banner left Boxtec Banner
Platzhalter BoxtecProdukteForumShopKontaktPlaygroundn/aJobs

Mass programming a lot of Arduino boards

This short Howto deals with programming a sketch on a lot of boards in the shortest possible time. You need a modern Linux workstation, like i.e. Debian, Ubuntu, SuSE, our robox-live or just any udev-enabled Linux distribution.

How it works

We use a custom udev-rule to automatically upload a prepared hex file using avrdude.

Step 1: Get the hex file

Only .hex files can be directly uploaded with avrdude. The easiest way to get the .hex file of your sketch is enabling verbose output in the preferences of your Arduino IDE and saving the file away for later use. If you enable verbose output, you will see some lines similar to the ones below:

/home/boxtec/apps/arduino-1.0.1/hardware/tools/avr/bin/avr-ar rcs 
/tmp/build5730367966331024242.tmp/core.a /tmp/build5730367966331024242.tmp/wiring_analog.c.o 

...and so on...

/home/boxtec/apps/arduino-1.0.1/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom 
/tmp/build5730367966331024242.tmp/Blink.cpp.elf /tmp/build5730367966331024242.tmp/Blink.cpp.hex 
Binary sketch size: 1,084 bytes (of a 32,256 byte maximum)

In the last line above you can see the name and path of the .hex file we are looking for:


Now save this file to a convenient place, i.e. in our user home:

cp /tmp/build5730367966331024242.tmp/Blink.cpp.hex ~/

Step 2: Script for autoprogramming

The exact usage of avrdude is beyond the scope of this document, please check this fine howto from Lady Ada for more info on avrdude.

The script that automatically uploads the .hex file which we copied to our home in Step 1 is below, save it to i.e. /usr/local/sbin/ with the following contents:

# Log connection of the board
/bin/echo "Programming new Arduino on /dev/$1, udev-action: $ACTION" | /usr/bin/logger
# Beep once to indicate start of writing
/bin/echo -e "\007" > /dev/console
# run avrdude from Arduino directoy and save output for later:
OUT=$($ARDUINO_BASE/hardware/tools/avrdude -v -C$ARDUINO_BASE//hardware/tools/avrdude.conf \
     -pm328p -carduino -P$1 -Uflash:w:$HEX_FILE 2>&1)
if [[ $? > 0 ]]; then
        /bin/echo "Error occured programming board:" | /usr/bin/logger
        /bin/echo $OUT | /usr/bin/logger
        /bin/echo -e "\007" > /dev/console
        sleep 0.5
        /bin/echo -e "\007" > /dev/console
        sleep 0.5
        /bin/echo -e "\007" > /dev/console
        sleep 0.5
        /bin/echo -e "\007" > /dev/console
        sleep 0.5
        /bin/echo -e "\007" > /dev/console
        # Beep twice to indicate that board is ready for disconnection
        /bin/echo "Board programmed, ready for disconnect." | /usr/bin/logger
        /bin/echo -e "\007" > /dev/console
        sleep 0.2
        /bin/echo -e "\007" > /dev/console

Now make the script executable with the following command:

sudo chmod 750 /usr/local/sbin/

You should now check if the script is working, connect i.e. an Arduino Uno and try running it with:

sudo /usr/local/sbin/ /dev/ttyACM0

Check your log in /var/log/messages and your Arduino to see if your code was actually uploaded as desired. If yes, you're ready for the next step.

Step 3: Create udev-rule

Udev rules are executed for matching target devices whenever such a device is connected (or disconnected). Our udev-rule shall invoke our script every time it sees an Arduino Uno somewhere on /dev/ttyACM*.

As root create /etc/udev/rules.d/58-massprogram_arduino.rules with the following contents:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341,", ATTRS{idProduct}=="0001"
KERNEL=="ttyACM*", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0001", RUN+="/usr/local/sbin/ /dev/%k"

The above rules are for an Arduino UNO, naturally you can easily adapt this for your our own board with the help of dmesg and lsusb.

Step 4: Test, save time, have more fun

You are now ready to give it a try, connect an Arduino UNO to USB and hear the beeps, 1 denotes the start, 2 the successful end. If you hear five longer beeps, something went wrong and the board wasn't successfully programmed.

It takes less than 4 seconds (!) of USB connection to program a board completely in our test setup.

arduino/arduino_massprogramming.txt · Last modified: 2013/02/24 18:34 by boxtec

zum Seitenanfang

Letzte Aktualisierung: © boxtec internet appliances · the better security products