Arduino Code Generation
Generate Arduino sketches for embedded physics simulations on microcontrollers.
Features
RAM-optimized: Uses
floatinstead ofdoublefor constrained memorySerial Plotter output: Real-time visualization in Arduino IDE
Servo output: Map simulation state to physical servo motors
Real-time timing:
micros()-based loop for consistent timestepsRK4 integrator: Full 4th-order integration on microcontroller
Basic Usage
from mechanics_dsl.codegen.arduino import ArduinoGenerator
import sympy as sp
theta, g, l = sp.symbols('theta g l')
gen = ArduinoGenerator(
system_name="pendulum",
coordinates=['theta'],
parameters={'g': 9.81, 'l': 1.0},
initial_conditions={'theta': 0.5, 'theta_dot': 0.0},
equations={'theta_ddot': -g/l * sp.sin(theta)},
use_serial_plotter=True,
servo_pin=9
)
gen.generate("pendulum.ino")
Parameters
use_serial_plotter: Enable Serial Plotter formatted output (default:True)servo_pin: Pin number for servo output, orNoneto disable (default:None)
Generated Code Structure
The generated .ino sketch contains:
Physical parameters:
const floatvalues withfsuffixState array: Fixed-size
floatarray``computeDerivatives()``: Equations of motion function
``rk4Step()``: In-place RK4 integrator using
float``setup()``: Serial initialization and optional servo attach
``loop()``: Timing-controlled integration and output
``resetSimulation()``: Reset state to initial conditions
Serial Plotter
Open Tools > Serial Plotter in Arduino IDE after uploading. The output format is CSV-compatible:
Time,theta,theta_dot
0.0100,0.4995,−0.0981
0.0200,0.4980,−0.1961
Servo Output
When servo_pin is set, the first coordinate is mapped to a 0–180 degree
servo range. This creates a physical pendulum display:
gen = ArduinoGenerator(
...,
servo_pin=9 # PWM-capable pin
)
Compatible Boards
Board |
RAM |
Notes |
|---|---|---|
Arduino Uno (ATmega328P) |
2 KB |
Up to ~3 coordinates |
Arduino Mega (ATmega2560) |
8 KB |
Larger systems |
ESP32 |
520 KB |
Wi-Fi + Bluetooth capable |
Teensy 4.0 |
1 MB |
600 MHz, hardware FPU |
Memory Considerations
Each coordinate uses 2 * sizeof(float) * 5 = 40 bytes for RK4 temporaries.
On an Arduino Uno with 2 KB RAM, keep systems to 3 coordinates or fewer.
See Also
C++ Code Generation - Standard C++ generation
Rust Code Generation - Rust with
no_stdembedded supportCode Generation Overview - All code generation targets