Differences

This shows you the differences between two versions of the page.

Link to this comparison view

workshop:arduino [2009-06-24 00:38]
equinox
workshop:arduino [2015-09-16 12:41]
Line 1: Line 1:
-====== 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. ​ 
- 
-<​code>​ 
-# ardiuno rules 
-# 
- 
-SUBSYSTEMS=="​usb",​ KERNEL=="​ttyUSB*",​ ATTRS{serial}=="​A6008hTA",​ SYMLINK+="​arduino",​ OWNER="​equinox",​ GROUP="​equinox"​ 
-</​code>​ 
- 
-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. ​ 
- 
-<​code>​ 
-# /​etc/​init.d/​udev reload 
-</​code>​ 
- 
-=== 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: 
-<​code>​ 
-#include <​stdlib.h>​ 
-#include <​termios.h>​ 
-#include <​fcntl.h>​ 
-#include <​sys/​ioctl.h>​ 
-#include <​time.h>​ 
-#include <​stdio.h>​ 
- 
-#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[]) 
-{ 
-  int fd; 
-  const struct timespec sleeptime = {0, 100000000}; // 100ms 
-  char* device = argc < 2 ? "/​dev/​ttyUSB0"​ : argv[1]; 
- 
-  fd = open(device,​ O_RDWR); 
-  if (fd == 0) { 
-    fprintf(stderr,​ "Could not open %s\n", device); 
-    return EXIT_FAILURE;​ 
-  } 
-  ​ 
-  setDTRState(fd,​ STATE_ON); 
-  nanosleep(&​sleeptime,​ NULL); 
-  setDTRState(fd,​ STATE_OFF); 
-  nanosleep(&​sleeptime,​ NULL); 
-  setDTRState(fd,​ STATE_ON); 
-  close(fd); 
- 
-  return EXIT_SUCCESS;​ 
-} 
-</​code>​ 
-Compilieren mit 
-<​code>​gcc reset_tty.c -o reset_tty</​code>​ 
- 
-Damit wird das Flashen des Arduino um einiges leichter: 
-Statt <​code>​make upload</​code>​ und wie ein Haftlmacher aufpassen wann der Reset-Button,​ jetzt neu; 
-<​code>​reset_tty;​ make upload</​code>​ 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. 
- 
-<​code>​ 
-#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);​ 
- 
-} 
- 
-</​code>​ 
- 
----- 
-{{tag>​workshop vortrag}} 
realraum Graz, Brockmanngasse 15, 8010 Graz, realraum - Verein für Technik in Kultur und Gesellschaft
  • /var/lib/dokuwiki/data/pages/workshop/arduino.txt
  • Last modified: 2015-09-16 12:41
  • (external edit)