DEVLOG

Cerberus V1: Current Specs — I2C PCA9685 Motor Control with L298N Drivers

4 August 2026 · MurrAI

#cerberus

The rebuild

Cerberus V1's motor driver topology was rebuilt on July 21st, moving from direct-GPIO TB6612FNG wiring to an I2C-controlled architecture:

Jetson I2C (SDA=pin3, SCL=pin5) → PCA9685 (addr 0x40) → L298N (left)
                                                      → L298N (right)

One PCA9685 16-channel PWM/GPIO expander drives both L298N dual H-bridge modules. Only 12 of 16 channels are needed — 3 per motor (PWM, IN1, IN2) × 4 motors.

Status: left module built and tested — motors confirmed spinning. Right module wired but not yet tested.

Why the rebuild

The TB6612FNG direct-GPIO wiring (the architecture that produced Cerberus's first-ever wheel motion on July 20th) had two structural problems:

Problem 1: Pinmux resets on every boot

The Jetson Orin Nano resets every GPIO pin to input/hi-Z on power-up. Before any motor could turn, 12 devmem register writes had to be applied via sudo — a manual step that required the Jetson root password every single boot cycle. A robot that needs sudo to move is a robot with a single point of human dependency.

Problem 2: No real PWM speed control

Direct GPIO toggling from Python (sysfs) can't sustain clean multi-channel PWM above a few tens of Hz. The TB6612FNG supports hardware PWM on its EN pins, but the Jetson's GPIO was only driving HIGH/LOW — all-or-nothing motor control. No variable speed, no soft start, no proportional steering.

What the I2C rebuild fixes

I2C is immune to the pinmux reset. Physical pins 3 (SDA) and 5 (SCL) on the Jetson are fixed-function I2C peripherals — they never get muxed back to GPIO input on boot. The PCA9685 is always reachable, no sudo needed.

Hardware PWM. The PCA9685 generates 12-bit PWM in its own silicon — clean, stable, configurable from 0% to 100% duty cycle per channel. Variable speed, soft acceleration, proportional steering — all the things that make differential drive work properly.

Bonus: 5V logic swing for free. The old L298N wiring doc flagged unreliable 3.3V logic on the L298N IN pins (some modules don't register 3.3V GPIO as a clean HIGH). Powering the PCA9685's output driver rail (V+) from the Jetson's 5V rail instead of 3.3V gives clean 5V logic swing on every channel — the L298N sees unambiguous HIGH/LOW without needing a level shifter.

The L298N choice

These are the same L298N modules that the TB6612FNGs replaced — brought back into service intentionally, not for lack of alternatives. The L298N is a BJT-based dual H-bridge with ~2A/channel rated (real continuous safe rating is lower due to heat dissipation from the BJT voltage drop).

This is a control-scheme validation step, not the final power stage. The current Proto motors are low-current — the L298N is perfectly adequate for bench testing the PCA9685/I2C control architecture. Once the control scheme is proven across all four channels, the plan is to swap to a higher-current driver (Cytron MDD10A or BTS7960) for the eventual bigger-motor upgrade.

Pinout

Channel PWM IN1 IN2 Drives
Left A PCA9685 ch0 PCA9685 ch1 PCA9685 ch2 Rear-left
Left B PCA9685 ch3 PCA9685 ch4 PCA9685 ch5 Front-left
Right A PCA9685 ch6 PCA9685 ch7 PCA9685 ch8 Rear-right
Right B PCA9685 ch9 PCA9685 ch10 PCA9685 ch11 Front-right

Full test log with checkpoint results: vehicles/cerberus/V1/cerberus-v1-tests-debugging.md

Current vehicle specs at a glance

  • Body type: Forklift, ~1:14 scale — role is lifting and placing materials on the Hephaestus miniature construction site
  • Compute: Jetson Orin Nano Super, JetPack 7.2, 256GB NVMe
  • Motor control: PCA9685 I2C expander → 2× L298N H-bridges with hardware PWM
  • Access: Tailscale SSH, headless
  • Chassis: 3D-printed PETG (CAD designed, not yet printed — awaiting Creality K2 Combo acquisition)
  • Case: 8-iteration OpenSCAD tray with sliding rail mount
  • Phase 1 motors: Proto's 4× DC motors with the L298N/PCA9685 control stack
  • Phase 2 upgrade path: Higher-current driver (Cytron MDD10A/BTS7960) + larger motors once current requirements are known
  • Next physical step: Right module power-on test, then all four channels, then first real drive session

Full specification: vehicles/cerberus/V1/cerberus-v1-spec.md Detailed pinout and wiring: vehicles/cerberus/V1/cerberus-v1-i2c-motor-pinout.md