0% found this document useful (0 votes)
31 views15 pages

Final Project Report

This experiment explores the conversion of magnetic energy into kinetic energy using a single-stage coil gun, where a ferromagnetic steel rod is accelerated by a solenoid coil. The average measured exit velocity was 0.575 m/s with an energy conversion efficiency of 73.2%, indicating that the position-dependent inductance model can effectively predict projectile velocity despite experimental errors. Various factors such as friction and eddy currents were identified as potential sources of error affecting the results.

Uploaded by

Irene Xue
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
31 views15 pages

Final Project Report

This experiment explores the conversion of magnetic energy into kinetic energy using a single-stage coil gun, where a ferromagnetic steel rod is accelerated by a solenoid coil. The average measured exit velocity was 0.575 m/s with an energy conversion efficiency of 73.2%, indicating that the position-dependent inductance model can effectively predict projectile velocity despite experimental errors. Various factors such as friction and eddy currents were identified as potential sources of error affecting the results.

Uploaded by

Irene Xue
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Translation of Stored Magnetic Energy to Kinetic Energy via 1

Stage Coil Gun


Physics 4BL, Winter 2026, 3/15/2026
Lab Section 3, Table 8
Nathan Tran, Sanya Badhe, Mimi Xue

Abstract
This experiment investigates the conversion of stored magnetic energy in an inductor into the kinetic
energy of a projectile using a single stage coil gun. The system utilizes a 7 cm long solenoid coil carrying
current, which produces a magnetic field that accelerates a 7 cm ferromagnetic steel rod. A digital hall
effect sensor disables the current in the solenoid when the projectile reaches the center of the coil,
prevents the magnetic field from pulling the projectile back toward the coil center and allows the
projectile to exit with its terminal velocity. Using a current sensor, the current through the solenoid coil is
measured, and the magnetic energy is modeled using U(x) = ½ L(x)I(t)2 where L(x) represents the
position dependent inductance of the coil. The inductance profile is approximated using a triangular
inductance model derived from measured inductance values. From this model, the magnetic force,
acceleration, and predicted exit velocity of the projectile can be calculated. The experimental velocity is
determined through frame by frame video analysis. Across five trials, the average peak current was 2.136
A, and the average measured exit velocity was 0.575 ± 0.08 m/s, corresponding to an average velocity
error of approximately 15% and a calculated energy conversion efficiency of 73.2%. These results suggest
that a position dependent inductance model can reasonably predict the exit velocity of the ferromagnetic
steel projectile, despite non-ideal effects present in the experimental system.

Introduction/Theoretical Background
Electromagnetic launchers, commonly referred to as coil guns or mass launchers, convert the
electrical energy stored in magnetic fields into kinetic energy of a ferromagnetic projectile. A current
carrying coil is an inductor and thus generates a magnetic field that pulls a ferromagnetic object toward
the region of highest magnetic energy density. As the projectile enters the coil, the effective inductance of
the coil increases because the magnetic permeability of the core increases.

Exit Velocity Prediction


1 2
The magnetic energy stored in an inductor is given by 𝑈(𝑥) = 2
𝐿(𝑥)𝐼(𝑡) (1), where L(x) is the
position dependent inductance of the coil and I(t) is the current through the coil as a function of time.
Because the inductance changes as the projectile moves, the magnetic energy stored in the system
becomes position dependent. The resulting force on the projectile can be derived from the gradient of the
1 2 𝑑𝐿(𝑥)
stored magnetic energy: 𝐹(𝑥, 𝑡) = 2
𝐼(𝑡) 𝑑𝑥
(2). Assuming conservation of energy applies and
accounting for no other forces, this will directly translate into the projectile accelerating via Newton’s
1 2 𝑑𝐿(𝑥)
Second Law: 𝑚𝑎(𝑥, 𝑡) = 2
𝐼(𝑡) 𝑑𝑥
where m is the mass of the projectile and a(x,t) is its acceleration.
This can then be numerically integrated to achieve a prediction for the velocity of the projectile
throughout its acceleration. Its terminal exit velocity can be taken as the integral of the acceleration over
the entire duration of the shot:
​ ​ ​ (4)
where v0 is the initial velocity, n is the index of the time sample for current and position, Δt is the time
step between time samples, and x is measured as the relative distance between the projectile center and
the coil center.
​ Note that the current I(t) is not assumed to follow an ideal RL response. Instead, it is obtained
directly from the measured current waveform during the experiment. Because the coil current is actively
switched off when the projectile reaches the center of the coil, the force is assumed to be zero for when x
is greater than 0 which prevents the projectile from being decelerated by the coil after passing its center.

Inductance Model
The relative permittivity of the ferromagnetic projectile is larger than one, µ = µ𝑟µ0, meaning the coils
total inductance is increased. We can model the coil as two inductors in parallel where the first has a
ferromagnetic core and length of the overlap of the projectile and the coil, and the other has just air inside
with length of L - Loverlap. This results in a triangular inductance waveform where its maximum inductance
is that of if the projectile is entirely situated inside the coil and occurs at x = 0 (centers of projectile and
coil aligned) Additionally, since a piecewise linear triangular function would produce discontinuities in its
derivative which is directly used to determine force (Eqn 2), the triangular profile is smoothed using a
∆𝐿 𝑥
hyperbolic tangent transition: 𝐿(𝑥) = 𝐿𝑎𝑖𝑟 + 2
(1 + 𝑡𝑎𝑛ℎ( 𝑎 )) where ΔL = Lcore - Lair and a controls
the transition width of the inductance change. The final model of inductance as a function of projectile
position is shown below along with its derivative dL(x)/dx:

Figure 1: Inductance and derivative of inductance model plotted vs position

Current Waveform and Projectile Dynamics


The current waveform is expected to exhibit a rapid rise followed by a gradual decay during the
launch event. When the projectile first begins to enter the coil, the inductance of the system increases
because the ferromagnetic material increases the effective magnetic permeability within the coil,
increasing the inductance, and thus the magnetic flux. The voltage and thereby current spike to drive the
large inductive load of the coil. According to Lenz’s Law the induced voltage will oppose the change in
𝑑ϕ𝐵
magnetic flux, 𝑉𝐸𝑀𝐹 =− 𝑑𝑡
(5), resulting in an induced voltage opposing the coil supply voltage which
will thereby decrease the current. As a result, the current is expected to reach a peak shortly after the
projectile begins entering the coil and then gradually decrease as the inductance continues to increase.
Because the switching circuit only allows current to flow during the initial portion of the launch, the
current remains in a decaying regime for the entire launch event (before switching off to 0 when x = 0).
This current behavior in turn determines the expected velocity profile of the projectile. The
electromagnetic force acting on the projectile is given by equation 2 and is directly proportional to the
positional derivative of inductance. In the simplified inductance model used, dL/dx is approximately a
positive constance while the projectile enters the coil. Under this assumption, the magnetic force is
expected to remain approximately constant during the entry phase. A constant force implies
approximately constant acceleration, which leads to an approximately linear increase in projectile velocity
as it travels through the accelerating region of the coil. Once the projectile reaches the center of the coil
and the current is switched off, the electromagnetic force is expected to vanish. At this point, the
projectile should continue moving at a constant velocity, corresponding to the predicted exit velocity.

Hypothesis:
​ It is hypothesized that the exit velocity of the projectile can be accurately predicted using a
position dependent inductance model together with the measured coil current waveform. The current is
expected to rise briefly as the coil is energized and then decay as the projectile enters the coil and
increases the inductance, consistent with Lenz’s law. By comparing the predicted exit velocity to the
experimentally measured velocity, the overall efficiency of the coil gun in converting electrical energy
into projectile kinetic energy can be evaluated where the conservation of energy should hold.

Methods/Procedure:
Materials
-​ Sensors: Digital Hall Effect Sensor (Gikfun A3144), Analog Current Sensor, Resistor Divider
(20k, 10k), iphone camera
-​ Circuit Components: MOFSET driver, ESP32 WROVER, 9V Battery, Jumper wires, Solder
-​ Physical Components: ¼ in Steel rod, Acrylic Tube, Coil (500 turns, 22AWG wire), Ruler, Tape
-​ Measurement Equipment: Proster BM4070 DMM, Scale

Procedure
In order to analyze the translation of stored magnetic energy to kinetic energy in a 1 stage coil
gun, a ferromagnetic rod was shot through an acrylic tube, where its velocity and current of the coil would
be measured. To accomplish this, 22AWG enameled wire was coiled around an acrylic tube 500 times to
create a 7cm solenoid, in which the acrylic tube serves as a low friction flyaway tube for the
ferromagnetic projectile, being a 7cm steel rod.
​ The parameters of the battery and the coil are listed below in Tables 1 and 2:
Table 1: Coil Parameters
Inductance with steel core inserted 0.656 ± 0.018 mH

Inductance with plain air 3.54 ± 0.012 mH

Coil Resistance 1.4 ± 0.16 Ω

Inductance uncertainty: 2% + 5D, Resistance uncertainty: 0.8% + 5D

Table 2: Battery Parameters


Unloaded Voltage 7.92 ± 0.07 V

Loaded Voltage 5.83 ± 0.06 mH

Internal Resistance 3.29 ± 0.05 Ω

Voltage uncertainty: 0.5% + 5D, Resistance uncertainty: 0.8% + 5D

The solenoid coil was then integrated into a circuit featuring a MOSFET driver, 9V battery, and
an ESP32 microcontroller in addition to an analog current sensor and digital hall effect sensor. The
schematic is shown below.

Figure 2: Coil gun operating schematic and implementation

The MOSFET driver allows the solenoid to be powered by a higher power source than the ESP32
that can supply higher voltage and higher driving current. It can be switched on or off by an output from
the microcontroller that is controlled by the hall effect sensor.
The hall effect sensor is placed at the direct exit of the coil and triggers with a changing magnetic
field directly under it that exists from the projectile passing by. Since the coil and projectile are the same
length, the steel rod’s edge reaching the coil’s edge indicates that the maximum inductance has been
reached, and thus the current must be turned off to avoid decelerating the projectile back inwards.
To collect telemetry data of the current’s value throughout this process, an analog current sensor
is placed in series whose output is voltage divided down so as to not overvolt the ESP32’s analog input
pins. The ESP32 takes a sample of the current over every cycle which is likely around ~100us.
Once the circuit was complete, a ruler was set next to the tube for reference. Then using an
iPhone camera, a trial of the steel rod being shot by the solenoid was recorded and underwent frame by
frame analysis where the change in distance between two points in time were recorded to calculate
experimental velocity. An example of this calculation is shown below:

Figure 3: Example of frame by frame analysis to find experimental velocity


This process was then repeated for 5 trials. After extracting experimental velocity and measured
current from each trial, results were compared to theoretical velocity found from the triangular current
inductance model.

Analysis/Results
​ The results of the measured velocity and peak currents are summarized below in table 3 with the
current and velocity waveforms in Figure 4:

Table 3: Trial Results – Peak Current, Velocity


Peak Current (A) Measured Velocity Theoretical Percent Error Efficiency
(m/s) Velocity (m/s

Trial 1 2.185 0.60 ± 0.084 0.691 13.2% 75.4%

Trial 2 2.101 0.575 ± 0.080 0.677 15.1% 72.1%

Trial 3 2.141 0.60 ± 0.084 0.675 11.1% 79.0%

Trial 4 2.128 0.55 ± 0.077 0.670 17.9% 67.4%

Trial 5 2.095 0.55 ± 0.077 0.669 17.8% 72.3%

Average 2.136 0.575 ± 0.080 0.676 15.0% 72.3%


Since energy is proportional to velocity squared, the overall efficiency of the coil gun can be given by:
𝑣 2
η = ( 𝑣𝑚𝑒𝑎𝑠𝑢𝑟𝑒𝑑 ) ​ ​ ​ ​ (6)
𝑝𝑟𝑒𝑑𝑖𝑐𝑡𝑒𝑑
Figure 4: Current and velocity waveforms derived from inductance models for five trials

Error Propagation:
∆𝑥
Given that 𝑣 = ∆𝑡
, the uncertainty in the frame by frame analysis is given by
σ𝑣 σ𝑥 2 σ𝑡 2
𝑣
= ( 𝑥
) +( 𝑡
) + 10%
Where σ𝑥 is 0.5mm given by the uncertainty of the ruler, σ𝑡 is 1/30s given the camera’s 30fps shooting
rate, and an additional 10% error is added to account for alignment error and human judgement error on
determining where the rod edge is across the ruler. We expect this error to be relatively high since the fps
rate of the camera is relatively low which causes the frames to contain blurred images of the steel
projectile which obfuscates its exact position (see Figure 3).

Waveform Trend and Value:


​ Both the current and velocity waveforms match our prediction for their trend and shape with the
change in current being negative throughout the trial and the velocity increasing approximately linearly
before leveling off. The values of peak and DC current are also reasonable given the coil resistance and
battery resistance that was measured. A ballpark estimate given these values was found via

The coil’s DC current was found by measuring the current with just air in the coil are recorded to be
1.61A. This is reasonable given that there is likely unaccounted for resistive losses in coil gun loop via
jumper wires, the current sensor, breadboard connections etc. given this DC value, the peak current of
around 2.1A due to the transient caused by the change in inductance is also generally reasonable.

Error Analysis:
Our measured velocity has a 15% error compared to our predicted velocity, and even with the
high uncertainty margin, our prediction still does not fall within one standard deviation of our measured
value. However, the percent error is not unreasonably high and there are many sources of error that can
justify the mismatch.
One source of error is friction between the projectile and the acrylic tube that guides it. The
theoretical model assumes that all magnetic energy transferred to the projectile is converted into kinetic
energy, but in practice some energy is dissipated through contact friction and minor misalignment within
the tube which were not accounted for in our force equations.
Another important consideration is eddy current damping within the steel projectile. As the
magnetic field of the coil changes rapidly during the current pulse, circulating currents are induced within
the conductive projectile. According to Lenz’s law, these currents produce magnetic fields that oppose the
change in flux, effectively generating a force that opposes the projectile’s motion. This results in some of
the electrical energy being dissipated as heat inside the projectile rather than being converted into kinetic
energy. The magnetic field produced by the coil is also not perfectly uniform. Because both the coil and
the projectile are relatively short, significant fringe fields exist near the ends of the coil. The simple
theoretical model assumes that the inductance change is primarily along the coil axis and that the field
distribution is uniform.
Finally, the inductance model used to predict the velocity makes a couple of idealized
assumptions. The permeability of the steel projectile is not constant and varies with magnetic field
strength, especially as the material approaches magnetic saturation. Additionally, the model assumes ideal
axial alignment between the projectile and the coil.
Overall, these simplifications tend to overestimate the change in inductance and therefore the
magnetic force, which would lead to a predicted velocity that is higher than the experimentally measured
value.

Efficiency Analysis:
The average efficiency value of 72.3% is higher than typical values of a low power 1 stage coil gun, but it
is important to note that the theoretical velocity prediction uses the experimentally derived current
waveform and not an idealized circuit model. This usage of the experimental current includes the effects
of major non ideal electrical effects that negatively impact efficiency such as battery voltage sag, wiring
resistance, and RL time constants. Because these electrical losses were already captured in the measured
current data, the theoretical model effectively accounts for many of the inefficiencies that would normally
reduce the predicted velocity. As a result, the calculated “theoretical” velocity is not based on an ideal
current source, but rather on the real electrical behavior of the system. This means that the remaining
discrepancy between predicted and measured velocity primarily reflects mechanical and magnetic losses
discussed above.

Conclusion
Throughout the experiment, the results of the single stage coilgun accurately exhibited the
translation of stored magnetic energy to kinetic energy. Through current sense and frame-by-frame video
analysis, average peak current was found to be 2.14 A and measured velocity was found to be 0.575 ±0.08
m/s. When comparing to average theoretical velocity, being 0.676 m/s, a percent error of 15% and an
efficiency of 72.3% was found.
As a result, the hypothesis was supported, as the exit velocity of the projectile was accurately
predicted with the use of a position dependent inductance model together with the measured coil current
waveform as efficiency was found to be about 72% over all 5 trials. The high calculated efficiency is
likely due to the use of the actual measured current waveform, which included non-ideal electrical effects
such as battery voltage sag, wiring resistance, and RL time constants. As errors were largely consistent
and ranged from 11.1% to 17.9%, this suggests that there were systematic errors within the experiment,
likely stemming from unaccounted factors such as friction between the projectile and acrylic tube, eddy
currents losses in the steel projectile, and the simplification of the inductance model. In addition, there
may have been human error in measuring velocity, as velocity was estimated through the use of frame by
frame analysis using a relatively slow camera.
Future improvements of the experiment could include more accurate methods of measuring
velocity, such as the use of more advanced high speed cameras or the use of a laser and photodiode set up,
to determine more accurate distances in points of time. In addition, an improved inductance model can be
used through the use of an LCR meter to measure the inductance of coil with the steel rod inserted at
regular intervals, which would ultimately reduce idealities assumed by the inductance model. To further
expand the experiment, variations could be done to explore higher intensities and different factors, such as
a multi-stage coilgun, more ideal and higher voltage supply to the coil gun, different materials of the
ferromagnetic projectile, or varying projectile and coil geometries.

References
1.​ “Build a Model Mass Driver for Launching Objects into Space | Science Project.” Science
Buddies,
[Link]/science-fair-projects/project-ideas/Elec_p094/electricity-electronics/ard
uino-mass-driver. Accessed 15 Mar. 2026.
Code Appendix int sample_count = 0;
bool shot_logging_done = false;
Arduino Code
#include <math.h> float readAcsVoltageAtAdc() {
int raw = analogRead(ACS_PIN);
// ===== PIN DEFINITIONS ===== return (raw * ADC_VREF) / ADC_MAX;
const int COIL_PIN = 25; }
const int SENSOR1_PIN = 23;
const int DEBUG_LED = 2; float readSensorVoltage() {
const int ACS_PIN = 34; return readAcsVoltageAtAdc() *
DIVIDER_GAIN;
// ===== SETTINGS ===== }
const int TRIGGER_LEVEL = LOW;
const uint32_t DEBOUNCE_US = 3000; float readCurrentA() {
const uint32_t ARM_IGNORE_US = 5000; // float v_sensor = readSensorVoltage();
ignore sensor for first 5 ms after arming return (v_sensor - acs_offset_V) /
ACS_SENS_V_PER_A;
// ===== ACS712 SETTINGS ===== }
const float ACS_SENS_V_PER_A = 0.185f;
const float DIVIDER_GAIN = 1.5f; void resetPeak() {
peak_abs_I_A = 0.0f;
const float ADC_VREF = 3.3f; peak_signed_I_A = 0.0f;
const int ADC_MAX = 4095; t_peak_us = 0;
}
const uint32_t SAMPLE_PERIOD_US = 100;
const int MAX_SAMPLES = 3000; void resetWaveform() {
sample_count = 0;
// ===== STATE ===== shot_logging_done = false;
bool coil_on = false; }
bool shot_done = false;
void calibrateAcsOffset() {
uint32_t last_s1_us = 0; const int N = 600;
uint32_t arm_time_us = 0; double sum = 0.0;
uint32_t t0_us = 0;
uint32_t last_sample_us = 0; delay(50);
for (int i = 0; i < N; i++) {
int prev_sensor_state = HIGH; sum += readSensorVoltage();
delay(2);
// ACS offset }
float acs_offset_V = 0.0f; acs_offset_V = (float)(sum / N);
}
// Peak tracking
float peak_abs_I_A = 0.0f; void armShot() {
float peak_signed_I_A = 0.0f; // coil off first
uint32_t t_peak_us = 0; digitalWrite(COIL_PIN, LOW);
coil_on = false;
// Waveform buffers delay(20);
uint32_t sample_time_us[MAX_SAMPLES];
float sample_current_A[MAX_SAMPLES]; // recal current zero
calibrateAcsOffset(); void dumpWaveformCsv() {
if (shot_logging_done) return;
resetPeak(); shot_logging_done = true;
resetWaveform();
shot_done = false; [Link]("# ---- SHOT WAVEFORM CSV
last_s1_us = 0; BEGIN ----");
[Link]("time_us,current_A");
t0_us = micros();
arm_time_us = t0_us; for (int i = 0; i < sample_count; i++) {
last_sample_us = t0_us; [Link](sample_time_us[i]);
[Link](",");
prev_sensor_state = [Link](sample_current_A[i], 6);
digitalRead(SENSOR1_PIN); }

digitalWrite(DEBUG_LED, LOW); [Link]("# ---- SHOT WAVEFORM CSV


END ----");
// arm coil [Link]("# Samples=");
digitalWrite(COIL_PIN, HIGH); [Link](sample_count);
coil_on = true;
[Link]("# Peak_I_abs(A)=");
[Link]("# ARMED. ACS offset(V)="); [Link](peak_abs_I_A, 6);
[Link](acs_offset_V, 4); [Link](" signed=");
} [Link](peak_signed_I_A, 6);
[Link](" at t(us)=");
void sampleCurrentWaveform(uint32_t now_us) [Link](t_peak_us);
{ }
if (!coil_on) return;
if ((uint32_t)(now_us - last_sample_us) < void handleSerialCommands() {
SAMPLE_PERIOD_US) return; while ([Link]() > 0) {
char c = (char)[Link]();
last_sample_us = now_us;
if (c == 'a' || c == 'A') {
if (sample_count >= MAX_SAMPLES) return; [Link]("# Arming shot");
armShot();
float I = readCurrentA();
uint32_t t_rel = now_us - t0_us; } else if (c == 'o' || c == 'O') {
digitalWrite(COIL_PIN, LOW);
sample_time_us[sample_count] = t_rel; coil_on = false;
sample_current_A[sample_count] = I; shot_done = true;
sample_count++; [Link]("# Coil forced OFF");
dumpWaveformCsv();
float absI = fabsf(I);
if (absI > peak_abs_I_A) { } else if (c == 'p' || c == 'P') {
peak_abs_I_A = absI; dumpWaveformCsv();
peak_signed_I_A = I;
t_peak_us = t_rel; } else if (c == 'h' || c == 'H') {
} [Link]("# Commands:");
} [Link]("# a = arm shot");
[Link]("# o = force coil off");
[Link]("# p = print waveform"); bool falling_edge = (prev_sensor_state !=
[Link]("# h = help"); TRIGGER_LEVEL && sensor ==
} TRIGGER_LEVEL);
}
} if (coil_on &&
arm_ignore_done &&
void setup() { falling_edge &&
[Link](115200); (uint32_t)(now_us - last_s1_us) >
delay(200); DEBOUNCE_US) {

pinMode(COIL_PIN, OUTPUT); last_s1_us = now_us;


digitalWrite(COIL_PIN, LOW);
coil_on = false; digitalWrite(DEBUG_LED, HIGH);

pinMode(DEBUG_LED, OUTPUT); // shut coil off immediately


digitalWrite(DEBUG_LED, LOW); digitalWrite(COIL_PIN, LOW);
coil_on = false;
pinMode(SENSOR1_PIN, INPUT_PULLUP); shot_done = true;

analogReadResolution(12); [Link]("# S1 Triggered -> Coil OFF");


analogSetPinAttenuation(ACS_PIN, }
ADC_11db);
prev_sensor_state = sensor;
[Link]("Type 'a' to ARM.");
} // ===== THEN SAMPLE CURRENT =====
sampleCurrentWaveform(now_us);
void loop() {
handleSerialCommands(); // dump data after shot is already safely off
if (shot_done && !shot_logging_done) {
uint32_t now_us = micros(); dumpWaveformCsv();
}
// ===== CHECK SENSOR FIRST =====
int sensor = digitalRead(SENSOR1_PIN); }

bool arm_ignore_done = ((uint32_t)(now_us -


arm_time_us) > ARM_IGNORE_US);
Python Analysis Code

You might also like