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_RATIO in config.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.