====== Workshop: Arduino ====== ==== Der Plan ==== Eine Einführung in die Arduino Hard- und Software. ==== Was man installiert haben bzw. mitbringen sollte ==== * ein Laptop mit installierter [[http://arduino.cc/en/Main/Software|Arduino Software]] * ein mit der Software kompatibles [[http://arduino.cc/en/Main/Hardware|Arduino Board]] ==== Nützliche Dokumentation ==== * [[http://arduino.cc/en/Guide/HomePage | Getting Started]] * [[http://arduino.cc/en/Reference/HomePage| Arduino Language Reference]] * [[http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf| Atmega328 Datasheet]] * [[http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf| Arduino Duemilanove Schematics]] ==== Nützliche Scripts ==== UDEV Script damit für das eigene Arduino Board immer /dev/arduino angelegt wird. Eine Datei mit dem Namen ''50-arduino.rules'' im Verzeichnis ''/etc/udev/rules.d'' anlegen. # ardiuno rules # SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{serial}=="A6008hTA", SYMLINK+="arduino", OWNER="equinox", GROUP="equinox" Wobei ''OWNER'' und ''GROUP'' entweder weggelassen werden kann oder durch den eigenen Benutzer und Gruppe ersetzt werden. Ausserdem muss das Feld ''ATTRS{serial}'' mit der Seriennummer des eigenen Arduino ersetzt werden. Die Seriennummer kann wie folge bestimmt werden. - Arduino einstecken - mittels ''dmesg'' den aktuellen Device namen herausfinden (zb. /dev/ttyUSB0) - das Kommando ''udevadm info --name /dev/ttyUSB0 --attribute-walk | grep ATTRs{serial}'' ausführen - die erste Zeile der Ausgabe des obigen Scripts enthält die richtie Seriennnummer Nach dem anlegen der UDEV Regeln muss udev neu gestartet werden. # /etc/init.d/udev reload === Seriellen Port reseten === Ein kleines Programm, um einen Arduino zu reseten. Funktionsweise: Auf den Duemilanove und anderen Boards ist die DTR-Leitung über eine Kondenstaor mit dem Reset-Pin verbunden. Wird die Leitung für 100ms auf low gezogen, enstehen ein negativer und eine positiver Spannungspuls, die ausreichen, das Reset durchzführen. Das passiert beim Anstecken, oder aber wenn folgendes Programm ausgeführt wird: #include #include #include #include #include #include #include #define STATE_OFF 0 #define STATE_ON 1 void setDTRState (int fd, int state) { int flags; ioctl(fd, TIOCMGET, &flags); flags = (state == STATE_ON ? flags | TIOCM_DTR : flags & ~TIOCM_DTR); ioctl(fd, TIOCMSET, &flags); } int main(int argc, char* argv[]) { char* device = argc < 2 ? "/dev/ttyUSB0" : argv[1]; int fd = open(device, O_RDWR); if (fd == 0) { fprintf(stderr, "Could not open %s\n", device); return EXIT_FAILURE; } setDTRState(fd, STATE_ON); struct timeval sleeptime = {0, 100000}; // 100ms select(0, NULL, NULL, NULL, &sleeptime); setDTRState(fd, STATE_OFF); sleeptime.tv_sec = 0; sleeptime.tv_usec = 100000; select(0, NULL, NULL, NULL, &sleeptime); setDTRState(fd, STATE_ON); close(fd); return EXIT_SUCCESS; } Compilieren mit gcc reset_tty.c -o reset_tty Damit wird das Flashen des Arduino um einiges leichter: Statt make upload und wie ein Haftlmacher aufpassen wann der Reset-Button, jetzt neu; reset_tty; make upload und zurücklehnen === Besipiel: Lauflicht === Je eine LED auf Pin 2 bis 7 schalten. **Achtung: Alle Anoden gemeinsam auf +5V legen!** Die Anoden der LEDs werden auf +5V gelegt, zum Einschalten der LED muss der entsprechende PIN deshalb auf LOW gesetzt werden. #define LEDS_OFF 0xFC #define LEDS_ON 0x00 #define LEDS_INIT 0xF8 #define INTERVALL 50 byte counter; byte direction; void setup(){ pinMode(13, OUTPUT); digitalWrite(13, LOW); counter = 0; direction = 1; DDRD = 0xFC; PORTD = LEDS_INIT; } byte led_table(byte led){ switch(led){ case 0: return LEDS_INIT; case 1: return 0xF4; case 2: return 0xEC; case 3: return 0xDC; case 4: return 0xBC; case 5: return 0x7C; } } byte get_next_state(){ if(counter == 5) direction = 0; else if(counter == 0) direction = 1; return (direction)?(led_table(++counter)):(led_table(--counter)); } byte get_next_state_oneway(){ counter++; counter %= 6; return led_table(counter); } void loop(){ PORTD = get_next_state(); //PORTD = get_next_state_oneway(); delay(INTERVALL); } ---- {{tag>workshop vortrag}}