Whilst building lots of robots to fulfill a recent Kickstarter project, I had the need to program a thousand or so Arduinos, which would take forever if I were to program them all individually. Situations like this are the perfect opportunity to work on those meta projects which can be just as much fun to build as the product itself. In this case I needed something that would:
- program a number of Arduinos in parallel
- work without a screen
- let me know if it had successfully programmed or not
- be quick and easy to use
Pogo pins are a great way of making a quick temporary electrical connection to a PCB so I decided on using those pretty quickly. I used a little laser cut toggle to hold the Arduino in place. The user interface needed to be kept pretty simple so I settled on some great looking arcade-style buttons that also light up with an LED inside. I think they’re intended for pimping out” boy racer cars” but work pretty well on an Arduino programmer too. I then laser cut a frame for all of these to sit in so that you could quickly slip the Arduino in to place and press the button. When it’s programming the button flashes and when it’s done it stays on if it was successful and goes off if it failed.
I connected up a USB to serial converter to each set of pogo pins and then plugged all of these into a USB hub. To drive the user interface I made a simple little sketch for the Arduino, which would allow external control of the LEDs and emit events when the buttons were pressed. This also plugged into the USB hub which then plugged into the Raspberry Pi.
I wrote a simple piece of software in Node.js, which is great for this kind of parallel event-driven workload. All this does is communicate with the UI Arduino and when a button is pressed it will execute avrdude in a sub-process on the correct serial port. It then tells the UI Arduino to flash the correct LED and then depending on the return code from this external process it will indicate success or failure.
With all of this in place, all I needed to do was tell it to boot at runtime, which I did by putting it into the crontab. The only complex thing to work around was making sure that the USB ports came up with the same ID each time. Fortunately in Linux this is possible by adding a udev script that generates a symlink depending on where the device is on the USB bus. This means that after reboots the USB to serial converters kept the same name.
Because they all operate independently of each other, I’m able to very quickly put one in place, press the button and start putting the next in place. By the time I’ve reached the fifth Arduino, the first has finished. Because they are being done in parallel, it only takes a few seconds to program each Arduino, rather than the 30 or so it would normally take for each one.
If you’d like to build something like this for yourself, it’s all open source:
If you want to modify it to program other types of Arduino the software should all still be valid and you can configure it to do as many as you have serial ports.