Moving Ejection Port · Volume 2

The Numbers: Time, Stroke, Mass, Force and the D16 Sequence

How long a port stroke may take, how far it should move, what the moving part weighs and how hard it must be pushed; why the port follows the kick without anyone noticing; the heat it adds; and where a light gun can learn that its magazine is empty

Volume 1 set out what the port does on the real gun. This volume turns it into a specification a mechanism can be designed against. Every number here is either taken from a named source or computed from one in plain sight, and the computed ones are estimates that the bench (Volume 6) replaces.

2.1 Four numbers

Table 1 — Four numbers

QuantityTargetWhere it comes from
Time for a full stroke, out and back≤ 63 ms, preferably ≤ 50 ms with the kick before itOne real cycle at H&K’s 950 rounds a minute (2.2)
Visible stroke10 mm baseline; up to about 20 mm with a leverThe actuators’ own strokes; the real travel is longer than 38.5 mm but cannot be seen at speed (2.3)
Moving mass10–20 g for a separate port part; the whole kick mass in concept AA printed flank part plus whatever is coupled to it (2.4)
Net force on the part1–4 N averaged over the strokeFollows from the first three (2.5)

2.2 Time

Two clocks set the time budget.

The real gun’s. At H&K’s figure of about 950 rounds a minute a cycle takes 63 ms; across NATO’s 800 to 1,150 it takes 75 to 52 ms (HK MP7 Vol 5). A port that completes its stroke inside 63 ms can follow the real gun’s automatic fire shot for shot.

The firmware’s. OpenFIRE’s defaults, read from its source by the Solenoid Recoil dive, are a 45 ms on-time and an 80 ms off-time, a 125 ms cycle, with a 500 ms pause after the first shot before held-trigger repeats begin. That is eight shots a second, half the real rate. The project’s fork ends the kick pulse at landing instead of at 45 ms (decision D13 and Solenoid Recoil Vol 8), which leaves more of each cycle free.

So the port must finish inside 63 ms to keep up with a real-rate setting, and has a comfortable 125 ms at the firmware’s default. Even with the stock 45 ms kick pulse, a port that starts after the kick’s current has decayed (about 48.5 ms) and takes 30 ms to go out and back is home by about 80 ms, inside the default cycle. A real-rate setting needs the kick pulse ended at landing.

2.3 Stroke

On the real gun the carrier travels more than 38.5 mm, the length of the cartridge it has to clear (Volume 1). A light gun does not have to match it, for three reasons:

  • Speed hides it. At sixteen strokes a second the eye sees a flicker, not a distance.
  • The actuators set it. The open-frame solenoids on the project’s bench shortlist have strokes of 5.5 to 10 mm, and catalogued parts such as the Ledex B14 are characterised to 10.2 mm (Solenoid Recoil Vol 8). A longer stroke means a lever, and a lever divides the force by the same ratio it multiplies the stroke.
  • The port sets an upper limit. The moving flank has to cover the window when forward and still overlap it when back, so the part is the window’s length plus the stroke plus an overlap at each end. A 40 mm window with a 20 mm stroke needs a part about 68 mm long, which is a lot of the receiver.

Baseline: 10 mm, direct drive. Enough to read clearly as a moving part in single shots, and matched to the shortlist’s 10 mm parts without a lever. A 2:1 lever to 20 mm is an option for a gun that is mostly seen at rest and in single shots; Volume 3 gives its cost.

What shows in the gap when the part is back is the other half of the effect. The cheapest realism is a matt black cavity: in the real gun the gap shows the dark inside of the receiver and, for an instant, a case on its way out.

2.4 Mass

The moving part is a printed flank, guided on two rods. A part 58 mm long, 14 mm high and 6 mm thick, solid, is 4.9 cm³; at Prusament PETG’s published density of 1.27 g/cm³ that is 6.2 g.1 With two short brass bushings, a pin and a connecting clevis it is about 8 g. If a solenoid’s plunger is pinned to it, the plunger moves too, and the plunger is often the heavier part: the Ledex B14’s is 12 g (Solenoid Recoil Vol 8). A separate port mechanism therefore moves about 10 to 20 g.

In concept A the port moves with the kick mass, which the Solenoid Recoil dive sizes at “a few tens of grams” for a carbine (Solenoid Recoil Vol 7). Volume 3 deals with that case.

2.5 Force

With the time, the stroke and the mass fixed, the force follows. From rest, under a constant net force F, a mass m crosses a stroke s in t = √(2·m·s/F). The net force is what the actuator gives minus the return spring and friction.

Figure 1 — The time a port part takes to cross 10 mm from rest under a constant net force, for moving masses of 10, 20 and 40 g, with the 63 ms of one real cycle and a 20 ms share of it marked. A 20 g part ne…
Figure 1 — The time a port part takes to cross 10 mm from rest under a constant net force, for moving masses of 10, 20 and 40 g, with the 63 ms of one real cycle and a 20 ms share of it marked. A 20 g part needs about 1 N net to cross in 20 ms; a 40 g part needs 2 N. Constant force and no friction; own-work plot.

Table 2 — Force

Moving massNet force for 20 ms over 10 mmNet force for 10 ms
10 g0.5 N2 N
20 g1 N4 N
40 g2 N8 N

The return is the spring’s job, and the spring’s force is set by the time allowed for the return and the noise allowed at the end of it. Volume 5 sizes it. Two stock springs bracket the useful range for a 10 mm stroke: a light one of 0.1 N/mm returns a 20 g part in about 45 ms, a stiffer one of 0.38 N/mm in about 19 ms, arriving three times as fast and with five times the energy to absorb at the stop. The out-stroke actuator has to beat the spring as well as accelerate the part, so the spring’s force is added to the figures in the table.

These forces are small. The shortlist’s open-frame parts are listed at about 5 N starting force at 12 V (Solenoid Recoil Vol 8), and force at a given stroke rises with current. The port does not need a strong actuator. It needs a quick one that is quiet at both ends of its travel.

2.6 Kick first, port second (D16)

Decision D16 rules that the recoil stage and the port stage never fire at the same instant. The Reference Electronics dive’s §5.13 sets the rule for the fork: EJECT_CMD may rise only when SOL_CMD has been low for at least the measured decay time, and the recoil stage wins any conflict, with a transistor on the board holding the port stage’s input low while SOL_CMD is high. With the regulated stage’s coast release, a 2 A current in the model coil is gone in roughly 3.5 ms.

Figure 2 — One shot under decision D16. The kick stage is on until the plunger lands, about 10 to 12 ms on the Solenoid Recoil model at 24 V; its current decays in about 3.5 ms; only then does the port stage …
Figure 2 — One shot under decision D16. The kick stage is on until the plunger lands, about 10 to 12 ms on the Solenoid Recoil model at 24 V; its current decays in about 3.5 ms; only then does the port stage fire, ending its pulse when the part arrives; the return spring brings the part home about 47 ms after the trigger. Below, one real cycle at 950 rounds a minute (63 ms) and OpenFIRE's default autofire cycle (45 ms on, 80 ms off) for comparison. Estimates; own-work diagram.

The sequence in the figure is: kick on for 10 to 12 ms, decay 3.5 ms, port pulse about 12 ms, spring return 13 to 19 ms. The port is home about 45 to 50 ms after the trigger, inside one real cycle.

Is the delay visible? The port moves about 16 ms after the kick begins. The published thresholds for noticing that two senses are out of step are larger. BioNumbers, summarising the psychophysics literature, gives the just-noticeable difference for visual and tactile pairs as 35–65 ms, for audio-visual pairs 25–50 ms and for audio-tactile pairs about 80 ms, from temporal-order and simultaneity studies including Keetels and Vroomen (2008) and Spence, Shore and Klein (2001); it notes that the figures vary with the spatial separation of the stimuli and with the task.2 A port lagging the kick by 16 ms is well inside the visual–tactile window. The same delay between the kick’s sound and the port’s is also below the audio-visual figure. And the shooter, as Volume 1 argued, is mostly not looking at the port.

Why kick first, not port first. The kick is the function that must never be lost or delayed, which is the Reference Electronics dive’s reason for giving it priority in hardware. On the real gun the carrier’s rearward stroke is the recoil, so the order “recoil, then the carrier seen moving” is also what a real shot gives the eye, compressed into one event.

Concept A has no sequence. When the kick moves the port (Volume 3), there is one stage and nothing to interlock.

2.7 Energy and heat per shot

A port coil is a second heat source in the shell. An illustrative coil of the shortlist’s open-frame class, about 8 Ω, regulated at 1.5 A, dissipates I²R = 18 W while on. A 12 ms port pulse is then about 0.22 J. At OpenFIRE’s default eight shots a second that averages about 1.7 W, against the kick coil’s own share; at a real-rate setting near sixteen a second it would be about 3.5 W. These are the same orders as the kick coil’s and the reason the reference board reserves a second temperature input for the port coil (Reference Electronics Vol 5 §5.11). The supply does not grow: under D16 only one stage draws at a time.

Holding the port open after the last round is a different load: a smaller current, continuously. A solenoid with its plunger seated needs much less current to hold than to pull in, which is why peak-and-hold drive exists (Solenoid Recoil Vol 4). Held at a third of the pull-in current, the same coil dissipates a ninth of the power, about 2 W at 0.5 A. Volume 4 gives the hold arrangement.

2.8 Knowing the magazine is empty

The real gun knows its magazine is empty because the follower lifts the catch. A light gun has no follower, and its firmware has no idea of ammunition: the Controls and Inputs dive’s Volume 1 puts it plainly, “The firmware has no ‘reload’ function.” A reload is whatever the game decides it is. There are two ways for the gun to learn that the game thinks it is empty.

From the game, in serial mode. OpenFIRE accepts MAMEHooker-style serial commands from a hook program, and among them, as OpenFIRE’s own addition, FDAx<n> sets the ammunition count shown on the gun’s OLED (Open-Source Firmware Vol 6 §6.8). Where a game or emulator publishes its ammunition as an output and the hook program maps it to FDAx, the gun is told the count after every shot and when the player reloads. A fork that watches for FDAx0 knows the magazine is empty, and a later FDAx with a count above zero means it has been reloaded. This works only where an output exists; it is the exact behaviour when it does.

From its own count. Elsewhere the fork can count shots against a set magazine size (the MP7’s magazines hold 20, 30 or 40) and treat the reload input or an off-screen trigger pull as the reload. It will be wrong whenever the game’s idea differs: games with infinite ammunition, partial reloads, weapon pick-ups. It should be an option, off by default.

Figure 3 — Last-round hold-open as a state machine in the fork. From CLOSED a shot moves to CYCLING (kick, decay, port out, spring return); if the part is back and the count is zero, the port coil switches to…
Figure 3 — Last-round hold-open as a state machine in the fork. From CLOSED a shot moves to CYCLING (kick, decay, port out, spring return); if the part is back and the count is zero, the port coil switches to a hold current and the state is HELD OPEN; a reload, seen as an FDAx count above zero, the reload input, or a hold-time limit, moves it to RELEASING, where the spring closes the part without a kick, and back to CLOSED. Own-work diagram.

A hold-time limit is required. OpenFIRE already forces the solenoid off two seconds after a serial F0x1 if the game never sends F0x0 (SERIAL_SOLENOID_MAXSHUTOFF, 2,000 ms, Open-Source Firmware Vol 6). The held port needs the same protection on a longer limit, because a reload takes seconds: release after, say, 10 s whatever the game says, and let the port coil’s temperature input end it sooner. All of this is fork work for the Our Firmware dive.

2.9 The requirements

Table 3 — The requirements

#RequirementValueVolume
P-1Full stroke, out and back, after the kick≤ 63 ms; target ≤ 50 ms from the trigger2, 6
P-2Never energised while the kick stage isD16; firmware plus hardware interlock2, 4
P-3Visible stroke10 mm baseline, parametric to 20 mm2, 3, 6
P-4Moving part looks like a carrier flank; the gap behind it darkprinted, matt black cavity1, 6
P-5Hold-open after the last round, released on reloadfork state machine; hold limit ≤ 10 s2, 4
P-6Quiet at both endsdamped stops; noise measured on the bench5, 6
P-7Lifeat least 10⁶ strokes design target, 10⁵ demonstrated on the bench before a kit5, 6
P-8No firearm internalsa printed flank on rods; nothing modelled from the real bolt1, 6
P-9Runs from the board as designedthe second DRV8251A stage on EJECT_CMD, or the kick stage alone in concept A4

The life target in P-7 is this dive’s proposal, not an owner decision. A million strokes is about 35 hours of continuous fire at eight shots a second, which no home gun will see; a hundred thousand is about three and a half hours on the bench, which is a test that can be run.

2.10 What could not be verified

  • The time a printed port part actually takes. Every figure here is from constant-force arithmetic; friction, the solenoid’s rising force and the coil’s current rise all change it, and the bench replaces it.
  • The visual–tactile threshold is a summary figure from a secondary database; the primary studies were not read for this volume.
  • Which games publish an ammunition output usable as FDAx.

Sources

The MP7’s rate is from the HK MP7 dive (H&K product page; NATO AEP-97 via ČOS 130511). OpenFIRE’s timings and commands are from the Solenoid Recoil and Open-Source Firmware dives, which cite OpenFIRE v6.2’s source. The interlock and decay time are from Reference Electronics Vol 5. The arithmetic is in this dive’s 04-templates/port_dynamics.py.

Footnotes

  1. Prusa Polymers, Prusament PETG technical data sheet, version 1.1, last update 16 February 2022, density 1.27 g/cm³ (ISO 1183), as hosted at https://www.3dprintergear.com.au/assets/files/technical-data-sheet%20(1).pdf, read 2026-10-19. ↩

  2. BioNumbers, entry 112411, “Just noticeable difference (JND) between sensory modalities”, https://bionumbers.hms.harvard.edu/bionumber.aspx?id=112411, read 2026-10-19; primary sources listed there: Keetels and Vroomen (2008), Neuroscience Letters 430(2):130–134; Spence, Shore and Klein (2001), Journal of Experimental Psychology: General 130(4):799–832; Hirsh and Sherrick (1961). ↩

Comments (0)

  1. Loading…

Comments are held for moderation — nothing appears until approved.