JMRI and Arduino Integration
Connect Arduino sensors and outputs to JMRI for computer-controlled layout automation.
Integration Methods
1. CMRI Protocol (Recommended)
- Well-supported in JMRI
- Multiple node addresses
- Reliable communication
2. Direct Serial
- Custom commands
- More flexible but requires scripting
CMRI Setup
Arduino Library
#include
CMRI cmri(0, 24, 24); // Node 0, 24 inputs, 24 outputs
void setup() {
Serial.begin(9600, SERIAL_8N2);
// Set up your pins...
}
void loop() {
cmri.process();
// Read sensors
cmri.set_bit(0, digitalRead(2)); // Sensor on pin 2
// Control outputs
digitalWrite(3, cmri.get_bit(0)); // Output on pin 3
}
JMRI Configuration
- Open Preferences → Connections
- Add new connection type: C/MRI
- Select your serial port
- Configure node address (must match Arduino)
Practical Applications
Block Detection
- Connect current sensors to Arduino inputs
- Report occupancy to JMRI
- Use in turnout control automation
Turnout Control
- JMRI sends commands
- Arduino controls servo motors
- Report back position
Signal Control
- JMRI calculates aspects
- Arduino drives LEDs
- Supports complex signaling rules
Testing the Connection
- Open JMRI Sensor Table
- Add sensor at configured address
- Trigger Arduino input
- Watch sensor state change in JMRI
Tips
- Use consistent node addressing
- Document your pin assignments
- Test each sensor individually
- Add status LEDs for debugging