Engineer · Hardware Hobbyist · Father
Engineer & Consultant. Hardware Hobbyist. Father.
Recent logs
CH32V006 Servo Controller Firmware - DXL 2.0 RX Timing
This is a design note for anyone bringing up a Dynamixel 2.0 servo on the CH32V006. You don’t need prior DXL or RISC-V expertise; read it top to bottom. Protocol reference throughout is the DYNAMIXEL Protocol 2.0 spec . If you’re new here, OpenServoCore is my effort to turn cheap SG90 / MG90 servos into networked smart actuators with sensor feedback, cascade control, and a DYNAMIXEL-style TTL bus. This is the first post in a series on how the CH32V006 firmware meets DXL 2.0’s timing budget on a $0.16 chip (qty. 1000+). Later posts will be linked here as they go live.
CH32V006 Servo Controller Dev Board (Rev. B) Bring-Up - One Trace Cut for a Fresh-Chip Bootstrap
When the first Rev B board came back from PCBWay, I hooked up the WCH-LinkE, fired up the debugger, and tried to connect. The debugger reported no target at all. The board was clearly powered (3.3 V rail LED on, no heat, no smoke), and the LinkE itself was alive, but whatever was on the other end of the SWD lines wasn’t answering. Unlike Rev A where I failed my way to debug success, I didn’t actually have to probe to know what was going on this time. It immediately hit me that the Rev B schematic puts nRST and OPN2 on the same physical pin, and is tied to ground. This means the chip is held in reset forever, no way of changing nRST to GPIO via LinkE… If you’re new here, OpenServoCore is my effort to turn cheap MG90S-class servos into networked smart actuators with sensor feedback, cascade control, and a DYNAMIXEL-style TTL bus. The CH32V006 dev board is the firmware development platform for this project. Rev B is the second revision, announced in April and fabricated and assembled by PCBWay as a sponsored run.
CH32V006 Servo Controller Dev Board (Rev. B) Designed
Rev A took board surgery to power on. Then I hit an RX line that refused to go LOW . Then I noticed a third defect I never wrote up: the differential current sensing on the OPA wasn’t actually differential. Rev B is the respin that fixes all three, plus a handful of features I was going to need anyway. If you’re new here, OpenServoCore is my effort to turn cheap MG90S-class servos into networked smart actuators with sensor feedback, cascade control, and a DYNAMIXEL-style TTL bus. The CH32V006 dev board is the firmware development platform for this project. Rev B is the second revision of that board, routed this week and ready to fab.
CH32V006 Servo Controller Dev Board (Rev. A) - UART RX Stuck High (TTL Buffer / TX_EN Gotcha)
RX wouldn’t go low. The scope showed a perfectly shaped square wave, riding on top of 3.3 V with a whopping 180 mV of swing. Something was holding the line near the rail so hard my USB UART adapter could only nudge it down a couple hundred millivolts. If you’re new here, OpenServoCore is my effort to turn cheap MG90S-class servos into networked smart actuators with sensor feedback, cascade control, and a DYNAMIXEL-style TTL bus. tinyboot is the Rust bootloader for those boards, and this post is what happened the first time I tried to bring it up on the Rev A CH32V006 dev board. The culprit turned out to be the half-duplex TTL front-end. TX_EN isn’t a transmit enable, it’s a mux select, and with it low the buffer was actively pushing 3.3 V back into RX through a 24 mA CMOS output stage. Inside: scope photos, schematic walkthrough, the absurd workaround (assert TX_EN to receive), and why Rev B gets a jumper instead of a firmware fix.
tinyboot v0.4.0 Released — The API is Stable
You may have noticed v0.3.0 came and went without an announcement. That was deliberate. Crates were merging, APIs were shifting, the wire protocol was being reworked, and I didn’t want to ship a writeup that’d be stale in two weeks. v0.4.0 is the release where the dust finally settles. If you’re new here, tinyboot is a minimal Rust bootloader for resource-constrained MCUs. It fits in 1920 bytes of system flash and gives you CRC-validated firmware updates over UART, with trial boot and automatic fallback to service mode. I’m building it as part of OpenServoCore so you can OTA-update servo firmware over the same single-wire DXL TTL bus, without tearing the robot apart. What’s in v0.4.0: full CH32V00x family support (V002 through V007, including the V006 that the OSC dev board runs on), TX_EN now fits in system flash on every supported variant, the three tinyboot-ch32-* crates collapsed into one, 24-bit protocol addresses with per-command flag bits, two nasty half-duplex bugs squashed during dev-board validation, and a docs rewrite aimed at users instead of maintainers. Plus a quiet announcement: with the API stable, active feature work pauses while my attention shifts to the OSC firmware rewrite.