Hardware
Bill of Materials
Kit-Supplied Components
| Component | Model | Qty |
|---|---|---|
| Microcontroller | ESP32 DevKit v1 | 1 |
| Water turbidity sensor | SEN0189 (mandated) | 1 |
| Soil moisture sensor | Capacitive v2.0 (mandated) | 1 |
| DC gearmotor | JGA25-370 12V 300RPM (no encoders) | 2 |
| Motor driver | L298N | 1 |
| Servo | MG996R | 1 |
| Buck converter | LM2596 | 1 |
Additional Components
| Component | Model | Qty | Role |
|---|---|---|---|
| Colour sensor | TCS34725 | 1 | Zone detection — mounted ahead of front wheels, facing down |
| ToF distance sensor | VL53L0X | 1 | Wall detection |
| IMU | MPU6050 | 1 | DMP yaw — heading hold |
| Voltage regulator | AMS1117-3.3V | 1 | 3.3V rail |
| Resistors | e.g. 2× 10kΩ | — | Voltage divider for SEN0189 output |
| Battery | LiPo 7.4V 2200mAh | 1 | Main power |
The robot has no wheel encoders and no I2C multiplexer — the VL53L0X address clash is solved with the ESP32's second I2C bus instead.
Power Architecture
LiPo 7.4V 2200mAh
│
├── L298N VM (7.4V direct → ~5.4V at motors after L298N drop)
│ └── expect reduced speed/torque on grass and sand
│
├── LM2596 Buck → 5V ──→ SEN0189 (5V supply)
│ MG996R servo
│ L298N logic
│
└── AMS1117-3.3V (from 5V) ──→ ESP32 · TCS34725 · VL53L0X · MPU6050
Capacitive moisture sensor
Critical: the SEN0189 output swings to ~4.5V. The ESP32 ADC pin maximum is 3.3V — the signal must pass through a voltage divider (e.g. 10kΩ/10kΩ → ratio 2.0, set as
TURBIDITY_DIVIDER_RATIOinconfig.h). Direct connection clips every clean-water reading and can damage the pin.
Pin Assignments (config.h — authoritative)
| GPIO | Function |
|---|---|
| 13 | L298N IN1 — Motor L direction |
| 14 | L298N IN2 — Motor L direction |
| 4 | L298N ENA — Motor L PWM (LEDC ch0) |
| 18 | L298N IN3 — Motor R direction |
| 19 | L298N IN4 — Motor R direction |
| 23 | L298N ENB — Motor R PWM (LEDC ch1) |
| 26 | MG996R servo PWM (LEDC timers 2/3) |
| 21 | Wire0 SDA — MPU6050 (0x68) + TCS34725 (0x29) |
| 22 | Wire0 SCL |
| 16 | Wire1 SDA — VL53L0X only |
| 17 | Wire1 SCL |
| 36 | SEN0189 ADC — via voltage divider |
| 39 | Capacitive moisture ADC — direct (3.3V safe) |
| 0 | BOOT button — hold at power-on for RC mode |
| 2 | Status LED |
GPIO 21/22 are reserved for I2C — never assign them to motors. (The original pin map did exactly that; it was the audit's first hardware finding.)
I2C Address Map
| Device | Address | Bus |
|---|---|---|
| MPU6050 | 0x68 | Wire0 (21/22) |
| TCS34725 | 0x29 | Wire0 (21/22) |
| VL53L0X | 0x29 | Wire1 (16/17) — same address as TCS34725, isolated on its own bus |
Double-Arm Seesaw Mechanism
One MG996R servo drives two rigid arms on the same shaft. One servo replaces two linear actuators — simpler, lighter, fewer failure modes. This is the headline innovation.
SERVO SHAFT (pivot)
│
┌─────────────┴─────────────┐
│ │
Arm A Arm B
SEN0189 Cap. Moisture v2.0
(Water probe) (Soil probe)
Servo 90° → NEUTRAL: both arms horizontal (travel position)
Servo 0° → Arm A DOWN: water sensor deployed
Servo 180° → Arm B DOWN: soil sensor deployed
Rules:
- Robot must be stationary before the servo moves.
- Always return to 90° after every sampling sequence.
- Arms are physically rigid — both move together on every rotation.
Physical Compliance
| Constraint | Limit |
|---|---|
| Length | ≤ 400mm |
| Width | ≤ 300mm |
| Height (arm at 90°) | ≤ 400mm |
| Weight (battery included) | ≤ 1.5kg |
All dimensions measured in starting configuration (servo at 90°, arms horizontal). Deployable parts may not exceed the limits.
Mounting Requirements
- TCS34725 ahead of the front wheels, facing down, ~10mm above ground. Water slots are recessed — detection must fire before a wheel reaches the slot edge. This is a hard safety constraint.
- VL53L0X forward-facing at wall height.
- Servo arm pivot at the front so both probes reach past the front bumper.
- Battery secured with an accessible power switch — officials can order an immediate power-down.