Arduino Cheat Sheet
© Silvia Rothen, rothen ecotronics, Schweiz
Autorin: Dr. Silvia Rothen, rothen ecotronics, Bern, Schweiz
Letzte Überarbeitung:
15.05.18
Diese Dokumentation ist schon lange über das A4-Mass eines Cheat Sheets hinausgewachsen. Es handelt sich eher um eine umfassende Dokumentation zu allem, was ich im Zusammenhang mit Arduino, physical computing und Elektronikbasteleien nützlich finde.
Inhaltsverzeichnis
- Was ist Arduino?
- Hardware
- Formeln, Schaltungen und elektrische Grundlagen
- Programmiersprache
- Warnungen, Tipps und Tricks
- Weitere Hilfsmittel
- Begriffe / Glossar / Übersetzungen
- Datenblätter
- Links und Quellen
Was ist Arduino?
Arduino ist ein Board, das einen Mikrocontroller, d.h. einen Minicomputer, mit Schnittstellen für Sensoren und Aktoren kombiniert. Das Board lässt sich via USB-Port an einen Computer anschliessen und von dort aus mit der Arduino-Entwicklungsumgebung in einer C-ähnlichen Sprache programmieren. Damit ist es möglich, rasch Prototypen von elektronischen Geräten zu bauen.
Hardware
Das Arduino-Board
Mein Board, ein Arduino Uno R3, besteht aus den folgenden Komponenten:
- Microcontroller ATmega328P (der grosse, schwarze, rechteckige Chip längs neben den analogen Pins)
- USB-Port und ATmega16U2 Chip (USB-to-serial,
das kleine schwarze Quadrat unterhalb des USB-Anschlusses): Der USB-Anschluss dient zum Hochladen von Programmen, zur
Übertragung von Daten, z.B. von Sensoren, an die serielle Schnittstelle des
Computers
Achtung: Bei den normalen Arduino-Modellen handelt sich nicht um einen echten USB-Anschluss, sondern um eine serielle Schnittstelle mit einem USB-Stecker - 16 MHz Uhrenquarz als Taktgeber für den USB-Anschluss (das ovale metallische Teil nahe dem USB-Anschluss)
- 16 MHz Keramikresonator als Taktgeber für den Chip (das winzige metallische Rechteck neben dem Atmega-Chip)
- 2 Elektrolytkondensatoren C2 47 μF/16V (die metallenen Tönnchen unterhalb des Stromanschlusses)
- ICSP Header: 6 Pins, um Shields wie den Ethernet-Shield via SPI-Bus mit dem Board zu verbinden (6 Anschlüsse auf der entgegengesetzten Seite des USB-Anschlusses)
- Strom- oder Batterieanschluss (9V-Batterie)
- 5V-Regler (das schwarze Rechteck neben dem Stromanschluss)
- 3.3V-Regler LP2985 (das kleine schwarze Rechteck neben den zwei Elektrolytkondensatoren)
- Reset-Button (roter Knopf in der Ecke neben dem USB-Anschluss)
- digitale Pins: Anschlüsse für digitale Sensoren, z.B. für Temperatur,
Feuchtigkeit, Licht, oder Aktoren (z.B. LEDs oder Motoren),
- 2 serielle: 0 RX Empfang, 1 TX Transmit
- 2 externe Interrupts: 2 und 3
- 6 Pins für PWM: 3, 5, 6, 9, 10, 11
- 4 Pins für SPI: 10 SS, 11 MOSI, 12 MISO, 13 SCK
- 1 Pin für eingebautes LED: 13
- analoge Pins: 6 Anschlüsse für analoge Sensoren oder Aktoren, Auflösung 10 Bits, d.h. Werte von 0 bis 1023
- weitere Pins
- AREF: Referenzspannung für analoge Inputs (siehe analogReference)
- RESET: auf LOW setzen, um Arduino zu resetten, Ersatz für den Reset-Button, falls dieser von einem Shield überdeckt wird
- 3 LEDs zur Anzeige
- RX: Datenempfang von serieller Schnittstelle
- TX: Datenversand an serielle Schnittstelle
- L: LED 13
Eine gute Erläuterung der Komponenten auf dem UNO-Board findet man bei Lady Ada.
Wer viele Anschlüsse benötigt, sollte gleich zum MEGA 2560 greifen, diese Variante kommt mit über 50 Anschlüssen daher.
Die Stromversorgung erfolgt über den USB-Anschluss mit 5V und bis zu 0.5 Ampere oder über die externe Stromversorgung mit einer 9V-Batterie oder einem Netzteil mit 9 bis 12Volt und 0.5 bis 1 Ampere. Die Polung der 2.1mm-Buchse ist beim Arduino innen Plus, aussen Minus, siehe http://www.arduino-tutorial.de/2010/06/netzteil/. Bei 5V gibt es pro I/O-Pin 40 mA Strom.
Steckbretter / Breadboards
Natürlich kann man für einfache Schaltungen Arduino direkt mit den entsprechenden Komponenten verkabeln. Oder man kann seine Komponenten auf Leiterplatten verlöten. Wenn man aber mit Arduino vor allem experimentieren und Prototypen von Geräten zusammenstecken möchte, dann ist ein Steckbrett oder englisch Breadboard am komfortabelsten. Ein Steckbrett ist nichts anderes als eine Platte mit vielen Löchern, die mit Leiterbahnen verbunden sind. Dadurch kann man seine Schaltungen zusammenstecken, das heisst Komponenten und die Verbindungskabel verkabeln. Dazu muss man natürlich wissen, wie die Leiterbahnen im Breadboard verlaufen. Im Normalfall findet man links und rechts je 2 vertikale Bahnen, die für den Anschluss von Strom und Masse dienen, sowie dazwischen 2 Sets von horizontalen Reihen, in die man seine Komponenten und Kabelanschlüsse steckt.
Komponenten
Ohne Komponenten kann man mit Arduino noch nicht viel anfangen. Zwar gibt es auf dem Board ein integriertes LED an Pin 13, so dass man zumindest mit einem ersten Programm ein LED zum Blinken bringen kann (man findet es in der Entwicklungsumgebung unter Examples - Blink).
Wer ein konkretes Projekt hat, kann sich die Komponenten im Elektronikfachhandel oder in einem der zahlreichen Online-Shops einzeln zusammenkaufen. Für Experimente ist es aber praktischer, sich eines der Experimentier-Kits anzuschaffen, die zu Arduino angeboten werden, da man damit schon einen Satz an Sensoren, Aktoren und Kabelverbindungen zum Starten hat. Es gibt zahlreiche Anbieter für solche Kits, u.a. auch Verlage, die das Kit in Kombination mit einem Buch anbieten (im deutschsprachigen Raum z.B. Franzis).
Sensoren
Sensoren messen einen Wert in der realen Welt und liefern diesen als Input an Arduino zurück. Der Wert kann binär (kein Strom oder Strom d.h. 0 oder 1), PWM (Pulse Width Modulation 0 bis 255) oder analog (0 bis 1023) sein.
Infrarotempfänger
Ein Infrarotempfänger dekodiert den Output von Infrarot-Fernbedienungen, wie sie bei Geräten wie TVs eingesetzt werden. Das vorliegende Modell ist ein VS1838B, bei anderen Modellen ändert sich u.U. die Anordnung der Beinchen, aber ansonsten bleibt der Bestückungsplan derselbe.
Bestückungsplan:
Piezo-Summer als Erschütterungssensor
Ein Piezo-Summer wird normalerweise als Aktor verwendet, um Töne zu erzeugen. In Kombination mit einem hohen Widerstand von 1 Megaohm lässt sich die Wirkung aber auch umdrehen: Das Piezo-Element fungiert nun als Sensor für Erschütterungen und laute Töne. Das Lichtobjekt "Les Fleurs du Mal" macht auf diese Weise von einem Summer gebrauch.
Bestückungsplan:
Photowiderstand
Ein Widerstand, der auf Licht reagiert und deshalb zur Helligkeitsmessung eingesetzt werden kann.
Bestückungsplan:
Aktoren
Aktoren wandeln die elektrischen Impulse, die sie vom Arduino erhalten, in eine Aktion um: LEDs leuchten, Motoren drehen sich, Servomotoren nehmen eine bestimmte Position ein.
4 Digit 7 Segment LED Display
Solche LED-Displays mit 4 Zeichen gibt es unzählige, deshalb unbedingt Pins zählen und das Datenblatt durchsehen. Beim vorliegenden Display handelt es sich um ein multiplexed Display mit 12 Pins und common cathode vom Typ LN3461AS2B. Ein vollständiges Tutorial mit Code findet sich in meinem Blog. Das Display wird übrigens am Besten vertikal in die zwei mittleren Reihen des Steckbretts gesteckt, das konnte ich aus Platzgründen im Bestückungsplan nicht abbilden. Die Beinchen der Pins sind übrigens zu dünn für den Female-Anschluss eines Jumperkabels, also bleibt nur Löten oder Steckbrett.Komponenten:
- multiplexed 4 Digit 7 Segment LED Display LN3461AS2B
- Steckbrett
- 4 Widerstände ca. 330 bis 680 Ohm
- mindestens 12 Jumperkabel
Gleichstrommotor
Ein Gleichstrommotor benötigt auch in der Spielzeugversion im Normalfall mehr Strom, als ein Pin des Arduino liefern kann. Deshalb wird ein NPN-Transistor als Schalter eingesetzt, um mit einem geringen Strom am Base-Pin des Transistors den stärkeren Strom für den Motor zu steuern. Zwischen Base-Pin und Arduino-Pin kommt zum Schutz des Transistors ein Widerstand, im aktuellen Fall von 2.2 kOhm. Die Diode wiederum schützt alle Komponenten (insbesondere den Arduino) vor den Induktionsströmen, die entstehen, wenn die Stromzufuhr des Motors unterbrochen wird und das Magnetfeld im Motor zusammenbricht.
In meinem Blog finden sich die folgenden Tutorials mit Gleichstrommotoren:
- "HBridge mit DPDT-Relay" zeigt, wie man die Laufrichtung des Motors mit einem Relay ändern kann.
- In "Motor über serielle Schnittstelle steuern" zeige ich, wie man die Laufgeschwindigkeit des Motors aus der seriellen Schnittstelle einlesen kann
LED
LED steht für light-emitting diode oder Leuchtdiode. LEDs gibt es in diversen Farben, die gängigsten sind grün und rot.
Bestückungsplan:
RGB-LED
Eine RGB-LED ist eine Leuchtdiode, bei der die Farben Rot, Grün und Blau so gemischt werden, dass damit ein Grossteil des Farbspektrums abgebildet werden kann. Es gibt Anoden- und Kathoden-RGB-LED.
- Anoden-RGB-LED: Anode mit Stromanschluss verbinden,
die 3 Farb-Beinchen mit je einem Widerstand und die Widerstände wiederum mit
3 PWM-Pins von Arduino verkabeln. Die Pins dienen damit als Masse, d.h.
ein Wert LOW oder 0 lässt die jeweilige Farbe leuchten, ein Wert 255
oder HIGH schaltet dagegen die Farbe ab!
Datenblatt / Bezugsadresse Schweiz - Kathoden-RGB-LED: Gleiche Verkabelung wie oben, aber die
Kathode wird mit der Masse, d.h. GND verbunden. Bei dieser Variante
reagiert die Leuchtdiode erwartungsgemäss, d.h. HIGH oder 255 schaltet an
und LOW oder 255 schaltet aus.
Datenblatt / Bezugsquelle Schweiz
Bestückungsplan für eine Anoden-RGB-Led:
Formeln, Schaltungen und elektrische Grundlagen
Wenn man sich mit Elektronik beschäftigt, kommt man um ein paar Formeln nicht herum. Spätestens dann, wenn eine Schaltung nicht läuft, weil 40 mA aus einem Arduino-Pin nicht ausreichen, muss man sich mit ein paar Grundlagen der Elektrizitätslehre auseinandersetzen.
Ohmsches Gesetz
Diese Formel kommt immer wieder vor, z.B. wenn man Vorwiderstände für LEDs berechnen will.
Spannung U = Widerstand R * Strom I
oder in Einheiten ausgedrückt:
Volt = Ohm * Ampere
Eine Anwendung des Ohmschen Gesetzes ist die Berechnung von Vorwiderständen für LEDs. LEDs sind ja für eine bestimmte Spannung und einen bestimmten Strom ausgelegt. Wenn die Spannungsversorgung wie beim Arduino höher ist, dann muss man sie mit einem Widerstand herabsetzen, um die LED nicht zu zerstören.
Mit dem Multimeter habe ich ausgemessen, dass meine grünen LEDs für 2.16 Volt und 10.7 mA ausgelegt sind. Versorgt wird die LED mit 5V aus dem Arduino. Der Vorwiderstand muss nun mindestens so hoch sein wie die Spannungsdifferenz / Strom.
Vorwiderstand = Spannungsdifferenz / Strom
oder in Einheiten:
Ohm = Spannungsdifferenz in Volt / Ampere
266 Ohm = 2.16 V / 0.0107 A
Brücken-Gleichrichterschaltung
Eigentlich dient diese Schaltung dazu, aus Wechselstrom Gleichstrom zu machen. Meine Fragestellung war etwas anders: Wenn ich einen Gleichstrommotor als Generator in einem Windrad einsetze, kann sich Plus- und Minuspol vertauschen, wenn sich der Wind und damit die Drehrichtung des Windrads dreht. Die Kondensatoren dienen zur Glättung. Die LED zeigt an, ab Strom geliefert wird.
Es ist mir zwar nicht gelungen, die Schaltung mit Strom aus einem Windrad zu versorgen, aber sie funktioniert, das habe ich mit einer Batterie getestet, indem ich den positiven und negativen Anschluss vertauscht habe.
Quellen:
- http://www.elektronik-kompendium.de/sites/slt/0201071.htm
- Das Windradprojekt, das mich zu der Schaltung animiert hat, ist im Buch "Making Things Move - Die Welt bewegen" von Dustyn Roberts beschrieben
Programmiersprache
Das Arduino kommt mit einer eigenen Entwicklungsumgebung und einer eigenen, an C++ angelehnten Programmiersprache. Für mich als Java-Programmiererin ist das praktisch, denn die Syntax entspricht von ganz wenigen Ausnahmen abgesehen einfach Java. Ich verzichte deshalb auch auf eine Einführung der grundlegenden Elemente, denn allen Java- und C#-Entwickler/innen muss ich nicht erklären, was eine Variable ist oder wie man Verzweigungen und Schleifen programmiert. In Arduino kann man die Syntax für if und for unverändert übernehmen. Ausserdem gibt es unzählige Tutorials im Netz, die in die Grundlagen der Programmierung mit Arduino. einführen. Ich konzentriere mich deshalb auf jene Sprachelemente, die spezifisch für das Arduino-Board sind. Die Angaben zu Pins beziehen sich übrigens auf Arduino Uno R3, andere Varianten weisen z.T. mehr Pins auf.
Notwendige Methoden
void setup {...}
void loop {...}
Typen
Bei Arduino gilt, was man in den letzten Jahren in der Programmierung eher vergessen hat: "Memory matters!". Im Gegensatz zu modernen Rechnern ist Arduino nicht endlos mit Memory ausgestattet, so dass es durchaus Sinn macht, den (in Bits und Bytes) kleinstmöglichen Datentyp für eine Variable zu wählen, um das Memory zu schonen (für PWM-Pins z.B. byte).
Ganzzahltypen
Arduino UNO und ATMega | Arduino Due | ||||
Type | Vorzeichen | Anzahl Bit | Wertebereich | Anzahl Bit | Wertebereich |
byte | ohne | 8 | 0-255 | dito | dito |
short | mit | 16 | -32'768 bis 32'767 | dito | dito |
word | ohne | 16 | 0-65'535 | dito | dito |
int | mit | 16 | -32'768 bis 32'767 | 32 | -2'147'483'648 bis 2'147'483'647 |
unsigned int | ohne | 16 | 0-65'535 | 32 | 0 bis 4'294'967'295 |
long | mit | 32 | -2'147'483'648 bis 2'147'483'647 | dito | dito |
unsigned long | ohne | 32 | 0 bis 4'294'967'295 | dito | dito |
Dezimaltypen
- float: dezimale 32-Bit-Werte zwischen -3.4028235E+38 und 3.4028235E+38; Präzision nur 6-7 Stellen insgesamt (nicht nur Dezimalstellen)!
- double: unter Arduino UNO und ATMega wie float, unter Arduino Due 64-Bit
Buchstaben und Strings
Ein String kann in Arduino als 0-terminierter Char-Array oder als String-Objekt deklariert werden.
- char: einzelnes Zeichen, Wert in einfachen Anführungszeichen
char variante = 'a'; - char-Array als string
char[] titel = "Arduino"; - String-Objekt:
Objekt benötigt mehr Memory als char-Array, hat dafür aber ähnliche
Methoden, wie man sie in Java kennt, z.B. length oder indexOf.
String titel = "Arduino";
Arrays
Bei den Arrays bin ich zuerst über gewisse Differenzen zu Java gestolpert.
Arrays sind 0-basiert. Ein Array lässt sich auf verschiedene Arten deklarieren:
int myArray[3];
int myArray[] = {15, 7, 24};
int myArray[3] = {15, 7, 24};
char myArray[6] = "Hallo";
Man beachte beim letzten Beispiel, dass wegen des Endzeichens der Array Länge 6 hat, obwohl der String nur 5 Zeichen hat.
Einen Wert zuweisen:
myArray[0] = 5;
Einen Wert auslesen:
int wertRot = led[0];
Die Länge eines Arrays lässt sich mit der Funktion sizeof bestimmen. Allerdings gibt es da ein paar kleine Gemeinheiten:
- sizeof bezieht sich auf die deklarierte Länge, nicht auf die effektiv
vorhandenen Elemente im Array, d.h.
byte myArray[5];
liefert immer 5 zurück, auch wenn noch gar keine Elemente zugewiesen sind. - sizeof liefert die Länge in Bytes zurück, nicht die Anzahl
Elemente! Für einen Array mit Elementen vom Type int stellt man die Anzahl
Elemente folgendermassen fest (damit der Code zwischen Arduino UNO und Due
kompatibel ist)
anzahl = sizeof(myArray) / sizeof(int); - sizeof funktioniert nur, wenn die Deklaration im selben Bereich erfolgte! Das heisst, wenn man den Array im Hauptprogramm deklariert und anschliessend als Parameter in eine Funktion übergibt, dann lässt sich die Länge des Arrays in der Funktion nicht mehr auslesen. Man muss sie bereits als weiteren Parameter mit übergeben. Darüber bin ich gestolpert, als ich ein funktionierendes Programm aufräumen und Code in eine Funktion auslagern wollte.
Arduino kennt auch mehrdimensionale Arrays. Bei der Übergabe in eine Funktion muss man die Länge für alle Dimensionen ausser der ersten angeben.
int colorSequenceRGB[3][3] =
{{255, 0, 0}, {0, 255, 0}, {0, 0, 255}};
void playColorSequence(
int colorSequence[][3], int length) {...}
Einen Array wieder zu leeren ist gar nicht so einfach. Dazu muss man ihn mit der Funktion memset mit dem Zeichen mit dem ASCII-Wert 0 füllen. Im folgenden Code-Snippet ist incoming der Array:
memset(incoming, 0, sizeof(incoming));
Hardware ansprechen
Ausgabe an digitalen Pins
Zielsetzung: Über einen digitalen Pin etwas einschalten, z.B. ein LED-Lämpchen
Pin in Methode setup initialisieren
pinMode(pin, mode);
pin: 0 - 19, die 6 analogen Pins 0 bis 5 sind 14 - 19
mode: vordefinierte Konstanten INPUT oder OUTPUT
digitalWrite(pin, value);
pin: 0 - 13, muss zuerst mit pinMode(nr, OUTPUT) auf Output gesetzt sein
value: HIGH (5 Volt) oder LOW (Erdung)
So sieht ein ganzes Programm aus, um ein LED an Pin 13 zum Blinken zu bringen:
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH); // LED anschalten
delay(100); // eine Zehntelsekunde warten
digitalWrite(led, LOW); // LED abschalten
delay(100);
}
Einlesen von digitalen Pins
Zielsetzung: Den Zustand eines digitalen Pins einlesen, z.B. den Zustand eines Buttons oder Schalters
In setup() den Pin auf INPUT setzen:
pinMode(button1, INPUT);
Mit digitalRead wird der Wert LOW oder HIGH (oft in Kombination mit einem if-Statement) wieder ausgelesen:
if(digitalRead(button1) == LOW) {...
Ausgabe an analogen Pins
Zielsetzung: Über einen analogen oder PWM-Pin etwas auf- oder zudrehen, z.B. die Helligkeit eines LED Schritt für Schritt von 0 bis 255 erhöhen.
Pin ebenso wie für digitalen Output in Methode setup initialisieren
pinMode(led, OUTPUT);
Die Konstanten sind wie zuvor INPUT oder OUTPUT und für die Ausgabe gilt natürlich OUTPUT. Dabei muss ein analoger Pin oder einer mit PWM angegeben werden, z.B. Pin 9. Die Ausgabe erfolgt mit analogWrite, wobei der Wert für PWM-Pins zwischen 0 und 255 und für analoge Pins zwischen 0 und 1023 liegen kann.
analogWrite(led, random(0, 255));
Einlesen von analogen Pins
Pin initialisieren:
pinMode(potentiometerPin, INPUT);
Das Einlesen eines analogen Pins liefert dezimale Werte von 0 bis 1023:
potentiometerValue = analogRead(potentiometerPin);
Schnittstellen
Werte an den seriellen Monitor in der Entwicklungsumgebung ausgeben
void setup() {
Serial.begin(9600);
...
}
void loop() {
...
Serial.println(temperature)
}
Werte aus der seriellen Schnittstelle einlesen
Zuerst muss man mit Serial.available() prüfen, ob noch weitere Werte in der Warteschlange stehen und dann werden sie mit Serial.read Zeichen für Zeichen eingelesen und in einen Array of char abgefüllt.. Wird die serielle Schnittstelle im Loop ausgelesen, muss ausserdem zuerst der Array mit memset jeweils wieder gelöscht werden. Und soll der eingelesene Wert beispielsweise zur Steuerung der Umlaufgeschwindigkeit eines Motors oder der Helligkeit eines LED benutzt werden, dann ist noch atoi notwendig, um den String in einen Integer umzuwandeln.
Das folgende Codebeispiel zeigt, wie man aus der seriellen Schnittstelle einen Wert von 0 bis 255 ausliest und die Geschwindigkeit eines DC-Motors entsprechend anpasst.
int motorPin = 9; // an diesem Pin hängt der Motor
int val = 0; //zuerst steht der Motor
char incoming[4] = {}; //wegen Endzeichen
void setup() {
Serial.begin(9600); // connect to the serial port
pinMode(motorPin, OUTPUT);
}
void loop() {
int i = 0;
if (Serial.available() > 0) {
//sonst bleiben die 0 erhalten 60 -> 600
memset(incoming, 0, sizeof(incoming));
while (Serial.available() > 0
&& i < sizeof(incoming) - 1) {
incoming[i] = Serial.read();
i++;
delay(3);
}
//array of char in int wandeln
val = atoi(incoming);
//Geschwindigkeit limitieren
if (val < 0) {
val = 0;
} else if (val > 255) {
val = 255;
}
Serial.print("Umlaufgeschwindigkeit ");
Serial.println(val);
//Motorgeschwindigkeit setzen
analogWrite(motorPin, val);
}
}
Nützliche Methoden und Funktionen
Call by value / Call by reference
Standardmässig werden Argumente als Werte, d.h. call by value, in Funktionen oder Methoden übergeben. Sollen sie innerhalb der Funktion oder Methode geändert werden können, dann muss man sie als Referenzen, d.h. call by reference übergeben. In Arduino wandelt man ein Wert-Argument in eine Referenz um, indem man dem Variablen-Namen & voranstellt.
int myFunction(int &myVariable) {...}
Zeit
millis();
Funktion, Typ unsigned long, Anzahl Millisekunden seit dem Anschalten des Arduino. Ohne Reset läuft die Variable nach ca. 50 Tagen über und beginnt wieder bei 0.
delay(1000);
Wartet die angegebene Anzahl Millisekunden
Zufallswerte
Da Arduino keine echten Zufallszahlen kennt, muss man die Zufallszahlen initialisieren, um bessere Ergebnisse zu erhalten. Im Normalfall macht man diese mit dem Startwert millis():
randomSeed(millis());
int rndValue = random(100, 200);
Zufallswert zwischen Minimum und Maximum erzeugen.
Achtung: Die Untergrenze ist eingeschlossen, die Obergrenze
aber nicht, d.h. der Code oben produziert Werte von 100 bis 199.
constrain
Da PWM-Pins auf dem Arduino-Board auf Werte zwischen 0 bis 255 und für analoge Pins zwischen 0 und 1023 begrenzt sind, kann man die praktische Funktion constrain(meineVariable, Minimum, Maximum) benutzen, um zugewiesene Werte genau auf diesen Bereich zu begrenzen:
helligkeit = constrain(helligkeit, 0, 255);
Constrain funktioniert übrigens mit allen numerischen Datentypen. Alles Weitere zu constrain findet man hier.
map
Diese äusserst nützliche Funktion nimmt automatische Berechnungen von einem Wertebereich in einen anderen vor, z.B. von einer analogen Eingabe im Wertebereich 0 bis 1023 zu einem PWM-Output im Bereich 0 bis 255.
helligkeitLED = map(analogerInput, 0, 1023, 0, 255);
atoi
Wandelt einen array of char in einen Integer um, falls dies möglich ist.
val = atoi(incoming);
toCharArray
Wandelt einen String in einen Array Char um:
char time[8] = {};
int hour = 10;
String strTime = "Zeit ";
strTime += hour; //Hier erfolgt Umwandlung von int zu String
strTime.toCharArray(time, 8);
Interrupts
Interrupts sind dann nötig, wenn im Arduino-Loop ein bestimmtes Programm abläuft, dass durch gelegentliche Inputs, z.B. durch die Benutzer oder durch Sensoren, unterbrochen und verändert wird. So könnten z.B. für eine RGB-LED verschiedene Funktionen zum Farbwechsel vorhanden sein, die durch Knopfdruck vom User gewechselt werden. Für solche Unterbrechungen benötigt man Interrupts.
Das Arduino-UNO-Board hat zwei externe Interrupts:
- 0 an Pin 2
- 1 an Pin 3
Im Setup muss man eine Interrupt-Funktion mit attachInterrupt an einen dieser zwei Interrupts hängen. Das dritte Argument ist der Modus. Er kann folgende Werte annehmen:
- LOW: ausgelöst, wenn Pin LOW ist
- CHANGE: ausgelöst, wenn Pin den Wert ändert
- RISING: ausgelöst, wenn Pin von LOW zu HIGH geht
- FALLING: ausgelöst, wenn Pin von HIGH zu LOW geht
Damit Variablen in der Interrupt-Funktion und im Hauptprogramm verfügbar sind, müssen sie mit volatile deklariert werden. Alle Elemente zusammen ergeben den folgenden Code:
volatile boolean on = false;
void setup() {
...
attachInterrupt(0, change, LOW);
}
void loop() {
if (on) {
...
}
}
//this is the interrupt method
void change() {
on = !on;
}
In meinem Tutorial zur Motorensteuerung findet man ein vollständiges Code-Beispiel inklusive Bestückungsplan.
Übrigens gibt es ab Version 1.0 Probleme, wenn man versucht Serial.print in einem Interrupt zu verwenden (Quelle)!
Warnungen, Tipps und Tricks
- Bleiben Sie am Anfang bei der Stromversorgung durch den USB-Anschluss oder durch Batterien bis 9V. Das Herumspielen mit hohen Stromstärken ohne Sachverstand kann tödlich sein!
- Bei der Verkabelung von LEDs die Widerstände auf keinen Fall vergessen, sonst wird das LED grilliert!
- Mit Lithiumbatterien, die oft in Notebooks zu finden sind, sollte man nicht herumspielen. Der niedrige Innenwiderstand kann zu hohen Stromstärken führen.
- Komponenten, die für 3.3 Volt ausgelegt sind, können durch den Anschluss am 5V-Pin zerstört werden
- Mit LEDs und Pingpongbällen, Flaschendeckeln, angerauten Plastikflaschen, Trinkröhrchen oder Eierschalen lassen sich witzige Lichtobjekte bauen.
Weitere Hilfsmittel
Arduino ist auch eine kleine Übung in Zen: Wenn man nur ein einziges Arduino-Board, aber ganz viele Ideen für Projekte hat, dann kommt relativ rasch der Zeitpunkt, wo man sein absolut geniales Projekt wieder loslassen muss, damit man das nächste Projekt starten kann. Wenn man so wie ich mit Zen noch nicht sehr weit gekommen ist, dann bringt man das kaum übers Herz und möchte das Erreichte zumindest dokumentieren, um es später wieder nachbauen zu können. Ganz ohne Spuren zu hinterlassen, kann ich mich nicht von einem Projekt verabschieden.
Software
Bei meinen Webrecherchen bin ich rasch auf die Opensource-Software Fritzing gestossen, mit der sich die Verkabelung auf der Steckplatine dokumentieren lässt. Gleichzeitig wird der Schaltplan dazu erstellt, und wer will, kann gleich eine Platine für die Produktion entwerfen und in Auftrag geben. Die Software ist wirklich sehr einfach, es ist mir nach dem Herunterladen in kürzester Zeit gelungen, mein Projekt "Temperarmelder" zu dokumentieren.
Eventuell möchte man die Arduino-Daten auch auf einem normalen Computer weiterverarbeiten oder Arduino von dort aus steuern. Um sich die entsprechende Software zu schreiben, wird zwar meist Processing empfohlen, aber prinzipiell kann man auf jede Programmiersprache zurückgreifen, welche die serielle Schnittstelle unterstützt (Delphi, Java, CSharp, C...). Ich selbst habe mich für CSharp entschieden, weil ich schon vorher mit dieser Sprache gearbeitet habe und weil Visual Studio Express gratis zur Verfügung steht.
Eine weitere Opensource-Software, die ich in den letzten Tagen öfters verwendet habe, ist Inkscape, ein Vektorgrafikzeichnungsprogramm. Mit ihm habe ich Zahnräder gezeichnet oder den Schnittplan für eine Arduino-Box aus Karton
Werkzeug
Und natürlich kommt man um Werkzeug nicht herum. Hier mal eine kleine Auflistung, was bei Arduino-Basteleien alles nützlich ist:
- Schlitz- und Kreuzschraubenzieher
- Zangen in verschiedenen Grössen
- Schweizer Taschenmesser mit möglichst vielen Klingen (und Flaschenöffner im Falle von Rückschlägen und Misserfolgen ;-)
- Schere und Nagelschere
- Abisolierzange
- Massstab
- Multimeter
- Lötkolben und Lötzinn
- Helping Hands: Gestänge mit zwei Klemmen und einer Lupe
- Klebband
- Schrauben und Muttern
- Papier und Karton
Wer eher richtig Mechanik und Maschinen geht, braucht irgendwann auch eine Bohrmaschine.
Und für LilyPad und wearable Computing ist natürlich eine Nähmaschine von Vorteil.
Material
Um rasch einen Prototypen zusammenzustecken oder irgendeine Konstruktion zusammenzubauen, hat sich das folgende Material als nützlich erwiesen:
- Draht / Isolierdraht / Blumendraht
- Pfeiffenputzer als flexible Verbindungen
- Plastikflaschendeckel: v.a. die grösseren kann man in Kombination mit Pfeiffenputzern gut als Sockel für Halterungen verwenden. Um sie dafür schwerer zu machen, kann man sie mit einer Mischung aus Sand und Kerzenwachs ausgiessen. Auch in Lichtobjekten lassen sich Flaschendeckel verwenden.
- Essstäbchen, hölzerne Pflanzenstützen, Holzspiesse als hölzerne Verstrebungen
- dicke Plastiktrinkhalme mit Gelenk als Kabelkanal, Halterung für LEDs, Leuchtstoffröhren für Lichtobjekte...
- Wäscheklammern, um etwas aufzuhängen
- Büroklammern als Fixierungen
- Verpackungsdrähte als Fixierungen
- Kerzenwachs für temporäre Fixierungen
- Plastilin für temporäre Fixierungen
- PET-Flaschen in allen Formen und Farben, weil man sie beliebig auseinanderschneiden kann, wann immer man ein Stück Plastik braucht. Mit Steinen gefüllt sind sie auch ganz ordentliche Sockel. Und wenn gerade mal wieder alle Steckbretter in Gebrauch sind, kann man sie auch dazu verwenden, indem man einfach die Beinchen der zu verbindenden Komponenten ins gleiche Loch steckt.
Schauen Sie sich in Ihrem Haushalt um: Sie werden staunen, wie viel Abfall man für kreative Basteleien verwenden kann. Mein Motto ist seit kurzem:
Wirfst Du noch weg, oder bastelst Du schon?
Begriffe / Glossar / Übersetzungen
Begriff deutsch | Begriff englisch | Abkürzung | Erklärung |
Buchsenleiste | Pin socket | ||
Gleichstrom | Direct current | DC | Strom, dessen Stärke und Richtung sich nicht ändert |
Masse | Ground | GND | Die Masse ist das negative Ende einer Schaltung. |
Pulsweitenmodulation | Pulse-width modulation | PWM | An digitalen Pins wird durch rasches Ein- und Ausschalten ein analoges Verhalten simuliert |
Stabilisiert | bedeutet bei einem Netzteil,dass bei Leerlauf die Ausgangsspannung ihren Nennwert behält | ||
Steckbrett | Breadboard | Durchlöchertes Plastikbrett mit Leiterbahnen, mit dessen Hilfe rasch Schaltungen gesteckt werden können. | |
Steckleiste | Pin header |
Datenblätter
Datenblätter zu meinen Komponenten:
- Microcontroller: ATmega328P
- Diode: 1N4001, 1 amp
- Infrarotempfänger: VS1838B (kein richtiges Datenblatt, aber zumindest ein paar Diagramme)
- LED:
- Motor: Gleichstrommotor
- Photowiderstand: EXCELITAS TECH - VT935G - LDR,SERIE VT901
- Piezo-Summer: PS1420P02AT TDK 70 DB 14mm 2KHz
- Realtime clock:
- Relay: DPDT-Relay von Axicom, 5V
- Temperatur- und Feuchtigkeitssensor: DHT11, 5V, 0 bis 50°, 20-90% Feuchtigkeit
- Transistor:
- Widerstand:
Links und Quellen
- Arduino.org, der englischsprachige Website der Community
- Unter Arduino.cc findet man u.a. eine ausführliche Referenz der Programmiersprache
- 32-seitiger Arduino Experimenter's Guide zum Experimentierkit: auch ohne das Kit nützlich, da Installation, Programmiersprache und wichtige Komponenten wie z.B. Sensoren beschrieben werden
- fritzing.org: Fritzing ist eine Open-Source-Software, um Schaltungen zu dokumentieren und Platinen zu designen
- Adafruit industries, amerikanischer Lieferant mit unzähligen Tutorials und Projekten
- DFRobot, ein Anbieter in Shanghai, der seine Komponenten jeweils mit Bestückungsplan und Arduino-Code dokumentiert
- In der Schweiz beziehe ich meine Komponenten meist über Play-Zone
- Farnell, riesiger Online-Shop für Elektronikkomponenten und vieles mehr
- Website des Make-Magazins, mit vielen digitalen und analogen Projekten. Der Verlag gibt auch ausgezeichnete Bücher heraus wie "Making Things Move" oder "Making Things Talk", die bereits auf Deutsch erhältlich sind.
- http://www.instructables.com/, ein guter DIY (Do it yourself) Website, unter anderem mit einer Sparte Technologie
- Datenblätter zu fast jeder elektronischen Komponente findet man unter http://www.alldatasheet.com/
- Und nicht zuletzt das ausgezeichnete deutschsprachige Buch von Manuel Odendahl, Julian Finn & Alex Wenger: Arduino - Physical Computing für Bastler, Designer & Geeks
- Und Heise beackert das Thema Hardware-Hacks ebenfalls mit einer Heftserie
- Und ein bisschen Eigenwerbung erlaube ich mir bei all dem Aufwand: In meinem Blog dokumentiere ich meinen laufenden Fortschritte mit Arduino und die durchgeführten Projekte.
Diese Webseite wurde am 21.05.18 um 17:10 von rothen ecotronics erstellt oder überarbeitet.
Printed on 100% recycled electrons!