For all the usual reasons, I’d like to compile & download Arduino programs from the command line, rather than through the (excellent!) IDE. That is supposed to work and, for most folks, apparently it does.
Not here, alas.
I’ve installed the 0012 Arduino Java IDE (x86 or x86_64 as appropriate) from http://code.google.com/p/arduino/ on three different systems, all with Kubuntu 8.04:
- Dell Dimension 9150 – x86_64, which seemed like a good idea at the time
- Dell Inspiron E1405
- Dell Inspiron 8100
In all cases the IDE works perfectly, compiles & downloads programs just fine, and behaves exactly as you’d expect. I had a few minor quibbles with sorting out various paths & suchlike, but, on the whole, it has no troubles at all with either a Diecimila or a Sparkfun Arduino Pro (with a Sparkfun FTDI Basic USB gizmo).
I tweaked ~/.arduino/preferences.txt to include:
console.auto_clear=false
build.verbose=true
upload.verbose=true
Here’s the final step in the IDE compile-and-download dance. Backslashes indicate continuations of the same line; the original is all on single line:
hardware/tools/avrdude -Chardware/tools/avrdude.conf -v -v -v -v -pm168
-cstk500v1 -P/dev/ttyUSB0 -b19200 -D
-Uflash:w:/mnt/bulkdata/Above the Ground Plane/
2009-06 Solar Data Logger/Firmware/Logger/applet/Logger.hex:i
avrdude: Version 5.4-arduino, compiled on Oct 22 2007 at 13:15:12
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
System wide configuration file is "hardware/tools/avrdude.conf"
User configuration file is "/home/ed/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyUSB0
Using Programmer : stk500v1
Overriding Baud Rate : 19200
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
AVR Part : ATMEGA168
The IDE evidently does the reset-from-USB trick through the standard USB hardware.
I set up the command-line Makefile from http://www.arduino.cc/en/Hacking/CommandLine, although that’s for the 0011 IDE, then made the recommended tweaks. The make section does exactly what you’d expect: compiles the source program.
Running make upload fails every time, on every PC, with both boards. Indeed, in all cases, running avrdude on the command line produces the dreaded “not in sync” errors, showing that it’s unable to communicate with the Arduino board. Blipping the reset button on the Arduino board generally makes the USB transfer work fine, with the failures most likely due to my lack of dexterity & timing precision.
The usual debugging suggestions aren’t relevant, as they all assume there’s a basic communication failure caused by anything from a completely dead board to mysterious library incompatibilities. In this case, however, I have an existence theorem: the IDE works perfectly before and after the command-line failure.
It turns out that the IDE includes a specially patched avrdude, so I tried running that version from the directory where the IDE lives, using exactly the same command-line flags as the IDE does. Surprisingly, that doesn’t work. Again, backslashes indicate continuations of the same line and I added quotes to the file name to protect the blanks…
hardware/tools/avrdude -Chardware/tools/avrdude.conf -v -v -v -v -pm168
-cstk500v1 -P/dev/ttyUSB0 -b19200 -D
-Uflash:w:"/mnt/bulkdata/Above the Ground Plane/
2009-06 Solar Data Logger/Firmware/Logger/applet/Logger.hex":i
avrdude: Version 5.4-arduino, compiled on Oct 22 2007 at 13:15:12
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
System wide configuration file is "hardware/tools/avrdude.conf"
User configuration file is "/home/ed/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyUSB0
Using Programmer : stk500v1
Overriding Baud Rate : 19200
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Recv: . [1e]
avrdude: stk500_getsync(): not in sync: resp=0x1e
avrdude: Send: Q [51] [20]
avrdude: Recv: . [0f]
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x0f
There’s no difference between the /opt/arduino/lib/librxtxSerial.so and /usr/lib/librxtxSerial.so libraries, which normally causes some confusion on x86_64 systems. I think that means the x86_64 version of the IDE has the correct library.
I’ve also tried the stock Kubuntu avrdude, which is at V 5.5, to no avail.
Given that the IDE works, that I’m running the same avrdude executable, and that the libraries match, I’m not sure where to go from here.
While I’m generally dexterous enough to run make upload and blip the Arduino board’s reset button with my other hand, I’m bringing up a shield-like board that plugs atop the Arduino and, alas, lacks both a reset button and a hole over the Arduino’s button.
The board is, of course, that one.
Update: As a reasonable workaround, I’ve set the IDE up to use an external editor. Then I can tweak the programming, flip to the IDE, click the Download button, and away it goes. Not quite as easy as a full command-line solution, but close enough.