The eventual robot is going to have *lots* of these joints. If I took a traditional servo approach, I'd need three wires per devices - power, ground and PWM. Assuming I bus the power and ground, that still leaves one wire per device for control; so with 30 devices that's 30 wires to thread and terminate on some eventual controller. I wanted something better.

My first plan was be to implement these joints as 1-wire devices. That way I could bus the control wire between all the devices and have just a single control wire at the controller. Unfortunately, while there are some nice Arduino libraries to implemented 1-wire slaves, my boards only run at 8MHz (the internal clock rate) which isn't fast enough to make them work, or at least work reliably.

Fortunately I had a fallback plan. I'm old enough to remember the Cambridge Ring - not some kind of upper class network of students spying for Russia - but an early networking protocol. Leaving aside the specific implementation details, it was essentially a ring of serial lines where each transmitter was connected to the next receiver (the last being connected back to the first). Messages are passed round the ring until they reach the destination.

So I build a ring network which works on a similar principles. Each Arduino TX is connected to the next Arduino RX, and then messages are encoded and sent around the network. To operate any given device a message is send along the network to the desired target where it is executed. The result is a large network of devices (~250) with just two wires and usable by anything with a serial line.

The RingNet is IOS level 3/4 - ordered, reliable delivered at least once, datagrams (Update 9/5/16 - originally the network was unreliable, but fix that today).

The networking code is here: https://github.com/aanon4/RingNet