🔍 AI Assistance Disclosure (click to expand)

This note has been lightly edited with AI assistance for clarity. All technical content and observations are my own.

Looking for polished project documentation? Check out Technical Projects.
Want my unfiltered thoughts? See Stories & Writing.


Quick Context

Just wrapped up the GT IEEE Robotech Hackathon - 36 hours straight of building a "mother-daughter" rover system.

Our team Tachy-Astroach took first place,

which was unexpected but awesome.

The concept: a quadruped "mother" rover carries a small RC "daughter" rover. Mother launches daughter to scout ahead, both controlled wirelessly.

Huge Shoutout to my awesome teammates who made this possible:

  • Zerun Wang: Quadruped mechanical design, inverse kinematics algorithms.
  • Hongyi Lyu: All other structural CAD design, 3D printing, mechanical assembly.
  • Yuting Zheng: Firmware post, controller UI design, presentation video editing.
  • Peijie Liu (me): All electronics/circuitry design & build, communication protocol.
  • Full project details on our DevPost page.

You all are my goats 🐏 !

The Discovery / Solutions

Custom Controller Build - Structural Diode Hack

No time for PCBs, so I went full old-school with protoboard and flying wires.

The hack I'm actually proud of: Instead of buying an RC controller enclosure, I used thick leads from salvaged high-power diodes as structural elements to mechanically join multiple protoboards together. Bent them into the rough shape of a handheld controller, soldered them between boards for both structural support AND ground distribution.

Core components:

  • ESP32 as main controller
  • 3 analog joysticks for multi-axis control
  • 2 OLED screens (status display + telemetry)
  • NRF24L01 module for wireless communication

PCA9685 Power Hack for Eight High-Power Servos

Eight servos on a quadruped = serious current demands. Standard PCA9685 servo driver boards aren't designed for this.

Modifications made:

  1. Added bulk capacitors - lots of them - to handle servo current spikes
  2. Tin stacking - literally piled solder onto the back traces to increase current capacity (probably added 3-4x the copper cross-section)
  3. Power rail separation hack - separated servo power rail from chip power, then fed servos directly from 2S LiPo (8.4V) while keeping PCA9685 chip at safe 5V

Daughter Robot - Simplicity Wins

The sub-rover was intentionally minimal:

  • Single H-bridge driving TT motor + PWM servo for steering
  • NRF24L01 receiver
  • MPU6050 gyro for attitude feedback
  • 9V alkaline battery with simple linear regulation

Nothing fancy, but it worked first try.

What Failed - The Wheel-Leg Hybrid

We originally planned wheel-leg hybrid locomotion - mount DC motors with wheels on each leg to drive like a car on flat ground, walk like a quadruped on rough terrain.

What killed it: SLA-printed Tough2000 resin gears were impossibly hard and brittle. We could NOT get them to mesh properly with the competition-provided motor shafts without cracking. After 6 hours of trying, we scrapped it and went pure quadruped.

Key Takeaways

  • Structural diode leads as protoboard joiners actually work great
  • Solder stacking is a valid emergency solution for current capacity boost
  • Keep subsystems simple when racing the clock - simplicity saved us
  • Test material properties BEFORE committing to geared mechanisms
  • Trust my teammates in their domains - let them own their parts completely

Wireless Protocol I Developed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*******************************************************
* radio_protocol.h
* Shared radio protocol definitions for Controller, Mother, and Kid

/******************** TARGET ENUM ********************/
enum Target : uint8_t {
TARGET_MOTHER = 0,
TARGET_KID = 1
};

/******************** PACKET STRUCTS ********************/
// Keep structs fixed-size and identical across nodes.
struct ImuData {
float ax, ay, az; // acceleration
float roll, pitch, yaw; // angles (or attitude)
};

struct CmdPacket {
uint8_t seq; // increments every send
uint8_t target; // TARGET_MOTHER / TARGET_KID
int16_t leftPower; // e.g. -1000..1000 (Mother: left wheel, Kid: 0)
int16_t rightPower; // e.g. -1000..1000 (Mother: right wheel, Kid: 0)
int16_t kidPower; // -1000..1000 (Kid: forward/back, Mother: 0)
int16_t kidSteer; // -1000..1000 (Kid: turn left/right, Mother: 0)
int8_t winch; // -1 rev, 0 stop, +1 fwd
uint8_t flags; // spare bits for future
};

struct TelPacket {
uint8_t seq;
uint8_t linkFlags; // bit0=kidOnline, bit1=controllerTimeout, etc.
ImuData imuM;
float distM;
float speedM; // optional, can be 0 if unused
ImuData imuK; // optional, can be 0 if unused
float distK; // optional
};

/******************** RADIO ADDRESSES ********************/
// 5-byte addresses for direct star topology (Plan A)
// Controller communicates directly with both Mother and Kid
static const uint8_t ADDR_C2M[6] = "C2M01"; // Controller -> Mother (CMD)
static const uint8_t ADDR_M2C[6] = "M2C01"; // Mother -> Controller (TEL)
static const uint8_t ADDR_C2K[6] = "C2K01"; // Controller -> Kid (CMD)
static const uint8_t ADDR_K2C[6] = "K2C01"; // Kid -> Controller (TEL)

/******************** RADIO CONFIGURATION CONSTANTS ********************/
// Shared radio settings across all nodes
static const uint8_t RADIO_CHANNEL = 90;
static const rf24_datarate_e RADIO_DATA_RATE = RF24_250KBPS;
static const rf24_pa_dbm_e RADIO_PA_LEVEL = RF24_PA_LOW;
static const uint32_t FAILSAFE_MS = 200; // Failsafe timeout (200ms)

#endif // RADIO_PROTOCOL_H

References


Just a quick note from my engineering journal. More detailed projects in Technical Projects.