313 lines
11 KiB
Markdown
313 lines
11 KiB
Markdown
# Simplified Wiring Diagram
|
||
|
||
## The Key Insight: One Driver for Everything! 🎯
|
||
|
||
**You only need ONE LM18200 H-Bridge driver** - it handles both DC and DCC modes.
|
||
|
||
The ESP32 just sends different signals to the same pins depending on which mode you select:
|
||
|
||
```
|
||
ESP32-2432S028R
|
||
┌─────────────┐
|
||
│ │
|
||
GPIO 18 ─┤PWM / DCC_A │───┐
|
||
GPIO 19 ─┤DIR / DCC_B │───┤
|
||
GPIO 23 ─┤BRAKE │───┤
|
||
GPIO 4 ─┤RELAY │───┼──→ To Relay Module
|
||
GPIO 35 ─┤ADC (ACK) │◄──┼──→ From ACS712 OUT
|
||
GND ─┤ │───┤
|
||
5V ─┤ │───┤
|
||
└─────────────┘ │
|
||
│
|
||
↓
|
||
LM18200 H-Bridge Module
|
||
┌──────────────┐
|
||
GPIO 18 ───┤ PWM Input │
|
||
GPIO 19 ───┤ DIR Input │
|
||
GPIO 23 ───┤ BRAKE │
|
||
GND ───┤ GND │
|
||
5V ───┤ VCC (logic) │
|
||
12-18V ───┤ VS (power) │
|
||
│ │
|
||
│ OUT1 OUT2 │
|
||
└───┬──────┬───┘
|
||
│ │
|
||
↓ ↓
|
||
ACS712 Current Sensor
|
||
┌──────────────┐
|
||
OUT1 ───┤ IP+ │
|
||
│ │
|
||
To Track ◄──┤ IP- OUT ├──→ GPIO 35 (ADC)
|
||
Rail 1 │ │
|
||
│ VCC GND ├──→ GND
|
||
5V ───┤ │
|
||
└──────────────┘
|
||
│
|
||
↓
|
||
Track Rail 1
|
||
│
|
||
(Rail 2 from OUT2)
|
||
```
|
||
|
||
## How It Works
|
||
|
||
### DC Analog Mode
|
||
When you select **DC Analog** mode in the UI:
|
||
- GPIO 18 outputs **20kHz PWM** (0-100% duty cycle for speed)
|
||
- GPIO 19 outputs **HIGH or LOW** (sets direction: FWD or REV)
|
||
- LM18200 amplifies this to create variable DC voltage on the track
|
||
- Your DC locomotive responds to the voltage
|
||
- ACS712 monitors current (optional - can display on screen)
|
||
|
||
### DCC Digital Mode
|
||
When you select **DCC** mode in the UI:
|
||
- GPIO 18 outputs **DCC Signal A** (square wave: 58μs or 100μs pulses)
|
||
- GPIO 19 outputs **DCC Signal B** (inverted version of Signal A)
|
||
- LM18200 amplifies these to create DCC waveform on the track
|
||
- Your DCC decoder locomotive responds to the digital commands
|
||
- ACS712 monitors current for normal operation
|
||
|
||
### DCC Programming Mode
|
||
When you press **[PROG]** button in DCC mode:
|
||
- GPIO 18/19 send **service mode packets** (22-bit preamble)
|
||
- Decoder receives CV programming commands
|
||
- Decoder responds with **60mA ACK pulse** for 6ms if command valid
|
||
- ACS712 detects current spike and sends voltage to GPIO 35
|
||
- ESP32 reads ADC and confirms successful programming
|
||
- UI shows "Verified!" or "Failed - No ACK"
|
||
|
||
## Complete Connection List
|
||
|
||
### LM18200 Module to ESP32
|
||
| LM18200 Pin | ESP32 GPIO | Purpose |
|
||
|-------------|------------|---------|
|
||
| PWM Input | 18 | Speed (DC) / DCC Signal A (DCC) |
|
||
| Direction Input | 19 | Direction (DC) / DCC Signal B (DCC) |
|
||
| Brake Input | 23 | Emergency stop |
|
||
| GND | GND | Ground reference |
|
||
| VCC (logic) | 5V | Control logic power |
|
||
|
||
### LM18200 Module Power & Outputs
|
||
| LM18200 Pin | Connection | Purpose |
|
||
|-------------|------------|---------|
|
||
| VS (motor power) | 12-18V supply + | High current power |
|
||
| GND (power) | 12-18V supply - | Power ground |
|
||
| OUT1 | ACS712 IP+ | To current sensor |
|
||
| OUT2 | Track Rail 2 | Direct to track |
|
||
|
||
### ACS712 Current Sensor Module
|
||
| ACS712 Pin | Connection | Purpose |
|
||
|------------|------------|---------|
|
||
| IP+ | LM18200 OUT1 | Current input (from driver) |
|
||
| IP- | Track Rail 1 | Current output (to track) |
|
||
| VCC | 5V | Sensor power |
|
||
| GND | GND | Ground reference |
|
||
| OUT | GPIO 35 (ADC) | Analog current reading |
|
||
|
||
**ACS712 Variants:**
|
||
- **ACS712-05A**: ±5A max (recommended for small locomotives)
|
||
- **ACS712-20A**: ±20A max (for larger locos or multiple)
|
||
- **ACS712-30A**: ±30A max (overkill, but works)
|
||
|
||
**Output Voltage:**
|
||
- At 0A: 2.5V (Vcc/2)
|
||
- Sensitivity:
|
||
- 5A model: 185 mV/A
|
||
- 20A model: 100 mV/A
|
||
- 30A model: 66 mV/A
|
||
- ACK Detection (60mA): ~2.5V + (0.06A × sensitivity)
|
||
|
||
### Relay Module (2-rail/3-rail switching)
|
||
| Relay Pin | ESP32 GPIO | Purpose |
|
||
|-----------|------------|---------|
|
||
| Signal IN | 4 | Relay control |
|
||
| VCC | 5V | Relay power |
|
||
| GND | GND | Ground |
|
||
|
||
### Power Supply Connections
|
||
```
|
||
12-18V Power Supply
|
||
├─→ LM18200 VS (motor power)
|
||
├─→ DC-DC Buck Converter → 5V → ESP32 + Relay + LM18200 VCC + ACS712 VCC
|
||
└─→ GND (common ground for all modules)
|
||
```
|
||
|
||
## ACS712 Current Sensor Details
|
||
|
||
### Why ACS712?
|
||
✅ **Hall-effect sensor** - Electrically isolated, no voltage drop
|
||
✅ **Analog output** - Easy to read with ESP32 ADC
|
||
✅ **Bi-directional** - Measures current in both directions
|
||
✅ **Module available** - Pre-built boards with 5V supply
|
||
✅ **ACK Detection** - Sensitive enough to detect 60mA programming pulses
|
||
|
||
### Wiring the ACS712
|
||
The ACS712 goes **in series** with ONE track rail:
|
||
|
||
```
|
||
LM18200 OUT1 ──→ [ACS712 IP+]──[IP-] ──→ Track Rail 1
|
||
│
|
||
[OUT] ──→ GPIO 35 (ESP32 ADC)
|
||
│
|
||
[VCC] ──← 5V
|
||
│
|
||
[GND] ──← GND
|
||
|
||
LM18200 OUT2 ──────────────────────────→ Track Rail 2
|
||
```
|
||
|
||
### Reading Current in Software
|
||
|
||
The ACS712 outputs an analog voltage proportional to current:
|
||
|
||
```cpp
|
||
// ACS712 5A model example
|
||
#define ACS712_PIN 35
|
||
#define ACS712_SENSITIVITY 0.185 // 185 mV/A for 5A model
|
||
#define ACS712_ZERO 2.5 // 2.5V at 0A (Vcc/2)
|
||
|
||
float readCurrent() {
|
||
int adcValue = analogRead(ACS712_PIN);
|
||
float voltage = (adcValue / 4095.0) * 3.3; // Convert to voltage
|
||
float current = (voltage - ACS712_ZERO) / ACS712_SENSITIVITY;
|
||
return current; // Returns current in Amps
|
||
}
|
||
```
|
||
|
||
### ACK Detection with ACS712
|
||
|
||
For DCC programming track ACK (60mA pulse):
|
||
|
||
```cpp
|
||
bool DCCGenerator::waitForAck() {
|
||
#define CURRENT_SENSE_PIN 35
|
||
#define ACS712_ZERO_VOLTAGE 2.5
|
||
#define ACS712_SENSITIVITY 0.185 // For 5A model
|
||
#define ACK_CURRENT_THRESHOLD 0.060 // 60mA in Amps
|
||
|
||
unsigned long startTime = millis();
|
||
|
||
// Wait up to 20ms for ACK pulse
|
||
while (millis() - startTime < 20) {
|
||
int adcValue = analogRead(CURRENT_SENSE_PIN);
|
||
float voltage = (adcValue / 4095.0) * 3.3;
|
||
float current = abs((voltage - ACS712_ZERO_VOLTAGE) / ACS712_SENSITIVITY);
|
||
|
||
// If current spike detected (60mA+)
|
||
if (current > ACK_CURRENT_THRESHOLD) {
|
||
Serial.println("ACK detected!");
|
||
return true;
|
||
}
|
||
|
||
delayMicroseconds(100);
|
||
}
|
||
|
||
Serial.println("No ACK");
|
||
return false;
|
||
}
|
||
```
|
||
|
||
### Calibration
|
||
|
||
Before using ACK detection, calibrate the zero point:
|
||
|
||
1. **Power on** with no locomotive on track
|
||
2. **Read GPIO 35** multiple times and average
|
||
3. **Calculate zero voltage** (should be ~2.5V)
|
||
4. **Update ACS712_ZERO** in code if needed
|
||
|
||
```cpp
|
||
// Calibration routine (run once)
|
||
void calibrateCurrentSensor() {
|
||
float sum = 0;
|
||
for (int i = 0; i < 100; i++) {
|
||
int adc = analogRead(35);
|
||
float voltage = (adc / 4095.0) * 3.3;
|
||
sum += voltage;
|
||
delay(10);
|
||
}
|
||
float zeroVoltage = sum / 100.0;
|
||
Serial.printf("ACS712 Zero Point: %.3fV\n", zeroVoltage);
|
||
}
|
||
```
|
||
|
||
## Why This Works
|
||
|
||
The LM18200 is just an amplifier. It doesn't care if you're feeding it:
|
||
- PWM signals (for DC speed control)
|
||
- DCC square waves (for digital commands)
|
||
|
||
It simply takes the 3.3V logic signals from the ESP32 and amplifies them to track voltage (12-18V).
|
||
|
||
**In DC mode**: The amplified PWM creates variable DC voltage
|
||
**In DCC mode**: The amplified square waves create the DCC signal
|
||
**In Programming mode**: The ACS712 detects decoder ACK pulses
|
||
|
||
### Benefits of Using ACS712
|
||
|
||
✅ **No voltage drop** - Hall-effect sensor doesn't load the circuit
|
||
✅ **Isolated measurement** - Safe for ESP32 ADC input
|
||
✅ **Both directions** - Works with forward/reverse current
|
||
✅ **Module form** - Easy to wire, includes filtering capacitors
|
||
✅ **DCC ACK capable** - Sensitive enough for 60mA detection
|
||
✅ **Current monitoring** - Can display real-time current on UI
|
||
✅ **Overcurrent detect** - Software can trigger emergency stop
|
||
|
||
## Safety Notes
|
||
|
||
✅ **Always power OFF before switching modes** (automatic in the UI)
|
||
✅ **Common ground** - All GND connections must be tied together
|
||
✅ **Heat sink** - LM18200 can get hot, use appropriate heat sinking
|
||
✅ **Fusing** - Add fuse on track output for overcurrent protection
|
||
✅ **ACS712 rating** - Use 5A model for most O-scale locos, 20A for larger
|
||
✅ **Short circuit** - Monitor current and auto-shutdown on excessive draw
|
||
|
||
## Shopping List
|
||
|
||
### Required Components
|
||
- ✅ **ESP32-2432S028R** module (includes display + touch)
|
||
- ✅ **LM18200 H-Bridge module** (or bare IC + heatsink)
|
||
- ✅ **ACS712 current sensor module** (5A or 20A version)
|
||
- ✅ **5V relay module** (for 2-rail/3-rail switching)
|
||
- ✅ **12-18V power supply** (2A minimum)
|
||
- ✅ **DC-DC buck converter** (12-18V to 5V, 1A)
|
||
- ✅ **Wires** (22-24 AWG for logic, 18-20 AWG for track)
|
||
- ✅ **Fuse holder** + appropriate fuse
|
||
|
||
### Optional but Recommended
|
||
- 🔧 Heatsink for LM18200 (if using bare IC)
|
||
- 🔧 Terminal blocks for easy track connections
|
||
- 🔧 Emergency stop button (wired to GPIO 23 or power)
|
||
- 🔧 Case/enclosure for professional finish
|
||
|
||
## No Separate DCC Booster Needed!
|
||
|
||
You do **NOT** need:
|
||
- ❌ Separate DCC booster circuit
|
||
- ❌ Different outputs for DC vs DCC
|
||
- ❌ Mode selection switches in hardware
|
||
- ❌ Separate programming track booster
|
||
- ❌ Complex current sensing circuits (ACS712 handles it!)
|
||
|
||
Everything is handled in software by the ESP32 touchscreen UI.
|
||
|
||
## Connection Summary
|
||
|
||
**Minimum wiring** for full functionality:
|
||
1. **ESP32 to LM18200**: 5 wires (GPIO 18, 19, 23, GND, 5V)
|
||
2. **LM18200 to ACS712**: 2 wires (OUT1 to IP+, IP- continues to track)
|
||
3. **ACS712 to ESP32**: 3 wires (OUT to GPIO 35, VCC to 5V, GND)
|
||
4. **ESP32 to Relay**: 3 wires (GPIO 4, 5V, GND)
|
||
5. **Power supply**: 12-18V to LM18200, 5V to all logic
|
||
|
||
Total: **~16 connections** for a complete dual-mode test bench with programming!
|
||
|
||
---
|
||
|
||
**Bottom Line**: Wire up ONE LM18200 + ONE ACS712, and you get:
|
||
- ✅ DC analog speed control
|
||
- ✅ DCC digital operation
|
||
- ✅ DCC programming track with ACK verification
|
||
- ✅ Real-time current monitoring
|
||
- ✅ Overcurrent protection capability
|