Difference between revisions of "Arduino"
m (→Documentation) |
|||
Line 146: | Line 146: | ||
Version 5.8 |
Version 5.8 |
||
So apparently we need absolutely to use the special arduino version. |
So apparently we need absolutely to use the special arduino version. |
||
+ | ==Blink blink== |
||
+ | Here is a first little project. |
||
+ | <br>It is using two libraries |
||
+ | * http://www.arduino.cc/playground/Code/Metro |
||
+ | * http://www.arduino.cc/playground/Code/LED |
||
+ | <source lang=c> |
||
+ | |||
+ | #include <Metro.h> |
||
+ | #include <LED.h> |
||
+ | |||
+ | LED LED_CircleA = LED(3); |
||
+ | LED LED_CircleB = LED(5); |
||
+ | LED LED_CircleC = LED(6); |
||
+ | Metro METRO_Circle = Metro(100); |
||
+ | int State_Circle = 0; |
||
+ | struct Steps_Circle_t { |
||
+ | int CircleA,CircleB,CircleC; |
||
+ | }; |
||
+ | struct Steps_Circle_t Steps_Circle[] = {{0xFF,0,0x80},{0x80,0xFF,0},{0,0x80,0xFF}}; |
||
+ | int Steps_Circle_size = 3; |
||
+ | |||
+ | LED LED_Left = LED(0); |
||
+ | LED LED_Middle = LED(1); |
||
+ | LED LED_Right = LED(2); |
||
+ | Metro METRO_Box = Metro(400); |
||
+ | int State_Box = 0; |
||
+ | struct Steps_Box_t { |
||
+ | int Left,Middle,Right; |
||
+ | }; |
||
+ | struct Steps_Box_t Steps_Box[] = {{0,0,0},{0,1,0}, |
||
+ | {0,0,0},{1,1,1}, |
||
+ | {0,0,0},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1}, |
||
+ | {0,0,0},{1,0,0},{1,1,0},{1,1,1}, |
||
+ | {1,1,1},{1,1,1}, |
||
+ | {0,0,0},{1,1,1}, |
||
+ | {0,0,0},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1}, |
||
+ | }; |
||
+ | int Steps_Box_size = 26; |
||
+ | |||
+ | LED LED_B = LED(8); |
||
+ | LED LED_R = LED(9); |
||
+ | LED LED_U = LED(10); |
||
+ | LED LED_C = LED(11); |
||
+ | LED LED_O = LED(12); |
||
+ | LED LED_N = LED(13); |
||
+ | Metro METRO_Brucon = Metro(400); |
||
+ | int State_Brucon = 0; |
||
+ | struct Steps_Brucon_t { |
||
+ | int B,R,U,C,O,N; |
||
+ | }; |
||
+ | struct Steps_Brucon_t Steps_Brucon[] = {{0,0,0,0,0,0},{1,1,1,1,1,1}, |
||
+ | {0,0,0,0,0,0},{1,1,1,1,1,1}, |
||
+ | {0,0,0,0,0,0},{1,0,0,0,0,0},{0,1,0,0,0,0},{0,0,1,0,0,0},{0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1}, |
||
+ | {0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}, |
||
+ | {1,1,1,1,1,1},{0,0,0,0,0,0}, |
||
+ | {0,0,0,0,0,0},{1,1,1,1,1,1}, |
||
+ | {0,0,0,0,0,0},{1,0,0,0,0,0},{1,1,0,0,0,0},{1,1,1,0,0,0},{1,1,1,1,0,0},{1,1,1,1,1,0},{1,1,1,1,1,1}, |
||
+ | }; |
||
+ | int Steps_Brucon_size = 26; |
||
+ | |||
+ | void setup() { |
||
+ | } |
||
+ | |||
+ | void loop() |
||
+ | { |
||
+ | if (METRO_Circle.check()) { |
||
+ | LED_CircleA.setValue(Steps_Circle[State_Circle].CircleA); |
||
+ | LED_CircleB.setValue(Steps_Circle[State_Circle].CircleB); |
||
+ | LED_CircleC.setValue(Steps_Circle[State_Circle].CircleC); |
||
+ | if (++State_Circle == Steps_Circle_size) |
||
+ | State_Circle = 0; |
||
+ | } |
||
+ | if (METRO_Box.check()) { |
||
+ | LED_Left.setValue (Steps_Box[State_Box].Left * 0xFF); |
||
+ | LED_Middle.setValue(Steps_Box[State_Box].Middle * 0xFF); |
||
+ | LED_Right.setValue (Steps_Box[State_Box].Right * 0xFF); |
||
+ | if (++State_Box == Steps_Box_size) |
||
+ | State_Box = 0; |
||
+ | } |
||
+ | if (METRO_Brucon.check()) { |
||
+ | LED_B.setValue(Steps_Brucon[State_Brucon].B * 0xFF); |
||
+ | LED_R.setValue(Steps_Brucon[State_Brucon].R * 0xFF); |
||
+ | LED_U.setValue(Steps_Brucon[State_Brucon].U * 0xFF); |
||
+ | LED_C.setValue(Steps_Brucon[State_Brucon].C * 0xFF); |
||
+ | LED_O.setValue(Steps_Brucon[State_Brucon].O * 0xFF); |
||
+ | LED_N.setValue(Steps_Brucon[State_Brucon].N * 0xFF); |
||
+ | if (++State_Brucon == Steps_Brucon_size) |
||
+ | State_Brucon = 0; |
||
+ | } |
||
+ | } |
||
+ | </source> |
Revision as of 01:12, 12 October 2009
So after the Arduino workshop at BruCON 2009 (pics here), I was seduced by this little development board.
Links
boards & clones
Duemilanove (SmartProjects)
The Duemilanove automatically selects the appropriate power supply (USB or external power), eliminating the need for the power selection jumper found on previous boards. It also adds an easiest to cut trace for disabling the auto-reset, along with a solder jumper for re-enabling it.
based on the ATmega168, latest versions are based on ATmega328p
Clones:
- Roboduino
Decimilia (SmartProjects)
Version before Duemilanove, with a jumper to select the power supply (USB or external power)
based on the Atmega168, can be upgraded with a ATmega328
Clones:
- Freeduino V1.16 Board
- Freeduino MaxSerial
- HACEduino "2009"
- Fino168 USB Board
- with a DIP switch to disable auto-reset and D13 LED
- Duino168 Serial Board
- with a DIP switch to disable auto-reset and D13 LED
- Duino328 Serial Board
- with a DIP switch to disable auto-reset and D13 LED
Lilypad (SparkFun)
based on the ATmega168V on v03 (the low-power version of the ATmega168) or the ATmega328V on v04
Pro (SparkFun)
based on the ATmega168 or ATmega328. The Pro comes in both 3.3V / 8 MHz and 5V / 16 MHz versions. It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a battery power jack, a power switch, a reset button, and holes for mounting a power jack, an ICSP header, and pin headers. A six pin header can be connected to an FTDI cable or Sparkfun breakout board to provide USB power and communication to the board.
The Arduino Pro is intended for semi-permanent installation in objects or exhibitions. The board comes without pre-mounted headers, allowing the use of various types of connectors or direct soldering of wires. The pin layout is compatible with Arduino shields. The 3.3V versions of the Pro can be powered with a battery.
Pro Mini (SparkFun)
based on the ATmega168. It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, an on-board resonator, a reset button, and holes for mounting pin headers. A six pin header can be connected to an FTDI cable or Sparkfun breakout board to provide USB power and communication to the board.
The Arduino Pro Mini is intended for semi-permanent installation in objects or exhibitions. The board comes without pre-mounted headers, allowing the use of various types of connectors or direct soldering of wires. The pin layout is compatible with the Arduino Mini.
There are two version of the Pro Mini. One runs at 3.3V and 8 MHz, the other at 5V and 16 MHz.
Nano (Gravitech)
small, complete, and breadboard-friendly board based on the ATmega328 (Arduino Nano 3.0) or ATmega168 (Arduino Nano 2.x). It has more or less the same functionality of the Arduino Duemilanove, but in a different package. It lacks only a DC power jack, and works with a Mini-B USB cable instead of a standard one
Clones:
- DFRoduino Nano
- HACEduino 2009 Nano
Mini (SmartProjects)
based on the ATmega168
the smallest of the serie. It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 8 analog inputs, and a 16 MHz crystal oscillator. It can be programmed with the Mini USB adapter or other USB or RS232 to TTL serial adapter.
Mega (SmartProjects)
based on the ATmega1280
54 Digital I/O Pins (of which 14 provide PWM) / 16 Analog Input Pins
Other clones
- iDuino, a breadboardable version
Officials
- Arduino official website
Documentation
Hardware
Shopping
Ethernet
LCD
- Tutorial with LiquidCrystal library, for Hitachi HD44780 compatible LCDs
Misc links to explore
Arduino and Linux
Installation
Main instructions are here
As I'm using a Debian AMD 64bit, here is what I did:
Installing java from Sun and making sure it will be called by the tools. It might be that other java suites are working but at least java-gcj is missing a GtkLookAndFeel component that Arduino GUI is using
So if you don't have it yet:
aptitude install sun-java6-jre
Then if it's not the one by default, change it: (maybe "java" is enough but let's be consistent)
update-alternatives --config java update-alternatives --config jar update-alternatives --config keytool update-alternatives --config orbd update-alternatives --config rmid update-alternatives --config rmiregistry update-alternatives --config serialver
Other dependencies:
aptitude install avr-libc gcc-avr
Arduino tools, here v0017:
wget http://arduino.googlecode.com/files/arduino-0017.tgz tar xzf arduino-0017.tgz
Arduino tools are coming only for 32bit but it contains only a few executables so let's install the 64bit version of those executables
aptitude install librxtx-java rm arduino-0017/lib/librxtxSerial.so
There is also the avrdude binary in arduino-0017 which is compiled as 32bit executable.
You can recompile it from the source or if you have the ia32-libs package, the 32bit binary provided will work out-of-the-box.
But in any ways, DON'T USE AVRDUDE FROM YOUR DISTRO! because the one provided with the Arduino tools is a patched version.
Now let's try to launch the script arduino-0017/arduino
Tools/SerialPort/"/dev/ttyUSB0" Tools/Board/"Arduino Diecimila, Duemilanove or Nanoe, w/ Atmega168"
Now trying the very first code:
See this tuto
Problem with the original avrdude
As I told in the previous section, don't use the avrdude coming with your distro. Initially this is what I did and here are the problems I faced:
aptitude install avrdude avrdude-doc cd arduino-0017/hardware/tools mv avrdude avrdude.disabled mv avrdude.conf avrdude.conf.disabled ln -s /usr/bin/avrdude ln -s /etc/avrdude.conf
DON'T USE AVRDUDE FROM YOUR DISTRO! Then when trying to upload the bin to the board (menu -> Upload to I/O board), I got the following message:
Binary sketch size: 896 bytes (of a 14336 byte maximum) avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check.
Then I tried to inject the -F option to avrdude, it flashed the chip, gave me still errors:
Wrong microcontroller found. Did you select the right board in the Tools > Board menu? avrdude: Yikes! Invalid device signature. avrdude: Expected signature for ATMEGA168 is 1E 94 06
But the code was apparently correctly uploaded to the board as I got my blinking LED...
Avrdude which is part of the arduino-0017 release is a patched version as it says:
Version 5.4-arduino
While the version in Debian Squeeze is:
Version 5.8
So apparently we need absolutely to use the special arduino version.
Blink blink
Here is a first little project.
It is using two libraries
#include <Metro.h>
#include <LED.h>
LED LED_CircleA = LED(3);
LED LED_CircleB = LED(5);
LED LED_CircleC = LED(6);
Metro METRO_Circle = Metro(100);
int State_Circle = 0;
struct Steps_Circle_t {
int CircleA,CircleB,CircleC;
};
struct Steps_Circle_t Steps_Circle[] = {{0xFF,0,0x80},{0x80,0xFF,0},{0,0x80,0xFF}};
int Steps_Circle_size = 3;
LED LED_Left = LED(0);
LED LED_Middle = LED(1);
LED LED_Right = LED(2);
Metro METRO_Box = Metro(400);
int State_Box = 0;
struct Steps_Box_t {
int Left,Middle,Right;
};
struct Steps_Box_t Steps_Box[] = {{0,0,0},{0,1,0},
{0,0,0},{1,1,1},
{0,0,0},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},
{0,0,0},{1,0,0},{1,1,0},{1,1,1},
{1,1,1},{1,1,1},
{0,0,0},{1,1,1},
{0,0,0},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,1,1},
};
int Steps_Box_size = 26;
LED LED_B = LED(8);
LED LED_R = LED(9);
LED LED_U = LED(10);
LED LED_C = LED(11);
LED LED_O = LED(12);
LED LED_N = LED(13);
Metro METRO_Brucon = Metro(400);
int State_Brucon = 0;
struct Steps_Brucon_t {
int B,R,U,C,O,N;
};
struct Steps_Brucon_t Steps_Brucon[] = {{0,0,0,0,0,0},{1,1,1,1,1,1},
{0,0,0,0,0,0},{1,1,1,1,1,1},
{0,0,0,0,0,0},{1,0,0,0,0,0},{0,1,0,0,0,0},{0,0,1,0,0,0},{0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1},
{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},
{1,1,1,1,1,1},{0,0,0,0,0,0},
{0,0,0,0,0,0},{1,1,1,1,1,1},
{0,0,0,0,0,0},{1,0,0,0,0,0},{1,1,0,0,0,0},{1,1,1,0,0,0},{1,1,1,1,0,0},{1,1,1,1,1,0},{1,1,1,1,1,1},
};
int Steps_Brucon_size = 26;
void setup() {
}
void loop()
{
if (METRO_Circle.check()) {
LED_CircleA.setValue(Steps_Circle[State_Circle].CircleA);
LED_CircleB.setValue(Steps_Circle[State_Circle].CircleB);
LED_CircleC.setValue(Steps_Circle[State_Circle].CircleC);
if (++State_Circle == Steps_Circle_size)
State_Circle = 0;
}
if (METRO_Box.check()) {
LED_Left.setValue (Steps_Box[State_Box].Left * 0xFF);
LED_Middle.setValue(Steps_Box[State_Box].Middle * 0xFF);
LED_Right.setValue (Steps_Box[State_Box].Right * 0xFF);
if (++State_Box == Steps_Box_size)
State_Box = 0;
}
if (METRO_Brucon.check()) {
LED_B.setValue(Steps_Brucon[State_Brucon].B * 0xFF);
LED_R.setValue(Steps_Brucon[State_Brucon].R * 0xFF);
LED_U.setValue(Steps_Brucon[State_Brucon].U * 0xFF);
LED_C.setValue(Steps_Brucon[State_Brucon].C * 0xFF);
LED_O.setValue(Steps_Brucon[State_Brucon].O * 0xFF);
LED_N.setValue(Steps_Brucon[State_Brucon].N * 0xFF);
if (++State_Brucon == Steps_Brucon_size)
State_Brucon = 0;
}
}