Extend AeroAlign with mixed CoG planning and telemetry base

This commit is contained in:
2026-03-11 23:14:33 +01:00
parent 538c3081bf
commit 56890272a0
28 changed files with 1631 additions and 1332 deletions
+106 -326
View File
@@ -1,360 +1,140 @@
# SkyLogic AeroAlign - Sensor Node Wiring Diagram
# SkyLogic AeroAlign - IMU Node Wiring
**Version**: 1.0.0
**Date**: 2026-01-22
**Target Hardware**: ESP32-C3/ESP32-S3 + MPU6050 + LiPo + TP4056
---
**Version**: 2.0.0
**Date**: 2026-03-11
**Scope**: Master and IMU slave nodes for the combined AeroAlign + CoG platform
## Overview
This document describes the complete wiring schematic for both Master and Slave sensor nodes. Both nodes use identical wiring (Master additionally runs WiFi AP + web server in firmware).
This document covers the current wiring for the angle-measurement nodes:
---
- `Master`: ESP32-C3 or ESP32-S3, WiFi AP, web UI, ESP-NOW receiver, local IMU
- `IMU Slave`: ESP32-C3 or ESP32-S3, remote MPU6050 node over ESP-NOW
## Component List (Per Node)
The Master and IMU Slave share the same MPU6050 wiring. The main difference is firmware role.
CoG-specific hardware is documented separately in [cog_scale_wiring.md](/Users/florianklaner/Github/AeroAlign/hardware/schematics/cog_scale_wiring.md).
| Component | Part Number | Quantity | Function |
|-----------|-------------|----------|----------|
| ESP32-C3 DevKit | ESP32-C3-DevKitM-1 | 1 | Microcontroller |
| MPU6050 IMU | GY-521 module | 1 | 6-axis motion sensor |
| LiPo Battery | 1S 3.7V 250-400mAh | 1 | Power source |
| TP4056 Charger | USB-C variant | 1 | Battery charging |
| HT7333 LDO | 3.3V 250mA | 1 | Voltage regulator |
| 10kΩ Resistor | 1/4W carbon film | 2 | Voltage divider for battery ADC |
| JST Connector | 2-pin PH2.0 | 1 | Battery connector |
| USB-C Cable | 1m | 1 | Charging/flashing |
## Supported ESP32 Pin Maps
---
### ESP32-C3
## Power Supply Wiring
| Signal | GPIO | Notes |
|--------|------|-------|
| `SDA` | `GPIO4` | MPU6050 I2C data |
| `SCL` | `GPIO5` | MPU6050 I2C clock |
| `BATTERY_ADC` | `GPIO0` | Battery divider midpoint |
| `STATUS_LED` | `GPIO10` | Optional |
### ESP32-S3
| Signal | GPIO | Notes |
|--------|------|-------|
| `SDA` | `GPIO4` | MPU6050 I2C data |
| `SCL` | `GPIO5` | MPU6050 I2C clock |
| `BATTERY_ADC` | `GPIO1` | Only if divider is actually fitted |
| `STATUS_LED` | disabled | Board-dependent, firmware keeps it off by default |
## Power Topology
```
LiPo Battery (3.7V nominal, 4.2V max, 3.0V min)
├─► [+] TP4056 IN+ (Battery charging input)
│ TP4056 IN- [GND]
│ TP4056 USB-C (for charging only)
└─► [+] HT7333 VIN (3.0V - 4.2V input)
HT7333 GND [GND]
HT7333 VOUT [3.3V] ─► ESP32-C3 3.3V pin
MPU6050 VCC
LiPo 1S
|
+--> TP4056 BAT+/BAT-
|
+--> LDO VIN
|
+--> 3.3V rail --> ESP32 3V3
--> MPU6050 VCC
```
**Notes**:
- TP4056 charges LiPo when USB-C connected (red LED: charging, blue LED: full)
- HT7333 regulates LiPo voltage to stable 3.3V for ESP32 and IMU
- ESP32-C3 DevKit has built-in USB-C for programming (separate from TP4056 charging USB-C)
### Notes
---
- A dedicated 3.3V regulator is still recommended for clean IMU behavior.
- The Master S3 configuration currently assumes battery monitoring may be absent.
- If no ADC divider is wired on the Master, leave `BATTERY_MONITOR_ENABLED` disabled in [config.h](/Users/florianklaner/Github/AeroAlign/firmware/master/src/config.h).
## ESP32-C3 to MPU6050 (I2C) Wiring
## MPU6050 Wiring
| ESP32 | MPU6050 | Notes |
|-------|---------|-------|
| `GPIO4` | `SDA` | I2C |
| `GPIO5` | `SCL` | I2C |
| `3V3` | `VCC` | Use 3.3V |
| `GND` | `GND` | Common ground |
| `GND` | `AD0` | Sets address `0x68` |
### Bus Settings
- ESP32-C3 default: `400 kHz`
- ESP32-S3 default: `100 kHz`
The lower S3 bus speed is intentional and matches the current robust MPU6050 access code.
## Battery Divider
Use the divider only on nodes that really need local battery reporting.
```
ESP32-C3 MPU6050 (GY-521)
--------- ----------------
GPIO4 (SDA) ───────► SDA (I2C Data)
GPIO5 (SCL) ───────► SCL (I2C Clock)
3.3V ───────► VCC
GND ───────► GND
INT (not connected)
AD0 (GND for 0x68 address)
LiPo+
|
[10k]
|
+----> BATTERY_ADC
|
[10k]
|
GND
```
**I2C Configuration**:
- **Address**: 0x68 (default, AD0 pulled low)
- **Frequency**: 400kHz (fast mode)
- **Pull-ups**: Internal ESP32 pull-ups enabled (no external resistors needed)
### Current firmware assumptions
**Alternative**: BNO055 IMU (for ±0.1° accuracy upgrade)
```
ESP32-C3 BNO055
--------- ------
GPIO4 (SDA) ───────► SDA
GPIO5 (SCL) ───────► SCL
3.3V ───────► VIN
GND ───────► GND
PS0 (GND for I2C mode)
PS1 (3.3V)
```
- IMU slaves: divider enabled in firmware
- Master C3: divider enabled
- Master S3: divider disabled by default until the ADC path is actually wired
---
## Master Node Wiring Summary
## Battery Monitoring (Voltage Divider)
| Block | Required | Notes |
|-------|----------|-------|
| ESP32-C3 or ESP32-S3 | yes | `master` firmware |
| MPU6050 | yes | local reference IMU |
| LiPo + charger + regulator | yes | portable operation |
| Battery divider | optional | hidden in UI if absent |
```
LiPo+ (3.0V - 4.2V)
10kΩ Resistor (R1)
├────► ESP32-C3 GPIO0 (ADC1_CH0)
10kΩ Resistor (R2)
└────► GND
## IMU Slave Wiring Summary
Output Voltage = (LiPo Voltage) / 2
ESP32 ADC reads 0-1650mV (half of LiPo voltage)
```
| Block | Required | Notes |
|-------|----------|-------|
| ESP32-C3 or ESP32-S3 | yes | `slave` firmware |
| MPU6050 | yes | same robust driver as Master |
| LiPo + charger + regulator | yes | remote node |
| Battery divider | recommended | transmitted to Master |
**Calculation**:
```cpp
float adc_value = analogRead(GPIO0); // 0-4095 (12-bit)
float voltage_at_adc = (adc_value / 4095.0) * 3.3; // Convert to volts
float battery_voltage = voltage_at_adc * 2.0; // Multiply by voltage divider ratio
uint8_t battery_percent = ((battery_voltage - 3.0) / (4.2 - 3.0)) * 100.0;
```
## Bring-Up Checklist
**Important**:
- R1 and R2 must be equal (10kΩ each) for 2:1 division
- ESP32-C3 ADC max input: 3.3V (do NOT exceed)
- LiPo max voltage 4.2V / 2 = 2.1V (safe margin)
---
## Status LED (Optional)
```
ESP32-C3 GPIO10 ───► [+] LED [-] ───► 220Ω Resistor ───► GND
```
**LED Indicators**:
- **Solid Blue**: WiFi AP active (Master only)
- **Slow Blink (1Hz)**: Normal operation, connected
- **Fast Blink (5Hz)**: Searching for Master (Slave only)
- **Red Blink (3×)**: Low battery (<20%)
---
## Complete Schematic (ASCII Art)
```
+──────────────────────────────────────+
│ LiPo Battery (1S 3.7V) │
│ 250-400mAh │
+──────────────────────────────────────+
│ │
│+ │-
│ │
┌────────┴────────┐ │
│ TP4056 Charger │ │
USB-C Charge ───────┤ (USB-C input) │ │
│ OUT+ OUT-│ │
└─────┬────────────┴─────────┤
│+ -│
│ │
┌─────┴──────────────────────┴─────┐
│ HT7333 LDO Regulator │
│ VIN GND VOUT │
└──────────────┬───────────┬───────┘
│ │ 3.3V
│ │
┌─────────────┴───────────┴────────┐
│ ESP32-C3 DevKit │
│ │
USB-C Flash ────┤ USB-C │
│ │
│ GPIO4 (SDA) ──────┐ │
│ GPIO5 (SCL) ──────┤ │
│ GPIO0 (ADC) ──────┤ │
│ GPIO10 (LED) ─────┤ │
│ 3.3V ─────────────┤ │
│ GND ──────────────┤ │
└────────────────────┼─────────────┘
┌────────────────────┴─────────────┐
│ MPU6050 IMU (GY-521) │
│ │
│ SDA ◄──────────────────────────┤
│ SCL ◄──────────────────────────┤
│ VCC ◄───── 3.3V ───────────────┤
│ GND ◄───── GND ────────────────┤
│ INT (not connected) │
│ AD0 ◄───── GND (0x68 address) │
└──────────────────────────────────┘
Battery Monitor (Voltage Divider)
LiPo+ ──┬── 10kΩ ──┬── 10kΩ ── GND
│ │
│ └──► GPIO0 (ADC)
(Read half voltage)
```
---
## Pin Assignment Summary
### ESP32-C3 GPIO Mapping
| GPIO Pin | Function | Connection | Notes |
|----------|----------|------------|-------|
| GPIO0 | ADC1_CH0 | Battery voltage divider midpoint | Read battery level |
| GPIO4 | I2C SDA | MPU6050 SDA | IMU data line |
| GPIO5 | I2C SCL | MPU6050 SCL | IMU clock line |
| GPIO10 | Digital Out | Status LED (optional) | Connection indicator |
| 3.3V | Power | HT7333 VOUT, MPU6050 VCC | Regulated power rail |
| GND | Ground | Common ground | All components share |
| USB-C | USB Serial | Flashing/debugging | Built-in on DevKit |
### MPU6050 (GY-521) Pinout
| Pin | Function | Connection | Notes |
|-----|----------|------------|-------|
| VCC | Power | ESP32 3.3V | 3.3V or 5V compatible |
| GND | Ground | Common GND | - |
| SDA | I2C Data | GPIO4 | Pull-up enabled internally |
| SCL | I2C Clock | GPIO5 | Pull-up enabled internally |
| INT | Interrupt | Not used | Future: motion detection |
| AD0 | Address Select | GND | Sets I2C address to 0x68 |
---
## Assembly Instructions
### Step 1: Solder HT7333 LDO
1. **Identify pins**: HT7333 (SOT-89 package)
```
┌───────┐
│ HT7333│
└┬─┬─┬──┘
│ │ └── VOUT (3.3V output)
│ └──── GND
└────── VIN (3.0V-6.0V input)
```
2. Solder to TP4056 OUT+ (VIN) and OUT- (GND)
3. Connect VOUT to ESP32-C3 3.3V rail
### Step 2: Connect Battery
1. Solder JST connector to LiPo (red = +, black = -)
2. Connect to TP4056 BAT+ and BAT-
3. **Important**: Check polarity before connecting!
### Step 3: Wire I2C to MPU6050
1. Solder 4 wires (SDA, SCL, VCC, GND) from ESP32-C3 to MPU6050
2. Use 22AWG silicone wire (flexible, ~10cm length)
3. Test continuity with multimeter
### Step 4: Install Voltage Divider
1. Solder two 10kΩ resistors in series
2. Connect high end to LiPo+ (or TP4056 OUT+)
3. Connect midpoint to ESP32-C3 GPIO0
4. Connect low end to GND
5. Cover with heat shrink tubing
### Step 5: Test Power Supply
1. **Without ESP32 connected**: Measure HT7333 VOUT with multimeter
2. Expected: 3.25V-3.35V (3.3V ±50mV)
3. If correct, connect ESP32-C3 3.3V pin
### Step 6: Flash Firmware
1. Connect ESP32-C3 USB-C to computer
2. Flash Master or Slave firmware via PlatformIO
3. Open serial monitor (115200 baud)
4. Verify IMU initialization: "MPU6050 initialized (0x68)"
### Step 7: Calibrate IMU
1. Place sensor on flat, level surface
2. Power on, wait 10 seconds for stabilization
3. Web UI (Master) or serial output (Slave) should show ~0.0° pitch/roll
---
1. Verify `3.3V` rail before plugging the ESP32 in.
2. Confirm MPU6050 address `0x68` with `AD0` tied low.
3. Keep SDA/SCL leads short on S3 builds.
4. On the Slave, set the Master MAC in [config.cpp](/Users/florianklaner/Github/AeroAlign/firmware/slave/src/config.cpp).
5. Build and flash:
- `cd firmware/master && pio run`
- `cd firmware/slave && pio run -e esp32-s3`
## Troubleshooting
### Problem: ESP32 won't power on
### No MPU6050 detected
**Check**:
- LiPo voltage (should be 3.7V-4.2V)
- HT7333 VOUT (should be 3.3V)
- TP4056 protection (may shut down if overcharged/over-discharged)
- Check `GPIO4` and `GPIO5`
- Check `AD0 -> GND`
- Reduce wire length
- Prefer the S3 default `100 kHz`
**Solution**: Charge LiPo via TP4056 USB-C
### Battery percentage missing on Master
### Problem: I2C not detected (MPU6050 not found)
- Expected on S3 unless the divider is fitted and `BATTERY_MONITOR_ENABLED` is enabled
- The web UI now hides the metric when unavailable
**Check**:
- Wiring: SDA to GPIO4, SCL to GPIO5
- I2C address: Run I2C scanner (should show 0x68)
- Pull-ups: Enable internal pull-ups in firmware
### Slave does not show up
**Solution**: Verify connections, re-solder if cold joints
### Problem: Battery percentage reads 0% or 255%
**Check**:
- Voltage divider wiring (two 10kΩ resistors in series)
- ADC pin (GPIO0) connection to midpoint
- ADC code calibration (3.3V ADC reference)
**Solution**: Measure voltage at GPIO0 with multimeter (should be LiPo voltage / 2)
### Problem: IMU angles drift over time
**Check**:
- Complementary filter alpha (should be 0.98)
- IMU temperature (MPU6050 sensitive to >15°C delta from calibration)
- Vibration isolation (sensor should be firmly mounted)
**Solution**: Recalibrate at operating temperature, increase filter alpha to 0.99
---
## Safety Warnings
⚠️ **LiPo Battery Safety**:
- Never short-circuit LiPo terminals (fire/explosion risk)
- Do not charge above 4.2V (TP4056 prevents this)
- Do not discharge below 3.0V (TP4056 prevents this)
- Store at 50-60% charge (3.7V-3.8V) if unused >1 week
- Dispose of damaged/swollen batteries at hazardous waste facility
⚠️ **Soldering Safety**:
- Use 300-350°C iron temperature (too hot damages components)
- Solder in ventilated area (avoid flux fumes)
- Do not touch soldering iron tip (obvious, but critical)
⚠️ **ESD Protection**:
- ESP32-C3 and MPU6050 are ESD-sensitive
- Touch grounded metal before handling (discharge static)
- Avoid working on carpets or synthetic fabrics
---
## Bill of Materials (Per Node)
See `hardware/schematics/bom.csv` for complete BOM with Amazon ASINs and pricing.
**Quick Summary**:
- ESP32-C3 DevKit: $6.50
- MPU6050 IMU: $4.50
- LiPo Battery (400mAh): $8.00
- TP4056 Charger: $1.50
- HT7333 LDO: $0.80
- Resistors, wire, connectors: $2.00
- **Total per node**: ~$23.30
---
## Revision History
| Version | Date | Changes |
|---------|------|---------|
| 1.0.0 | 2026-01-22 | Initial wiring diagram for MVP |
---
*SkyLogic AeroAlign - Precision Grounded.*
- Recheck Master MAC in [config.cpp](/Users/florianklaner/Github/AeroAlign/firmware/slave/src/config.cpp)
- Ensure Master AP channel and ESP-NOW channel match