Mechanical

Our pipe builder is designed to mount directly onto a pipe, then extend the stack vertically by moving and placing new segments. The robot starts attached to an existing “base” segment, grabs a new pipe segment from the bottom, then travels upward, rotates to align, and seats the segment on top of the current stack. This creates a repeatable stacking cycle consisting of pickup, climb, rotate, and placing.

To make this feasible in a 36-hour build, the mechanical system was kept modular: one pair of the team focused on the chassis/stacking mechanism and the gripper/arm geometry, while the other pair built the electronics + controls in parallel. The final mechanism prioritizes repeatability and alignment over complexity so the full stacking sequence can be demonstrated reliably during the task run.

Electrical

We used a two-ESP32 architecture to separate the human interface from the robot actuation.

  • Controller Unit (ESP32): reads three joysticks (elbow, wrist, motors) and four buttons (gripper toggle + auxiliary actions). It connects to a laptop via USB for telemetry forwarding.
  • Robot Unit (ESP32): drives motion and manipulation hardware:
    • PCA9685 I2C PWM driver for servo control (gripper, wrist, elbow)
    • H-bridge motor drivers for rotation and vertical movement

We also added an independent camera subsystem: Arducam + Raspberry Pi 3B streaming video to the laptop over WiFi. This is separate from the main control link so video streaming does not interfere with low-latency actuation.

Safety and robustness features included:

  • Servo angle limits constrained to 0–180°
  • Control timeout: motors stop if no control signal for 500 ms
  • Motor timeout: motors stop if no motor command for 1 s
  • Emergency-stop flags integrated into the status system

Software & Controls

Communication + Telemetry

We chose ESP-NOW for bidirectional, low-latency peer-to-peer communication between the controller and robot ESP32s.

  • Control rate: 100 Hz (20 ms intervals) for joystick commands
  • Telemetry rate: 20 Hz (50 ms intervals) for battery voltage, servo angles, and status flags

To keep packets fast and reliable, ESP-NOW uses a binary packet format with checksums, while the controller forwards telemetry to the laptop as JSON over USB serial at 921600 baud.

Control behavior

We implemented several control features to improve repeatability and operator feel:

  • Joystick auto-calibration: 100-sample calibration on startup + 10% dead zone to prevent drift
  • Smooth servo movement: rate-limited updates (30°/s elbow & wrist, 60°/s gripper)

Firmware + App software

Firmware was written in C++ (Arduino framework) and built with PlatformIO (migrated from Arduino IDE for multi-file support and cleaner dependency management).

  • Separate PlatformIO environments for controller and robot firmware
  • Pre-build Python script copies files into PlatformIO’s expected src/ structure while keeping a logical directory layout
  • Libraries: Bounce2 (debouncing), Adafruit PWM Servo Driver (PCA9685), ESP-NOW/WiFi

For operator feedback, we built a Python (PySide6) GUI using PySerial that displays real-time telemetry: battery voltage, servo angles, connection health, status flags, packet statistics, dynamic styling, and auto-reconnect.

Technical issues solved

  • ADC2 conflict: joystick pin on ADC2 conflicted with WiFi/ESP-NOW; moved to GPIO32 (ADC1) to resolve
  • ESP-NOW peer interface error: fixed by specifying WIFI_IF_STA in the peer structure
  • Initialization hang debugging: added targeted serial debug output (with Serial.flush()) to isolate hang points
  • I2C robustness: added debug output to detect PCA9685 initialization stalls when hardware is disconnected

Built With

Share this project:

Updates