Arduino Manual
Arduino Manual
Arduino
Au
Julian Finn & Alex Wenger
fla
ge
Manuel Odendahl,
ISBN 978-3-89721-995-3
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IX
2 Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser . . . . . . . . . 31
Elektrische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Schaltungen, Bauteile und Schaltbilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Löten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Fehlersuche in elektronischen Schaltungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3 Workshop LED-Licht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Eine blinkende LED – das »Hello World« des Physical Computing . . . . . . . . . . . . . 84
V
5 Sprich mit mir, Arduino! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Nach Hause telefonieren mit der seriellen Konsole . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Automatisierung mit Gobetwino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
7 Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Aktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Elektronischer Würfel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
8 Automation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Alles hört auf mein Kommando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
DMX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Barlicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
RF-Steckdosen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Gespensterschreck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
VI Inhalt
A Arduino-Boards und -Shields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Arduino-Boards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Arduino-Shields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
B Arduino-Bibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
EEPROM-Bibliothek: Werte langfristig speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Ethernet-Bibliothek: mit dem Internet kommunizieren . . . . . . . . . . . . . . . . . . . . . . . 277
Firmata-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
LiquidCrystal-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Servo-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Debounce-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Wire-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
capSense-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
C Sprachreferenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Übersicht: Programmiersprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Struktur, Werte und Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Programmwerte (Variablen, Datentypen und Konstanten) . . . . . . . . . . . . . . . . . . . . 297
Ausdrücke und Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Kontrollstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Sketch-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Funktionsreferenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
D Händlerliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Inhalt VII
In diesem Kapitel:
• Für wen ist dieses Buch
Einleitung gedacht?
• Aufbau dieses Buchs
• Typografische Konventionen
• Verwendung der Code-
beispiele
• Die Codebeispiele zu diesem
Buch
• Die Arduino-Welt
• Dedication from David
Cuartielles
IX
kann, aber auch leicht mit vielen Sensoren zur Interaktion mit der
Umwelt verbunden werden kann. Arduino ist aber auch die dazu-
gehörige Entwicklungsumgebung, und – nicht zu vergessen – das
Framework, das viele komplizierte Details der hardwaregestützten
Entwicklung einfacher macht. So kann mit einem einzelnen Knopf-
druck der Programmcode sowohl kompiliert als auch direkt über
USB in den Arduino geladen werden.
All das erlaubt die schnelle Entwicklung von Prototypen; aber
dadurch, dass alle Teile auf bestehenden Standards wie C++ und
verbreiteten Mikrocontrollern basieren, kann es später auch losge-
löst vom Arduino-Konzept weiterverwendet werden.
X Einleitung
fen würden, aber einfach nicht so recht verstehen, was man ihnen
eigentlich sagen will.
Auch wenn Sie schon Erfahrung mit einer Programmiersprache
haben, sollten Sie nun das Buch nicht beiseite legen: Es ist so aufge-
baut, dass die Programmierung beiläufig erklärt wird, während die
einzelnen Projekte zusammengesetzt werden. Selbst als Geek, des-
sen natürliche Umgebung meist aus einem Codedschungel besteht,
wird Ihnen die Lektüre also kaum langweilig werden. Besonders
wenn Sie zwar im Schlaf Software schreiben können, dafür aber
noch unerfahren in Sachen Lötkolben, Sensoren und Widerstände
sind, wird Ihnen dieses Buch bieten, was Sie suchen. All das erlaubt
das schnelle Erstellen von Prototypen, sodass nicht die langwierige,
umständliche Umsetzung, sondern die Idee im Vordergrund steht.
All das heißt natürlich auch, dass dieses Buch sich vor allem an Ein-
steiger richtet. Trotzdem geht es z.B. in Kapitel 11, das sich mit der
Anbindung von Arduino an die Welt der Musik beschäftigt, auch
ein wenig mehr in die Tiefe. Weiterhin bietet der Anhang eine voll-
ständige Referenz der Programmiersprache, sodass Sie diese Seiten
auch im weiteren Verlauf Ihrer Physical-Computing-Karriere auf
dem Schreibtisch behalten sollten, um jederzeit nachschlagen zu
können.
Der Projektcharakter ist bewusst nach den Prinzipien des Rapid
Prototyping gestaltet, um die Fantasie der Leser nicht unnötiger-
weise einzuengen. Wir freuen uns natürlich über Projektbeschrei-
bungen und Bilder der daraus entstandenen Arbeiten, die Sie uns
gern über Twitter (@arduinobuch) zuschicken können.
Hilfreich ist es, wenn Sie zum Buch auch ein Arduino-Board erwer-
ben, falls Sie noch keines besitzen. In Kapitel 1 finden Sie Hinweise
dazu, wo Sie den hier verwendeten Arduino Duemilanove beziehen
können. Weiterhin wird für die im Buch beschriebenen Workshops
eine Reihe von Bauteilen benötigt. Wir empfehlen, dass Sie die
Liste der benötigten Teile zu Anfang durchlesen und entsprechend
einkaufen. Zudem wäre es hilfreich, wenn Sie einen Lötkolben,
ausreichend Lötzinn und Entlötlitze sowie ein Steckbrett besitzen.
XII Einleitung
Kapitel 4 führt den Workshop aus Kapitel 3 fort und erklärt, wie an
den Arduino mit dem sogenannten Multiplexing auch Matrix-Dis-
plays mit 7x5-LEDs angeschlossen werden können. Zudem wird
mit dem Interrupt eine etwas weiter fortgeschrittene Technologie
erklärt. Der Workshop schließt mit einer Gehirnwellenmaschine,
die durch pulsierende LEDs für Entspannung im Kopf sorgen soll.
Kapitel 5 erlöst den Arduino aus seiner Einsamkeit und zeigt ver-
schiedene Möglichkeiten der Kommunikation mit dem Rechner
und darüber hinaus. Zunächst wird auf die einfache Verbindung
über den USB-Port eingegangen und auf die Kommunikation mit
der seriellen Konsole der Arduino-Programmierumgebung, die man
auch für die Fehlersuche nutzen kann. Anschließend wird das Pro-
gramm Gobetwino erklärt, das ebenfalls unkompliziert die Kom-
munikation zwischen Arduino und PC ermöglicht. Das Kapitel
schließt mit der Anbindung an Processing, eine Programmierumge-
bung, die dem Arduino als Vorbild gedient hat. Sie ermöglicht es,
einfach und schnell grafische Anwendungen zu entwickeln, die mit
dem Arduino gesteuert werden.
Kapitel 6 führt das fünfte Kapitel fort und erläutert die Verwen-
dung eines Ethernet-Shields. Dieser Aufsatz für das Arduino-Board
erlaubt den Anschluss eines Netzwerkkabels, sodass der Arduino
auch mit dem Internet verbunden werden kann. Zunächst wird ein
einfacher Webserver implementiert, mit dem man den Status des
Arduino im Browser anzeigen lassen kann. Dann folgt ein kleines
Projekt, das über Twitter meldet, ob das Licht im Raum an oder
aus ist – Physical Computing in Reinform! Zum Abschluss erklärt
das Kapitel den Datenspeicher, auf den der Arduino zurückgreifen
kann und beschreibt, wie sich dort einzelne Daten ablegen und wie-
der auslesen lassen.
Kapitel 7 bildet einen Einschub zwischen die verschiedenen Work-
shops des Buches. Nun, da einige Grundlagen erläutert sind, wer-
den die gängigsten Sensoren und Aktoren beschrieben, die man mit
dem Arduino verwenden kann, und einige Projekte und Einsatz-
möglichkeiten geschildert. Zudem liefert das Kapitel ein Beispiel
dafür, wie man einen kapazitiven Näherungssensor recht einfach
selbst bauen kann. Das Kapitel schließt mit einem kleinen Würfel-
Projekt, das auf einen kleinen Schalter aufbaut, der zufällig öffnet
und schließt.
Kapitel 8 vernetzt den Arduino noch weiter mit seiner Umgebung.
In diesem Kapitel wird eine Lichtsteuerung per DMX-Bus erklärt.
Anschließend wird der Arduino verwendet, um herkömmliche
Typografische Konventionen
Die folgenden typografischen Konventionen werden in diesem
Buch verwendet:
Kursiv
Wird für URLs, die Namen von Verzeichnissen und Dateien,
Optionen, Menüs und zur Hervorhebung verwendet.
Nichtproportionalschrift
Wird für Codebeispiele, den Inhalt von Dateien und sowie für
die Namen von Variablen, Befehlen und anderen Codeab-
schnitten verwendet.
XIV Einleitung
Verwendung der Codebeispiele
Dieses Buch soll Ihnen bei der Umsetzung Ihrer Projekte helfen. Es
ist allgemein erlaubt, den Code aus diesem Buch in Ihren Program-
men und Dokumentationen weiterzuverwenden. Dafür ist es nicht
notwendig, uns um Erlaubnis zu fragen, es sei denn, es handelt sich
um eine größere Menge Code. So ist es beim Schreiben eines Pro-
gramms, das einige Codeschnipsel dieses Buchs verwendet, nicht
nötig, sich mit uns in Verbindung zu setzen, beim Verkauf oder
Vertrieb einer CD-ROM mit Beispielen aus O’Reilly-Büchern dage-
gen schon. Das Beantworten einer Frage durch das Zitat von
Beispielcode erfordert keine Erlaubnis. Verwenden Sie einen erheb-
lichen Teil des Beispielcodes aus diesem Buch in Ihrer Dokumenta-
tion, ist unsere Erlaubnis dagegen nötig.
Eine Quellenangabe ist zwar erwünscht, aber nicht obligatorisch.
Dazu gehört in der Regel die Erwähnung von Titel, Autor, Verlag
und ISBN, zum Beispiel: »Arduino – Physical Computing für Bast-
ler, Designer und Geeks« von Manuel Odendahl, Julian Finn &
Alex Wenger. Copyright 2010 O’Reilly Verlag, ISBN 978-3-89721-
995-3.«
Falls Sie sich nicht sicher sind, ob die Nutzung der Codebeispiele
außerhalb der hier erteilten Erlaubnis liegt, nehmen Sie bitte unter
der Adresse kommentar@[Link] Kontakt mit uns auf.
Die Arduino-Welt
Arduino wird zwar von einer italienischen Firma vertrieben, die
Layoutdaten für das Board sind aber ebenso wie die Programmier-
umgebung unter einer Open-Source-Lizenz verfügbar. Die Weiter-
entwicklung wird also auch von einer Gemeinschaft unterstützt,
Die Arduino-Welt XV
die hilft, beides konstant zu verbessern. Zudem gibt es eine riesige
und stets wachsende Menge an Websites, die Arduino-Projekte
dokumentieren oder Anleitungen zum Basteln geben. Hier im Buch
sind viele dieser Projekte erwähnt, zusätzlich wollen wir einen klei-
nen Überblick darüber geben, welche Ressourcen und Websites im
Zusammenhang mit dem Arduino interessant sind.
Das Arduino-Projekt
Die Marke »Arduino« sowie die Rechte an den Schaltplänen liegen
bei der Firma [Link], die aus den ersten Arbeiten am Arduino her-
vorgegangen ist. Die Firma behält sich allerdings nur das Marken-
recht vor, alle anderen Daten können also frei verwendet werden,
sofern die Ergebnisse nicht unter dem Namen Arduino veröffent-
licht werden. Neben dem Arduino hat sich [Link] vor allem auf
Consulting und Training rund ums Physical Computing und den
Arduino spezialisiert.
Weiterführende Quellen
Neben den schon genannten Webseiten gibt es eine ganze Reihe
von Ressourcen rund um das Thema Arduino. Für den Erwerb von
Boards sei zusätzlich der entsprechende Absatz in Anhang A emp-
fohlen. Hier wollen wir einige interessante Websites vorstellen.
Diese Liste ist natürlich nicht einmal annähernd vollständig.
• [Link] ist eine Community-Seite, die Projekte und
Möglichkeiten rund um Arduino und seine Abwandlung Free-
duino sammelt. Die Seite verfügt über einen Index von Anlei-
tungen rund um Sensoren und Aktoren, die mit dem Arduino
verbunden werden können, und ist deshalb besonders nütz-
XVI Einleitung
lich, wenn man auf der Suche nach Informationen über ein
bestimmtes Bauteil ist.
• [Link] ist ein Portal im Netz, das Anleitungen für
allerlei Projekte zur Verfügung stellt. Auch zum Thema Ardu-
ino und Physical Computing wird man hier fündig, ebenso gibt
es einige Bastelanleitungen für selbstgebaute Sensoren oder
Aktoren.
• Ladyada ([Link] ist eine Website einer ehe-
maligen MIT-Studentin, die eine umfangreiche Ressourcen-
sammlung zum Thema Arduino zusammengetragen hat. Hier
finden sich viele Ideen, aber auch Angebote für verschiedene
Arduino-Shields.
• Die Webseite [Link] beschäftigt sich mit dem
künstlerischen und designerischen Aspekt von Physical Com-
puting. Insbesondere ist die Website empfehlenswert, weil sie
eine umfangreiche Ressourcensammlung zum Thema Wea-
rable Computing beherbergt, also Computer, die in Kleidung
eingearbeitet sind. Diese Unterseite ist unter [Link]
[Link]/page/12648/nl zu finden.
• Unter [Link] findet sich eine herausra-
gende Ressource rund um das Thema Wearable Computing.
Ein Blog beschreibt immer wieder neue und interessante Pro-
jekte, während eine Community zu fast allen Problemen eine
Lösung findet.
Danksagungen
Wir möchten hiermit noch einer Reihe von Menschen danken,
ohne die dieses Buch nicht möglich gewesen wäre. Zunächst möch-
ten wir unserem herausragenden Lektor Volker Bombien danken,
mit dem dieses Projekt weit mehr als eine normale Geschäftsbezie-
hung war. Weiterer Dank gilt Jens Ohlig für das großartige Einlei-
tungskapitel sowie allen unseren Freunden im Entropia e.V.,
besonders Cupe, Flowhase, Bugbabe, Neingeist, Syb, nanoc und
Hannes.
Zudem möchten wir in dieser zweiten Auflage besonders all jenen
danken, die uns wertvolles Feedback geschickt haben.
Julian Finn dankt desweiteren besonders Steffi sowie Silvan Hor-
bert, Roman Alexis Anastasini, Jayoung Bang und Martin Feld-
kamp für Inspiration und Instruktion.
XVIII Einleitung
interested in getting a telescope to look at the stars. You might not
go for the »gold edition« one in the first place. People usually get
something that works, and if they like it and get hooked, then they
make a move for something better - and probably more expensive.
When it comes to learn about crafting electronic devices like you
want to feel the thrill of controlling a light bulb, starting up the
engine of your car remotely, or time up your fireworks next New
Year's Eve by means of digital logics ... Arduino offers a door to
easily access this world. Get yourself a board, download the soft-
ware, check out the examples and in a couple of sessions you will
be controlling motors, launching rockets, and reading data from a
GPS.
We made Arduino a tool for learning. It is made to be easy to use
for beginners, but also powerful for those that want to go deeper in
the topic. However, we wanted it to be affordable. We like people
to try things without the fear of breaking them. Your Arduino will
most likely not let you down, but if it did ... it wouldn't be a big
deal. It is cheap to get a new one, but even cheaper to fix it. Since it
is open source you can always consider the possibility of creating
your own version of it, our website will tell you how.
I hope this book will encourage you to try things out. Its authors
have put a lot of effort in transmitting one of the Arduino Philoso-
phy Fundamentals: make it work while having fun!
May 2010
David Cuartielles ist Mitentwickler des Arduino-Boards
Kondensatoren Gerät
• Arduino-Projekte: eine kleine
Vorstellung
• Hardware
• Die Arduino-Entwicklungs-
umgebung
Die ersten Investitionen sind getätigt. Das Buch hier und ein Ardu-
ino-Board sind gekauft, und nun liegt dieses wundersame Gebilde
aus Schaltkreisen, Chips und Pins auf dem Tisch. Wo kommt es
her, wo wird es hingehen? Die folgenden Kapitel sollen darin Ein-
blick geben. Von der Geschichte des Arduino-Projektes geht es zur
Beschreibung des in diesem Buch verwendeten Boards, des Arduino
Duemilanove. Wenn Sie noch keines besitzen, können Sie in diesem
Kapitel auch Bezugsquellen nachschlagen. Anschließend werden
die Grundzüge des Physical Computing und der dafür notwendigen
Physik erklärt, um in den darauf folgenden Kapiteln schließlich mit
kleinen Workshops zu beginnen, die die Programmiersprache und
einfache Schaltungen erklären. Wer diese Workshops durcharbei-
tet, sollte anschließend in der Lage sein, größere Projekte mit Ardu-
ino durchzuführen. Ob dabei bunte Lampen gebastelt werden, eine
Pflanze über Twitter meldet, wenn sie Wasser benötigt, oder der
Arduino dazu verwendet wird, Musik zu machen – dieses Buch
sollte nicht nur Einsteigern genügend Möglichkeiten bieten, die
Welt des Physical Computing kennenzulernen.
1
nicht aufhielt. Sein Geschäftsmodell erwies sich als letztendlich
nicht tragfähig: Nachdem er erheblichen militärischen Widerstand
von Adel und Klerus erfahren hatte, verzichtete er auf den Thron
und starb in einem Kloster. Italien bekam nach ihm erst in der Neu-
zeit wieder einen König.
Das Arduino-Projekt hat seinen Namen nicht direkt von dem
machthungrigen, aber letztendlich erfolglosen italienischen König
geerbt. Ein freundlicherer Namenspatron wäre sicher der Geograph
Giovanni Arduino (1714–1795), der Vater der italienischen Geo-
wissenschaft, nach dem auch der Meeresrücken Dorsum Arduino
auf dem Mond benannt ist. Noch näherliegend ist aber eine ganz
andere Erklärung für den Namen: »Arduino« war der Name einer
Studentenkneipe (die wiederum nach König Arduino benannt ist)
in der Nähe des Interaction Design Institute Ivrea (IDII) in Italien,
einer ehemaligen Hochschule für Gestaltung.
Ganz wie der König aus dem 11. Jahrhundert hat das Elektronik-
projekt Arduino aber etwas ganz Neues versucht, was es in dieser
Form bisher nicht gab. Allerdings ist dem Projekt bis jetzt größerer
Erfolg beschieden, und statt Machtgier und Intrigen ist das Leit-
prinzip die Offenheit.
Die Gestaltung von Interaktion wurde am IDII von 2001 bis 2005
gelehrt. Unter Interaction Design versteht man diejenige Fachrich-
tung der Gestaltung, die sich mit Verhaltensweisen von Produkten
und Systemen beschäftigt, mit denen ein Benutzer interagieren
kann. Das IDII hatte nur genau einen Kurs und einen Magisterab-
schluss in Interaction Design im Angebot. Obwohl die Schule nach
vier Jahren mit einer anderen Akademie zusammenlegt wurde,
nachdem die ursprüngliche Förderung ausgelaufen war, und heute
nicht mehr als eigenständige Institution existiert, hatte sie einen
Einfluss, der noch heute spürbar ist. Neben dem Arduino entstan-
den hier wichtige Beiträge zu der Grafikprogrammierplattform
»Processing« vom MIT Media Lab und ein viel gelesenes Standard-
werk zum Interaction Design.
Im Winter 2005 hatte Massimo Banzi, Dozent für Gestaltung am
IDII, ein Gespräch mit David Cuartielles, einem Mikrochip-Inge-
nieur aus Spanien, der einen Forschungsaufenthalt am Institut
absolvierte. Die beiden sprachen darüber, wie oft Banzi Klagen von
Studenten hörte, dass es keine preiswerten und einfach zu pro-
grammierenden Mikrocontroller-Plattformen für Kunstprojekte
gebe. Sie entwickelten ihr eigenes Design für ein Board. Ausgehend
von der Entwicklungsumgebung Processing schrieb David Mellis
Abbildung 1-1
Das Arduino-Board
Die Arduino-Philosophie
Im Gegensatz zu einer traditionellen Entwicklung von elektroni-
schen Projekten, bei denen der Prozess im Vordergrund steht, wie
sie z.B. in Ingenieurschulen gelehrt wird, wird bei Arduino-Projek-
ten Wert auf das Implementieren und Bauen gesetzt, weniger auf
das lange und anstrengende Planen. Alles ist dazu gedacht, mög-
lichst schnell und elegant einen funktionierenden Prototypen zum
Laufen zu bringen. Diese Herangehensweise mag zuerst ein biss-
chen verwirrend klingen: Ist sorgfältige Planung, gerade bei Elek-
tronik, nicht notwendig, um Fehler und Nebenwirkungen zu
vermeiden? Bei Arduino ist der Weg ein großer Teil des Ziels: Erst
beim Ausprobieren (und oft auch, wenn unvorhergesehene Fehler
oder nicht geplantes Verhalten zutage treten) setzt man sich mit der
Materie richtig auseinander. Und wenn ein schneller Erfolg eintritt,
motiviert das zusätzlich die Entwicklung: Die Energie bleibt erhal-
ten, auch wenn man sich durch größere Projekte hindurcharbeitet.
Das Basteln und Ausprobieren ist bei Arduino ein Spiel, das Spaß
machen soll. Anstatt zielstrebig von A nach B zu gehen, wie es sonst
bei Projekten der Fall ist, kommt es hier oft vor, dass man sich auf
dem Weg ein bisschen verirrt und dann auf einmal bei C landet.
Auch für fortgeschrittene Nutzer ist diese Eigenschaft von Arduino
sehr erfrischend: Man muss nicht mühsam, sauber und korrekt
Projekte bauen und Programme schreiben, sondern überrascht sich
schnell dabei, wie man wilde Ideen »einfach nur so« ausprobiert,
weil es eben sehr schnell möglich ist. Am besten lässt sich Arduino
mit älteren Homecomputern vergleichen, die einen beim Anschal-
ten gleich mit einem BASIC-Prompt einluden, verrückte Pro-
gramme zu schreiben.
Im Sinne des schnellen Erzeugens von funktionierenden Proto-
typen wird bei Arduino viel Wert auf die kreative Nutzung von
Technik gesetzt. Anstatt alles von Grund auf aufzubauen, werden
oft fertige Komponenten (sogenannte Shields, siehe auch
Anhang A) zusammengesteckt und mit fertigen Programmteilen
angesprochen (sogenannten Libraries, siehe auch Anhang B).
Ähnlich wie bei den schon kurz erwähnten grafischen Program-
mierumgebungen Max/MSP, Reaktor oder VVVV werden bei
Interaktive Kunstinstallationen
Neben Designern und Modeschöpfern sind vor allem Künstler die
großen Nutznießer von Arduino. Da Künstler sich meistens nicht
mehr als nötig mit Technik und Programmierung beschäftigen,
sondern sich lieber auf ihre kreative Arbeit konzentrieren wollen,
ist ein einfach zu programmierender Mikrocontroller geradezu ein
Segen und eröffnet ganz neue Möglichkeiten, den eigenen Ideen
freien Lauf zu lassen.
Gute Luft
Das AIR-Projekt ist in erster Linie als soziales Experiment gedacht:
Jeder Teilnehmer erhält ein Gerät, basierend auf einem Arduino,
das Umweltdaten wie den Grad der Luftverschmutzung misst.
Diese Daten werden über ein Netzwerk zu einem zentralen Server
übertragen und an die anderen Teilnehmer weiterverbreitet. Die
Nutzer können also selbstständig herausfinden, wo in ihrer Umge-
bung besondere Verunreinigungen existieren. Das Projekt will zum
Beispiel die Reaktionen darauf herausfinden und sehen, ob die
Menschen sich selbstständig darum kümmern, ihre direkte Umwelt
lebenswerter zu machen. Zudem soll es Diskussionen rund um
Umweltpolitik, Gesundheit und soziale Zusammenhänge innerhalb
einer Gemeinschaft anregen. Die Website für das Projekt findet
sich unter [Link]
Buchstabenklettern
Eine spielerische Kunstinstallation hat Olaf Val mit dem Digiripper
geschaffen, eine Matrix von 7 mal 5 Elementen aus Plastik, die in
eine Wand eingelassen sind. Dahinter befinden sich Leuchtdioden.
Wenn diese aufleuchten, fahren die Plastikelemente aus und bieten
dem Nutzer Halt, um darauf zu klettern. Wird das Licht ausge-
schaltet, fährt das Element wieder ein, der Kletterer verliert seinen
Abbildung 1-2
Digigripper, © Olaf Val
Klangstufen
Um dem Betrachter ein Gefühl für die Klänge seiner Stadt zu geben,
wurde die Installation »Klangstufen« geschaffen. Unter einer kleinen
Holztreppe sind Entfernungssensoren angebracht, die erkennen,
wenn ein Mensch auf einer Stufe steht. Der Betrachter kann nun
einen Punkt in der Stadt auswählen und einen Kopfhörer aufziehen.
Je nach Ort und Stufe hört er nun Klänge, die an diesem räumlichen
Punkt aufgenommen wurden. Jede Stufe repräsentiert dabei einen
Schritt in die Höhe, beginnend bei 0 Metern, auf denen man die
U-Bahn, Wasser oder das Rauschen in der Erde hört. Von dort aus
geht es weiter über den Klang der Stadt (200 m), des Umlands (1.
500 m), des Wetters (8.000 m) und der Flugzeuge (12.500 m). Das
Projekt befindet sich immer noch in der Weiterentwicklung wird
unter [Link] doku-
mentiert, wo man sich auch ein Video ansehen kann.
Kreative Aggressionen
Boxsäcke eignen sich seit jeher recht gut, um angestauten Aggressi-
onen freien Lauf zu lassen, ohne dass dabei Menschen zu Schaden
kommen. Die Designer von Fluidforms ([Link]
[Link]) nutzen die Fäuste ihrer Kunden, um individuelle
Lampen zu erschaffen. Die Energie, die bei jedem Schlag in einen
speziell präparierten Boxsack freigesetzt wird, wird mit Sensoren
und einem Mikrocontroller an einen PC übermittelt. Dort läuft ein
3D-Programm, das einen weißen Zylinder anzeigt, der Schlag um
Schlag verformt wird. Das Ergebnis kann anschließend gespeichert
und mit einen 3D-Drucker gedruckt werden, welcher als Lampen-
schirm verwendet wird.
Musikinstrumente
Einen ganz eigenen Bereich in der Kunst nehmen Projekte ein, die
Arduino nutzen, um Musik zu machen oder zu steuern. In diesem
Buch widmet sich Kapitel 10 der direkten Sounderzeugung und
Ausgabe auf dem Arduino. Zudem gibt das Kapitel eine Übersicht
über weitere Projekte in diesem Feld und beschreibt, wie man mit
dem Arduino eigene Musikinstrumente bauen kann.
Spiele
Ein Mikrocontroller, wie er auf dem Arduino-Board aufgebracht
ist, ist längst viel leistungsfähiger als die ersten Spielekonsolen, die
Anfang der 1980er in die Wohnzimmer der Welt drängten. Das
bedeutet natürlich, dass es möglich ist, einfache Computerspiele
auf dem Arduino selbst zu entwickeln oder bekannte Klassiker
nachzubauen. In diesem Buch finden sich zwei Spiele: In Kapitel 7
wird ein Würfel mit einem Kontaktsensor gebaut, in Kapitel 5 wird
Processing und ein Lichtsensor für ein kleines Geschicklichkeits-
spiel verwendet.
Gotcha!
Es mag zwar nicht die feine Art sein, auf Menschen zu schießen,
aber es kann durchaus Spaß machen, wenn es sich bei den Geschos-
sen beispielsweise um Farbkugeln handelt. Beim »Lasertag« werden
Infrarotstrahlen verwendet, wobei jeder Mitspieler neben seiner
Waffe auch die passende Kleidung trägt, die mit Sensoren ausge-
stattet ist. Diese Sensoren können zum Beispiel mit einem Arduino
(hier empfiehlt sich ein LilyPad) verbunden sein, der die Treffer
registriert und sofort oder nach Ende des Spiels zur Auswertung an
einen Rechner überträgt. Die Beschreibung eines vollständigen
Projektes finden Sie unter [Link]
opensource/[Link]?search_by=Arduino+laser. Hiermit sei
jedoch darauf hingewiesen, dass Laserspiele in Deutschland mit
Verweis auf die Garantie der Menschenwürde im Grundgesetz
verboten sind, da es bei den kommerziellen Angeboten darum
geht, möglichst viele Treffer zu landen, und nicht, wie bei Paint-
Nicht wackeln!
Labyrinthe aus Holz haben schon Generationen von Kindern frust-
riert. Sie wissen schon: diese Spiele, bei denen eine Kugel auf einem
mit einem Drehknopf in zwei Richtungen schwenkbaren Unter-
grund vom Start ins Ziel gebracht werden soll, vorbei an Löchern,
durch die sie fallen kann. Dank dem Arduino ist nun die Zeit
gekommen, diesen garstigen Maschinen ein Schnippchen zu schla-
gen, denn mithilfe zweier Servos kann das Labyrinth auch ohne
zittrige Hände gesteuert werden, wie Jestin Stoffel zeigt. Man kann
allerdings auch diesen Triumph über die Schwerkraft ruinieren,
indem man ein Wii-Balance-Board anschließt, wie es unter http://
[Link]/2009/01/12/arduino-powered-
robotic-labyrinth-game/ erklärt wird.
Arduinoboy
Um einen Arduino mit dem Thema Computerspiele in Verbindung
zu bringen, braucht es nicht unbedingt ein Spiel: Längst wird auch
die Hardware alter und neuerer Konsolen verwendet, um mit dem
Arduino zu kommunizieren. Der Arduinoboy hingegen arbeitet mit
einem Nintendo Gameboy zusammen, dem Urvater aller Hand-
held-Konsolen, der seit 1989 weltweit 118 Millionen mal verkauft
wurde. Die Verbindung läuft dabei in die andere Richtung: Der
Arduino wird an einen Gameboy angeschlossen, um diesem als
Midi-Controller zu dienen. Für den Gameboy gibt es mittlerweile
eine ganze Reihe von Programmen wie Nanoloop und Little-
SoundDJ, die dem Soundchip Klänge entlocken können. Mehr
Informationen zu diesem Projekt finden Sie unter [Link]
[Link]/p/arduinoboy/.
Schöne Bilder
Digitale Bilderrahmen sind immer noch recht teuer und natürlich
viel langweiliger als ein selbst gebasteltes Projekt. Das March
Frame Project ([Link]
kann zwar keine digitalen Bilder anzeigen, aber immerhin mit ein-
Hardware
Hält man zum ersten Mal ein Arduino-Board in der Hand, erkennt
man nur einzelne Teile wieder, zum Beispiel den Anschluss für das
USB-Kabel. Anders als beim PC sollte aber ein Arduino-Nutzer alle
Bauteile seines Gerätes genau kennen.
Beschreibung
Alle Erklärungen in diesem Buch beziehen sich auf den Arduino
Duemilanove, die 2009er-Ausgabe des Arduino-Boards. Dieses
Board besteht im Wesentlichen aus den folgenden Bestandteilen.
Hardware 17
Abbildung 1-3
Das Arduino-Board mit seinen
einzelnen Bestandteilen
Mikrocontroller
Auf dem Arduino Duemilanove ist ein Atmega168- oder Atmega328-
Mikrocontroller angebracht, ein kleiner Computer, der mit 16 MHz
Taktfrequenz arbeitet. Er besitzt zwar wenig Speicher (16 bzw. 32
KByte Speicher und 2 bzw. 4 KByte Arbeitsspeicher) und kann nur
8-Bit-Befehle verarbeiten, dafür aber direkt mit anderer Hardware
verbunden werden. Natürlich besitzt dieser »Computer« weder
Festplatte noch Tastatur oder Display, aber er ist in der Lage, kleine
Programme auszuführen, die meist jeweils eine einzelne Aufgabe
erledigen.
Im Gegensatz zu anderen Entwicklungsboards muss der Mikrocon-
troller beim Arduino nicht direkt programmiert werden, der Code
wird vor dem Upload automatisch umgewandelt, erweitert und in
Maschinensprache übersetzt (kompiliert). Diese Maschinensprache
ist zwar durchaus für Menschen lesbar, aber sehr abstrakt und auf-
wendig zu programmieren.
Reset-Schalter
Das aktuell laufende Programm lässt sich natürlich auch neu star-
ten, wenn das Board nicht mit dem Computer verbunden ist. Dafür
dient der Reset-Schalter: Wird der rote Knopf betätigt, beendet der
Arduino alle derzeitigen Aktionen und begibt sich in den Anfangs-
zustand, den er auch beim Einschalten des Netzteils oder der USB-
Stromquelle hatte. Anschließend wird das aktuell auf dem Arduino
geladene Programm von Neuem ausgeführt.
Bootloader/ICSP-Header
Schließt man den Arduino über ein USB-Kabel an, kommuniziert
man nur mit dem sogenannten Bootloader – einem sehr kleinen
Programm, das immer auf dem Chip vorhanden ist. Sobald der
Prozessor mit Strom versorgt wird, wird es ausgeführt. Der Ardu-
ino-Bootloader ermöglicht es, über die USB-Schnittstelle ein
neues Programm hochzuladen. Dadurch, dass der Bootloader
immer zuerst ausgeführt wird, ist es möglich, auch bei einem
komplett defekten Programm wieder eine korrigierte Version
hochzuladen.
Über den ICSP-Header (In-Circuit Serial Programming) ist aber
auch die direkte Kommunikation mit dem Mikroprozessor mög-
lich. Dafür ist allerdings ein sogenannter Programmierer notwen-
dig, der an den Computer angeschlossen wird und über diese In-
Hardware 19
Circuit-Schnittstelle ein neues Programm auf den Arduino hochla-
den kann. Für die in diesem Buch erklärten Workshops ist die
Benutzung des ICSP-Header nicht nötig. Die Verwendung eines
externen Programmiergeräts wird allerdings dann gebraucht, wenn
ein neuer Bootloader auf den Arduino-Prozessor hochgeladen wer-
den soll (z.B. wenn man den Atmega168 auf einem älteren Arduino
Duemilanove durch einen Atmega328 austauschen möchte). Es ist
auch möglich, einen Arduino-Prozessor im Internet zu bestellen,
der schon mit einem Bootloader programmiert ist.
Digitale Pins
An der oberen Seite des Boards befinden sich 16 Steckplätze. 14
davon sind sogenannte digitale I/O-Pins (Input/Output). Sie sind
mit den Zahlen 0 bis 13 markiert und dienen als Anschlussmöglich-
keit für alle Sensoren und Aktoren, die zum Betrieb nur digitale Sig-
nale, also Einsen und Nullen benötigen, um etwas ein- und
auszuschalten. Dazu gehören zum Beispiel LEDs und Schalter, wie
sie in den Workshops ab Kapitel 3 verwendet werden. Sechs dieser
Pins haben zusätzlich die Beschriftung PWM. Mit dieser sogenann-
ten Pulsweitenmodulierung können beispielsweise LEDs gedimmt
werden (mehr dazu in Kapitel 3, Pulsweitenmodulierung). Beach-
ten sollte man zusätzlich, dass die Pins 0 und 1 auch für die serielle
Kommunikation mit dem Arduino (siehe Kapitel 5) verwendet wer-
den. Setzt man diese gleichzeitig als digitale Aus- oder Eingänge
ein, kann es zu merkwürdigen Nebenwirkungen kommen. Man
sollte also beachten, dass sich serielle Kommunikation und andere
Verwendung des Pins nicht in die Quere kommen. Außerdem kann
über die Pins 10 bis 13 mit dem SPI-Protokoll kommuniziert wer-
den, das allerdings nicht Bestandteil der Arduino-Sprache ist, wes-
halb es in diesem Buch nicht verwendet wird.
GND
Auf dem Board gibt es zwei Massepunkte, die als Minuspol für den
Stromkreis dienen. Sie sind mit GND (Ground) beschriftet und
befinden sich in den beiden Pinreihen oben und unten.
Analoge Pins
Die rechte Pinreihe auf der unteren Seite des Boards besteht aus
sechs Analogen Input-Ports, die in der Lage sind, analoge Signale
in digitale 10-Bit-Signale umzuwandeln. Das heißt, diese Signale
können 1.024 Werte annehmen. Dabei wird von einer maximalen
Bezugsquellen
Und woher bekommt man solch ein Arduino-Board? Natürlich aus
dem Internet.
Tatsächlich gibt es eine Handvoll Onlinehändler in Deutschland,
die sowohl den Arduino Duemilanove als auch seine Vorgänger, die
Bluetooth-Version und eine Vielzahl von Shields verkaufen. Die
Preise unterscheiden sich kaum, sodass andere Faktoren wie Ver-
sandkosten oder die zusätzliche Verfügbarkeit von Materialien eine
weitaus wichtigere Rolle spielen sollten. Eine aktuelle Liste von
deutschen Arduino-Händlern wird auf der Projektwebsite unter
[Link] geführt.
Besonders empfohlen sei das »Bausteln«-Projekt, auf dessen Web-
site [Link] nicht nur Arduino-Boards verkauft wer-
den, sondern die gesamte Philosophie behandelt wird. Die
Betreiber bieten weitergehenden Support an, veranstalten monat-
lich Baustel-Abende und arbeiten daran, eine deutsche Community
rund um Physical Computing und »Do-it-yourself«-Elektronik auf-
zubauen.
Abbildung 1-4
[Link]
Hardware 21
lungsumgebung begonnen werden. Im folgenden Abschnitt wird
erklärt, wie das Arduino-Board an den PC angeschlossen und wie
das erste Programm auf dem Arduino ausgeführt wird.
Die Arduino-Entwicklungsumgebung
Installation der Arduino-Software
Die Arduino-Entwicklungsumgebung kann von der Arduino-Web-
site [Link] für alle drei gängigen Betriebssysteme
(Windows, Linux, Mac OS X) heruntergeladen werden (zum Zeit-
punkt des Schreibens dieses Buches ist die aktuelle Version ardu-
ino-018). Die Seite, die die aktuelle Version zur Verfügung stellt, ist
[Link] Dort kann das Archiv für
das jeweilige Betriebssystem heruntergeladen werden. Die Umge-
bung enthält den Arduino-Editor, die Arduino-Dokumentation
sowie eine Anzahl von Beispielprogrammen und Libraries. Im fol-
genden Abschnitt wird die Installation der Arduino-Umgebung
unter Windows und Mac OS X beschrieben. Die Installation unter
Linux ist ein bisschen komplizierter und hängt auch sehr von der
verwendeten Linux-Distribution ab. Deswegen verweisen wir auf
die Wiki-Seite zur Linux-Installation, [Link]
ground/Learning/Linux.
Nachdem die Archivdatei für die Arduino-Umgebung heruntergela-
den wurde, muss sie mit einem Doppelklick entpackt werden: Es
wird ein Ordner erzeugt, der arduino-[version] heißt. Dieser Ordner
kann jetzt an eine beliebige Stelle kopiert werden, zum Beispiel in
den Dokumentenordner oder nach C:\Program Files\ unter Win-
dows oder nach /Applications unter Mac OS X. Um Arduino zu
starten, genügt es dann, in diesem Ordner das Programm Arduino
zu öffnen. Vorher müssen allerdings noch ein paar Schritte ausge-
führt werden.
Mitgeliefert werden auch Treiber für den USB-Baustein, der auf
dem Arduino-Board installiert ist. Dieser Chip ist ein FTDI-seriell-
nach-USB-Konvertierer. Für Windows und Mac OS X sind Treiber
mitgeliefert, die installiert werden sollten, bevor das Board an den
Computer angeschlossen wird. Unter Linux sind diese Treiber
meistens schon im Distributions-Kernel enthalten. Je nachdem,
welches Arduino-Board benutzt wird (ältere Boards haben noch
keine eingebaute USB-Schnittstelle), muss ein externer USB-nach-
seriell-Adapter verwendet werden.
Die Arduino-Entwicklungsumgebung 23
müsste die PWR-LED grün leuchten und die LED, die mit L
gekennzeichnet ist, regelmäßig blinken. Ist das nicht der Fall, wird
in unter »Fehlersuche in Elektronischen Schaltungen« erklärt, wie
häufige Fehlerquellen zu erkennen und zu beheben sind.
Abbildung 1-5
Der Windows Gerätemanager
Abbildung 1-6
Boardkonfiguration
Die Arduino-Entwicklungsumgebung
Das Fenster der Umgebung besteht aus drei Hauptbestandteilen,
nämlich der Symbolleiste und zwei Fenstern für den Programm-
code und die Kommunikation mit dem Arduino. Das schwarze
Kommunikationsfenster wird auch »Konsole« genannt.
Nachdem das Kabel verbunden wurde, müssen Sie in der Program-
mierumgebung das Board und den seriellen Port, also die Verbin-
dung, unter der die Kommunikation laufen soll, auswählen. Beide
Menüpunkte finden sich unter Tools.
Die Arduino-Entwicklungsumgebung 25
Die Symbolleiste
Die Symbolleiste besteht aus acht Symbolen, von denen mindestens
drei aus fast jedem anderen Programm bekannt sein sollten.
Abbildung 1-7
Die Symbolleiste
Abbildung 1-8 Das Symbol New öffnet einen neuen Sketch. Als »Sketches« werden
Das Symbol New Programme bezeichnet, wobei jedes Programm aus mehreren
Dateien bestehen kann. Dieser Sketch ist komplett leer. Wird
gerade ein anderer Sketch bearbeitet, sollte dieser gespeichert wer-
den, wobei das Programm dabei auch noch einmal nachfragt.
Abbildung 1-9 Das Symbol Open File öffnet einen gespeicherten Sketch. Damit
Das Symbol lassen sich auch Bibliotheken, die aus dem Netz heruntergeladen
Open File wurden, im Arduino-Programm ansehen und bearbeiten. Generell
werden alle Sketches als Dateien gespeichert, sodass sie auch mit
anderen Nutzern ausgetauscht werden können.
Abbildung 1-10 Das Symbol Save speichert den aktuellen Sketch. Gerade beim Pro-
Das Symbol Save grammieren ist es hier wichtig, daran zu denken, dass man alle Ver-
sionen, die man ausprobiert, getrennt abspeichert. Oft kommt man
erst nach langem Probieren darauf, dass ein Teil der ersten Version
eine gute Lösung war.
Die restlichen Symbole sind in zwei Gruppen aufgeteilt: die Steue-
rung des Arduino sowie die Kommunikation mit ihm. Die Pro-
grammsteuerung ist dabei recht einfach.
Abbildung 1-11 Mit diesem Knopf wird der aktuelle Sketch kompiliert, also in
Das Symbol Verify Maschinensprache übersetzt, und dabei auf seine Korrektheit über-
prüft. Das Ergebnis des Kompiliervorgangs sowie die Größe des
erzeugten Programms werden in der Konsole angezeigt. Damit
kann überprüft werden, ob das Programm auch in den Speicher des
Arduino passt (die Arduino-Variante mit Atmega168 hat 16 KByte
CodeSpeicher, von denen 2 KByte vom Arduino-Bootloader belegt
sind. Es sind also 14 KByte für den kompilierten Sketch übrig. Die
Arduino-Variante mit Atmega328 hat 32 KByte Codespeicher, von
denen 30 KByte für den kompilierten Sketch übrig sind). Ein Sketch
belegt allerdings nicht nur Codespeicher, sondern auch Arbeitsspei-
cher. Dieser wird nach der Kompilierung als »data« angezeigt. Die
Das Stop-Symbol beendet das laufende Programm auf dem Ardu- Abbildung 1-12
ino. Der Arbeitsspeicher wird anschließend gelöscht, sodass bei Das Symbol Stop
einem erneuten Start der gesamte Programmablauf wieder von vorn
beginnt.
Die Konsole dient als Kommunikationskanal zwischen dem Ardu- Abbildung 1-14
ino und der Programmierumgebung, sobald das Programm einmal Das Symbol Console
hochgeladen und gestartet ist. Dabei können Daten mit bis zu 9.
600 Bits pro Sekunde ausgetauscht werden, was genug ist, um
Kommandos an den Arduino zu senden und Informationen zu
empfangen. Eine genauere Erklärung der Kommunikation über die
serielle Konsole findet sich in Kapitel 6.
Das Codefenster
Bevor mit der eigentlichen Programmierung in der Arduino-Umge-
bung begonnen wird, wird ein Beispielprogramm auf das Arduino-
Board hochgeladen. Dazu wird eins der Beispiele, die mit der
Umgebung mitgeliefert werden, geöffnet. Über FILE → SKETCH-
BOOK → EXAMPLES können diese Beispiele ausgewählt werden. Wie
man sehen kann, wird schon eine große Menge von Beispielen mit-
geliefert, die man sich als Anregung und als Anleitung anschauen
kann. Zum Testen der Umgebung laden Sie über DIGITAL → BLINK
das Programm Blink, das die LED, die sich auf dem Arduino-Board
befindet, blinken lässt. Nachdem die Datei geöffnet ist, kann sie
übersetzt und auf das Arduino-Board hochgeladen werden. Dazu
muss der Upload-Knopf betätigt werden. Das Kompilieren kann
ein paar Sekunden dauern, danach beginnen die RX- und TX-LEDs
auf dem Arduino-Board zu flackern (was bedeutet, dass das über-
setzte Programm übertragen wird). Nach einen paar weiteren
Sekunden wird das Programm dann auch ausgeführt: Die LED
Die Arduino-Entwicklungsumgebung 27
beginnt zu blinken und die Arduino-Entwicklungsumgebung zeigt
Upload Completed an. Falls es Probleme beim Hochladen gibt, mel-
det die Umgebung in der braunen Zeile den Fehler. Als Erstes sollte
dann überprüft werden, ob das Arduino-Board korrekt an den
Computer angeschlossen ist und ob das richtige Board und die
richtige serielle Schnittstelle eingestellt wurden. Weitere mögliche
Probleme werden unter »Fehlersuche« in Kapitel 2 behandelt.
Code wird in der Arduino-Umgebung geschrieben wie in jedem
anderen Texteditor auch. Dabei wird das sogenannte Syntax High-
lighting unterstützt: Einzelne Programmelemente werden als sol-
che erkannt und so eingefärbt, dass sie sich leicht erkennbar von
den anderen unterscheiden. So lassen sich Fehler schon beim
Schreiben des Codes vermeiden. Beim Speichern einer Datei wird
diese in einem eigenen neuen Ordner unterhalb des sogenannten
Sketchbook (also Skizzenbuch) gespeichert. Das Verzeichnis für
das Skizzenbuch wird beim ersten Starten von der Arduino-Ent-
wicklungsumgebung erstellt (unter Mac OS X unter Dokumente/
Arduino, unter Windows in Eigene Dateien\Arduino. Der Pfad zu
diesem Verzeichnis kann leicht in den Einstellungen von Arduino
geändert werden (unter Mac OS X über ARDUINO → PREFERENCES,
unter Windows und Linux FILE → PREFERENCES). Dort lässt sich
auch einstellen, ob jede neue Datei zuerst benannt werden soll
(was sehr praktisch ist, weil das Skizzenbuch sich sonst schnell mit
vielen »sketch_XXX« benannten Dateien füllt) und ob leere
Dateien beim Verlassen der Umgebung gelöscht werden sollen.
Weitere Einstellungen für fortgeschrittene Benutzer können in der
Datei [Link], deren Pfad bei den Arduino-Einstellungen
angezeigt wird, von Hand mit einem normalen Texteditor einge-
tragen werden.
Die Arduino-Entwicklungsumgebung 29
KAPITEL 2 In diesem Kapitel:
• Elektrische Grundlagen
Physical Computing, • Schaltungen, Bauteile und
Schaltbilder
31
Der Vorteil dieser intelligenten Geräte ist, dass man den Umgang
mit ihnen deutlich flexibler gestalten kann. So werden viele kleine
Vorgänge auf den Benutzer direkt angepasst. Schließt man einen
Schalter an eine Lampe an, ohne einen Mikrocontroller einzuset-
zen, lässt sich kaum mehr erreichen, als dass man durch Betätigen
des Schalters das Licht an- oder ausschaltet. Mit einem Mikrocont-
roller kann man allerdings das Licht zum Beispiel für eine
bestimmte Zeit nach einem Schalterdruck anschalten (ähnlich wie
mit einer Zeitschaltuhr), oder nur dann, wenn andere Lichter schon
aus sind. Es ist auch möglich, über diesen einen Schalter deutlich
kompliziertere Vorgänge zu erkennen: Der Benutzer kann etwa
durch langes Drücken auf den Schalter den Zeitschaltmodus akti-
vieren oder die Lampe regelmäßig blinken lassen. Solche einfachen
Lichtsteuerungen findet man heutzutage in jeder Fahrradbeleuch-
tung: Die unterschiedlichen Blinkmuster lassen sich ohne »Rech-
nen« nicht einfach bauen.
Der Arduino-Prozessor ist ein gutes Beispiel für einen solchen
Mikrocontroller. Er verfügt über genügend Rechenleistung, um die
meisten Anwendungen locker zu erledigen, und hat mit seinen Aus-
und Eingängen Platz für Sensoren und Aktoren, mit denen viele
Projekte umgesetzt werden können.
Der Begriff »Physical Computing« beschreibt diese Kommunika-
tion zwischen Benutzer und einem physikalischen elektrischen
Gerät. Dieses kann eingehende Information (auf Englisch »Input« )
verarbeiten und anhand eines Programms in eine Reihe von Aus-
gangssignalen (auf Englisch »Output«) umwandeln. Ziemlich jedes
Programm kann als fortgehende Schleife dargestellt werden, die
Input zu Output verarbeitet. Dieser Ansatz wird auch in der Struk-
tur von Arduino-Programmen deutlich, wie Sie im entsprechenden
Abschnitt am Ende dieses Kapitels sehen werden.
Input erlaubt der realen Welt, mit dem Computer zu kommunizie-
ren. Sensoren können ihre Umwelt wahrnehmen und in Signale
verwandeln, die der Rechner verstehen kann. Dabei unterscheidet
man zwischen digitalem Input, der nur zwei Zustände (An und
Aus) kennt, und analogem mit einer Vielzahl von Zwischenwerten.
Neben Sensoren gehören zum Input auch all jene Bauteile, über die
ein Mensch Eingaben machen kann, wie etwa Schalter.
Die Ausgänge (oder auch der Output) ermöglichen es, die reale
Welt in der Umgebung des Computers zu verändern. Aktoren
32 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
manipulieren Licht und Ton oder setzen Dinge in Bewegung. Gene-
rell ist der Output dabei der schwierigere Teil des Physical Compu-
ting, weil er oft auch vom Erschaffer verlangt, dass dieser sich mit
den elektrischen und mechanischen Eigenschaften seiner Aktoren
auskennt und sie sinnvoll einsetzt. Es ist zum Beispiel viel einfa-
cher, die Umgebungshelligkeit zu messen, als sie mit richtig positi-
onierten und angesteuerten Lichtern zu verändern. Zum Output
zählt es aber auch, dass Bilder auf Monitoren angezeigt oder Töne
an Soundkarten ausgegeben werden, ein Mikrocontroller also wei-
tere angeschlossene Chips (und unter Umständen auch eigenstän-
dige Computer bzw. Mikrocontroller) steuert. Die gängigsten
Sensoren und Aktoren werden in Kapitel 7 vorgestellt.
Ein wichtiger Bereich des Physical Computing ist die Erweiterung
der Benutzerschnittstelle herkömmlicher Desktop-Computer.
Normale Software wird angepasst, damit sie mit physikalischen
Gegenständen interagieren kann. Dafür kann zum Beispiel die
Programmierumgebung Processing verwendet werden, die sich als
Schnittstelle zwischen Input und Output anbietet. Processing
besteht aus einer einfachen Programmiersprache, die vor allem die
Entwicklung von grafischen Programmen sehr leicht macht. In
diesem Buch taucht Processing deshalb an vielen Stellen auf, zum
Beispiel in Kapitel 5. Processing ist eng mit der Arduino-Program-
mierumgebung verwandt, in der Tat handelt es sich bei Arduino
um eine Weiterentwicklung davon, um Programme auf Mikrocon-
trollern schreiben zu können.
Ein Beispiel für eine solche Benutzerschnittstellenerweiterung sind
die Multitouch-Oberflächen, die es dem Benutzer erlauben, mit
mehreren Fingern oder Händen direkt mit einem Bildschirm zu
interagieren. Solche Oberflächen erinnern an den Film »Minority
Report«, und es gibt im Internet beeindruckende Videos auf den
Seiten der Forschungsgruppen, die sich mit diesem Konzept
beschäftigen. Sie lassen sich relativ einfach mit Kameras und Bea-
mern bauen und erobern zum Beispiel als Multitouch-Tische die
Museen und Bühnen dieser Welt. Es wird nicht mehr lange dauern,
bis wir diese auch in der freien Wildbahn beobachten können (das
iPhone und das iPad von Apple sind ein gutes Beispiel für diese
Technologie). Neue Eingabegeräte bedeuten auch einen neuen
Umgang mit Computern, die mit der Zeit immer weniger als solche
wahrgenommen werden.
Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser 33
Abbildung 2-1
Multitouch-Tisch: Reactable
(Foto: Xavier Sivecas Saiz)
34 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Zunächst benötigt man für einen Einstieg in das Physical Compu-
ting jedoch einige Grundlagen, die im Folgenden erklärt werden.
Dabei geht es zunächst um die Physik von Schaltungen und
Stromkreisen, die Vorstellung häufig gebrauchter Bauteile und
Werkzeuge sowie die Einführung ins Basteln, Löten und in die
Fehlersuche. Im Anschluss folgt ein kurzer Überblick über die
Arduino-Programmiersprache und die dazugehörige Software.
Elektrische Grundlagen
Der Kern aller Physical-Computing-Projekte ist der elektrische
Schaltkreis. Alle Eingangs- und Ausgangsschnittstellen kommuni-
zieren über elektrische Signale. Diese Signale übermitteln sowohl
Information, indem diese in elektrische Werte codiert wird, als
auch Energie, um z.B. Licht oder mechanische Kraft zu erzeugen
(um Gegenstände zu bewegen oder Klänge zu generieren). Ein elek-
trischer Schaltkreis (auch Stromkreis genannt) besteht aus Bautei-
len, die eine gewisse Funktion erfüllen und mit diesen elektrischen
Signalen umgehen, sowie aus Verbindungen, die diese einzelnen
Bauteile miteinander verknüpfen.
Elektrische Grundlagen 35
Strom ist die Menge der elektrischen Energie, die durch eine Ver-
bindung in der Schaltung fließt, und wird in Ampere gemessen.
Elektrischer Strom ist eigentlich die Bewegung von Abermillionen
kleiner Partikel, die eine elektrische Ladung tragen: den Elektro-
nen. Diese fließen von einem Punkt mit hoher elektrischer Energie
(also hohem elektrischen Potenzial) zu einem Punkt mit niedriger.
Im Wasserbeispiel entspricht der Strom der Menge des Wassers,
die innerhalb einer konstanten Zeit durch eine Röhre fließt. Damit
Strom von einer Stelle in einer Schaltung zu einer anderen Stelle
fließen kann, müssen diese beiden Stellen verbunden werden, zum
Beispiel mit einem Draht oder auch einem Bauteil; eine Lampe
stellt auch eine Verbindung dar, durch die der Strom fließen kann.
Alle Teile einer Schaltung, durch die Strom fließt, stellen für den
Strom unterschiedlich große Hindernisse dar: den Widerstand,
gemessen in Ohm. Durch diese Strombegrenzung wird elektrische
Energie umgewandelt. Ein einfacher Widerstand z.B. wandelt die
Energie, die an ihm abfällt, einfach in Wärme um, während andere
Bauteile Energie etwa in Bewegung (wie ein Motor) oder in Licht
(LEDs und Lampen) umsetzen können. Digitale Bauteile benutzen
diese Energie, um Berechnungen auszuführen. Drähte und Verbin-
dungen auf einer Platine haben einen sehr geringen Widerstand, sie
begrenzen den Stromfluss fast nicht. Schließt man zwei Punkte mit
unterschiedlichen elektrischen Potenzialen über einen Draht zusam-
men, wird nur wenig Widerstand in den Weg gestellt, es fließt ziem-
lich viel Strom und es kommt zu einem Kurzschluss. Im besten Fall
greifen dann Schutzmechanismen: Beim Arduino-Board, das über
USB seinen Strom bekommt, wird der Strom dann vom angeschlos-
senen Rechner gekappt. In einer Wohnung springen dann meist die
Sicherungen heraus. Es ist allerdings auch möglich, mit Kurzschlüs-
sen Bauteile zu beschädigen oder sich selbst zu gefährden, weshalb
man beim Zusammenbauen von elektrischen Schaltungen immer
vorsichtig vorgehen sollte. Man sollte lieber ein zweites Mal über-
prüfen, ob auch keine Kurzschlüsse erzeugt werden.
Ein sehr einfacher Schaltkreis wäre z.B. eine Glühbirne, die an eine
Stromquelle angeschlossen ist. Um die Lampe ein- und ausschalten
zu können, wird noch ein Schalter in den Schaltkreis eingebaut.
Dieser ist ein Bauteil, das eine elektrische Verbindung erzeugen und
trennen kann: Ist er offen, besteht keine elektrische Verbindung,
und es kann auch kein Strom durch den Schalter fließen; ist er
geschlossen, verhält er sich wie ein Draht, und der Strom fließt hin-
durch. Die Lampe verhält sich wie ein Widerstand, der den Strom-
36 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
fluss begrenzt und die Energie des Stroms in Licht und Hitze
umwandelt.
Jedes Bauteil im Schaltkreis braucht eine gewisse Menge Strom, um
seine Aufgabe zu erledigen. Bekommt die Glühbirne nicht genug
davon, wird der Draht, der das Licht erzeugt, nicht heiß genug, und
die Birne leuchtet nicht. Bekommt sie aber zu viel Strom, brennt
der Draht durch und die Glühbirne ist danach defekt. Die Menge
Strom, die durch ein Bauteil fließt, und die Spannung, die an ihm
anliegt, müssen also genau eingestellt werden.
Abbildung 2-2
Anschließen einer Lampe
Ohmsches Gesetz
Um Strom und Spannung in einem Schaltkreis zu berechnen, lassen
sich folgende Formeln einsetzen, die die drei elektrische Größen
verbinden. Diese Formeln sind auch die am häufigsten gebrauchten,
um Schaltungen zu entwerfen, und nach einer gewissen Zeit entwi-
ckelt man auch ein Bauchgefühl, wie ein Schaltkreis zu entwerfen
ist. Sie werden auch Ohmsches Gesetz genannt und lauten wie folgt:
U (Spannung) = R (Widerstand) × I (Strom)
oder wenn man das Ganze umformt:
I (Strom) = U (Spannung) / R (Widerstand)
Anschaulich lassen sich diese Formeln wie folgt beschreiben: Je
höher die Spannung zwischen zwei Punkten, desto mehr Strom
Elektrische Grundlagen 37
wird zwischen ihnen fließen, wenn sie zusammengeschlossen wer-
den. Je größer der Widerstand zwischen diesen zwei Punkten,
desto weniger Strom wird fließen. Wird also eine Spannung an ein
Bauteil angeschlossen, fließt genau so viel, wie der Widerstand des
Bauteils zulässt.
Als Beispiel wird ein Bauteil (Glühbirne) mit einem Widerstand
von 15 Ohm verwendet (Im Zweifelsfall kann der genaue Wider-
stand mit einem Messgerät ermittelt werden) und es an eine Span-
nungsquelle von 5 Volt angeschlossen. Die URI-Formel ergibt:
I = 5 Volt / 15 Ohm → I = 0,33A
Bevor man das tatsächlich anschließt, sollte man auf der Glühbirne
nachsehen, ob sie einen Strom von 0,33A verträgt. Bei 5V ent-
spricht das P = 5 Volt × 0,33A → 1,65 Watt
Befinden sich in einer Schaltung mehrere Bauteile hintereinander,
so wird ihr Widerstand einfach addiert. Der Strom wird bei jedem
Bauteil ein bisschen stärker eingeschränkt. So lässt sich auch der
Strom einstellen, der durch eine Glühbirne fließt; man begrenzt
ihn, damit der Draht der Glühbirne nicht durchbrennt. Bei Bautei-
len, die hintereinander angeschlossen werden, sagt man, dass sie in
Serie geschaltet sind. Der Gesamtwiderstand der in der Abbildung
gezeigten Schaltung ist also
R (Gesamt) = R (Widerstand) + R (Glühbirne)
Abbildung 2-3
Widerstand und Glühbirne in Serie
38 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Dadurch fällt an jedem Widerstand also eine Spannung ab, die pro-
portional zu seinem Widerstandswert ist. Die Spannung an der
Stelle A im Bild ist also UA = U × (R2 / (R1 + R2)). Diese Schaltung
wird sehr oft benutzt, um zum Beispiel definierte Referenzspannun-
gen zu erzeugen, eine Spannung zu skalieren oder um resistive
Sensoren, also jene, die sich wie ein veränderbarer Widerstand ver-
halten, auszulesen.
Ein Spannungsteiler aus zwei gleich großen Widerständen teilt also
eine Spannung genau in der Mitte, aus 5 Volt werden 2,5V. Aller-
dings nur so lange, wie kein oder fast kein Strom von dieser Mitte
aus woanders hinfließt.
Abbildung 2-4
Spannungsteiler
Leistung
Eine weitere wichtige Größe ist die Leistung, die in Watt gemessen
wird. Die Leistung gibt an, wie viel Energie ein Bauteil verbraucht,
wenn es in einem Schaltkreis angeschlossen ist und Strom durch
ihn fließt. Die Leistung, die ein Bauteil benötigt, kann berechnet
werden, indem man die Spannung an seinen Anschlüssen mit dem
fließenden Strom multipliziert, der durch ihn fließt. Dadurch lässt
sich auch berechnen, wie viel Strom und Spannung notwendig
sind, damit ein Bauteil seine Aufgabe erledigen kann. So braucht
eine 60-Watt-Glühbirne bei einer Spannung von 12V also 5A
Strom, damit sie mit ihrer vollen Helligkeit leuchtet.
Die Leistung ist auch wichtig, um zu wissen, wie viel Strom und
Spannung ein Bauteil verträgt, bevor es durchbrennt. Ein handels-
üblicher Widerstand verträgt zum Beispiel 0.125 bis 0.25 Watt. Da
Energie niemals ohne Weiteres vernichtet werden kann (obwohl es
einem oft so vorkommt), muss der Widerstand diese Leistung als
Wärme wieder abgeben, er wird also heiß. Kann die Wärme nicht
Elektrische Grundlagen 39
schnell genug an die Umgebung (Luft oder Kühlkörper) abgegeben
werden, wird der Widerstand so heiß, dass er zerstört wird. Dabei
können sogar Gegenstände in seiner Umgebung in Brand geraten.
Sicherheitsregeln
Für Menschen sind Ströme von mehr als 5 bis 10 mA sehr gefähr-
lich. Für Spannungen kleiner als 48 Volt kann im Normalfall davon
ausgegangen werden, dass nichts passieren kann, da der Wider-
stand eines Menschen zu groß ist, um bei einer solchen Spannung
so viel Strom fließen zu lassen.
Die auf dem Arduino-Board verwendeten Spannungen von 5 und 3
Volt stellen keine Gefahr für den Menschen dar. Trotzdem sollten
direkte Verbindungen zum Menschen (Berührung, EEG usw.) min-
destens mit einem 100kOhm-Widerstand in Reihe abgesichert wer-
den, wenn das Arduino-Board nicht aus einer Batterie versorgt
wird. Niemand kann garantieren, dass das Netzteil (z.B. im ange-
schlossenen PC) bei einem Defekt sicher bleibt. So können im
Ernstfall plötzlich 230 Volt aus der Steckdose an der Schaltung
anliegen.
Für Experimente mit höheren Spannungen sollte unbedingt ein
Experte herangezogen werden. Mindestens aber sollte immer eine
Fehlerstromsicherung verwendet werden. Diese Sicherungen sind
als Zwischenstecker in Baumärkten erhältlich und trennen die Ver-
bindung, sobald ein Strom von mehr als 10 bis 30mA über die
Hand fließt.
Ist es unumgänglich, an einer unter Spannung stehenden Schaltung
zu arbeiten, sollte eine Hand immer hinter den Rücken gehalten
werden: So wird ein gleichzeitiges Berühren mit beiden Händen
verhindert und somit ein Stromfluss direkt durch das Herz ver-
mieden. Schlimme Unfälle passieren häufig dadurch, dass eine
Hand am geerdeten Metallgehäuse ist, während die andere ein
Strom führendes Teil berührt.
40 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
In elektronischen Schaltungen werden oft Spannungen und Ströme
verwendet, um Informationen zu übermitteln, ohne dass man mit
dieser Energie direkt etwas antreiben möchte. Deshalb können
diese Ströme sehr viel kleiner sein. So kann zum Beispiel ein Audio-
signal als Spannung kodiert und in einer elektronischen Schaltung
verändert werden (z.B. um die Anteile an Höhen und Bässen einzu-
stellen, oder die Lautstärke). Erst im letzten Schritt wird dieses
Spannungssignal dann so verstärkt, dass damit große Lautsprecher
angesteuert werden können. Zur Verstärkung und Manipulation
dieser Signale werden Transistoren eingesetzt. Für viele Aufgaben
gibt es integrierte Schaltungen (ICs, integrated circuits), die diese
Leistungstransistoren ersetzen. Diese werden meistens Treiber
genannt. Diese integrierten Schaltungen können mehrere Millionen
einzelne diskrete Bauteile enthalten (wie z.B. Transistoren) und
werden in kleinen Plastikgehäusen mit Anschlusspins geliefert.
Diese Bauteile nennt man Chips, und es gibt sie von sehr einfachen
Varianten, die nur eine Handvoll Transistoren enthalten, über
komplizierte mikromechanische Sensoren (wie z.B. den Beschleu-
nigungssensor) bis hin zu großen Prozessoren wie z.B. einem Pen-
tium-Prozessor.
In elektronischen Schaltungen werden oft Spannungen eingesetzt,
die nur zwei Werte annehmen können: hohe Spannung (auch
HIGH-Spannung) und niedrige (auch LOW-Spannung). Diese zwei
unterschiedlichen Spannungen werden verwendet, um sogenannte
Bits zu codieren: 0 oder 1. Man spricht auch von diskreten Span-
nungswerten, weil es sich um zwei klar getrennte und definierte
Spannungen handelt, im Unterschied zu kontinuierlichen Span-
nungswerten, die über den gesamten Bereich von GND bis VCC
gehen. Diese Codierung, d.h. Darstellung von Information in Span-
nung, in diskrete Werte nennt man auch digitale Codierung (und
die verwendeten Spannungen werden digitale Spannungen
genannt), im Vergleich zur analogen Codierung (wie sie z.B. für
Audiosignale in einem Verstärker verwendet wird). Der größte Vor-
teil der digitalen Codierung ist, dass sich mit ihr Informationen
»exakt« übermitteln lassen. Eine analoge Spannung ist immer mit
Rauschen behaftet, das etwa durch die Umgebung erzeugt wird. Je
mehr eine analoge Spannung bearbeitet und übertragen wird, desto
stärker ist dieses Rauschen. Das lässt sich am besten mit analogen
Audioaufnahmen verdeutlichen: Eine Audiokassette oder eine
Schallplatte speichert analoge Informationen und wird mit der Zeit
und der Abnutzung immer schlechter. Je länger das benutzte Kabel
ist, das zum Anschluss des Abspielgeräts dient, desto schlechter
Elektrische Grundlagen 41
wird auch der Klang. Im Unterschied zu analogen Signalen lassen
sich digitale Signale wieder ohne Verlust verstärken. Wenn also
digitale Signale über lange Kabel gesendet werden, kann man sie
regelmäßig einlesen und wieder ausgeben. So ist es jetzt möglich,
über das Internet Leuten, die auf der anderen Seite des Globus
wohnen, ohne Verlust Fotos, Audioaufnahmen und Filme zu sen-
den. In einem deutlich kleinerem Maßstab wird diese Eigenschaft
in Chips benutzt, um Millionen von Transistoren zu verbinden,
ohne dass die ausgetauschten Spannungen am Ende vollends mit
Rauschen behaftet sind.
Die digitale Elektronik bildet die Grundlage für das »Rechnen« im
Physical Computing. Bei digitalen Signalen wird meistens kaum
Leistung übertragen (ein bisschen Strom wird immer noch in
Wärme umgewandelt, weswegen moderne Prozessoren auch sehr
schnell warm werden), sondern die Signale dienen rein der Kom-
munikation. Viele Sensoren und Aktoren bieten, obwohl sie intern
mit analogen Signalen und Werten arbeiten, eine digitale Schnitt-
stelle an, sodass sie sehr einfach anzuschließen sind. Der Königs-
baustein unter den digitalen Bauteilen ist der sogenannte Prozessor.
Er ist ein frei programmierbarer Computer, der sich in Schaltkreise
einbauen lässt. Hier wird zwischen Prozessor und Mikrocontroller
unterschieden. Erstere findet man etwa in Desktopcomputern und
Servern. Sie haben keine direkte Anbindung an die Umwelt, das ist
die Aufgabe weiterer Bausteine auf dem Mainboard. Bei einem
Mikrocontroller sind viele Schnittstellen (RS232, USB, Analog In,
PWM, IO-Ports) schon eingebaut, oft ist auch der Speicher direkt
integriert. Der Arduino-Prozessor hat eine interne Datenbreite von
8 Bit und ein paar Kilobyte Arbeitsspeicher. Er rechnet mit einem
Takt von 16 MHz.
42 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
• Seriell geschaltete Bauteile addieren ihren Widerstand.
• Parallel geschaltete Bauteile teilen den Strom entsprechend
ihrem Widerstand auf.
Es reicht meistens aus, diese Regeln zu benutzen, um die Strom-
und Spannungswerte für ein neues Bauteil zu berechnen. Bei schon
einmal verwendeten Bauteilen lassen sich meistens ältere Schalt-
kreise und Einstellungen wiederverwenden, sodass sich nach eini-
ger Zeit eine Art Routine einstellt. Bei einem neuen Bauteil muss im
dazugehörigen Datenblatt, das die elektrischen Eigenschaften des
Bauteils beschreibt, nachgeprüft werden, wie hoch die minimalen
und maximalen Strom-, Spannungs- und Leistungswerte sind.
Diese sind oft in einer Tabelle zusammengefasst.
44 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Eigenschaften und sonstige Informationen zusammengefasst, die
für eine korrekte und vollständige Verwendung des entsprechenden
Bauteils nötig sind. Im Internet gibt es eine ganze Reihe von Daten-
blattsammlungen, die die meisten gängigen Bauteile umfassen. Die
Websites [Link] und [Link]
[Link]/de/ stellen tausende von PDFs zur Verfügung, die von
den Herstellern dort hochgeladen wurden.
Diese unterschiedlichen Bauteile kann man bei vielen Distributoren
und Elektronikläden erwerben. Das Suchen und Bestellen von elek-
tronischen Komponenten kann schnell zu einem eigenen Sport
werden: Meistens gibt es nicht nur eine Version von einem Bauteil,
sondern gleich 15, die ähnliche Eigenschaften haben, sich aber
leicht voneinander unterscheiden. Hier lohnt es sich oft, bei ver-
schiedenen Läden und Distributoren nachzugucken, ob bestimmte
Bauteile vielleicht billiger zu erhalten sind, oder in einer sinnvolle-
ren Bauform oder mit besseren Eigenschaften. Zum Glück gibt es
mittlerweile, gerade für Arduino-Anfänger, Läden, die sich auf den
Hobbybastelbereich konzentrieren, wie z.B. [Link]
[Link] und [Link] Dort lassen sich auch
viele verschiedene Arduino-Boards und -Shields (siehe Anhang A),
Adapterplatinen, interessante Sensoren und sogar fertige Projekte
zum Selbstbauen (sogenannte Kits, in denen alle Bauteile für ein
Projekt schon zusammengelegt sind) erwerben.
Schaltbilder
Schaltbilder sind eine Art »Sprache«, um Informationen über elek-
tronische Schaltungen auszutauschen. Sie werden verwendet, um
Schaltungen in abstrahierter und vereinfachter Form grafisch dar-
zustellen. So können Entwickler diese entwerfen und planen, ohne
eventuelle physikalische Notwendigkeiten wie die eigentliche
Kabelführung zu berücksichtigen.. Mit ihnen lassen sich vage
bestimmte Schaltungen definieren, es ist aber auch möglich, genau
jedes Bauteil zu spezifizieren. Viele elektronische Projekte im Inter-
net werden auf diese Weise erklärt. Im unteren Schaltbild wird zum
Beispiel beschrieben, wie zwei LEDs über ihren jeweiligen Vorwi-
derstand an eine Batterie anzuschließen sind. Die zweite LED ist
über einen Schalter getrennt aktivierbar (siehe Abbildung 2-5).
Schaltbilder sind Diagramme, die zeigen, wie einzelne Bauteile mit-
einander verknüpft werden. Jedes Bauteil wird durch ein Symbol
dargestellt. Ihre Darstellung variiert allerdings von Schaltbild zu
Schaltbild (in den USA werden zum Beispiel Widerstände als Zick-
zack-Linien dargestellt, in Europa dagegen als kleine Kästchen).
Viele Bastler benutzen auch ihre eigenen Symbole um bestimmte
Bauteile zu zeichnen. Jedes dieser Symbole wird dann mit Strichen
mit anderen verbunden, und jeder dieser Striche steht für eine elek-
trische Verbindung. Die Bauteile werden meistens noch mit Namen
und Werten beschrieben (z.B. den Widerstandswerten einzelner
Widerstände, den Herstellernamen und den genauen Typbezeich-
nungen). Schaltbilder (oder Schaltpläne) können mit einer Reihe
von Programmen erstellt und bearbeitet werden (es ist natürlich
auch möglich, Schaltbilder auf eine Papierserviette zu zeichnen)
und greifen dabei auf einen Satz von meist genormten Symbolen für
die einzelnen Bestandteile zurück.
Tipp Für den Heimbereich bieten sich zum Zeichnen von Schaltbil-
dern Programme an wie gEDA (eine Open-Source-Lösung, die
aus vielen einzelnen kleinen Programmen besteht), KiCad (das
auch frei ist) oder EAGLE (das für den Heimbereich frei ist). Es
reicht meistens allerdings, die Schaltung auf einem einfachen
Blatt Papier zu entwerfen.
GEDA: [Link]
KiCad: [Link]
EAGLE: [Link]
46 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
getrennten Verbindungen sind. Weiterhin werden oft benutzte
Spannungen in der Schaltung (meistens jene, die von der Stromver-
sorgung zur Verfügung gestellt werden) mit einem einzelnen Sym-
bol gezeichnet, sodass es nicht notwendig ist, jeden Baustein
immer mit der Stromversorgung zu verbinden. Die Masse (also die
Spannung 0 Volt) wird meistens mit einem umgekehrten T-Symbol
dargestellt, während die Spannungsversorgung (bei Arduino-Schal-
tungen meistens 5 Volt) mit einem Pfeil nach oben dargestellt wird.
Wie so oft sind diese Symbole aber von Schaltbild zu Schaltbild
unterschiedlich, und es ist wichtig, hier nicht Spannungen zu ver-
wechseln. Bei ICs wird die Spannungsversorgung oft gar nicht erst
mit eingezeichnet, sondern es wird davon ausgegangen, dass dem
IC auch Strom zugeführt wird.
In der unteren Abbildung ist diese Schaltung mit zwei LEDs und
Vorwiderständen dieses Mal mit eigenen Symbolen für die Span-
nungsversorgung gezeichnet.
Abbildung 2-6
Schaltbild mit Spannungs-
versorgungssymbolen
Nachdem eine Schaltung entworfen wurde, ist es Zeit, sie mit rich-
tigen Bauteilen zu realisieren. Das Schaltbild ist also sozusagen ein
Bauplan. Oft ist es nicht möglich, die Bauteile so anzuordnen, wie
sie auf dem Schaltbild vorkommen. Bei Platinen werden dazu oft
mehrere Schichten Kupfer benutzt, bei Steckbrettschaltungen wer-
den für die Verbindungen sowohl die vertikalen und horizontalen
Lochreihen des Steckbretts als auch einzelne gesteckte Drähte ver-
wendet. Die Bauteile müssen nicht so angeordnet werden wie auf
dem Schaltbild. Es ist allerdings sinnvoll, auch auf dem Steckbrett
oder der Platine Bauteile, die in einem Zusammenhang miteinander
stehen, nah beieinander aufzubauen. Wichtig ist, dass jede elektri-
sche Verbindung, die auf dem Schaltbild steht, auch im physikali-
schen Aufbau hergestellt wird.
48 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Wird er wieder losgelassen, wird der Kontakt wieder unterbrochen
(solche Taster nennt man »normally open« oder »n. o.«, also »im
Normalzustand offen«). Es gibt auch Taster, die ohne Betätigung
durch den Benutzer einen Kontakt herstellen und diesen erst beim
Betätigen unterbrechen. Diese nennt man »normally closed« oder
»n. c.«.
Weiterhin gibt es viele verschiedene Schalter, die sich durch die
Anzahl der durch sie einstellbaren Verbindungen unterscheiden. So
gibt es einfache, die nur eine elektrische Verbindung trennen oder
aufbauen können. Kompliziertere Schalter können aber z.B. paral-
lel zwei, drei oder mehr Verbindungen aufbauen und trennen.
Generell werden Schalter durch die Anzahl der verschiedenen her-
stellbaren Verbindungen (auf Englisch »poles«) und die Anzahl der
elektrischen Leitungen, die verbunden werden können (auf Eng-
lisch »throws«) beschrieben. In der folgenden Tabelle sehen Sie
eine Übersicht herkömmlicher Schaltertypen.
Abbildung 2-7
Schalter
50 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
ein bisschen abgesetzt von den anderen an einem Ende des Wider-
stands zu finden ist), die Toleranz angibt, also beschreibt, wie
genau der angegebene Wert zum tatsächlichen passt. Beim zweiten
Code werden fünf Farbbänder benutzt. Hier geben die ersten drei
den Widerstandswert an, das vierte ist der Multiplikator, und das
letzte Band gibt die Toleranz des Widerstands an.
Abbildung 2-8
Widerstand
Ein variabler Widerstand ist, wie sein Name schon sagt, einer, bei
dem der Wert eingestellt werden kann. Bekannte Beispiele für vari-
able Widerstände sind Potentiometer und Schieberegler. Ein Poten-
tiometer besteht aus einem speziellen Widerstand, an dem ein
sogenannter Schleifer angebracht ist, der sich durch die Drehung
entlang der leitenden Oberfläche bewegt. Dadurch vergrößert oder
verkleinert er auch den Widerstandswert und somit die Spannung,
die am Potentiometer anliegt. Ganz ähnlich wie Drehpotentiometer
funktionieren auch Schieberegler (oder »Fader«). Dort ist der
Schleifer nicht rund, sondern länglich, sodass der Regler bei einer
Bewegung den Widerstand verkürzt. Bekannte Anwendungen sind
Lautstärkeregler oder Crossfader auf Mischpulten. Im Arduino-
Bereich können Fader z.B. für die Steuerung von Licht oder Ton
verwendet werden.
Potentiometer und Schieberegler haben meistens drei Anschlüsse.
Die zwei äußeren sind an beiden Enden des zu manipulierenden
Materials angebracht, und der Widerstand zwischen ihnen verän-
dert sich nicht. Der dritte Anschluss liegt am Schleifer an und der
Widerstand von diesem Anschluss zu den beiden anderen variiert,
je nachdem, wie der Schleifer bewegt wird. Wenn an den beiden
äußeren Anschlüssen definierte Spannungen angebracht werden,
wird ein Spannungsteiler gebildet. Dadurch variiert die Spannung
am mittleren Anschluss zwischen den beiden äußeren Spannungen.
Dieser Wert lässt sich dann durch einen analogen Eingang am
Arduino auslesen.
Es gibt allerdings auch noch eine ganze Reihe anderer Bauteile, die
sich wie variable Widerstände verhalten (man nennt diese Bauteile
52 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
auch resistive Sensoren). So gibt es lichtempfindliche Widerstände,
die ihren Wert ändern, je nachdem, wie viel Licht aus sie einfällt.
So einen Widerstand nennt man LDR (light dependent resistor)
oder auch Fotowiderstand oder Fotozelle. Thermistoren sind
Widerstände, die ihren Wert je nach Temperatur ändern. Druck-
sensoren und Flexsensoren sind Widerstände, die ihren Wert
ändern, je nachdem, wie viel Druck auf sie ausgeübt wird oder wie
stark sie gebogen werden. Wie Widerstände habe diese Bauteile
auch zwei Anschlüsse, und ihre Richtung ist nicht relevant. Oft
werden resistive Sensoren mit einem weiteren Widerstand an defi-
nierte Spannungen angeschlossen, um so einen Spannungsteiler
aufzubauen. Dadurch lässt sich ein resistiver Sensor wie ein Poten-
tiometer auslesen. Mehr Informationen zu resistiven Sensoren fin-
den Sie in Kapitel 7.
Kondensator
Einen Kondensator kann man als ein Speicherbauteil für elektrische
Ladung betrachten. Fließt Strom hinein, speichert dieser intern eine
Ladung. Wird die Spannung entfernt, leert sich der Kondensator
und liefert Strom, bis er keine Ladung mehr enthält. Dieses Entlee-
ren geschieht allerdings nicht sofort, sondern spielt sich über einen
gewissen Zeitraum ab, der von der Kapazität des Kondensators
(wie viel elektrische Ladung er aufnehmen kann, gemessen in
Farad) und von der Menge des fließenden Stroms abhängt.
Dadurch können Kondensatoren z.B. eingesetzt werden, um sich
schnell verändernde Ströme zu begrenzen und »aufzuweichen«:
Fließen kurze Stromstöße, sammelt der Kondensator sie auf, wird
der Stromfluss kleiner, braucht er seine gespeicherte Ladung auf,
um den Strom aufrechtzuerhalten.
Farad ist eine sehr große Größe, weshalb die Kondensatoren in den
Arduino-Schaltungen meistens in Bereiche von Mikrofarads bis
Picofarads gehen. Kondensatoren gibt es sowohl in unpolarisierter
Bauform, bei der es keinen Einfluss hat, in welcher Richtung sie
angeschlossen werden, als auch in polarisierter Bauform. Bei die-
sen polarisierten Kondensatoren (meistens Elektrolytkondensato-
ren, kurz auch Elkos genannt) steht auf dem Gehäuse, welcher
Anschlusspin an die positive und welcher an die negative Seite
angeschlossen werden muss. Bei digitalen Schaltungen werden sie
oft eingesetzt, um die Spannungsversorgung für Bausteine zu glät-
ten. Sie können auch benutzt werden, um kurze Impulse, wie sie
z.B. aus Piezomikrofonen kommen, zeitlich zu verlängern, sodass
Abbildung 2-10
Kondensatoren
54 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Abbildung 2-12
Relais
Dioden
Abbildung 2-13
Diode
Abbildung 2-14
Invertierungsschutz mit einer
Diode
Spannungsregler
Lineare Spannungsregler erzeugen aus der ursprünglichen eine
geregelte niedrigere Spannung. Dazu müssen am Eingang 2 bis 3
Volt mehr anliegen, als die Ausgangsspannung sein soll.
Häufig wird der Regler 7805 (5 Volt) verwendet. Er kann aus 7 bis
35 Volt eine geregelte Spannung von 5 Volt erzeugen. Je höher die
Eingangsspannung, desto besser muss die Kühlung sein; hier wird
empfohlen, ein kleines Stück Blech an den Regler zu schrauben.
56 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Auf dem Arduino-Board ist schon ein Spannungsregler montiert,
außerdem funktioniert der USB-Chip auch als Quelle für eine Span-
nung von 3,3 Volt. Die Spannung, die das Arduino-Board auf den
Spannungsversorgungspins liefert, ist also schon reguliert.
Steckbretter
Abbildung 2-16
Steckbrett
58 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
leicht in Steckbretter stecken lässt und weil sie nach dem Biegen
ihre Form behält. Allerdings ist sie mechanisch nicht sehr belast-
bar, weil der einzige Draht in ihrem Kern sehr schnell brechen
kann, wenn man das Kabel bewegt.
Deshalb gibt es eine andere Sorte Kabel, die in ihrem Innern eine
Kupferlitze hat, die aus vielen kleinen einzelnen, biegsamen Dräh-
ten besteht. Diese Kabel sind deutlich robuster und werden oft
verwendet, um zum Beispiel Schalter und Taster mit einer Platine
zu verbinden oder Kabel über längere Distanzen zu verlegen. Es
gibt sie auch in mehradriger Ausführung, z.B. als Netzwerk-, Tele-
fon- und Druckerkabel. In einem mehradrigen Kabel sind mehrere
einzelne Litzenkabel zusammen verlegt, sodass sich z.B. mehrere
Datenleitungen mit einem einzigen Kabel verbinden lassen. Aller-
dings kann man Litze nicht einfach ins Steckbrett einstecken, son-
dern muss sie an eine Steckerleiste anlöten, die man dann in das
Steckbrett einbauen kann.
Eine praktische Alternative zu Steckbrettern sind Kabel mit Kroko-
dilklemmen, die sich gut dazu eignen, größere mechanische Bau-
teile miteinander zu verknüpfen, um Projekte, die viel Raum
brauchen, aufzubauen. Allerdings halten Krokodilklemmen nicht
besonders gut, sodass diese Art des Verkabelns wirklich nur kurz-
zeitig verwendet werden sollte, um dann z.B. durch robuste Stecker
ersetzt zu werden.
Zusätzlich zu Kabeln gibt es auch eine unendliche Anzahl verschie-
dener Stecker und Buchsen; viele Kabel sind auch schon mit pas-
senden Steckern versehen (alternativ kann man Stecker auch
anlöten oder mit einer sogenannten Crimpzange ancrimpen). Es
gibt sie in allen Formen und Größen, und sie werden verwendet,
um Platinen mit Strom zu versorgen und verschiedene Platinen
oder Bauteile miteinander zu verknüpfen, ohne dass jedes Mal eine
Verbindung gelötet werden muss.
Eine wichtige und beim Basteln häufig verwendete Steckerform
sind die sogenannten Pin- und Buchsenleisten, die meistens in
einem 2,54-mm-Raster verwendet werden. Pinleisten bestehen aus
einer oder zwei Reihen von Pins, die aus der Platine hervorstehen.
Sie werden verwendet, um Flachbandkabel aufzustecken oder
bestimmte Verbindungen mithilfe von Jumpern herzustellen. Auf
dem Arduino-Board gibt es eine doppelreihige Pinleiste (2x3), die
zum Programmieren des Arduino-Prozessors verwendet wird. Auf
älteren Arduino-Boards wie dem Arduino NG wird auch eine
Abbildung 2-17
Kabel
Abbildung 2-18
Stecker
60 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
ICs
ICs (integrated circuits, integrierte Schaltkreise), auch Chips
genannt, sind komplette Schaltungen, die in einem eigenen kleinen
Plastikgehäuse platziert werden und sich für spezielle Aufgaben in
einer Schaltung einsetzen lassen. ICs sind also ein Ersatz für Schal-
tungen, die man meistens auch separat aufbauen könnte; aber
durch die seit den 1960er Jahren immer weiter verbesserten und
verfeinerten Herstellungsmethoden ist es möglich, solche Schaltun-
gen auf dem Bruchteil eines Quadratzentimeters zu realisieren.
Integrierte Schaltkreise können sehr einfache Schaltkreise sein
(zum Beispiel eine Reihe von Transistoren zur Stromverstärkung,
die man Treiberbausteine nennt), aber auch hoch komplizierte
CPUs und Signalprozessoren. Auch der Arduino-Prozessor ist ein
solcher Baustein.
ICs gibt es in verschiedenen Bauformen; die meisten haben mittler-
weile die SMD-Bauform, weshalb sie nicht so einfach beim Auf-
bauen von Schaltungen auf der Steckplatine zu verwenden sind.
Dazu eignet sich die DIP-Bauform deutlich besser, weil diese sich
direkt auf der Steckplatine einstecken lässt. Alle ICs haben Pins, die
zur Stromversorgung angeschlossen werden sollen. Hier ist beson-
dere Vorsicht geboten, damit man die Stromversorgung nicht inver-
tiert (als GND an die positive Spannung anschließen und VCC an
die Masse), weil dadurch oft die Chips kaputtgehen. Zu jedem IC
gibt es vom Hersteller ein Datenblatt, das die Pinbelegung zeigt
(hier heißt GND auch oft Vss) und die Funktionsweise des Chips
erklärt. Weiterhin gibt es in jedem Datenblatt eine Tabelle, die
Grenzwerte und Sollwerte für verschiedene Größen wie maximalen
Strom, maximale Spannung und niedrigste und höchste Geschwin-
digkeit angibt. Oft ist es praktisch, im Arduino-Wiki unter http://
[Link]/ zu suchen, ob es schon Beispielschaltungen zu einem
bestimmten Chip gibt (und vielleicht sogar schon eine Library, die
die Kommunikation mit dem Chip implementiert).
Wenn eine Schaltung auf einer Platine gebaut wird (oder auch auf
einer Lochrasterplatine), ist es bei DIP-Gehäusen sinnvoll, die
Chips auf einem Sockel einzubauen. Der Sockel wird auf die Platine
gelötet und der Chip dann nur in den Sockel eingesteckt. Mit einem
Schraubenzieher oder einer dünnen Zange (es gibt auch spezielle
Chipzangen) lässt er sich dann auch vorsichtig wieder herausneh-
men. Dadurch lassen sich defekte Chips auswechseln, ohne gleich
62 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Abbildung 2-19
ICs
Abbildung 2-20
Zangen
Löten
Die meisten der Schaltungen in diesem Buch lassen sich ohne
Löten auf einem Steckbrett anbringen. Allerdings ist diese Art, Pro-
jekte aufzubauen, weder sonderlich stabil noch elegant oder ästhe-
tisch. Immer besteht die Gefahr, dass einzelne Kabel aus den
Löchern herausfallen, wenn z.B. am Arduino gezogen wird. Auch
das Steckbrett selbst hat oft nicht die gewünschten Dimensionen,
sodass es nicht möglich ist, die komplette Schaltung in ein
Gehäuse einzubauen oder im Rahmen einer Kunstinstallation an
einem Gegenstand zu befestigen. In all diesen Fällen ist es sinnvol-
ler, die Schaltung, sobald sie fertig und getestet ist, in eine endgül-
tige Form zu bringen, indem man sie auf eine Platine lötet. Das ist
64 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
nur halb so wild, wie es klingt, und nach ein paar Versuchen stellt
sich schnell heraus, dass Löten sogar Spaß macht. Vor allem wer-
den dadurch die einzelne Projekte, die in diesem Buch vorgestellt
oder später eigens entwickelt werden, zu richtigen benutzbaren
und robusten Gegenständen, die immer wieder verwendet werden
können.
Im Internet gibt es eine große Gemeinde von Elektronikerinnen
und Elektronikern, die Schaltungen und Projekte entwickeln und in
Form von Schaltplänen und Bausätzen veröffentlichen. Mit Löt-
kenntnissen ist es dann sehr einfach, einen dieser Bausätze zu
bestellen, zu bestücken und zum Laufen zu bringen. Diese Bausätze
reichen von einfachen Blinkschaltungen (wie der Brainmachine von
Mitch Altman, unter [Link] zu finden
und auch in Kapitel 4 beschrieben, und dem Open Heart Kit von
Jimmie Rodgers, unter [Link]
zu finden) über Gadgets wie das T.V.-be-Gone (auch von Mitch
Altman, unter [Link] bis hin zu komplizierten
Projekten wie der x0xbox (einem Nachbau der legendären TR-303
Groovebox von Ladyada), irrsinnig vielen verschiedenen Synthesi-
zermodulen (siehe auch Kapitel 10), Robotern, selbstfahrenden
Autos und Ähnlichem. Das Löten eröffnet also eine riesige Welt an
Möglichkeiten.
Lochrasterplatinen
Die einfachste Art, eine Schaltung von einem Steckbrett auf eine
Platine zu bringen, ist die Benutzung einer Lochrasterplatine. Diese
gibt es in verschiedenen Formen. Sie bestehen aus einer Grund-
platte (meistens aus Epoxid, manchmal auch aus Karton), auf der
in regelmäßigen Abständen Löcher eingestanzt sind. Diese Löcher
sind von einer kleinen Kupferschicht umgeben und auf manchen
Platinen auch schon rudimentär verknüpft (in sogenannten Rails,
Verknüpfungen, die sich über das ganze Board ziehen). Dort lassen
sich Komponenten hindurchstecken, ähnlich wie bei einem Steck-
brett. Die Beinchen dieser Komponenten werden dann an die Kup-
ferschicht gelötet, siehe Abschnitt »Löten«.
Wie man sich leicht vorstellen kann, tauchen hier deutlich mehr
Probleme auf, als wenn eine Schaltung auf einem Steckbrett zusam-
mensetzt wird. Ist ein Bauteil schon angelötet, ist es nur schwer
wieder zu lösen. Weiterhin dürfen sich Drähte nicht kreuzen, weil
Löten 65
Abbildung 2-21
Gelötete Lochrasterplatine
66 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
und der Bauteile (die Drahtbeinchen) werden mit der Spitze des
Lötkolbens erhitzt, und ein drittes Metall (das man Lötzinn oder
Lot nennt) wird zum Schmelzen gebracht. Das geschmolzene
Lötzinn haftet an beiden Metalloberflächen (auf Platinen wird
meistens Kupfer verwendet) und erhärtet sich beim Kühlen, sodass
es Bauteil und Platine zusammenhält.
In diesem Abschnitt werden die verschiedenen Werkzeuge und Ver-
brauchsmaterialien vorgestellt, die beim Löten verwendet werden.
Das wichtigste Werkzeug ist natürlich der Lötkolben. Er besteht
aus einer kleinen Lötstation (es gibt auch Lötkolben, die direkt an
die Stromversorgung angeschlossen werden), mit der der Lötkol-
ben an- und ausgeschaltet wird, dem Kolben an sich, der aus einem
Griff und einem Heizelement besteht und über ein Kabel an die
Lötstation angeschlossen ist, und einer Lötspitze aus Metall, mit
der die eigentliche Lötarbeit durchgeführt wird.
Es gibt sehr viele Lötkolben, die man käuflich erwerben kann, je
nachdem, welche Eigenschaften gewünscht sind. Auf zwei Dinge
sollte geachtet werden: Zunächst die Leistung, die der Lötkolben
erbringen kann. Diese wird in Watt gemessen und beeinflusst, wie
schnell ein Kolben seine Lötspitze erhitzen kann. Die andere wich-
tige Eigenschaft ist, dass der Lötkolben über eine Temperaturrege-
lung verfügen sollte. Dadurch lässt sich die Temperatur der Spitze
einstellen und je nach benutzten Bauteilen und zu lötenden Flächen
(für größere Bauteile und Flächen wird mehr Leistung benötigt)
verändern. Besonders interessant sind Lötkolben mit automati-
scher Temperaturregelung, die die Leistung immer so anpassen,
dass die Lötspitze die gewünschte Temperatur hat. Für elektroni-
sche Schaltungen braucht man ein Lötkolben, der ungefähr 25 bis
45 Watt Leistung hat. Bei größerer Leistung besteht die Gefahr,
dass Bauteile und Platine beschädigt werden, und bei kleinerer
Leistung heizt der Kolben das Lötzinn nicht genug, was die Gefahr
schlechter Lötverbindungen erhöht.
Die Spitze des Lötkolbens ist praktisch gesehen der wichtigste Teil
des Lötkolbens. Es ist wichtig, eine gute Lötspitze auszusuchen
(aus Eisen, nicht aus Kupfer). Je dicker die Spitze ist, desto mehr
Hitze kann an die zu lötenden Bauteile übertragen werden, aber
umso vorsichtiger muss dann vorgegangen werden, um nicht
angrenzende Bauteile und Lötpunkte mit zu erhitzen. Mit einer
kleineren Spitze ist es zwar einfacher, präzise zu arbeiten, durch die
geringere Hitzeübertragung ist es allerdings schwieriger, gute Löt-
punkte zu erzeugen. Besonders wichtig ist, dass die Spitze nicht
Löten 67
oxidiert. Sonst überträgt sie keine Hitze mehr, und es wird sehr
schwer, sauber zu löten. Deswegen muss sie regelmäßig gesäubert
und anschließend mit Lötzinn geschützt werden (es wird ein biss-
chen Lötzinn auf der Spitze geschmolzen und dort gelassen). Säu-
bern kann man die Spitze mit einem kleinen nassen Schwamm
(allerdings nicht, wenn bleifreies Lötzinn verwendet wird) oder z.B.
mit Stahlwolle. Es kann vorkommen, dass nach einiger Zeit die Löt-
spitze, besonders wenn sie schlecht gepflegt wird, komplett oxi-
diert und nicht mehr zum Löten verwendet werden kann. Bei den
meisten Lötkolben lässt sich die Lötspitze austauschen; vor dem
Austauschen sollte die Spitze natürlich abgekühlt sein.
Abbildung 2-22
Lötkolben
Das zweite wichtige Element beim Löten ist das Lötzinn. Auch hier
gibt es eine große Menge verschiedener Arten, insbesondere seit in
Europa die ROHS-Regelung in Kraft getreten ist, die für die indus-
trielle Fertigung bleifreies Lötzinn vorschreibt. Im Hobbybereich ist
es allerdings immer noch möglich, mit bleihaltigem Lötzinn zu
arbeiten, was auch deutlich einfacher ist, denn bleifreies Lötzinn
hat einen deutlich höheren Schmelzpunkt und benötigt starke
Flussmittel. Diese sind schädlich und man kommt gerade beim
Handlöten leicht mit ihnen in Kontakt. Als Lötzinn für die Projekte
in diesem Buch und für weitere Hobbyelektronikprojekte sei nor-
males bleihaltiges 60/40-Lötzinn mit Flussmittelkern empfohlen.
Das bedeutet, dass 60% aus Zinn bestehen und 40% aus Blei.
Wegen der enthaltenen Flussmittel (die dazu verwendet werden,
die Metalle vor dem Verbinden zu säubern, um das Anhaften des
Lötzinns zu erleichtern) lässt sich damit sehr gut arbeiten. Verfüg-
68 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
bar ist es in kleinen Drahtspulen mit verschiedenen Durchmessern.
Es ist empfehlenswert, eher dünnes Lötzinn zu nehmen, weil sich
dadurch die aufgetragene Menge einfacher kontrollieren lässt.
Praktisch sind zum Beispiel Spulen mit 0,5 mm Durchmesser.
Abbildung 2-23
Dritte Hand
Löten
Der eigentliche Lötvorgang ist sehr einfach. Als Erstes muss ein
Bauteil durch die Löcher in der Platine (sei es auf einer Lochraster-
platine oder auf einer richtigen) gesteckt und dort festgehalten wer-
den. Das kann man entweder mit einer dritten Hand machen oder
einfach, indem man die Beinchen des Bauteils leicht verbiegt,
sodass es von selbst hängenbleibt. Im nächsten Schritt werden mit
dem Lötkolben in der einen Hand und mit dem Lötzinn in der
anderen das Beinchen und die Leitung auf der Platine erhitzt. Nach
ein oder zwei Sekunden ist die Stelle heiß genug, dass man das
Lötzinn anbringen und an die Lötspitze halten kann. Das Lötzinn
Löten 69
schmilzt sofort (wenn die Temperatur des Lötkolbens richtig einge-
stellt ist – ca. 300 Grad Celsius für bleihaltiges Lötzinn und 350 bis
400 Grad für bleifreies) und verteilt sich auf Platine und Beinchen.
Anschließend werden Lötkolben und Lötzinn entfernt, der Löt-
punkt kühlt ab, und das Bauteil ist mit der Platine verbunden. Der
erzeugte Lötpunkt sollte glatt und glänzend sein (bei bestimmten
bleifreien Lötzinnen sind die Lötpunkte allerdings immer grau und
matt) und das komplette Loch auf der Platine überdecken. Ist der
Lötpunkt matt und merkwürdig geformt, bildet er mit hoher Wahr-
scheinlichkeit eine kalte Lötstelle, die schlecht oder gar nicht leitet
und wahrscheinlich auch leicht durch mechanische Belastung
bricht.
Eine wichtige Regel für den Lötvorgang ist, dass weniger Lötzinn
besser ist. Es sollte immer nur so viel Lötzinn angebracht werden,
wie ausreicht, um eine stabile Verbindung herzustellen. Bei zu viel
Lötzinn besteht die Gefahr, dass sich ein kleines Lötkügelchen bil-
det, das unter Umständen nicht richtig leitet. Ein weiterer wichtiger
Punkt ist, dass der Vorgang schnell ausgeführt werden sollte. Die
verschiedenen Schritte sollten zusammen nicht mehr als fünf
Sekunden dauern. Je länger an einer Lötstelle geheizt wird, desto
mehr steigt die Wahrscheinlichkeit, dass sowohl Bauteil als auch
Platine beschädigt werden (gerade bei Lochrasterplatinen kommt
es vor, dass sich die Kupferschicht vom Platinenmaterial löst). Je
länger das Lötzinn erhitzt wird, desto weniger Flussmittel enthält es
(weil dieses sehr schnell verdampft). Wenn kein Flussmittel mehr
vorhanden ist, fließt das Lötzinn nicht mehr richtig und bleibt an
Lötkolben, Bauteil und Platine haften, sodass er sich nicht mehr
sauber verarbeiten lässt: Es kommt zu einer kalten Lötstelle. In die-
sen Fällen lässt sich das Problem durch Hinzufügen von Flussmittel
oder durch Entfernen des Lötzinns lösen (siehe nächster Abschnitt
»Entlöten«).
Nachdem ein oder mehrere Lötpunkte bearbeitet worden sind,
muss die Spitze des Lötkolbens gereinigt werden. Dazu kommt der
zuvor erwähnte Schwamm oder Stahlwolle zum Einsatz. Die Löt-
spitze sollte stets leicht von Zinn bedeckt und glänzend sein, um
Oxidation zu vermeiden.
Um Kabel und Drähte anzulöten, müssen die abisolierten Enden der
Kabel verzinnt werden. Bei Litze ist es praktisch, die einzelnen Kup-
ferdrähte zusammenzudrehen, sodass sie nicht abstehen. Anschlie-
ßend wird das Ende des Kabels leicht erhitzt und mit Lötzinn
bedeckt. Dadurch lässt sich ein Kabel leicht an einem Bauteil befes-
70 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
tigen, weil das zuvor verzinnte Ende beim Aufheizen gleich angelö-
tet wird.
Um Leiterbahnen auf einer Lochrasterplatine herzustellen, wird oft
verzinnter Draht verwendet (mit Kupferlack bedeckter Draht funk-
tioniert nicht so gut, weil diese Lackisolierung erst weggebrannt
werden muss). Es ist wichtig, bei Drähten, die geknickt werden,
alle möglichen Kanten auf der Lochrasterplatine zu befestigen,
damit sich die Drähte nicht lösen oder verbiegen und so Kurz-
schlüsse erzeugen.
Entlöten
Trotz aller Vorsicht und Übung kommt es immer wieder vor, dass
ein Bauteil entweder falsch angelötet wird oder beim Löten ein Feh-
ler passiert, wenn zum Beispiel zwei benachbarte Lötpunkte aus
Versehen verbunden werden. In diesen Fällen muss die fehlerhafte
Stelle entlötet werden. Dazu gibt es verschiedene Möglichkeiten:
Bei einem Bauteil müssen alle Beinchen auf einmal entlötet werden,
damit es auch ausgesteckt werden kann. Im einfachsten Fall (wenn
z.B. die Beinchen nahe beieinander liegen) können alle Beinchen
auf einmal erhitzt werden, indem man den Lötkolben schräg hält
(dabei auf mögliche Verbrennungsgefahr achten!) oder noch mehr
Lötzinn auf die zu entlötenden Stellen gibt, damit alle Stellen ver-
bunden sind. Während eine Stelle erhitzt wird, kann man dann das
Bauteil entfernen (hier muss auch darauf geachtet werden, dass es
nicht zu Verbrennungen kommt, weil das Bauteil und besonders
seine Beine heiß sind). Geschwindigkeit ist dabei auch von Vorteil,
weil dadurch die Bauteile nicht beschädigt werden. Beim Heraus-
ziehen muss darauf geachtet werden, dass die Lötstellen auch wirk-
lich geschmolzen sind, da man sonst leicht die Platine beschädigen
kann, wenn sich Leiterbahnen bzw. Kupferringe von ihr lösen.
Systematischer kann man vorgehen, indem man Entlötlitze verwen-
det. Entlötlitze ist eine eng geflochtene Kupferlitze, die Lötzinn
aufsaugen und so von der Platine abtragen kann. Die zu entlötende
Stelle wird durch die Litze hindurch erhitzt, und das geschmolzene
Lötzinn wird von der Litze aufgesaugt. Wenn anschließend die
Lötstelle frei von Zinn ist, können die Bauteile entfernt werden.
Hier muss darauf geachtet werden, dass die Stellen wirklich sauber
und frei sind, weil sonst die Platine beim Herausziehen beschädigt
werden kann. Da die Litze aus Kupfer ist, wird auch sie sehr
schnell heiß.
Löten 71
Alternativ kann man auch eine sogenannte Entlötpumpe verwen-
den, um Lötzinn von der Platine abzutragen. Die Entlötpumpe
muss zuerst geladen werden, indem die interne Feder gespannt
wird. Anschließend wird die zu entlötende Stelle mit dem Lötkol-
ben erhitzt, die Entlötpumpe sehr nah darübergehalten und das
geschmolzene Lötzinn aufgesaugt, indem der Pumpentaster, der die
Feder auslöst, gedrückt wird. Dadurch wird das Zinn in die Pumpe
aufgenommen und von der Platine abgetragen. Beim nächsten
Aufladen der Pumpe wird das aufgesaugte Lötzinn nach außen
gepresst und muss entsorgt werden. Bei der Verwendung ist Vor-
sicht geboten, weil man mit ihr sehr leicht Platinen beschädigen
kann, wenn die Lötstelle nicht richtig erhitzt wurde.
Schließlich kann man z.B. für Chips oder mechanische Bauteile
auch mit einer Heißluftpistole, die auf 300 bis 350 Grad kalibriert
wird, großflächig entlöten. Die entsprechende Stelle wird mit der
Heißluft erhitzt, bis das Zinn schmilzt. Anschließend kann man
durch Umdrehen der Platine und leichtes Rütteln die Chips herun-
terfallen lassen. Bei diesem Vorgang können Chips schnell beschä-
digt werden, und der zu entlötende Bereich ist auch nicht sehr
präzise einzustellen. Auch wird die Platine bei dem Vorgang extrem
heiß, weshalb große Vorsicht geboten ist.
Sicherheit
Auch wenn Löten keine sonderlich gefährliche Aktivität ist, sollten
ein paar Sicherheitsregeln beachtet werden. Die wichtigste ist
natürlich, dass man den Lötkolben nicht an der Spitze berühren
sollte. Das klingt zwar selbstverständlich, ist aber in der Realität
doch nicht so einfach. Wie man auch schnell merkt, sind Metalle
besonders gute Hitzeleiter, sodass Bauteilbeinchen oder Drähte,
wenn sie mit dem Lötkolben erhitzt werden, schnell sehr heiß wer-
den und auch nicht sonderlich schnell abkühlen. Deswegen ist es
besser, beim Löten keinen direkten Kontakt zu erhitzten Metalltei-
len zu haben. Das gilt auch für Lötzinntropfen, die beim Löten
abfallen. Diese können auch nach Minuten noch extrem heiß und
geschmolzen sein. Beim Löten kommt es auch schnell zu kleinen
Spritzern von Flussmittel und Lötzinn, weswegen es wichtig ist,
eine Brille zu tragen, damit diese Spritzer nicht in die Augen gelan-
gen. Es ist natürlich auch sinnvoll, den PC nicht in der unmittelba-
ren Nähe des Lötkolbens zu verwenden, besonders wenn es sich
dabei um einen Laptop handelt: Zu schnell kann es passieren, dass
die heiße Spitze an die Tastatur kommt und eine Taste zum
72 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Schmelzen bringt oder im schlimmsten Fall sogar ein Loch in den
Monitor brennt.
Beim Löten entstehen auch Dämpfe, die auf Dauer nicht gesund
sind (besonders die Flussmitteldämpfe können allergische Reaktio-
nen auslösen). Deswegen ist es wichtig, auf eine gute Lüftung am
Lötplatz zu achten. Für viele Projekte reicht es schon, das Fenster
aufzumachen. Es ist aber auch möglich, eine kleine Rauchabzugs-
einrichtung, die den Rauch mit einem Ventilator abzieht, in der
Nähe des Lötplatzes aufzubauen. Dadurch werden die Dämpfe
abgezogen und gelangen nicht in Ihre Lunge. Man kann sich auch
eine solche Abzugseinrichtung selber mit einem kleinen Ventilator
bauen. Wenn bleifreies Lötzinn verwendet wird, ist eine solche
Abzugseinrichtung quasi unabdingbar, weil die verwendeten Fluss-
mittel viel aggressiver sind. Wegen dieser Chemikalien und des
Bleis im Lötzinn ist es wichtig, nach dem Löten gründlich die
Hände zu waschen.
74 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
grammablauf gestaltet ist. Erst wenn die Schaltung richtig ver-
standen wurde, kann man beurteilen, ob Teilbereiche sich nicht so
verhalten, wie sie sollten, ob ein Bauteil seine Aufgabe nicht erfüllt,
oder ob es bei der Programmausführung zu Problemen kommt.
Deswegen ist es natürlich sinnvoll, Schritt für Schritt vorzugehen
und erst mit sehr einfachen Schaltungen und Projekten anzufangen,
bis man mit ihnen gut vertraut ist. Anschließend kann man darauf
aufbauend immer kompliziertere Projekte bauen.
Der zweite Bereich ist das Vereinfachen und Aufteilen des Projekts
in kleine Bereiche, die sich getrennt testen lassen. Besteht ein Pro-
jekt aus einem Temperatursensor, einer LED, einer Tastatur und
einer Servosteuerungsschaltung, ist es sinnvoll, jedes dieser Bauteile
und Schaltungen getrennt zu überprüfen. So ist gewährleistet, dass
keine Interaktion zwischen verschiedenen Bauteilen und Pro-
grammteilen Ursache des Problems ist. Durch diese Aufteilung
wird auch die Komplexität der Schaltung und der Software drama-
tisch reduziert. Ist etwa die LED falsch herum angeschlossen, lässt
sich das in einem separaten Test, bei dem man nur die LED an- und
ausschaltet, deutlich einfacher überprüfen, als wenn die LED theo-
retisch nur angeht, wenn die Temperatur über 50 Grad liegt. Bei
einer elektronischen Schaltung gibt es verschiedene Wege, die mög-
lichen Fehlerquellen in kleine Bereiche zu isolieren.
Der einfachste Schritt ist, die Software so zu verändern, dass nur
eine bestimmte Komponente angesprochen wird. Diese Testroutine
lässt sich am besten als neuer Sketch in der Arduino-Umgebung
schreiben. So kann für jede Teilschaltung (z.B. die LED, den
Temperatursensor, die Tastatur und die Servosteuerung in der obi-
gen Schaltung) getestet werden, ob sie funktioniert. Diese Test-
Sketches sollten so geschrieben werden, dass sie keine komplexe
Logik beinhalten (wie bei komplizierten Unterscheidungsfällen
oder einer Benutzerschnittstelle), sondern sie sollten der Reihe
nach verschiedene Funktionalitäten der untersuchten Schaltung
testen. Funktioniert die untersuchte Schaltung, kann man Schritt
für Schritt die weiteren Komponenten wieder mit in den Pro-
grammquellcode einbeziehen, bis die Schaltung nicht mehr funkti-
oniert. Ab dem Moment weiß man, wo das Problem zu suchen ist.
Wenn die mögliche Problemquelle identifiziert wurde, muss wieder
der erste Schritt »Verstehen« angewendet werden, um nachzuvoll-
ziehen, was fehlerhaft ist. Oft lohnt es sich auch, ein kleines Log-
buch zu führen, in das notiert wird, welche Fehlerquellen für
welche Probleme verantwortlich sind und wie sie zu beheben sind.
76 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
lassen sich nie voraussehen, und sie machen lustigerweise auch
einen großen Teil des Spaßes aus. Wenn man nach acht Stunden
endlich die Fehlerquelle identifiziert hat, die über fünf Umwege
und drei Winkel an einer komplett anderen Stelle einen Fehler aus-
gelöst hat, fühlt man sich so erfolgreich wie Superman.
Häufige Fehlerquellen
In diesem Abschnitt werden einige Arduino-spezifische Fehlerquel-
len und Testvorgänge beschrieben. Als Erstes sollte immer sicher-
gestellt werden, dass das Arduino-Board mit Strom versorgt ist. Das
Board wird über USB an den Rechner angeschlossen. Die Power-
LED sollte hellgrün leuchten. Leuchtet sie nur schwach oder flim-
mert, gibt es ein Problem mit der Stromversorgung: Entweder der
USB-Port am Computer ist defekt oder das Kabel funktioniert nicht
richtig. Ist die Power-LED komplett aus, gibt es ein Problem mit
dem Computer, mit dem Kabel oder mit dem Board an sich. In die-
sen Fällen sollten ein anderes Kabel und ein anderer Computer
ausprobiert werden. Wenn das Board immer noch nicht angeht,
sollte es gewechselt werden.
Wenn der Arduino zum ersten Mal angeschlossen wird, sollte das
Testprogramm, das mitgeliefert wird, ausgeführt werden und die
L-LED regelmäßig blinken. Wenn sie das nicht tut, ist vermutlich
schon ein anderes Programm hochgeladen worden. Das richtige
Funktionieren des Prozessors und der LED kann überprüft werden,
indem das LED-Testprogramm hochgeladen wird (siehe Kapitel 1).
Lässt es sich nicht hochladen, kann das an einem Softwareproblem
auf der Computerseite liegen (das ist auch die wahrscheinlichste
Erklärung, keine Panik). Es sollte überprüft werden, ob die richtige
serielle Schnittstelle und das richtige Boardmodell in der Arduino-
Entwicklungsumgebung ausgewählt ist (siehe ebenfalls Kapitel 1).
Weiterhin kann man unter Windows im Gerätemanager und unter
Mac OS X im Programm System Profiler, das unter /Programme/
Dienstanwendungen zu finden ist, nachprüfen, ob das Arduino-
Board tatsächlich als serielle Schnittstelle erkannt wird. Ist alles
korrekt eingestellt, sollte auch überprüft werden, ob die Arduino-
Entwicklungsumgebung die aktuellste Version ist.
Bei Schaltungen, die auf Steckbrettern aufgebaut werden, kann es
schnell zu kleinen elektrischen Fehlern kommen, weil die einge-
steckten Kabel leicht wieder herausrutschen können. Deswegen
sollte immer sichergestellt werden, dass alle Kabel richtig sitzen
Das Multimeter
Ein sehr wichtiges Werkzeug bei der Fehlersuche ist das Multime-
ter. Damit lassen sich verschiedenste elektrische Größen messen:
Strom, Spannung, Widerstand und Kontinuität. Bestimmte Multi-
meter erlauben auch das Messen von Kapazitäten und das Überprü-
fen und Verstärkungsmessen bei Transistoren (diese Funktionalität
ist allerdings oft nicht so wichtig). Es gibt analoge und digitale Mul-
timeter: Erstere stellen die gemessene Größe mit einer Nadelanzeige
dar und sind oft nicht sehr genau. Die meisten heutigen Multimeter
sind allerdings digital und zeigen die gemessenen Werte auf einem
LED-Display an.
Ein solches Gerät hat zwei Anschlüsse, an die sich Testspitzen
anschließen lassen. Eine (meistens schwarz) wird an den Masseste-
cker des Multimeters angeschlossen, während die andere (meistens
rot) an den V-Stecker angeschlossen wird. Oft besitzen Multimeter
zwei V-Stecker, von denen der eine für große Spannungen und
Ströme ausgelegt ist und bei normalen Arduino-Schaltungen nicht
78 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
zum Einsatz kommt. Mit diesen Testspitzen kann man beliebige
Punkte in der Schaltung berühren (natürlich müssen diese Punkte
metallisch sein, damit auch ein Kontakt entsteht) und so elektri-
sche Größen messen. Es ist wichtig, dass höchstens mit einer Hand
eine der Testspitzen direkt berührt wird. Kommen beide Testspit-
zen in Kontakt mit dem Körper des Benutzers, wird seine Haut
gleich mitgemessen, was insbesondere bei Widerständen zu fal-
schen Ergebnissen führen kann.
Die gewünschte Funktionalität des Multimeters lässt sich meistens
über ein Drehrad einstellen. Zu den verschiedenen Größen (A für
Strom, V für Spannung, R oder Ohm für Widerstand) lässt sich
auch die gewünschte Größenordnung einstellen.
Abbildung 2-24
Multimeter
Widerstandswerte messen
Das Multimeter kann als Ohmmeter eingesetzt werden, um den
Widerstandswert von Widerständen zu messen. Beide Testspitzen
müssen an die Anschlüsse des Widerstandes gebracht werden.
Generell lassen sich Widerstände nur getrennt messen. Sind sie in
einer Schaltung eingebaut, wird der parallele Widerstand des Rests
der Schaltung auch mitgemessen, und der Ergebniswert ergibt nicht
viel Sinn. Die Ohmmeter-Funktionalität des Multimeters kann mit
dem Auswählen einer der Ohm-Größenordnungskategorien akti-
viert werden. Ist die Größenordnung des zu messenden Widerstan-
des unbekannt, kann man sich herantasten, indem man zunächst
die kleinste wählt.
Spannungen messen
Eine sehr wichtige Funktion zum Überprüfen von Schaltungen und
für die Suche nach Fehlern in einer Schaltung ist die Voltmeter-
Funktionalität des Multimeters. Ähnlich wie bei der Ohmmeter-
80 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
Funktionalität lassen sich hier verschiedene Spannungsgrößenord-
nungen auswählen. Da aber Spannungen in einer Arduino-Schal-
tung meistens unter 5 Volt liegen, kann man die entsprechende
Größenordnung gleich auswählen. Die schwarze Testspitze sollte
meistens an die Masse der Schaltung angeschlossen werden. Wird
der Multimeter oft eingesetzt, kann man zum Beispiel ein Kabel mit
Krokodilklemme verwenden, um die Masse fest zu verbinden. Mit
der roten Testspitze lassen sich dann Spannungen an verschiedenen
Stellen in der Schaltung untersuchen. Wichtig ist zum Beispiel zu
überprüfen, ob jedes Bauteil an den vorgesehenen Pins auch mit der
richtigen Spannung versorgt wird. Ist die Spannung an dem gemes-
sen Punkt variabel, hängt die Anzeige von der Geschwindigkeit des
Multimeters ab. Genaue Variationen lassen sich mit einem Multi-
meter nicht messen (dazu sollte ein Oszilloskop verwendet werden,
siehe unten), man kann aber grob überprüfen, ob zum Beispiel
Daten über eine serielle Leitung übertragen werden. Wichtig ist
beim Messen einer laufenden Schaltung, dass mit den Testspitzen
des Multimeters keine Kurzschlüsse erzeugt werden. Es ist dazu
praktisch, die Testspitze möglichst vertikal über die zu messenden
Punkte zu halten.
Ströme messen
Eine weitere Funktionalität zum Messen von laufenden Schaltun-
gen, die allerdings nicht so oft verwendet wird wie die Voltmeter-
Funktionalität, ist die Amperemeter-Funktionalität zum Messen
von Strömen. Dafür muss das Multimeter allerdings in Serie mit der
zu messenden Leitung eingebaut werden. Die Leitung muss also
getrennt und das Multimeter sozusagen als »Verbindungskabel«
eingesetzt werden. Dazu sind Krokodilklemmen sehr praktisch.
Wenn das Multimeter in Serie angeschlossen und die Ampereme-
ter-Funktionalität ausgewählt sind, werden die gemessenen Ströme
auf dem Display angezeigt. Damit kann man zum Beispiel den
Strom zu einer LED messen, um sicherzustellen, dass er den maxi-
malen Wert nicht überschreitet.
Das Oszilloskop
Ein nützliches und aufschlussreiches Werkzeug, das allerdings
nicht sehr erschwinglich ist, ist das Oszilloskop. Ein Oszilloskop ist
eine Art grafischer Voltmeter, mit dem Spannungen nach Zeit
gemessen werden. So ist es möglich, den zeitlichen Verlauf einzel-
82 Kapitel 2: Physical Computing, elektrische Grundlagen und der Sprung ins kalte Wasser
KAPITEL 3 In diesem Kapitel:
• Erste Schritte
Workshop LED-Licht • Eine blinkende LED – das
»Hello World« des Physical
Computing
Nun soll also der erste Workshop beginnen, dessen Ziel es ist, eine
in allen Farben des Regenbogens leuchtende LED-Lampe zu
bauen. Natürlich geht es nicht darum festzulegen, welche Form
oder Farbe sie bekommen soll. Vielmehr wird dieses Kapitel hof-
fentlich genügend Anleitung geben, um im Anschluss ein eigenes
Licht programmieren zu können. Dieses kann aus einer oder meh-
reren Lichtquellen bestehen, die sich auch in ihrer Helligkeit ver-
ändern lassen, entweder durch Programmierung oder durch ein
Steuerungselement wie einen Schalter oder Drehknopf. Zudem
wird erklärt, wie man aus Rot, Grün und Blau Farben mischen
kann, um den Raum auch mehrfarbig zu erhellen. Am Ende des
Kapitels werden zusätzlich weitere Projekte beschrieben, die mit
Anleitungen aus dem Internet nachgebaut werden können. Auf
dem Weg durch das Kapitel werden die Grundlagen erläutert, die
zum Programmieren eines Arduino nötig sind. Dieser Workshop
richtet sich also auch an Leute, die soeben zum ersten Mal ein
Arduino-Board angeschlossen haben.
Erste Schritte
Um dieses Kapitel durchzuarbeiten, sind zum ersten Mal in diesem
Buch einige Bauteile nötig, nämlich
• vier LEDs (drei davon in Rot, Grün und Blau) und passende
100-Ohm-Widerstände,
• ein Taster,
• ein Schalter und
• ein Drehknopf.
83
Ein einfaches Arduino-Programm: Übersicht
Ein Arduino-Programm kann aus vielen miteinander verbundenen
Dateien bestehen, hat jedoch mindestens zwei Teile: das Setup und
die Hauptfunktion.
Setup
Der Setup-Teil des Programms ist gekennzeichnet durch die Funk-
tion setup():
void setup()
{
}
Loop
Die Funktion loop() wird auch als Hauptfunktion bezeichnet. Von
hier aus werden andere Bestandteile des Programms aufgerufen
oder Befehle abgearbeitet. Wie der Name schon verrät, läuft loop()
in einer Schleife, das heißt sie beginnt immer wieder von vorn,
sobald sie durchlaufen wurde. Ganz analog zur setup()-Funktion
sieht auch loop so aus:
void loop()
{
}
Hardware
LEDs besitzen ein langes und eines kurzes Beinchen, die Pins:
Anode und Kathode (kleine Merkhilfe: kurz = Kathode). Sind die
Pins bereits abgeschnitten worden, etwa um sie irgendwo zu verlö-
ten, findet man die Kathode an der Seite, an der die LED leicht
abgeflacht ist. Die LED wird mit der Anode, also der positiven
Seite, mit dem 100-Ohm-Widerstand verbunden, und dieser wird
am Arduino-Pin 13 angebracht, die negative Seite wird an der
Masse (GND, zu englisch »ground«) angeschlossen.
Abbildung 3-1
Arduino-Board
Programmierung
Zunächst wird Pin 13 mit einer Variablen verbunden. Das
geschieht, um im weiteren Verlauf des Programms auf ledPin1
zurückgreifen zu können. So kann schnell der Pin geändert werden,
ohne dass das ganze Programm durchgearbeitet werden muss.
Zudem steht so keine 13 im Programmverlauf, sondern eine ver-
ständliche Bezeichnung, die beim Lesen oder nachträglichen Bear-
beiten des Codes behilflich ist.
Variablen können verschiedene Datentypen besitzen, je nachdem,
welche Inhalte in ihnen gespeichert werden. In diesem Fall wird
eine ganze Zahl (»Integer«) gespeichert, dem Variablennamen wird
bei der Initialisierung also der Typ int vorangestellt.
Im Setup wird dieser Pin als Ausgang definiert. Im Hauptteil wird
schließlich ein digitales Signal auf diesen Ausgang geschrieben.
HIGH lässt dabei Strom durch den Ausgang fließen, während LOW
diesen Stromfluss unterbricht. So leuchtet die LED oder erlischt.
Dazwischen wird der Programmablauf mit dem Befehl delay für 1.
000 Millisekunden, also eine Sekunde, unterbrochen – es wird
gewartet.
Aufgabe:
Eine zweite LED anschließen und beide wechselnd blinken lassen.
Abbildung 3-3
Das Schaltzeichen für
einen Schalter
Abbildung 3-4
Verschiedene Schalter/Taster
Hardware
Um einen Schalter oder Taster mit dem Arduino abzufragen, wird
die eine Seite des Bauteils mit einem IO-Pin (in diesem Fall Pin 2)
und die andere mit GND verbunden.
Der Arduino erkennt an seinen IO-Pins hohe Spannungen (2–5
Volt) als eine 1 und kleinere Spannungen als eine 0. Ist der Taster/
Schalter gedrückt, wird der PIN des Arduino mit GND verbunden,
die gemessene Spannung ist also null.
Programmierung
Der Schalter wird, wie auch die LEDs, auf eine Variable gelegt. Im
Setup wird er als Eingang definiert:
pinMode(schalter, INPUT); // setze den digitalen Pin auf Input
eingeschaltet.
Im Hauptteil wird durch digitalRead die Eingabe gelesen. Nun
wird eine if-else-Abfrage benutzt. Sie steht für eine Verzweigung im
Programmablauf: Wenn der Strom durch den Schalter fließt, ist das
Eingangssignal mit GND verbunden, also LOW, und der zweite Pro-
grammblock wird ausgeführt, der durch die geschweiften Klam-
mern begrenzt ist. Ansonsten liegt am Eingang durch den Pull-up
ein HIGH-Signal vor, also wird der erste Programmblock ausgeführt.
Vergleiche in if-Abfragen werden dabei immer mit zwei Gleich-
heitszeichen vorgenommen. Wird das Gegenteil benötigt, steht !=
für »ungleich«.
int ledPin1 = 13; // LED an digitalen Pin 13 angeschlossen
int ledPin2 = 12; // LED an digitalen Pin 12 angeschlossen
int schalter = 2; // Schalter an digitalen Pin 2 angeschlossen
void setup()
{
pinMode(ledPin1, OUTPUT); // setze digitalen Pin als Output
pinMode(ledPin2, OUTPUT); // setze digitalen Pin als Output
pinMode(schalter, INPUT); // setze digitalen Pin auf Input
digitalWrite(schalter, HIGH); // setze pullup-widerstand
}
void loop() {
int val = digitalRead(schalter); // lies Input vom Schalter
if (val == HIGH) { // wenn der Wert von val gleich HIGH ist
digitalWrite(ledPin1, HIGH); // schaltet LED1 ein
digitalWrite(ledPin2, LOW); // schaltet LED2 aus
}
else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}
Setup
Vier LEDs werden an die digitalen Pins 10, 11, 12, 13 angeschlos-
sen, und ein Taster an Pin 2 (so wie der Schalter aus dem vorigen
Beispiel).
Programmierung
Ein Array (also eine Tabelle) fasst mehrere Variablen in einer
zusammen. Über sogenannte Indizes können die einzelnen Werte
dann als Elemente angesprochen werden.
Ein Array wird ähnlich wie eine Variable initialisiert. Mit
int led[4] = { 10,11,12,13};
werden die vier Werte 10, 11, 12 und 13 auf ein Array mit vier Ele-
menten gelegt. Da die Indizes bei 0 beginnen, ist der Wert von
led[0] nun also 10, der von led[1] 11 und so weiter.
Nun können diese Werte mit einer Schleife durchlaufen (»iteriert«)
werden. In diesem Fall wird for() zusammen mit einer Zählvari-
able i verwendet, die pro Schleifendurchlauf mit i++ um eins
erhöht wird.
Schleifen sind ein weiterer häufig benutzter Bestandteil von Pro-
grammiersprachen. Im Arduino-Hauptteil wird eine loop()-Schleife
verwendet, die unendlich lange weiterläuft (sofern kein Programm-
abbruch festgelegt wird). Hinzu kommt nun die for()-Schleife, der
drei Bestandteile hinzugefügt werden: Die Startbedingung (z.B.
»beginn bei null«), die Endbedingung (z.B. »zähl bis vier«) und die
Zählbedingung (z.B. »zähl immer eins dazu«).
Um Codezeilen zu sparen, wird die Zählvariable direkt in der
Schleife initialisiert:
for (int i = 0; i<4; i++) {
pinMode(led[i], OUTPUT);
}
Funktionen
Um eine LED leuchten zu lassen, kann der Code der zweiten
Übung benutzt werden. Allerdings wäre dieser nun pro Schritt vier
statt bisher zwei Zeilen lang. Bei allen vier LEDs, die nacheinander
leuchten sollen, wären das also 16 Zeilen und nicht mehr vier. Zeit
für eine Vereinfachung!
Eine Funktion ist eine einzelne Einheit innerhalb eines Programms,
die fast überall aufgerufen werden kann. Sie erledigt selbstständig
eine Aufgabe und gibt, wenn gewünscht, einen Wert zurück. Je
nach Typ dieses Werts werden Funktionen und Variablen, also
Typen zugewiesen. Geben sie keinen Wert zurück, ist der Typ void.
Zudem nimmt eine Funktion Werte an, mit denen sie arbeiten soll
– sogenannte »Argumente«.
Um eine LED blinken zu lassen und die anderen auszuschalten,
muss der Funktion mitgeteilt werden, um welche LED es sich han-
delt. Gleichzeitig ist die Aufgabe der Funktion lediglich die Aus-
gabe von Signalen. Sie gibt also keinen Wert zurück.
Der Code
void setLED(int ledNr) {
}
Hinweis Noch einfacher ließe sich das Problem mit dem »Modulo«
lösen, dem Rest, der beim Teilen durch eine Zahl entsteht.
Erhöht man pro loop()-Durchlauf die Variable count um eins,
kann man setLED jederzeit mit setLed(count mod 4) oder
auch setLed(count % 4) aufrufen. Es wird immer eine Zahl
zwischen 0 und 3 übergeben.
Da der Taster sehr schnell abgefragt wird, soll sein Impuls nur dann
zu einem Lichtwechsel führen, wenn er gerade gedrückt wurde.
Dazu wird eine Variable oldVal eingeführt, auf die pro loop()-
Durchlauf der aktuelle Wert des Eingangs geschrieben wird. Nur
wenn diese sich im Vergleich zum vorigen Durchlauf ändert, wird
die Funktion setLED wirklich aufgerufen.
Das sieht nun also wie folgt aus:
int led[4] = { 10,11,12,13};
int oldVal = 0;
int counter = 0;
int taster = 2;
void setup() {
for (int i = 0; i<4; i++) {
pinMode(led[i], OUTPUT);
}
void setLED(int ledNr) {
for (int i = 0;i<4;i++) {
if (i == ledNr) {
digitalWrite(led[i], HIGH);
}
else {
digitalWrite(led[i], LOW);
}
}
}
Die Debounce-Bibliothek
Möchte man den Taster als Umschalter verwenden, kann es oft zu
mehrfachen Betätigungen kommen, selbst wenn man eine Abfrage
wie die obige einbaut. Gegen dieses sogenannte »Prellen« hilft die
Debounce-Bibliothek, mit der wir jetzt einen kurzen Ausflug in die
Welt der Libraries machen.
Viele Anwendungen rund um Arduino sind im Prinzip recht ein-
fach, benötigen aber hohen Programmieraufwand. Zum Beispiel
möchte man einen bestimmten Sensor eigentlich einfach nur ausle-
sen oder einen Motor nur mit einer bestimmten Geschwindigkeit
betreiben. Die Technik dahinter ist aber recht komplex und benö-
tigt verschiedene Signale und Voreinstellungen vom Arduino.
Bibliotheken fassen diese Funktionen zusammen. Denn wer einmal
die Arbeit gemacht hat, kann sie auch anderen zur Verfügung stel-
len und sie über eine sogenannte API benutzen lassen. Der Begriff
API steht für »Application Programming Interface« und ist quasi
das Tor zur Bibliothek: ein Satz von Funktionen, mit denen die
komplexeren Funktionalitäten der Bibliothek verwendet werden
können. Für den Arduino gibt es eine ganze Reihe von Bibliothe-
ken, die zum Teil die Programmierung einfacher machen, so wie
die Debounce-Bibliothek, um die es hier geht. Wichtiger sind aber
diejenigen Bibliotheken, die Bauteile und Geräte ansteuern können.
Auf der Arduino-Webseite finden Sie Listen von Bibliotheken,
genauso wie im Verzeichnis von [Link]
in den Sketch ein. Nun stehen drei Funktionen zur Verfügung, die
es bisher in der Arduino-Programmiersprache noch nicht gab:
read(), update() und write(). Diese Funktionen gehören zu einem
Objekt, das die aktive Bibliothek repräsentiert. Objekte sind Daten-
und Funktionssammlungen. Das heißt, sie beherbergen neben den
API-Funktionen auch weitere Funktionalitäten und Datenstruktu-
ren. Man kann ein Objekt also mit einer Küche vergleichen, in der
Essen vorbereitet wird. Dabei werden Herde und Öfen bedient,
Teig vorgehalten und einzelne Gerichte gestapelt, bis eine Bestel-
lung beisammen ist. Über eine oder mehrere Luken, Türen oder
Zettelsysteme spricht die Bedienung mit dieser Küche und tauscht
Informationen oder Nahrungsmittel aus. Dabei bleibt natürlich
auch nicht alles zwischen Küche und Bedienung. Vielmehr gibt es
einen Hinterausgang, über den neue Rohstoffe bestellt und geliefert
werden.
Ein Objekt ist dabei immer die Instanz einer sogenannten Klasse.
Das bedeutet, dass die importierte Bibliothek auch mehrfach ver-
wendet werden kann, beispielsweise wenn man mehrere gleiche
Geräte an einen Arduino hängen möchte. Klassen sind die eigentli-
chen Programmierkonstrukte, die im laufenden Betrieb zu Objek-
ten werden. Sie verfügen zusätzlich über besondere Funktionen.
Aufgabe:
Einen »Funkenhimmel« bauen, der so viele LEDs wie möglich
verwendet und sie zufällig blinken lässt.
Hinweis Die Funktion random(13) gibt bei jedem Aufruf eine neue zufäl-
lige Zahl zwischen 0 und 12 zurück.
Hardware
Eine LED an Pin 10 anschließen.
Beim genauen Hinsehen stellt man fest, dass das Licht nicht gleich-
mäßig pulsiert. Das liegt daran, dass das Auge das Licht nicht linear
wahrnimmt, also geradlinig, sondern als logarithmische Funktion.
Wenn die LED fast aus ist, sieht man kleinere Veränderungen sehr
stark; ist die LED fast ganz eingeschaltet, ändert sich praktisch gar
nichts mehr. Um diesem Umstand entgegenzuwirken, kann chan-
geCounter() zu einer aufwendigeren Version ausgebaut werden,
sodass der Logarithmus korrekt errechnet wird. Viel einfacher ist
ersetzt durch
analogWrite(led, loga[counter]);
Schließt man vier LEDs an, verändert sich im Prinzip nicht viel. Um
die LEDs in einer Welle pulsieren zu lassen, benötigt man vier
Counter und vier Marker:
int counter[4] = {0,32,63,32};
int changeMarker[4] = {1, 1, -1, -1};
Mach es bunt
Nun kann schon die erste Lampe gebaut werden, die mit Farbver-
läufen eine gemütliche Atmosphäre im Raum schafft. Dazu werden
drei LEDs in den Grundfarben Rot, Grün und Blau benötigt. Mit
diesen Farben lassen sich durch Mischung alle weiteren Farben des
sichtbaren Spektrums erzeugen, indem man jede LED mit einer
entsprechenden Helligkeit pulst. Die folgende Lampe wählt zufällig
Farben aus und dimmt sich langsam von der einen zur anderen und
weiter zur nächsten.
Hardware
Drei LEDs in den Grundfarben Rot, Grün und Blau werden über
einen passenden Widerstand (100 Ohm) mit dem Arduino verbun-
den. Welcher Widerstand genau benötigt wird und mit welcher
Eingangsspannung und Stromstärke die LEDs betrieben werden,
hängt von der Bauart ab. Genauere Daten können Sie dem Daten-
blatt entnehmen. Es gibt auch fertige RGB-LEDs, die mit sechs
Beinen ausgestattet sind und somit auf die gleiche Weise ange-
schlossen werden wie drei einzelne. Je nach Stromstärke müssen
die Leuchtdioden an einen anderen Stromkreis angeschlossen wer-
den, besonders wenn eine stärkere Leistung erwartet wird. Am
Ende dieses Kapitels wird unter dem Stichwort »Mehr Power«
erläutert, wie man das zum Beispiel mit Transistoren machen
kann. Das folgende Programm geht davon aus, dass die rote LED
an Pin 9, die grüne an 10 und die blaue an 11 angeschlossen ist.
Programmierung
Wie weiter oben beschrieben, werden drei LEDs in einer Tabelle
initialisiert und mit den passenden Pins verbunden. Auch die Loga-
rithmustabelle wird benötigt. Zudem braucht man zwei Tabellen,
die Quell- und Zielfarbwert speichern.
// PINs für die RGB-LED
int ledPin[3] = { 9, 10, 11};
// Startfarbe
currentPos wird jetzt der Mittelwert nach der Formel farbe = start ×
(128-currentPos) + ende × currentPos auf ihre entsprechende LED
geschrieben und die loop()-Funktion abgeschlossen:
void loop()
{
// für alle drei Grundfarben Mittelwert an der
// Stelle currentPos berechnen und ausgeben
for (int i = 0; i < 3; i++) {
int helligkeit = (sourceValue[i] * (128 – currentPos) +
targetValue[i] * currentPos)/128;
analogWrite(ledPin[i],helligkeit);
}
currentPos++;
if (currentPos > 128) {
for (int i = 0; i < 3; i++) {
sourceValue[i] = targetValue[i];
targetValue[i] = random(64);
}
currentPos = 0;
}
// 10ms warten.
delay(10);
}
Und fertig ist die Lampe! Nun kann damit experimentiert werden.
Mit Sicherheit finden sich viele Möglichkeiten, dieses Projekt zu
erweitern und anzupassen. Zum Beispiel könnte man eine weitere
RGB-LED anschließen und die aktuelle Farbe von einer zur ande-
ren wandern lassen.
Eine blinkende LED – das »Hello World« des Physical Computing 101
Helligkeit mit einem Drehknopf steuern
Zum Abschluss dieses Workshops soll nun die Helligkeit einer LED
mit einem Drehknopf gesteuert werden. Dazu wird ein sogenanntes
Potentiometer verwendet. Es besteht aus einem Metallstift, der auf
einer Fläche angebracht ist. Wird diese Fläche durch Drehen ent-
lang des Stiftes bewegt, verändert sich der Widerstand und es fließt
weniger Spannung an den Ausgang. Ein Potentiometer ist somit ein
sogenannter resistiver Sensor. Mehr Informationen über resistive
Sensoren finden Sie auch in Kapitel 7.
Die Messung erfolgt über den analogen Eingang, wobei das Signal
niemals genau ist. Abweichungen im Wert müssen bei der Pro-
grammierung berücksichtigt werden. Somit können nicht die vollen
1.024 Stufen ausgeschöpft werden, was angesichts von 256 mögli-
chen Helligkeitsstufen bei den pulsweitenmodulierten Digitalaus-
gängen allerdings kein Problem darstellt, zumal ohnehin nur die 64
Stufen aus der Tabelle verwendet werden sollen.
Hardware
An den Arduino wird zunächst eine LED an einen PWM-fähigen
Digitalausgang angeschlossen, in diesem Fall Ausgang 9. Zudem
wird ein Potentiometer mit dem mittleren Pin an den analogen Ein-
gang 0 angeschlossen, die anderen beiden Pins an GND und den 5-
Volt-Anschluss. Dabei kommt es darauf an, wie der Knopf gedreht
werden soll: Je nachdem, wie der Strom fließt (von links nach
rechts oder umgekehrt), muss auch gedreht werden, um die Span-
nung zu erhöhen oder zu senken.
Programmierung
Zunächst werden die beiden Pins festgelegt und im Setup als Ein-
bzw. Ausgang definiert. Zudem wird wieder die Tabelle für die Hel-
ligkeitsstufen verwendet.
int potPin = 0; // lege potPin als Pin 0 fest
int ledPin = 9; // lege ledPin als Pin 9 fest
int potiVal = 0; // eine Variable, um den Input zu speichern
int loga[64] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
16, 18, 20, 22, 25, 28, 30, 33, 36, 39, 42, 46, 49, 53, 56, 60,
64, 68, 72, 77, 81, 86, 90, 95, 100, 105, 110, 116, 121, 127, 132,
138, 144, 150, 156, 163, 169, 176, 182, 189, 196, 203, 210, 218,
225, 233, 240, 248, 255};
void setup() {
pinMode(ledPin, OUTPUT); // initialisiere ledPin als Output
}
Nun können der analoge Eingang gelesen und das Signal gespei-
chert werden. Anschließend werden das Signal durch 16 geteilt und
der Ausgangswert anhand des oben erklärten Sinus berechnet.
Schließlich wird der entsprechende Wert in der Logarithmustabelle
auf den digitalen Ausgang geschrieben, die LED wird nun vom
Potentiometer gesteuert.
void loop()
{
int potiVal = analogRead(potPin); // lies analoges
// Eingangssignal
potiVal = potiVal / 16; // teile den Signalwert durch 16
analogWrite(led, loga[potiVal]); // schreibe den Tabellenwert
// auf den Ausgang
delay(10);
}
Flower Power
Nicht nur die Helligkeit kann mit einem Potentiometer geregelt
werden, sondern auch die Wunschfarbe, passend zum Abendkleid.
Eine blinkende LED – das »Hello World« des Physical Computing 103
Dazu verwenden wir den Quellcode von »Mach es bunt« in diesem
Kapitel und verändern nur die Funktion loop(), sodass abhängig
von der Reglerstellung eine Farbe ausgewählt wird. Nun gibt es kei-
nen einfachen Weg durch alle Farben, es muss also ein bestimmter
Verlauf einprogrammiert werden. Die 1.024, die maximal vom
Potentiometer zurückgeliefert werden, teilen wir dazu in vier Teile
auf. Im ersten Teil dimmen wir von Rot nach Grün, im zweiten Teil
von Grün nach Blau, im dritten von Blau nach Rot, und mit dem
verbleibenden Teil dimmen wir nach Weiß. Durch die Logarith-
mustabelle benötigen wir Werte von 0–63 für jede Farbe, wir kön-
nen den Potentiometerwert also noch durch 4 teilen, um in jedem
Teilabschnitt 64 Punkte zu haben.
void loop() {
int potiVal = analogRead(potPin) / 4; // lies analoges
// Eingangssignal
Mehr Power
Bis jetzt wurden nur sehr kleine LEDs mit dem Arduino gesteuert,
ein Pin kann nur ca. 20 mA Strom liefern. Bei einer 3-Volt-LED ent-
spricht das 0,06 Watt. Damit bekommt man natürlich kein Zimmer
erleuchtet.
Abbildung 3-7
Transistorausgangsschaltung
Gesteuert wird der Transistor über den Stromfluss, der in die Basis
hineinfließt. Dabei muss der Basisanschluss mindestens 0,7 Volt
Eine blinkende LED – das »Hello World« des Physical Computing 105
höher liegen als der Emitter. Dazu wird die Basis über einen Wider-
stand von 1.000–10.000 mit dem Ausgangspin des Arduino ange-
schlossen. Der Emitter wird direkt mit GND verbunden, und an
den Kollektor kommt dann die eine Seite der Last, die andere Seite
wird mit 5V verbunden. Das Schöne an dieser Schaltung ist, dass
die Spannung auch viel größer sein kann, ohne dem Arduino zu
schaden (das Maximum entnehmen Sie bitte dem Datenblatt des
Transistors). Dadurch kann man viele LEDs in einer Reihe verbin-
den oder besonders starke LEDs verwenden, um den Raum hell zu
erleuchten.
Eine blinkende LED – das »Hello World« des Physical Computing 107
KAPITEL 4 In diesem Kapitel:
• LED-Matrix
LEDs für Fortgeschrittene • Animationen
• Interrupts
• Tamagotchi
• Brainwave und Biofeedback
Nun soll mit LEDs ein wenig mehr passieren, als nur Licht zu
machen. In diesem Kapitel wird es zunächst darum gehen, viele
LEDs zu steuern, wozu diese in einer sogenannten Matrix verschal-
tet werden. Damit soll dann eine kleine Art Tamagotchi selbst
gebaut werden. Den Abschluss macht eine Gehirnwellenmaschine,
die mit blinkendem Licht und Ton für Entspannung im Gehirn des
Benutzers sorgen soll.
LED-Matrix
Reichen die 14 digitalen Pins nicht aus, gibt es die Möglichkeit, mit
einer Matrix zu arbeiten. Dabei werden Reihen und Zeilen jeweils
an einen Pin angeschlossen und die einzelnen Elemente der Matrix
über eine Kombination der beiden angesprochen. Die einfachste
Darstellungsform ist natürlich, wenn diese Matrizes auch als solche
sichtbar sind, die LEDs also in Rechteckform angeordnet sind. Für
7x5 Bildpunkte benötigt man zwölf digitale Pins; damit kann man
kleine Piktogramme oder Laufschrift anzeigen. Oder man program-
miert kleine Spiele, die nicht mehr als diese 35 Punkte benötigen,
wie das bekannte Schlangenspiel, in dem eine sich bewegende
Schlange aus Punkten größer wird, wenn sie andere leuchtende
Bildpunkte auffrisst. Die wohl größte Matrix dieser Art wurde beim
Blinkenlights-Projekt konstruiert, das schon in Kapitel 1 erwähnt
wurde: 18x8 Fenster eines Hochhauses dienten dabei als Bild-
punkte eines Displays. Dort wurden kleine Animationen angezeigt,
die man mit einem eigenen Programm erschaffen und hochladen
konnte. Zudem war es möglich, mit einem Handy auf einer Num-
mer anzurufen und die Paddel eines Pong-Spiels mit den Tastentö-
109
nen zu steuern. In weiteren Varianten wurde das Projekt sogar noch
ausgebaut und 2008 wurde das Rathaus von Toronto in ein Display
von insgesamt 960 Bildpunkten verwandelt.
Im Alltag findet man solche LED-Matrizen zum Beispiel in den
Laufschrift-Displays, mit denen kleinere Geschäfte für aktuelle
Angebote werben. Es gibt aber zum Beispiel auch Gürtelschnallen,
auf denen man Laufschriften anzeigen kann. Diese können meist
direkt programmiert werden, es spricht aber auch nichts dagegen,
sie an einen Arduino anzuschließen. Neben kleinen Blinkprojekten
kann man solche Displays auch verwenden, um Informationen dar-
zustellen. Oft reichen die im Vergleich zu LC-Displays viel günsti-
geren LEDs aus.
Für den nun folgenden Workshop wurde eine Kingbright TA20-
11EWA LED-Matrix verwendet. Sie besteht aus sieben Reihen und
fünf Spalten; diese oder baugleiche LED-Matrizes sind für wenig
Geld in fast jedem Fachgeschäft und -Versand erhältlich. Natürlich
funktioniert das auch mit einzelnen LEDs, nur ist der Lötaufwand
dabei größer. Mit einer einfachen Google-Suche findet man das
entsprechende Datenblatt, unter anderem direkt beim Hersteller
Kingbright oder bei [Link] ([Link]
com/datasheet-pdf/pdf/232968/KINGBRIGHT/[Link]).
Die Matrix ist in Deutschland unter anderem bei Reichelt (http://
[Link]) erhältlich.
Die Funktionsweise ist recht einfach: Strom kann bei einer LED nur
von der Anode zur Kathode fließen. Wird also eine höhere Span-
nung an die Kathode als an die Anode angelegt, kann kein Strom
fließen, die LED bleibt dunkel. Schließt man die Anoden der LEDs
spaltenweise und die Kathoden zeilenweise an eine Spannungs-
quelle an, kann man einzelne Dioden individuell ansteuern, indem
man ein Signal auf eine Spalte gibt und einzelne Zeilen auf LOW
schaltet.
Würde man es dabei belassen, könnte man immer nur bestimmte
Muster anzeigen, denn ist eine Zeile auf LOW geschaltet, leuchten
alle LEDs in dieser Zeile bei entsprechendem Signal auf der Spalte
auf. Abhilfe schafft die Darstellung des gewünschten Bildes Zeile
für Zeile in einer schnell durchlaufenden Schleife, die für das Auge
den gleichen Effekt hat wie die in Kapitel 3 beschriebene Pulswei-
tenmodulation: Bei entsprechend schneller Wiederholung kann das
menschliche Auge kein Flackern mehr erkennen.
Hardware
Das Datenblatt zeigt für die Reihen eine Belegung für die Matrix-
Pins 9, 14, 8, 12/5, 1, 7 und 2 an. Die Spalten werden an 13, 3,
4/11, 10 und 6 angeschlossen. Zwei Pins sind damit doppelt
verfügbar, was beim Verlöten mehr Freiheiten erlaubt. In diesem
Beispiel werden die Reihen an die Arduino-Pins 1–7, die Spalten an
8–12 angeschlossen. Die Schaltung lässt sich am besten auf eine
Lochrasterplatine löten.
Abbildung 4-1
LED-Matrix, Lochrasterplatine
LED-Matrix 111
Abbildung 4-2
LED-Matrix, Lochrasterplatine
Software
Zunächst werden die Reihen in Arrays dargestellt und mit den ent-
sprechenden Pins verbunden:
// definiere Zeilen und Spalten als Array vom Typ uint8_t
uint8_t rows[7] = {1, 2, 3, 4, 5, 6, 7};
uint8_t columns[5] = {8, 9, 10, 11, 12};
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(rows[i], OUTPUT);
}
for (int i = 0; i < 5; i++) {
pinMode(columns[i], OUTPUT);
}
}
Aufgabe:
Die Werte der Matrix verändern und somit ein Muster anzeigen.
Animationen
Nun sollen nicht nur statische Muster angezeigt werden, sondern
eine kleine Animation. Das Setup soll zunächst gleich bleiben,
hinzu kommen einige Funktionen, um die Anzeige zu verändern.
Programmierung
Zunächst wird eine Funktion benötigt, die die Matrix löscht und
neu initialisiert. Es ist wichtig, die Matrix immer wieder komplett
Animationen 113
auf null zu setzen, weil es sonst möglich ist, dass alte Pixel ihren
Wert behalten. Um die Matrix zu löschen, wird eine geschachtelte
Schleife verwendet, um beide Dimensionen zu durchlaufen, also
die x- und die y-Achse der Matrix.
// setze die Matrix auf 0
void clearMatrix() {
// für jede Reihe
for (int x = 0; x < 7; x++) {
// für jede Spalte
for (int y = 0; y < 5; y++) {
// setze das Matrixelement auf 0
matrix[x][y] = 0;
}
}
}
Aufgabe:
Eine Animation erstellen, bei der eine leuchtende Zeile von oben
nach unten wandert.
Nun muss dem Arduino noch mitgeteilt werden, dass ein soge-
nannter Timer-Interrupt benötigt wird. Dazu werden ein paar
Werte in spezielle Register geschrieben. Diese starten einen inter-
Interrupts 115
nen Zähler, der das Programm dann regelmäßig unterbricht und
die Interrupt-Funktion aufruft.
unsigned char Matrix_SetupTimer2(){
// Timer2 Settings: Timer Prescaler /8, mode 0
// Timer clock = 16MHz/8 = 2Mhz or 0.5us
TCCR2A = 0;
TCCR2B = 0<<CS22 | 1<<CS21 | 1<<CS20;
// Timer2 Overflow Interrupt Enable
TIMSK2 = 1<<TOIE2;
}
Hier passiert die eigentliche Arbeit: Als Erstes wird die zuletzt
aktive Zeile ausgeschaltet. Dann wird die nächste bestimmt und die
Daten dafür ausgegeben, und gleich danach wird diese Zeile dann
aktiviert.
Relativ ungewohnt für ein Arduino-Programm ist die Zeile, die mit
PORTD beginnt. PORTD ist eine acht Bit breite Speicherstelle im
Atmel (dem Arduino-Mikrocontroller), die direkt den Zustand der
Pins 0–7 beschreibt. Alle Werte, die dorthin geschrieben werden,
erscheinen direkt als HIGH- und LOW-Signal auf den entsprechenden
Pins. Eine Null würde zum Beispiel alle Pins auf null setzen. Eine 85
würde jeden zweiten Pin auf HIGH und alle anderen auf null setzen,
da die 85 binär geschrieben 01010101 entspricht.
Der Tildenoperator (~) hat hier die Aufgabe, alle Bits umzudrehen:
Aus Einsen macht er Nullen und umgekehrt. Das ist notwendig,
weil an diesen Pins ja die Kathoden der LEDs angeschlossen sind,
die leuchten, wenn die Kathode LOW = 0 ist, und nicht (wie man
zuerst erwarten würde) bei HIGH = 1. Im Programmiersprachenan-
Buchstaben
Nun macht es keinen Spaß, Buchstaben und Symbole Pixel für
Pixel mit SetPixel(x,y) zu zeichnen; deshalb gibt es dafür eine
kleine Tabelle, die alle kleinen und großen Buchstaben und die
Zahlen enthält. Die Funktion DisplayChar() holt diese dann aus
dem Speicher und kopiert sie in die Variable matrix.
Damit können kleinere Texte und Symbole auf der LED-Matrix
ausgegeben werden.
void SetPixel(uint8_t x, uint8_t y)
{
matrix[x] |= _BV(y+1);
}
void ClrPixel(uint8_t x, uint8_t y)
{
matrix[x] &= ~_BV(y+1);
}
void ClrMatrix(void)
{
for(uint8_t x = 0; x <= 5; x++){
matrix[x] = 0;
}
}
static unsigned char __attribute__ ((progmem)) Font5x7[] = {
0x7E, 0x11, 0x11, 0x11, 0x7E,// A
0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x7F, 0x09, 0x09, 0x01, 0x01,// F
(....komplettes Listing auf der Webseite....)
};
void DisplayChar(uint8_t c)
{
for(uint8_t i = 0; i <= 4; i++)
{
matrix[i] = pgm_read_byte(&Font5x7[((c – 0x10) * 5) + i])
<< 1;
Interrupts 117
Hinweis Die Daten für das Aussehen der Buchstaben werden im Flash-
speicher des Arduinos gespeichert, anders als beim Ramspei-
cher kann auf das Flash leider nicht direkt zugegriffen werden.
Dazu wird die Funktion pgm_read_byte(adresse) benötigt. Diese
bekommt als Parameter die Adresse, welche gelesen werden
soll, und liefert dann den Wert an dieser Stelle in Flash zurück.
Im ASCII-Zeichensatz (Das ist die Tabelle, die der Computer ver-
wendet, um Zahlen zu Buchstaben zuzuordnen) sind für uns
nicht alle Bereiche wichtig, die Tabelle fängt deswegen erst
beim 16ten Buchstaben an. Also wird als erstes 16 oder 0x10
(Hexadezimale Schreibweise) vom gewünschten Zeichen »c«
subtrahiert.
Da jeder einzelne Buchstabe aus 5 Bytes besteht, wird das
Resultat jetzt mit 5 multipliziert, das ist jetzt die Nummer des
ersten Eintrags in der Tabelle Font5x7 für den Buchstaben »c«.
Bei jedem der 5 Schleifendurchläufe (für einen Buchstaben)
erhöht sich i um eins, so das nach und nach alle 5 Bytes eines
Buchstabens verarbeitet werden.
Das Zeichen »&« vor dem Font5x7[...] bewirkt dabei, dass die
Adresse des Bytes innerhalb der Tabelle zurückgeliefert wird
um dann mit der Funktion pgm_read_byte das tatsächliche Byte
lesen zu können.
}
}
void loop() {
for (uint8_t i = 0; i < 32; i++)
{
DisplayChar('A'+i); // Zeige
Buchstaben an.
delay(500);
DisplayChar(0x10+i); // Zeige
Gesichter an.
delay(500);
}
}
Tamagotchi
Tamagotchis sorgten im Jahr 1997 für einen Ansturm auf Kaufhäu-
ser und Spielzeugläden in Deutschland und verschwanden dann
fast ebenso schnell in der Versenkung, wie sie gekommen waren.
Im Jahr 2004 wurde die Serie noch einmal aufgelegt, wenn auch mit
keinem zur Urversion vergleichbaren Erfolg in Deutschland. Ein
Tamagotchi ist ein kleines Plastikei mit einem LCD, auf dem ein
kleines Küken dargestellt ist. Dieses Küken gibt vor zu leben und
benötigt regelmäßig Wasser, Futter und Zuneigung. Nach und
nach entwickelt es eine eigene kleine Persönlichkeit, die individuell
Hardware
Wir verbinden das Mikrofon wie auf der Zeichnung mit dem Tran-
sistor und dem Arduino-Board, damit das Ardugotchi auch etwas
hören kann. Ansonsten bleibt die Matrix aus den vorigen Projekten
bestehen.
Abbildung 4-3
Tamagotchi-Schaltung
Software
Zunächst kann der Programmcode des vorigen Beispiels übernom-
men werden, mit dem die Matrix angezeigt wird. Einige Bilder kön-
nen hineingeladen werden, die die verschiedenen Gefühlszustände
des Tierchens beschreiben. Sie sind bereits in der Zeichentabelle
enthalten und unter den Codes 0x10 bis 0x1f zu finden. Den kom-
pletten Code finden Sie auf der entsprechenden Buchseite bei http://
[Link].
Tamagotchi 119
Die Spannung am analogen Eingang 0, an den das Mikrofon ange-
schlossen ist, wird eingelesen und mit dem Mittelwert der letzten
100 Messungen verglichen. Ist der Wert deutlich größer, so wechselt
das Ardugotchi seinen Gesichtsausdruck. Um Gesichter darstellen
zu können, enthält die Zeichentabelle 16 verschiedene Muster, sie
können mit DisplayChar(0x10+gesicht) angezeigt werden.
int laut;
int laut_mittelwert;
int sad;
int gesicht;
// Dieser Wert muss je nach verwendetem Mikrofon angepasst werden.
Abbildung 4-4 Im Folgenden soll nun eine Gehirnmaschine gebaut werden, die in
BrainMachine der Lage ist, das menschliche Gehirn in einen Zustand der Entspan-
nung zu versetzen. Dabei sorgen an einer Brille angebrachte LEDs
für die Lichtimpulse. Zudem wird versucht, das Ergebnis mit
binauralen Klängen auf Kopfhörern noch zu steigern. Binaural
bedeutet wörtlich übersetzt »Zwei-ohrig«, man hört Unterschiedli-
ches auf beiden Ohren. Da wir so tiefe Frequenzen wie Deltawellen
nicht hören können, spielen wir einen höheren Ton, der vom rech-
ten zum linken Ohr genau um die gewünschte Frequenz auseinan-
derliegt. Die Überlagerung dieser zwei Töne erzeugt ein Pulsieren
in der gewünschten Frequenz.
Setup
Für die Brain Machine werden einige Bauteile benötigt, allem voran
eine Brille, um die LEDs vor dem Auge zu positionieren. Dafür
genügt eine einfache Schutzbrille aus dem Baumarkt. Um die Elek-
Damit ist die Brain Machine im Grunde fertig. Für den ersten Test Abbildung 4-5
empfiehlt es sich, alles unberührt zu lassen; möchte man die Brille BrainMachine-Schaltung
Programmierung
Wie eingangs erwähnt, müssen für die verschiedenen Gehirnwellen
passende Frequenzen auf den LEDs und im Kopfhörer erzeugt wer-
den. Dazu werden zunächst die nötigen Pins deklariert:
int ledPin1 = 4; // LED rechtes Auge
int ledPin2 = 5; // LED linkes Auge
int speakerPin1 = 11; // Kopfhörer rechtes Ohr
int speakerPin2 = 3; // Kopfhörer linkes Ohr
volatile uint16_t sample1; // welches ist das nächste Sample aus
// der Sinustabelle
volatile uint16_t sample2; // die oberen 7 Bit zeigen in die
// Tabelle, die restlichen Bits sind
// Kommastellen
int diff = 5; // Differenz der beiden Töne in
// update-ticks
int tone = 500; // Frequenz der beiden Töne in
// update-ticks
int vol = 0; // aktuelle Lautstärke
int set_vol = 0; // gewünschte Lautstärke
Diese Tabelle gibt es auch auf der Webseite zum Buch: [Link]
[Link] herunterzuladen.
Nun folgt schon die komplizierteste Funktion im Programm, die
Interrupt-Funktion: Sie wird von der Hardware automatisch 8.000
Mal pro Sekunde aufgerufen, hier werden die LEDs ein- und ausge-
schaltet und die Werte für die Töne ausgegeben.
ISR(TIMER1_COMPA_vect) {
// Zähler, um Lautstärkeänderung langsamer zu machen
static int timer1counter;
int wert;
// Wert an der Stelle sample1/512 aus der sinus-Tabelle lesen
wert = pgm_read_byte(&sintab[(sample1 >> 9)]);
// Wert mit der aktuellen Lautstärke multiplizieren
wert = (wert * vol) / 256;
// PWM-Hardware anweisen, ab jetzt diesen Wert auszugeben
OCR2A = wert;
// das Gleiche für das andere Ohr
wert = pgm_read_byte(&sintab[(sample2 >> 9)]);
wert = (wert * vol) / 256;
OCR2B = wert;
// berechnen der LED-Pulse in Abhängigkeit vom gespielten Ton
if (((sample1 & 0x8000) != 0) && ((sample2 & 0x8000) !=0)) {
PORTD |= _BV(5) | _BV(4); // LEDs einschalten
}
else {
PORTD &= !(_BV(5) | _BV(4)); // LEDs ausschalten
}
// nächstes Sample in der Sinustabelle abhängig vom gewünschten
// Ton auswählen
sample1 += tone;
sample2 += tone + diff;
void loop()
{
SetFreq(grundton,0.7,0); // Einstimmung, langsames Pulsen ohne
// Ton
Der Arduino ist beileibe keine einsame Insel, auf der nur einmal
Passagiere abgeladen werden, ohne dass sie die Außenwelt infor-
mieren können. Bleibt das Board mit einem USB-Kabel (oder in der
Bluetooth-Variante über Funk) mit einem PC verbunden, kann es
auch Daten zurücksenden. Das folgende Kapitel soll zunächst
erklären, wie einfache Statusmitteilungen über die serielle Konsole
an die Arduino-Entwicklungsumgebung gesendet werden können.
Anschließend wird die Kommunikation noch etwas ausgebaut: Die
Processing-Programmiersprache etwa besitzt eine Bibliothek, die es
sehr einfach macht, mit dem Arduino Daten auszutauschen. So
können das Board und seine angeschlossenen Sensoren oder Taster
benutzt werden, um Processing-Programme zu steuern.
Unter »digitaler Kommunikation« versteht man den Austausch von
Daten zwischen zwei oder mehr Geräten über eine festgelegte Ver-
bindung. Dabei bestimmt ein sogenanntes Protokoll alle Details.
Alle Kommunikationsteilnehmer müssen sich dabei genau an die-
ses Protokoll halten, damit die Daten auch korrekt verstanden und
weiterverarbeitet werden können. Protokolle können unterschiedli-
che Bereiche umfassen, und meistens werden mehrere Protokolle
zusammen verwendet. Zu diesem Zweck werden Netzwerke in
ihrem Aufbau nach Schichten getrennt, die im sogenannten Open
Systems Interconnection Model, kurz OSI-Modell, festgeschrieben
sind. Diese Schichten bauen aufeinander auf und beschreiben die
komplette Kommunikation vom physischen Träger bis hin zu den
Datenpaketen. Im Folgenden werden wir eine serielle Verbindung
in ihren Grundzügen erklären.
Die unterste Schicht beschreibt, wie die beiden kommunizierenden
Seiten physisch miteinander verbunden sind, wie die entsprechen-
129
den Anschlüsse aufgebaut und wie viele Verbindungen nötig sind,
um Daten hin und her zu senden. Beim Arduino sind es eigentlich
zwei Verbindungen über die RX- und TX-Pins. Da viele Rechner –
insbesondere Laptops – keine RS232-Schnittstelle mehr besitzen,
wird diese über USB emuliert. Dabei sorgt ein USB-Controller
dafür, dass das entsprechende, deutlich kompliziertere USB-Proto-
koll verwendet werden kann. Die serielle Verbindung wird also
quasi darin eingebettet. Einer der besonderen Vorteile von USB
gegenüber einem seriellen Port (RS232), wie er in älteren Compu-
tern verwendet wurde, ist, dass an einem einzelnen Anschluss eine
Vielzahl von Verbindungen registriert werden kann. USB-Hubs
nutzen diese Technik zum Beispiel, um an die üblicherweise zwei
oder drei Steckplätze viele Geräte anzuschließen. Jedes weitere
Gerät, das sich am USB-Bus anmeldet, wird im Betriebssystem als
ein neues serielles Gerät festgestellt. Unter Windows können zum
Beispiel drei Geräte als COM8, COM9 und COM10 angesprochen
werden, Mac OS X würde sie als
/dev/[Link]-5B21
/dev/[Link]-5B22
/dev/[Link]-5B24
Abbildung 5-1
Serieller Monitor
Setup
Wie schon in Kapitel 3 wird ein Drehknopf an den digitalen Pin 11
angeschlossen. Für die Kommunikation bleibt der Arduino per USB
mit dem Rechner verbunden.
int ledPin = 11;
int drehKnopf = 0;
Nun sei für dieses Beispiel angenommen, die LED flackere nun
gelegentlich, weil der Sensor nicht präzise arbeitet. Es kann recht
lange dauern, das herauszufinden. Sendet man nun den Wert des
Drehknopfs an die serielle Konsole und zeigt zudem an, welche
Verzweigung das Programm nimmt, kommt man viel schneller zu
einem Ergebnis:
void loop() {
potiWert = analogRead(drehknopf);
[Link](potiWert);
if (potiWert == 0) {
[Link]("Poti ist auf null.");
digitalWrite(LED, HIGH);
}
else {
[Link]("Poti ist nicht auf null.");
digitalWrite(LED, LOW);
}
delay(1000);
}
Nachrichten empfangen
Die serielle Konsole eignet sich nicht nur zum Senden von Nach-
richten, sondern kann in beide Richtungen kommunizieren. Somit
kann der Computer den Arduino auch steuern, nachdem das Pro-
gramm kompiliert und hochgeladen wurde. Das ist zum Beispiel
nötig, um eine volle Steuerung durch Processing zu ermöglichen.
Für den Empfang von Daten wird der TX-Pin genutzt, der bei der
Programmierung funktioniert wie die anderen Eingänge auch: Hat
man Serial initialisiert, kann man über die Funktion available()
prüfen, ob und wie viele Bytes von Daten an das Board gesendet
wurden. Die Funktion read() kann diese Daten nun byteweise aus-
lesen und z.B. in einer Variable speichern. In einem einfachen Bei-
spiel werden nun die Daten, die über den seriellen Port empfangen
wurden, gelesen und wieder über die Konsole ausgegeben:
Abbildung 5-2
Eingabezeile, Send-Button
Gibt man nun test ein, erscheinen die vier Buchstaben nacheinan-
der auf dem Bildschirm, da read() immer nur ein Byte auf einmal
empfängt und die darauf folgenden Bytes in einem so genannten
Ringpuffer zwischenhält, der nach und nach ausgelesen werden
kann. Ein Ringpuffer ist eine Datenstruktur, die mehrere Elemente
(zum Beispiel Bytes) speichert und nach und nach bei jedem Aufruf
zurückgibt.
Abbildung 5-3
Empfangen im Monitor
Möchte man nun auch das nächste Wort korrekt anzeigen, muss
das Array geleert werden, da sonst noch unerwünschte Zeichen
gespeichert sind. Das geschieht, indem das komplette Array durch-
laufen und alle Elemente mit NULL, also einem leeren Zeichen über-
schrieben werden:
for (int i=0; i<=255; i++) {
incomingByte[i] = NULL;
}
Steuerungseingaben
Jetzt können diese Eingaben verwendet werden, um zum Beispiel
die LED auf dem Arduino-Board einzuschalten. Dazu müssen Pin
13 als Ausgang definiert und die serielle Konsole initialisiert werden:
int ledPin = 13;
void setup() {
[Link](9600); // initialisiere seriellen Port auf 9.600
// Baud
pinMode(ledPin, OUTPUT); // setze ledPin auf OUTPUT
}
Lebst du noch?
Wir wollen mit einem Ping die Erreichbarkeit unseres Webservers
überprüfen und im Fehlerfall eine rote Fahne mit einem Servomo-
tor (kurz: Servo) hissen. Das ist ein kleiner Motor aus dem Modell-
bauladen, den man in Geschwindigkeit und Position steuern kann.
Das ist notwendig, damit der Motor am Ende der Fahnenstange
auch wieder anhält. Die Fahnenstange kann man dabei wie eine
echte basteln: Auf der einen Seite ist eine Fahne an einem kleinen
Draht angebracht, der um eine Rolle gewickelt wird. Diese Rolle
wird dann vom Servo gedreht.
Hardware
Als Erstes wird der Servo angeschlossen. Ein Servo hat die drei
Anschlüsse GND (schwarz oder braun), VDD (rot) und SIGNAL.
GND wird mit GND auf dem Arduino-Board verbunden, VDD mit
5V und SIGNAL mit PIN9. Servos werden über kurze Impulse von
1–2 ms Dauer gesteuert, die sich mit ca. 50 Hz wiederholen. Die
Länge der Pulse ergibt die Position, die der Servo anfahren soll.
Abbildung 5-5 Am Drehrad des Servos befestigt man jetzt noch die Fahne, und
Gobetwino-Schaltung schon kann es losgehen mit dem Schreiben der Software.
Processing
Processing ist in vielerlei Hinsicht eines der Vorbilder für Arduino,
dessen Programmierumgebung und -sprache sehr ähnlich model-
liert sind. Wie Arduino wurde Processing entwickelt, um Schülern
und Studenten eine einfache Möglichkeit zu geben, programmieren
zu lernen und Ideen auszuprobieren, um zu schnellen Ergebnissen
zu gelangen. Und natürlich gibt es auch hier mittlerweile eine große
Anhängerschaft, vor allem unter Künstlern und Bastlern.
Dabei hat Processing zunächst rein gar nichts mit Physical Compu-
ting und Mikrocontrollern zu tun; vielmehr wurde es geschaffen,
um möglichst einfache Programmierung von Grafik zu ermögli-
chen. So läuft der Einstieg dort nicht über eine blinkende LED, son-
dern vielmehr über die Anzeige des Textes »Hello World« in einer
großen, bunten Schrift. Mittlerweile gibt es eine Vielzahl unter-
schiedlicher Projekte, die auf Processing basieren. Längst gibt es
Bibliotheken, die es sogar Bands wie R.E.M. ermöglichen, ihre Kon-
Processing 143
Möchte man nun Arduino und Processing verbinden, benötigt man
zunächst Bibliotheken für beide Seiten. Beim Arduino ist diese
Bibliothek schon in der Programmierumgebung enthalten. Sie
nennt sich Firmata und kann mit #include <Firmata.h> ins Pro-
gramm eingebunden werden. Alternativ kann man das unter
SKETCH → IMPORT LIBRARY → FIRMATA tun. Unter FILE →
SKETCHBOOK → EXAMPLES → LIBRARYFIRMATA finden Sie den
gesamten passenden Firmata-Sketch, der alles kann, was in diesem
Workshop benötigt wird.
Lädt man diesen Beispielsketch auf das Arduino-Board, ist es konfi-
guriert, um mit Processing zusammenzuarbeiten. Dabei muss im
Prinzip keine weitere Programmierung auf dem Arduino vorgenom-
men werden. Wie das folgende Beispiel zeigt, kann Processing die
Pins des Arduino selbstständig steuern und so auch die Signale ver-
arbeiten.
Zunächst muss also die Arduino-Bibliothek in Processing einge-
bunden werden. Sie ist auf der Arduino-Website unter [Link]
[Link]/playground/Interfacing/Processing erhältlich. Nachdem
sie heruntergeladen wurde, wird sie entpackt und der Ordner ardu-
ino in den Ordner libraries der Processing-Programmierumgebung
kopiert.
Nun können im Processing-Sketch die beiden Bibliotheken serial
und arduino geladen und ein Arduino-Objekt erstellt werden:
import [Link].*;
import [Link].*;
// initialisiere Arduino-Objekt
Arduino arduino;
Nun soll die LED 13 zum Blinken gebracht werden, wie auch
schon im ersten Workshop dieses Buches. Zunächst wird also die
Variable ledPin auf 13 gesetzt. Anschließend wird im Setup die
Verbindung hergestellt. Dazu wird die Funktion [Link]()
verwendet, die alle verfügbaren seriellen Geräte auf diesem Com-
puter anzeigt. Wenn das Arduino-Board verbunden ist, sollte dort
eine passende serielle Verbindung in dieser Liste auftauchen. Hier-
bei wird nun angenommen, dass es sich um das einzige Gerät han-
delt und somit an Stelle 0 in der Liste befindet. Funktioniert
[Link]()[0] nicht auf Anhieb, empfiehlt es sich, in der Kon-
sole diese Liste auszugeben und die richtige Verbindung zu suchen.
Anschließend wird, wie schon bekannt, ledPin als Ausgang defi-
niert.
Auch der Rest des Programms verhält sich ähnlich wie schon im
Workshop 3: Nun kann die LED alle 1.000 Millisekunden blinken,
indem ein HIGH- bzw. LOW-Signal auf den entsprechenden Pin gesetzt
wird:
void draw()
{
[Link](ledPin, [Link]);
delay(1000);
[Link](ledPin, [Link]);
delay(1000);
}
Processing 145
geschieht das, indem der Hintergrund mit background(204); in
Grau neu gezeichnet wird. Um ein wenig mehr Farbe hineinzubrin-
gen, wird der Kreis selbst in einem satten Rot gezeichnet (RGB-
Werte: 255, 0, 0).
Die fertige Draw-Routine sieht also wie folgt aus:
int potiPin = 0;
int potiVal = 0;
void draw() {
potiVal = [Link](potiPin);
background(204);
fill(255, 0, 0);
ellipse(50, 50, floor(potiVal/10), floor(potiVal/10));
}
Setup
Ein Fotowiderstand wird an den analogen Eingang 0 des Arduino
angeschlossen.
Abbildung 5-6
Lichtsensor-Aufbau
Processing 147
noFill();
}
// zeichne den Tunnel mit drei Vertexen
void createScene() {
// unteres Feld
stroke(204, 102, 0);
fill(204, 102, 0);
beginShape();
vertex(0, windowHeight);
vertex(0, 200);
vertex(windowWidth, 400);
vertex(windowWidth, windowHeight);
endShape(CLOSE);
// mittleres Feld
fill(125);
stroke(0);
beginShape();
vertex(0, 100);
vertex(windowWidth, 300);
vertex(windowWidth, 400);
vertex(0, 200);
endShape();
}
Nun sind alle Voraussetzungen für das Spiel gegeben. Die Funktion
endGame() zeigt einen Text mit der Punktezahl an, die sich aus der
Dauer in Millisekunden ergibt, die das Spiel gelaufen ist. Die
Hauptfunktion lädt nun die Grafik und beginnt das Spiel nach
Druck der Taste S.
// Anzeige beim Ende des Spiels
void endGame(){
// berechne die Endzeit
endTime = millis();
// beende die Draw-Funktion
noLoop();
// zeige weißen Text an
fill(0);
text("your score: ", 50, 60);
// Punktezahl berechnen in Millisekunden seit Startzeit
text(endTime-startTime, 200, 60);
// Hier wäre noch platz für einen Restart-Knopf ;-)
}
// Hauptfunktion
void draw() {
// lies Arduino-Eingabe und wandle sie um
int arduino = [Link](sensorPin);
// wenn Taste S gedrückt wird, beginn und miss Startzeit
if(keyPressed) {
if (key == 's') {
start = true;
// miss Startzeit
startTime = millis();
}
}
// wenn das Startsignal gegeben wurde
if (start) {
// wenn keine Kollision geschehen ist
if (!collision) {
createScene();
stroke(0); // setz die Farbe für den Ball
drawCircle(x, arduino); // zeichne den Ball
collision = detectCollision(x, arduino); // prüf, ob es eine
// Kollision gab
Processing 149
x++; // erhöhe die Ballposition
// wenn es eine Kollision gab
} else {
// rufe Endfunktion auf
endGame();
}
// wenn das Startsignal noch nicht gegeben wurde
} else {
// zeichne den Tunnel und den Ball
createScene();
drawCircle(0, arduino);
}
}
Aufgaben:
Ein Labyrinth basteln, sodass x- und y-Achse ab einem bestimm-
ten Punkt wechseln und die Kugel vertikal am Labyrinth entlang
nach unten fliegt.Überschreitet die Kugel also einen gewissen x-
oder y-Wert, wird ihre Richtung geändert.
Eine Reset-Funktion einbauen, die zum Beispiel auf Knopfdruck
das Spiel von vorn beginnen lässt.
Einen Piezo-Lautsprecher an den Arduino anschließen und bei
einer Kollision einen Ton ausgeben lassen.
Flusskontrolle
Ein Programm, dessen Ablauf stark von der Übertragung serieller
Daten abhängig ist, kann schnell ins Stocken geraten, wenn die
Kommunikation asynchron läuft. Obwohl klar ist, welche Daten
übertragen werden, kann es sein, dass zum Beispiel Daten vom
Arduino zu einem falschen Zeitpunkt an den PC gesendet werden.
Wenn zum Beispiel ein Processing-Programm Daten empfängt, die
schon vor einiger Zeit gesendet wurden, können diese schon längst
ungenau oder falsch sein. Möglicherweise hat der Arduino schon ein
zweites Byte gesendet, das nun im Ringpuffer hängen geblieben ist.
Processing 151
Schieberegler an einen PC anzuschließen, oder – wie eben gesehen –
Spiele zu steuern. Bei der Entwicklung komplexerer Systeme, etwa
von Flugobjekten, können die durch Processing verarbeiteten Daten
auch dabei helfen, Fehler zu finden oder Feineinstellungen vorzu-
nehmen. So werden mögliche Probleme schon vermieden, bevor sie
auftreten und Schaden anrichten können. Man denke dabei zum
Beispiel an Beschleunigungs- und Neigungssensoren in einer Flug-
drohne, die bei falscher Konfiguration abstürzen würde. Auch in der
Wissenschaft wird Processing in Verbindung mit Mikrocontrollern
wie Arduino immer beliebter, um Versuchsreihen möglichst einfach
zu gestalten und sich so auf das Wesentliche zu konzentrieren.
Im folgenden Kapitel soll nun die Kommunikation des Arduino
nicht mehr nur über die serielle Schnittstelle geschehen. Mit einem
Ethernet-Shield, also einer »Netzwerkkarte«, die auf das Board
gesteckt wird, können Daten auch über das Internet übertragen
werden. Damit lässt sich ein Arduino-Projekt auch aus der Ferne
warten oder abfragen, was insbesondere dann sinnvoll ist, wenn es
das tägliche Leben in der eigenen Wohnung automatisieren soll,
auch während man gar nicht zu Hause ist.
153
oder IP-Adressen dürften vielen Nutzern bekannt sein, die sich
schon einmal beispielsweise mit der Einrichtung ihres heimischen
PCs im lokalen Netzwerk beschäftigt haben. Um eine hierarchische
Ordnung zu erhalten, gibt es zusätzlich noch die Subnetz-Adresse,
die bestimmt, wie viele Geräte in einem Subnetz zusammengefasst
werden. In einem kleinen Heimnetzwerk ist das meistens die 255.
255.255.0, was bedeutet, es bis zu 256 Geräte fassen kann. Die IP-
Adresse selbst besteht aus vier Bytes. Dabei wird unterschieden
zwischen dem globalen Adressraum, der von der Internet Assigned
Numbers Authority vergeben wird, und lokalen Adressbereichen,
die für lokale Netzwerke reserviert sind und dort von jedem Nutzer
selbst gewählt werden können. Das bedeutet, dass zum Beispiel
eine Adresse, die mit 192.168 beginnt (z.B. die [Link]), nicht
vom gesamten Internet aus erreichbar ist. Dafür können mehrere
Netzwerke jeweils die gleichen Adressen besitzen. Im Gegensatz
dazu ist die Adresse [Link] weltweit eindeutig und gehört
dem deutschen Webserver des O’Reilly Verlags.
Die Verbindung von einem Netzwerk in ein anderes übernimmt ein
sogenannter Router. Das sind für den Heimgebrauch meistens
kleine Geräte, die heutzutage über mehrere Ethernet-Kabelan-
schlüsse und ein WLAN-Modul verfügen und die Übersetzung vom
lokalen Netzwerk ins Internet übernehmen. Generell sind Router
Geräte, die das Internet in Subnetze einteilen und so die Verteilung
der Datenpakete übernehmen.
Die Übertragung von Daten übernehmen im Internet entweder das
TCP- oder das UDP-Protokoll. Das UDP-Protokoll sendet munter
Daten, ohne auf eine Antwort zu warten oder zu prüfen, ob sie auch
wirklich ankommen. Man spricht von einer zustandslosen Datenü-
bertragung. Bei UDP kann es vorkommen, dass Daten auf dem Weg
verloren gehen, was aber für bestimmte Daten nicht weiter wichtig
ist. Weil die Überprüfung nicht stattfindet, ist UDP schneller als
TCP. Letzteres basiert auf dem sogenannten Drei-Wege-Handshake.
Das bedeutet, dass jede Übertragung, also zum Beispiel die Ausliefe-
rung einer Website mit einem Anfrage-Paket (SYN) begonnen und
von der Gegenseite mit einem »Acknowledged« (ACK) quittiert
wird. Um diese Quittierung zu bestätigen, sendet sie zusätzlich noch
ein weiteres SYN, auf das schließlich ein weiteres ACK von der
Senderseite folgt. Meist geschieht diese Antwort in einem kombi-
nierten ACK/SYN-Paket. Der Abbau einer Verbindung sieht ähnlich
aus, statt SYN heißt das entsprechende Paket aber FIN.
Natürlich muss man im Internet kaum noch eine IP-Adresse einge-
ben, um sich mit einem bestimmten Rechner zu verbinden. Dafür
Hardware
Zunächst wird der Ethernet-Shield mit dem Arduino-Board ver-
bunden, indem beide zusammengesteckt werden. Alle Pins sind
auch über den Shield zugänglich. Selbst die LEDs und der Reset-
Taste sind auf dem Ethernet-Shield noch einmal vorhanden, sodass
man sie bequem bedienen kann. Die Pins 10 bis 13 werden aller-
dings schon für den Ethernet-Controller verwendet und sollten
deshalb nicht für eigene Anwendungen eingesetzt werden, wäh-
Abbildung 6-1
Ethernet-Shield
Der auf dem Board verbaute Chip Wiznet W1500 enthält einen
kompletten Ethernet- und IP-Stack für TCP und UDP. Das bedeu-
tet, dass er kein zusätzliches Betriebssystem benötigt, um mit dem
Internet zu kommunizieren. Er kann somit direkt mit dem Arduino
verwendet werden, bei der Programmierung muss man sich um
nichts mehr kümmern. Den weiteren Aufwand übernimmt die
Arduino-Ethernet-Bibliothek, die allerdings weder DNS noch
DHCP implementiert hat, sodass man derzeit noch auf statische IPs
zurückgreifen muss.
Software
In der Arduino-Entwicklungsumgebung und der Ethernet-Biblio-
thek ist bereits alles vorhanden, was man benötigt, um mit dem
Ethernet-Shield zu arbeiten.
Das Board kann mit [Link](mac,ip[,gateway,subnet] initi-
alisiert werden. Die MAC-Adresse (oder Ethernet-ID) ist dabei die
physische Adresse des Boards, die in diesem Fall vom Nutzer selbst
festgelegt werden kann, da der Hersteller des Shield diese Adresse
nicht vergeben hat. Die IP-Adresse muss je nach Netzwerk gewählt
werden, in dem der Arduino eingesetzt wird. Befindet man sich in
einem unbekannten Netzwerk, sollte man über den PC den IP-
Adressbereich herausfinden und eine Adresse wählen, die mit
Sicherheit in keinem Konflikt mit anderen steht. Die meisten Heim-
Dabei sollten Sie darauf achten, dass beide Adressen passen. Die IP-
Adresse muss ins lokale Netzwerk passen und darf dort keine Kon-
flikte erzeugen, also nicht identisch mit schon bestehenden Geräten
sein. Anschließend wird ein Serverobjekt erzeugt, das später die
Verbindungen auf Port 80, dem Standard-Port für Webserver,
annehmen kann. Das Objekt bietet eine Reihe von Funktionen, die
jederzeit abgerufen werden können.
Server server = Server(80);// Port-Einstellung (Standard 80)
Nun kann der Browser diese Daten empfangen und anzeigen. Der
kleine Arduino-Webserver kennt allerdings nur einen sehr kleinen
Teil von HTTP: Er liefert immer eine »200 OK«-Antwort und kann
auch keine URLs unterscheiden.
void loop() {
Client client = [Link](); // prüfen, ob Client Seite
// aufruft
if (client) { // Seitenaufruf durch User
// übertrage 200 OK-Code und identifiziere den Server als
// arduino
[Link]("HTTP/1.0 200 OK\r\nServer: arduino\r\n");
// übertrage den Dateityp
[Link]("Content-Type: text/html\r\n\r\n");
//übertrage Daten
[Link]("<HTML><HEAD><TITLE>");
[Link]("Arduino Board");
[Link]("</TITLE>");
[Link]("</HEAD><BODY>");
[Link]("<b>Hello World!</b><br />");
[Link]("Arduino runs for ");
[Link](millis());
[Link](" ms.</BODY></HTML>");
//Datenübertragung zu Ende
delay(10); // kurz warten, um Daten zu senden
[Link](); // Verbindung mit dem Client trennen
}
}
Dazu wird der Widerstand zwischen zwei in die Erde gesteckten Abbildung 6-2
Drähten gemessen, der analog zur Trockenheit zunimmt. So kann Twitter und Arduino
Hardware
An den Arduino werden ein LDR (Fotowiderstand) sowie ein wei-
terer Widerstand mit ca. 10.000–100.000 Ohm angeschlossen. Der
Fotowiderstand ändert seinen Widerstand von ca. 1–100 Mio Ohm
(MOhm) im Dunkeln zu 100–2.000 Ohm in der Sonne. Er wird an
die die PINs 5V und A0 angeschlossen, der andere Widerstand an
A0 und GND. So fungieren die Bauteile als Spannungsteiler, und
die Spannung an A0 wird von der Helligkeit am LDR verändert
(siehe Abbildung 6-3).
Software
Den Anfang machen wieder ein paar grundlegende Einstellungen,
die gegebenenfalls angepasst werden müssten. Da der Ethernet-
Shield keine DNS-Abfragen machen kann, muss die IP-Adresse von
Twitter von Hand eingetragen werden. Sollte Twitter seine IPs
ändern, muss diese Adresse angepasst werden.
Die Ethernet-Bibliothek wird beim Arduino-Programm mitgeliefert
und kann dort einfach unter SKETCH → IMPORT LIBRARY eingebun-
den werden:
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 10 }; // unsere IP/anpassen an
// das lokale Netzwerk
byte gateway[] = { 192, 168, 0, 1 }; // die IP des Routers
byte subnet[] = { 255, 255, 255, 0 };
byte server[] = { 128, 121, 146, 100 }; // IP von Twitter
(default: [Link])
#define TWITTERURL "/statuses/[Link]" // URL zum Update-Skript
#define TWITTERUSERNAMEPW "geheim" // Base64 kodiert USERNAME:
// PASSWORT
Client client(server, 80);
void setup()
{
[Link](mac, ip, gateway, subnet); // Ethernet
// initialisieren
[Link](9600); // serielle Verbindung für Statusmeldungen
}
Nun kann der Wert ausgelesen und gespeichert werden. Der Input
des analogen Pins ist allerdings 10 Bit lang. Zunächst sollen aber
nur ein Byte lange Werte geschrieben werden. Entweder man ver-
wendet also für vier Werte fünf Bytes, was später noch erklärt wer-
den soll. Im einfacheren Falle genügt es, ungefähre Werte aus dem
Sensor zu speichern. Teilt man den aktuellen Wert durch vier,
erhält man die 8 Bit, die man bequem in einem einzelnen
EEPROM-Byte ablegen kann.
void loop() {
i++;
int lichtWert = analogRead(lichtPin);
lichtWert = lichtWert/4;
[Link](i, lichtWert);
if (i > 10) {
int ausgabeWert = [Link](i-10);
[Link](ausgabeWert, DEC);
}
delay(10000);
}
Nun fällt auf, dass der Speicher irgendwann voll sein wird. Es ist
also sinnvoll, nach 5.120 Sekunden wieder bei 0 zu beginnen. Man
fügt also am Anfang der loop()-Funktion Folgendes hinzu:
if (i == 512) {
i = 0;
}
Da man nie weiß, welche Werte sich beim Start noch im EEPROM
befinden, sollte man zusätzlich zu Beginn alle Werte des Speichers
auf null setzen. Dazu werden alle Speicherplätze durchlaufen und
auf 0 gesetzt:
void deleteEEPROM() {
// durchlaufe jedes Byte des EEPROM und setze es auf 0
for (i = 0; i <512; i++) {
[Link](i, 0);
}
}
Um die Daten wieder aus dem EEPROM zu lesen, muss die Funk-
tion umgedreht werden. Da die Größe der Sensordaten (10 Bit)
bekannt ist, weiß man auch, welche Bits sich wo befinden, wenn
man den Anfangswert kennt. Beginnt man bei null, liest man also
zuerst die ersten beiden Bytes aus und liest und schreibt das erste
Byte vollständig sowie die niedrigsten 2 Bits des zweiten Bytes in
die Ausgabevariable. Dazu zählt man die aktuelle Bitposition sowie
die Position des Bytes. Die Bitposition wird in jedem Schritt nach
oben gezählt. Nach 8 Bits wird diese wieder auf 0 gesetzt und die
Byteposition um eins erhöht. Sind 10 Bytes durchlaufen, wird die
Variable ausgelesen und ausgegeben.
Zunächst wird eine Reihe weiterer Zählvariablen benötigt:
int readBytePos = 0;
int readBitPos = 0;
int outByte = 0;
Sensoren
Die wohl wichtigste Rolle beim Physical Computing spielen ne-
ben immer günstigeren Mikrocontrollern vor allem die verschie-
denen Sensoren. Ob sie nun selbst angelötet werden, mit einem
Steckbrett an den Arduino angeschlossen, oder ihren Weg über ei-
nen der zahllosen Shields nehmen, die verschiedenen Zwecke die-
nen: Ohne Sensoren ist ein Arduino-Board kaum etwas wert. Hier
werden die wichtigsten Sensorenarten und ihre Ausprägungen
vorgestellt, wobei dieses Kapitel längst nicht alle einzelnen Bau-
teile umfassen kann. Weitere Informationen finden Sie unter an-
derem im Tutorial-Bereich auf der Arduino-Website ([Link]
[Link]/playground/Learning/Tutorials) oder in der ausführli-
chen Zusammenfassung bei Freeduino ([Link]
171
Schalter und Taster werden in der Regel mit dem einen Pin an einen
digitalen Arduino-Pin und mit dem anderen an GND angeschlos-
sen. Bei mehrstufigen Schaltern werden natürlich auch mehrstufige
Pins verwendet. Fließt der Strom, liegt am digitalen Eingang eine 1
an, ist der Stromkreis unterbrochen, ist das Ergebnis eine 0. Bei
Schaltern und Tastern empfiehlt es sich, einen Pull-up-Widerstand
zu verwenden (siehe Kapitel 3).
Die Anwendungen von Schaltern und Tastern sind dabei sehr viel-
fältig. So könnte eine LED-Leuchte beispielsweise mit einem Schal-
ter durch verschiedene Modi wechseln oder auch nur ein- und
ausgeschaltet werden. Ein Taster wiederum eignet sich vor allem
zur Eingabe, etwa bei kleinen Spielen, die damit gesteuert werden.
Auch für ein Wecker-Projekt könnte man einen Taster verwenden,
um Uhr- und Weckzeit einzustellen.
Potentiometer
Potentiometer sind auch als Drehknöpfe oder Drehregler bekannt
und die wohl meisten verbreiteten Bauteile aus der Gruppe der stu-
fenlosen Regler. Sie gehören zur Klasse der resistiven Sensoren, also
derjenigen, bei denen die Spannung durch den Widerstand verän-
dert wird.
Potentiometer gehören, ähnlich wie die vorhin beschrieben Schalter
und Taster, zu den am häufigsten eingesetzten Steuerelementen.
Drehknöpfe gibt es in allen möglichen Formen: als Lautstärkeregler
einer Stereoanlage oder um die Temperatur eines Herdes zu steuern,
aber auch in zahlreichen Physical-Computing-Projekten. Sie können
die Frequenz oder Helligkeit von LEDs steuern oder als Eingabemit-
tel für Processing verwendet werden, um dort zum Beispiel Formen
und Farben einer Animation einzustellen und live zu verändern.
Sensoren 173
wendet werden; mithilfe eines Arduino könnte man so teure
Musikhardware selbst bauen. Aber auch für kleine Spiele auf dem
Arduino – selbst mit einem Display – oder unter Processing gibt es
einige Möglichkeiten, ein Touchpad einzusetzen.
Resistiver Touchscreen
Ein resistiver Touchscreen besteht aus einer leitfähig beschichteten
Glasscheibe, über der sich eine leitfähige Kunststofffolie befindet.
Auf der Folie sind viele ganz kleine Abstandhalter aufgedruckt
(normalerweise ein Epoxidsiebdruck), sodass im Normalfall die
Folie keinen Kontakt zur Glasscheibe hat. Drückt man mit einem
Finger oder Stift auf die Folie, entsteht eine leitfähige Verbindung,
und der Ort dieser Verbindung kann über die Widerstandswerte
gemessen werden. Dazu hat eine leitfähige Schicht zwei horizontale
und die andere zwei vertikale Anschlüsse. Zuerst wird durch Anle-
gen einer Spannung an die horizontale Schicht auf dieser ein Span-
nungsverlauf (wie bei einem Potentiometer) aufgebaut, über die
beiden vertikalen Anschlüsse kann dann die Position in horizonta-
ler Richtung gemessen werden. Danach wird das Verfahren umge-
dreht und die vertikale Richtung vermessen.
Dafür ist es ganz praktisch, dass die analogen Eingänge des Ardu-
ino-Boards auch als Ausgänge verwendet werden können. An vier
dieser Ein-/Ausgänge kann direkt ein 4-Wire-Touchscreen ange-
schlossen werden.
Größere und langlebigere Touchscreens werden oft in 5-Wire-
Technik ausgeführt, sie haben also fünf Anschlüsse. Die leitfähige
Kunststofffolie wird hier nur als Messeingang verwendet, und die
Potentiale werden mit den vier Elektroden auf der Glasplatte reali-
siert. Dadurch kann die Beschichtung auf der Folie viel dicker und
niederohmiger ausgeführt werden, und Widerstandsschwankungen
in der Folie verändern nicht den Messwert.
Allen resistiven Touchscreens ist gemeinsam, dass sie keine Multi-
touch-Funktion unterstützen, da man nur einen Berührungspunkt
messen kann.
Lichtsensoren
Nach den mehr oder weniger mechanischen oder elektromechani-
schen Sensoren folgen nun jene, die auf optische Impulse wie etwa
Helligkeit reagieren können.
Light Intensity IC
Ein nicht ganz günstiger Schaltkreis zur Lichtintensitätsmessung ist
der TSL230R-LF von Taos. Dabei liegt der große Vorteil in der line-
aren und vermessenen Ausgangsfunktion. Der Schaltkreis gibt
abhängig von der gemessenen Helligkeit unterschiedlich lange
Impulse aus. Laut Datenblatt ist die Länge der Impulse definiert als
0,77 KHz/W. Damit ist also eine echte Helligkeitsmessung möglich.
Eine ausführliche Referenz findet sich im Blog von Roaming Drone
unter [Link]
the-taos-tsl230r-light-sensor-getting-started/. Diese Adresse findet
sich, wie alle Adressen in diesem Buch und weitere Aktualisierun-
gen im Blog zum Buch, unter [Link]
Fototransistor
Ein Fototransistor ist, wie der Name schon sagt, eine spezielle
Form des Transistors. Bei entsprechendem Lichteinfall lässt er
einen Stromfluss zu. Dabei ist er viel lichtempfindlicher als eine
Diode, da er gleichzeitig als Verstärker wirkt. Das wohl bekannteste
Sensoren 175
Arduino-Projekt, das einen Fototransistor einsetzt, ist eine Schal-
tung, um Gewitterblitze zu fotografieren. Dabei ist der Transistor
schnell genug, um im Falle eines hellen Blitzes in der Natur den
Auslöser zu betätigen. Eine passende Schaltung ist sehr einfach,
wenn die Kamera eine elektrische Auslöseverbindung besitzt. Diese
wird an einen digitalen Ausgangspin angeschlossen, der Transistor
an einen analogen Eingang. Misst man nun konstant die Licht-
werte, kann man bei einem ausreichend starken Anstieg ein digita-
les Signal an den Auslöser geben, sodass die Kamera ein hoffentlich
gutes Foto eines Blitzes machen kann.
Eine Dokumentation dieses Projekts findet sich im Netz unter
[Link]
Lichtschranke
Mithilfe eines handelsüblichen Lasers und einer Fotodiode lässt
sich eine einfache Lichtschranke basteln. Dabei wird der Laser so
ausgerichtet, dass sein Licht direkt auf die Fotodiode fällt. Wird
das Licht des Lasers unterbrochen, sodass es nicht mehr auf die
Diode fällt, fällt das Signal stark ab, und der Arduino ist in der
Lage, dies zu verarbeiten. In der Fotografie gibt es weitaus mehr
Gelegenheiten, Fotos in möglichst kurzer Zeit auszulösen, als nur
bei Blitzen. Eine Lichtschranke ist etwa in der Lage, Tropfen in
einer Flüssigkeit zu erkennen und eine entsprechende Fotografie
auszulösen. Natürlich lassen sich so auch einfache Alarmsysteme
basteln, die vermelden, wenn eine bestimmte Schranke durch-
kreuzt wurde, oder man misst die Geschwindigkeit eines Objektes,
indem man den Zeitabstand zwischen der Durchquerung zweier
Schranken berechnet.
Beschleunigungssensoren
Beschleunigungssensoren messen, wie ihr Name schon verrät, die
aktuelle Beschleunigung in eine oder mehrere Richtungen. Im Fol-
genden werden Drei-Achsen-Beschleunigungssensoren vorgestellt,
die direkt an den Arduino angeschlossen werden können, sowie
weitere Bauteile und Geräte, die einen solchen Sensor beinhalten.
Einfache Beschleunigungssensoren
Moderne Beschleunigungssensoren wie der ADXL320 und der
ADXL330 von SparkFun basieren auf sogenannten mikroelek-
trisch-mechanischen Systemen oder MEMS und werden aus Sili-
Wiimote
Als Nintendo Ende 2006 die Wii-Konsole auf den Markt brachte,
sorgte das nicht nur in Spielerkreisen für Aufruhr. Grund dafür war
die Technik, die im Wiimote-Controller und dem angeschlossenen
Nunchuck verbaut ist und einzeln im Elektronikfachhandel viel
teurer ist als in der weißen Hülle.
Freundlicherweise hat Nintendo sich aber nicht darauf beschränkt,
diese Daten verschlüsselt an die Wii zu senden. Vielmehr wird
Bluetooth eingesetzt, um alle nötigen Informationen zu funken; der
Nunchuck benutzt ein serielles Protokoll. Dafür gibt es inzwischen
Bibliotheken, sodass vor allem Beschleunigungssensor und Joy-
stick des Nunchuck, aber auch der daran angebrachte Knopf aus-
gelesen werden können. Nunchucks sind im Handel für 19,95
Euro erhältlich. In Kapitel 10 wird ein Nunchuck an den Arduino
angeschlossen und als MIDI-Kontroller verwendet. Ein ausführli-
ches Tutorial zur Verwendung mit dem Arduino findet sich unter
[Link]
Die wohl nächstliegende Verwendung des Nunchuck liegt in der
Kontrolle von Motoren. Kleine Servos können Roboter antreiben,
Sensoren 177
aber auch andere Geräte wie etwa eine Webcam. Dank Knopf, Joy-
stick und Neigungssensor gibt es aber noch unzählige andere Ein-
satzgebiete. So findet sich im Internet beispielsweise ein Bastler, der
seine Espressomaschine mit einem Nunchuck ausgestattet hat, um
die verschiedenen Parameter wie Druck und Hitze einzustellen und
schließlich mit der Produktion des perfekten Espresso zu beginnen.
Gyroskop
Ein Gyroskop ist ein schnell rotierender Kreisel, der sich in einem
beweglichen Lager dreht, z.B. in einem Käfig. Aufgrund der Dreh-
impulserhaltung behält der Kreisel auch seine Lage im Raum, wenn
der Käfig geneigt wird. Dadurch können Drehungen und Neigun-
gen im Raum gemessen werden. Das Gyroskop kann also als Kom-
pass dienen, um den richtigen Weg nach Norden anzuzeigen –
selbst an den Polen, wo ja magnetische Kompasse versagen. Zudem
liefert es echte Neigungsmesswerte, selbst wenn es sich bewegt.
Beschleunigungssensoren können einen Winkel zur Schwerkraft
nämlich nur dann korrekt messen, wenn sie sich im Ruhezustand
befinden.
Elektronische Gyroskope werden heute ähnlich wie Beschleu-
nigungssensoren als MEMS aufgebaut. Allerdings ist darin kein
sich drehender Kreisel mehr vorhanden, sondern eine vibrierende
Masse, deren Auslenkung bei Drehungen gemessen werden kann.
Beispiele dafür sind der ADXRS300 und der ADXRS610 von Ana-
log Devices. Um eine stabile Lage in der Luft zu halten, benötigen
beispielsweise Quadrokopter drei Gyroskope. Sie werden aller-
dings zusätzlich von einem Beschleunigungssensor unterstützt,
damit sich Messfehler nicht aufaddieren und den Hubschrauber
zum Umkippen bringen.
Abstandssensoren
Es gibt viele Methoden, mit denen sich der Abstand von einem
Objekt zum Sensor messen lässt. Das reicht von recht einfachen
Mitteln wie einem kapazitiven Sensor bis hin zu Radar und Ultra-
schall. Im Folgenden werden die häufigsten Methoden beschrieben.
Sensoren 179
Kapazität am Empfangspin verändern. Zusammen mit dem Wider-
stand, der Sende- und Empfangspin verbindet, wird ein soge-
nanntes RC-Netzwerk gebildet. RC steht für resistor und
capacitator, also Widerstand und Kondensator. Diese beeinflussen,
wie schnell eine Spannungsänderung am Ausgang des Netzwerks
widergespiegelt wird. Wenn also der Arduino den Sendepin von 0
auf 1 schaltet, bestimmt die Kapazität an der Antenne, wie schnell
diese Veränderung am Empfangspin ankommt. Misst man nun die
Zeit, lässt sich die Entfernung des menschlichen Körpers bestim-
men. Verwendet man mehrere Sensoren, kann man sogar die Posi-
tion berechnen.
Natürlich kann man solche Sensoren auch für wenig Geld kaufen.
In jedem Falle kann die Spannung analog ausgelesen und verarbei-
tet werden.
Hall-Sensor
Ein Hall-Sensor nutzt den nach dem Physiker Edwin Hall benann-
ten Effekt, der das Auftreten von elektrischer Spannung in einem
stromdurchflossenen Leiter beschreibt, wenn dieser sich in einem
stationären Magnetfeld befindet. Die Spannung fällt dabei senk-
recht sowohl zur Stromfluss- als auch zur Magnetfeldrichtung am
Leiter ab und wird Hall-Spannung genannt. Dieser Sensor ist also
kein Abstandssensor im eigentlichen Sinne, kann aber zum Beispiel
als Schalter verwendet werden, ohne dass ein mechanischer Kon-
takt entstehen muss. Er kann aber auch verwendet werden, um
Magnetfelder zu erkennen und ihre Stärke zu messen. Wenn
Strom- und Magnetfeldstärke bekannt sind, funktioniert er auch
als Metalldetektor. Ein recht einfaches Projekt ([Link]
[Link]/2009/03/02/my-first-arduino-project/), das einen Hall-
Sensor verwendet, ist ein Elektromagnet, der durch die Regelung
mittels Arduino ein magnetisches Objekt in der Luft schweben las-
sen kann. Dabei misst ein Hall-Sensor die Stärke des Feldes und der
Arduino reguliert es, sodass das Objekt nicht zu nahe kommt oder
aus dem Feld herausfällt. Andererseits kann der Hall-Sensor zum
Beispiel auch benutzt werden, um die Geschwindigkeit eines Venti-
lators zu messen.
Reed-Relais
Das Reed-Relais schaltet einen Stromkreis, je nachdem, ob sich ein
magnetisches Feld in der Nähe befindet oder nicht. Es besteht aus
zwei Kontakten, die in einem Glaskörper so eingeschmolzen sind,
dass sie sich durch ein externes Magnetfeld anziehen können. Je
Sonar
Das Sonar kennt man aus U-Booten (bzw. den entsprechenden Fil-
men), wo es zur Ortung von fremden Gegenständen und Booten in
der Umgebung verwendet wird. Ein Sonarsensor kann aber auch
dazu verwendet werden, den Abstand von einem Objekt zum Sen-
sor zu messen. Das geschieht, indem ein Ultraschallsignal ausge-
sendet und die Zeit gemessen wird, bis das Echo zurückkommt. Ein
Beispiel für einen solchen Sensor ist der Ping))) von Parallax Inc.
([Link]
ProductID/92/List/1/[Link]?SortField=ProductName,Product-
Name). Er ist in der Lage, Objekte in einer Entfernung von 2 cm bis
zu 3 m zu orten. Die Messung übernimmt allerdings das daran
angeschlossene Arduino-Board. Es setzt zunächst den mit dem Sen-
sor verbundenen Pin als Output fest und sendet dann ein Signal
und anschließend den Pin auf Input. Nun kann es die Zeit messen,
bis ein Signal auf dem Pin anliegt, und diese Zeit in Entfernung
umwandeln, da Schall sich in der Luft nahezu konstant bewegt.
Laut Datenblatt sind das 1.130 Fuß (344,424 Meter) pro Sekunde,
also 34,442 Zentimeter pro Millisekunde.
Infrarotsensor
Natürlich lässt sich auch mit Licht die Position relativ zu einem
Objekt bestimmen. Dafür werden Infrarotwellen gemessen, die
vom Sensor ausgesandt werden. Das angepeilte Objekt reflektiert
die Lichtwellen, die in einem bestimmten Winkel wieder auf dem
Sensor auftreffen. Diese Messung samt Abstandsberechnung nennt
man Triangulation. Für einfache Projekte empfiehlt sich zum Bei-
spiel der IR Range Finder GP2D12 von Sharp, der für ca. 14 Euro
im Elektronikfachhandel erhältlich ist. Er kann Objekte in einer
Entfernung zwischen 10 und 80 Zentimetern erkennen.
Sensoren 181
Temperatursensor
Temperatur lässt sich auf viele verschiedene Arten durch die
Anwendung unterschiedlicher physikalischer Prinzipien messen.
Am häufigsten sind Widerstandssensoren. Kaltleiter erhöhen ihren
Widerstand, wenn die Temperatur zunimmt, während Warmleiter
ihn senken. Auf der anderen Seite gibt es auch Halbleitersensoren,
die – je nach Bauweise – zur Temperatur proportionalen Strom
oder Spannung liefern.
Feuchtigkeitssensor
Grundsätzlich gibt es zwei verschiedene Arten von Sensoren, um
Feuchtigkeit zu messen: Hygrometer, die die Luftfeuchtigkeit
anzeigen können, und Messgeräte für die Messung der Feuchtigkeit
in verschiedenen Stoffen (z.B. Tensiometer für die Bodenfeuchtig-
keit).
Die interessanten Hygrometer sind vor allem jene, die die absolute
Luftfeuchtigkeit messen können. Um die relative Luftfeuchtigkeit
und den Taupunkt zu messen, gibt es ebenfalls Verfahren, die hier
aber keine Rolle spielen.
Um die absolute Luftfeuchtigkeit zu messen, wird ein wasseranzie-
hendes Material verwendet. Seine Eigenschaften verändern sich bei
zunehmender Luftfeuchtigkeit. Bei elektrischen Hygrometern ist
das ein Polymer, dessen Widerstand oder Kapazität sich verändern
kann.
Kompass
Kompasse bestehen nicht notwendigerweise aus einer runden Mes-
singdose mit Glasdeckel und einer magnetischen Nadel. Mit dem
HMC6352 von Honeywell ist beispielsweise ein magnetischer Sen-
sor verfügbar, der auch an den Arduino angeschlossen werden
kann. Um die beiden Achsen auszulesen und somit die horizontale
Lage des Sensors zu bestimmen, empfiehlt es sich, die Wire-Biblio-
thek zu verwenden, die auf der Website des Arduino-Projektes
([Link] dokumentiert ist. Eine
andere Bibliothek samt Beispiel finden Sie unter [Link]
com/wp/2009/03/19/arduino-library-for-hmc6352/.
Ein Kompass kann als günstige Methode der Lagebestimmung in
einem Roboter eingesetzt werden, wenn man diesem einen be-
Mikrofone
Mikrofone wandeln Schallwellen in elektrische Wellen um, sodass
man diese messen kann. Das Prinzip besteht immer aus einer Mem-
bran, die sich durch die Druckwellen in der Luft verformt. Diese Ver-
formung kann über verschiedene Mechanismen gemessen werden.
Dynamisches Mikrofon
Ein dynamisches Mikrofon ist die Umkehrung eines Lautsprechers:
Die von den Schallwellen bewegte Membran verschiebt die daran
angebrachte Spule innerhalb eines Magneten, wodurch in der Spule
Ströme induziert werden. Tatsächlich kann man einen Lautspre-
cher auch als Mikrofon verwenden. Vorteilhaft ist dabei, dass
dynamische Mikrofone nicht so leicht übersteuert werden wie Elek-
tret-Kondensatormikrofone (kurz: Elektretmikrofone), was beson-
ders für Lichtorgel-Anwendungen im Bereich der Lautsprecher
wichtig ist.
Der Ausgang eines dynamischen Mikrofons ist zu schwach, um
direkt vom Arduino gemessen zu werden; er muss mit mehreren
Transistoren oder einem Operationsverstärker verstärkt werden.
Sensoren 183
Piezoelektrisches Mikrofon
Der Piezoeffekt beschreibt die Erzeugung einer elektrischen Polari-
sation bei Festkörpern, wenn sie verformt werden. Wird also auf
einen piezoelektrischen Sensor mechanisch eingewirkt, verändert
sich die Spannung auf der Oberfläche des Sensormaterials. Umge-
kehrt kann ein piezoelektrischer Aktor sich verformen, wenn Span-
nung angelegt wird.
Das piezoelektrische Mikrofon reagiert auf Druckveränderungen in
der Luft. Eine Membran folgt den Schwankungen des Schalls. Sie
ist mit einem piezoelektrischen Element gekoppelt, das durch den
Druck minimal verformt wird und so elektrische Spannungs-
schwankungen auslöst. Als Mikrofon ist ein Piezo nicht die beste
Wahl, da die Tonqualität höhenlastig ist. Als Sensor kann es zum
Beispiel in Verbindung mit einem Tiefpass-Filter eingesetzt werden,
um Bassimpulse an den Arduino zu melden. Damit können z.B.
Animationen in Processing gesteuert oder LEDs gepulst werden,
um eine entsprechende Atmosphäre zur Musik zu schaffen. Oder
man nutzt es, um Geräusche zu melden, etwa für eine Alarmanlage.
Einer der Autoren dieses Buches nutzt eine Schaltung mit Piezomi-
krofon, um eine Tonaufnahme zu starten, sobald er wieder einmal
im Schlaf zu reden anfängt.
Biometriesensor
Im eigentlichen Sinn gibt es keine biometrischen Sensoren, aller-
dings können Temperatur-, Spannungsdifferenz-, Druck- und
Kraftsensoren dazu verwendet werden, biometrische Zustände zu
messen.
Fingerabdrucksensor
Fingerabdrücke werden heutzutage nicht mehr nur in Science-Fic-
tion-Filmen verwendet, um beispielsweise Schlüssel zu ersetzen.
Viele Notebooks und auch elektronische Türsysteme besitzen sol-
che Scanner. Diese sind nicht hundertprozentig sicher, sollten also
nicht in hoch sensiblen Einrichtungen verwendet werden. Für den
Gebrauch in der heimischen Umgebung, in der kaum damit gerech-
net werden dürfte, dass das System für kriminelle Machenschaften
missbraucht wird, sind sie allerdings geeignet, wenn auch derzeit
noch etwas teuer. Für 70 bis 100 Euro kann man einen passenden
Sensor für den Arduino erstehen.
Gasdrucksensor
Der Druck in einer Leitung oder einem Gefäß kann über die Verfor-
mung einer Membran gemessen werden. Der dabei gemessene
Wert entspricht dann immer der Differenz der Drücke an den zwei
Seiten der Membran (Differenzdrucksensor). Die physikalische Ein-
heit für Druck ist dabei Pascal (Pa). Fast alle Differenzdrucksenso-
ren funktionieren entweder resistiv (ändern also ihren Widerstand)
oder kapazitiv (ändern ihre Kapazität). Solche Sensoren werden
zum Beispiel im in Kapitel 1 beschriebenen Bierbrauprojekt einge-
setzt, wo der Druck im Brautank reguliert werden muss. Sie eignen
sich aber auch, um große Mengen an Flüssigkeit zu regulieren oder
beispielsweise Wasserschläuche zu steuern. So kann ein Gas-
drucksensor am Ende eines Schlauches, der in eine Wasserzisterne
getaucht wird, denn aktuellen Wasserstand messen.
Kraftsensor
Piezoelektrische Sensoren nutzen den gleichnamigen Effekt, um aus
der Verbiegung eines Kristalls eine Spannung zu erzeugen. In einem
Feuerzeug schlägt ein Federmechanismus auf einen Piezokristall.
Die dabei erzeugte Spannung ist groß genug, um das Gas zu ent-
zünden. EnOcean stellt mit diesem Effekt drahtlose Lichtschalter
Sensoren 185
her, die ihre Energie für das Funksignal nur aus dem Betätigen des
Schalters gewinnen. Da die vom Piezokristall abgegebene Span-
nung aber proportional zur Änderung der Kraft ist, die auf den
Kristall einwirkt, können nur Veränderungen gemessen werden.
Man kann damit also keine Waage bauen, aber zum Beispiel Drum-
pads für ein elektronisches Schlagzeug.
Resistive Sensoren basieren auf Dehnungsmessstreifen (DMS), die
bei Verformung ihren elektrischen Widerstand verändern. Wird
der DMS in die Länge gezogen, verringert sich die Leiterbahnbreite,
und der Widerstand steigt. Dieses Prinzip würde auch mit einem
normalen Draht funktionieren, was aber aus zwei entscheidenden
Gründen nicht praktikabel ist: Die Widerstandsänderung ist sehr
klein, und normaler Kupferdraht würde sich nicht mehr zusam-
menziehen, nachdem die aufgebrachte Kraft wieder verschwunden
ist. Fast alle elektrischen Waagen funktionieren mit DMS-Senso-
ren. Auch im Brückenbau, in Kraftwerken usw. werden sie einge-
setzt, um frühzeitig Verformungen zu erkennen.
Kapazitive Drucksensoren enthalten einen Kondensator, der durch
die aufgebrachte Kraft verformt wird, wodurch sich seine Kapazität
ändert. Diese Änderung ist dann ein Maß für den Druck.
Der einfachste Anwendungsfall für einen Drucksensor ist natürlich
eine Art Tastatur, die mehr als nur einen An/Aus-Wert übergeben
muss. Einfache Sensoren können zum Beispiel in Kleidung einge-
näht werden, um festzustellen, wenn der Träger umarmt wird oder
hinfällt. Sicherlich kennen Sie den »Hau den Lukas« von Jahr-
marktbesuchen. Unter einer Gummimatte und einem Holzbrett
könnte der Drucksensor so die Hammerschläge messen, die der
Arduino dann auf einer langen Linie von LEDs visualisiert. Ein
anderes Beispiel sind Klopfsensoren; ein Drucksensor auf einer Tür
kann diese nach dem richtigen Klopfsignal öffnen.
Biegungssensor
Biegungssensoren verhalten sich ähnlich wie piezoelektrische Kraft-
messer. Sie verändern also ihren Widerstand, wenn sie mechanisch
verändert werden – in diesem Fall gebogen. Diese Sensoren können
beispielsweise in Kleidung eingearbeitet werden und bieten so die
Möglichkeit eines einfachen Motion-Capturing. Auch wenn die
Präzision wahrscheinlich nicht ausreicht, um damit filmreife 3-D-
Modelle zu steuern, gibt es diverse Projekte damit: Die Designer
Mika Satomi und Hannah Perner-Wilson nutzen selbstgebaute
Aktoren
Aktoren sind allgemein Elemente, die eine physikalische Eingangs-
größe in eine andersartige Ausgangsgröße umwandeln. In der Welt
des Physical Computing ist diese Eingangsgröße natürlich Elektrizi-
tät. Die möglichen Ausgangsgrößen sind so unterschiedlich, wie die
Physik vielschichtig ist, und reichen von Licht und Ton bis hin zu
Wärme und Bewegung. Die gängigsten Aktoren werden hier nun
kurz vorgestellt.
LEDs
Glühlampen und Leuchtstoffröhren sind zwar sehr hell, können
aber nur schwer geregelt werden. Sie reagieren nur langsam und
sind zudem groß und damit nur begrenzt einsetzbar. LEDs sind,
wie in Kapitel 3 beschrieben wurde, Dioden, die binnen Mikrose-
kunden einen Lichtimpuls abgeben können. Die fortschreitende
technische Entwicklung macht es inzwischen möglich, auch Licht-
dioden mit sehr hohen Helligkeitswerten herzustellen, sodass die
LED langsam auch die privaten Haushalte erobert. Weitere Vorteile
neben den schon erwähnten sind, dass LEDs im Durchschnitt viel
länger halten und über eine deutlich höhere Lichtausbeute pro
Watt verfügen. Waren LEDs lange Zeit nur in weißer und roter
Farbe erhältlich (andere Farben wurden über einen entsprechenden
Aktoren 187
Plastiküberzug erzeugt), gibt es mittlerweile auch grüne und blaue
Leuchtdioden und Kombinationen aller drei Grundfarben (Rot,
Grün und Blau), die gemeinsam auf einen Chip montiert sind.
Kapitel 3 erklärt ausführlich, wie LEDs mit dem Arduino angesteu-
ert und durch Pulsung in ihrer sichtbaren Helligkeit verändert wer-
den können. Am Ende des Kapitels gibt es zudem eine Liste
interessanter LED-Projekte.
Motoren
Kleine Motoren sind der Antrieb für alle Projekte im Bereich der
Robotik. Sie können aber auch benutzt werden, um beispielsweise
Lampen auszurichten oder Sensoren in eine gewünschte Position
zu bringen. Im normalen Gebrauch unterscheidet man zwischen
drei Arten: Gleichstrom-, Servo- und Schrittmotoren.
Gleichstrommotoren
Die günstigsten und einfachsten Motoren basieren auf einer oder
mehreren magnetischen Spulen, die um eine Welle gefasst werden.
Liegt Spannung an diesen Motoren an, bringt das Magnetfeld die
Welle zum Rotieren. Ein normaler Gleichstrommotor kann dabei
nur schwer gesteuert werden. Er bietet keinerlei Rückkopplung,
sodass dem Benutzer weder die Position noch die Geschwindigkeit
genau bekannt sind. Für präzise Operationen, wie etwa die Steue-
rung eines Fluggerätes oder die Drehung eines Objektes um wenige
Grad, eignet er sich also nicht; kann man aber darauf verzichten,
ist der Gleichstrommotor aufgrund seines Preises natürlich zu
empfehlen.
Servomotoren
Benötigt man ein Feedback vom Motor, um seine Geschwindigkeit
genau regeln zu können, empfiehlt sich ein Servomotor. Diese
Motoren sind durch die Rückkopplung außerordentlich präzise,
allerdings auch entsprechend teuer. Ein Servomotor besteht aus
einem Gleich- oder Wechselstrommotor, enthält zusätzlich einen
Rückkopplungsmechanismus, meist auf Basis einer Lichtschranke
oder eines Potentiometers. So ist er in der Lage, genaue Geschwin-
digkeiten und sogar Positionen einzustellen. Die kleine Variante der
Servomotoren sind die Modellbauservos. Diese können sich nur
um ca. 180° drehen, haben aber ein einfaches digitales Interface,
können also ohne weitere Bauteile mit dem Arduino verwendet
Abbildung 7-1
Servomotor
Schrittmotoren
Ein Schrittmotor basiert auf einem drehbaren Motorteil (Rotor) mit
einer Welle, das sich in einem magnetischen Feld befindet. Dieses
Feld ist in Schritte unterteilt, sodass der Rotor sich um einen oder
mehrere dieser Schritte drehen kann. Dadurch kann man im Prin-
zip Geschwindigkeit und auch Position bestimmen. Allerdings gibt
es keinerlei Rückmeldung über mögliche Schrittverluste. Während
ein Servomotor seine Position wieder einnimmt, wenn er beispiels-
weise durch einen Finger angehalten wurde, ist der Schrittmotor
dazu nicht in der Lage. Zudem kann es bei großen Leistungen zu
Problemen kommen. Dafür ist er deutlich preisgünstiger.
Der Arduino selbst ist nicht in der Lage, Motoren zu steuern, da er
ja nur über digitale Ausgänge verfügt und ein Motor nicht einfach
angeschaltet werden kann. Hier hilft ein Motor-Driver wie der
L293 oder der SN754410NE. Unter [Link]
mshield/ oder auch [Link]
[Link] findet man Shields für den Ardu-
ino, über die Richtung und Geschwindigkeit des Motors gesteuert
werden können. Der Shield von [Link] verwendet dabei
8-Bit-Werte für die Geschwindigkeit und wird über eine der
Aktoren 189
Bibliotheken angesteuert, die auf der Website heruntergeladen
werden können. Der Driver von [Link] verwendet
Pulsweitenmodulation und wird nur über ein entsprechendes ana-
logWrite() angesprochen. Welchen man nun kauft, oder ob man
sich dank verfügbarer Board-Layouts selbst einen Shield baut,
hängt vom Verwendungszweck und dem Preis ab, den man zu zah-
len bereit ist.
Relais
Oft möchte man einen Arduino verwenden, um Stromkreise zu
schalten, die sich weit über der Betriebsspannung des Boards von 5
Volt bewegen. Das ist natürlich zunächst ein Problem, weil starke
Ströme dem Board erheblichen Schaden zufügen können. Um bei-
spielsweise Glühbirnen anzuschalten, werden die vollen 220 Volt
aus der Steckdose benötigt. Abhilfe können hier Relais schaffen.
Das sind Schalter, die durch einen elektronischen Impuls einen
weiteren Stromkreis schalten können. Ein mechanisches Relais
arbeitet meist nach dem Prinzip des Elektromagneten. Liegt Strom
in einer Spule an, zieht diese einen mechanischen Anker an, der als
Schalter im zweiten Stromkreis fungiert. Diese Relais eignen sich
vor allem, um zum Beispiel Geräte im Haushalt anzuschalten. Wie
wäre es mit einem Kaffeewecker, der durch den Duft frischen
Espressos auf sich aufmerksam macht, oder mit einem Lichtschal-
ter, der unter einer Fußmatte neben dem Bett angebracht ist und
den Raum beleuchten lässt, sobald man aufsteht?
Neben diesen mechanischen Relais gibt es auch eine Reihe anderer;
dazu zählen auch Transistoren bzw. Halbleiterrelais, auch wenn
diese streng genommen keine Relais sind. Diese können zum Bei-
spiel recht einfach verwendet werden, um leistungsfähige LEDs zu
schalten (siehe Kapitel 1 und 3), da Transistoren im Gegensatz zur
Mechanik auch schnell genug sind, um die nötige Pulsung zu leisten.
Ein Relais wird – ähnlich wie eine leistungsfähige LED – immer
über einen Transistor an den Arduino angeschlossen. Dabei sollte
man die Diode nicht vergessen, sonst kann die Induktivität des
Relais den Transistor beschädigen.
Solenoide
Ein Solenoid ist eine Zylinderspule, die magnetische Kräfte entwi-
ckelt, wenn Spannung angelegt wird. Diese kann etwa um einen
Elektronischer Würfel
Nun soll ein elektronischer Würfel gebaut werden. Dieser besteht
aus einem elektronischen Display, das die gewürfelte Zahl darstellt,
sowie einem Taster, der den Würfel anstößt. Anschließend wird
mit einem Piezo-Lautsprecher noch ein entsprechender Ton ausge-
geben.
An Material werden dafür sieben LEDs, sieben Widerstände 470R,
eine Lochrasterplatine und ein piezoelektrischer Sensor benötigt.
Abbildung 7-2
Würfelaufbau, Lochrasterplatine
oben
Setup
Die mittlere LED wird mit einem 470R-Widerstand mit Pin 11 ver-
bunden. Die beiden LEDs oben links und unten rechts mit Pin 10,
die LEDs unten links und rechts mit Pin 9 und die verbleibenden
zwei LEDs mit Pin 8.
Abbildung 7-3
Würfelaufbau,
Lochrasterplatine unten
Abbildung 7-4
Rüttelsensor
Software
Zunächst werden die sieben LEDs in einem leeren Worksheet ange-
bunden (wie auch in Kapitel 3 erklärt), dann wird Pin 12 mit dem
Erschütterungssensor als Eingang definiert und mit einem HIGH-
Signal für den internen Pull-up-Widerstand belegt.
Nun kann durch einzelne HIGH- und LOW-Signale herausgefun-
den werden, wie sich mit dieser Schaltung alle benötigten Augen-
bilder eines Würfels abbilden lassen. Das Ergebnis wird in eine
eigene Funktion geschrieben.
Dabei kann das Konstrukt switch() {.. case …} verwendet werden.
Es erlaubt wie if...else bedingte Sprünge, kann aber abhängig
von einem Wert aus mehreren Verzweigungen wählen:
void display(int num)
{
switch(num)
{
Dieser Code ist allerdings wenig elegant, zieht er sich doch in die
Länge und wiederholt sich dabei in großen Teilen. Mit ein wenig
Nachdenken kommt man allerdings auf einige Gesetzmäßigkeiten:
LED1 ist immer an, wenn num nicht durch 2 teilbar ist (1, 3, 5).
LED2 ist immer an, wenn num > 1 ist (2, 3, 4, 5, 6).
LED3 ist immer an, wenn num > 3 ist (4, 5, 6).
LED4 ist nur bei num = 6 an.
Also kann das Ganze durch Folgendes ersetzt werden.
// zeigt eine Zahl von 0 bis 6 auf den Würfel-LEDs an
void display(int num)
{
if ((num % 2) == 0) {
digitalWrite(led1Pin, LOW);
} else {
digitalWrite(led1Pin, HIGH);
}
if (num > 1) {
digitalWrite(led2Pin, HIGH);
} else {
digitalWrite(led2Pin, LOW);
}
if (num > 3) {
digitalWrite(led3Pin, HIGH);
} else {
digitalWrite(led3Pin, LOW);
}
if (num == 6) {
digitalWrite(led4Pin, HIGH);
} else {
digitalWrite(led4Pin, LOW);
}
}
Die Funktion getTaster() liefert also nur dann eine 1 zurück, wenn
sich der Erschütterungssensor bewegt hat.
Steht der Würfel still, so soll der Wurf erst gestartet werden, wenn
viele Male in kurzer Zeit so eine Veränderung gemessen worden ist,
andernfalls würde der Würfel schon auf leichtes Anstoßen des
Tisches reagieren. Dazu wird eine Zählvariable benutzt: taster_
entprellen wird bei jedem Ereignis um 20 erhöht; tritt nichts ein,
wird eins abgezogen. Erst wenn diese Zahl größer als 1.000 ist, soll
der Wurf gestartet werden.
void loop() // Hauptschleife
{
// warten auf einen Tastendruck zum Starten des Würfels
taster_entprellen = 0;
while( taster_entprellen < 1000)
{
taster_entprellen += getTaster()*20;
if (taster_entprellen > 0) taster_entprellen--;
delay(1);
}
Die Variable speed bestimmt die Geschwindigkeit, mit der sich der
Würfel dreht. Sie wird nun willkürlich auf 100 gesetzt und der
Wurf gestartet. Dabei wird eine do...while-Schleife verwendet.
Diese läuft mindestens einmal durch, maximal so lange, bis eine
bestimmte Bedingung erreicht wird. Setzt man die while-Bedingung
an den Anfang der Schleife, kann es passieren, dass die Schleife
nicht ausgeführt wird, im Falle des Würfels soll aber zumindest ein-
mal eine neue Zahl ermittelt werden.
// nun wird der Würfel gestartet
// setzen der Würfelgeschwindigkeit auf hoch
speed = 100;
do
{
Piezolautsprecher
Der Würfel soll nun einen Piezolautsprecher erhalten, um beim
Wurf einen passenden Ton auszugeben.
Abbildung 7-5
Piezo
Buzzer to DMX
Für eine Quizshow werden an den Arduino mehrere Knöpfe (Buz-
zer) angeschlossen. Wird einer davon betätigt, sendet der Arduino
über DMX den Befehl, den Kandidaten zu beleuchten. Leider sind
z. Zt. auf der Webseite ([Link] weder
Quellcode noch Schaltpläne vorhanden.
Specdrum
Lichtsäulen, die interaktiv von einer Trommelgruppe gesteuert
werden. Sensoren in den drei Trommeln erkennen die einzelnen
199
Schläge. Je nach Tonhöhe werden über DMX verschiedene Farben
zu RGB-Scheinwerfern in großen, matten Plastiktrommeln gesendet.
[Link]
Forcefield Interactive
Mittels verschiedener RFID-Karten kann das »Lichtfeld« dieser
Installation beeinflusst werden. Ein einzelner Arduino kontrolliert
hier 192 Lichtstäbe. Die Farbmuster basieren hauptsächlich auf Per-
linrauschen und den Daten der RFID-Karten der Besucher. Zusätz-
lich können mitgebrachte Gegenstände mittels eines Farbsensors
abgescannt werden ([Link]
01/forcefield_interactive.html).
DMX
DMX ist ein Standard zur Steuerung von Scheinwerfern in der Ver-
anstaltungs- und Bühnentechnik. Er ersetzte die davor übliche
Ansteuerung mit 0-10V Signalen. Bei diesen Systemen benötigte
man zu jedem Scheinwerfer ein eigenes Kabel. Bei 30 oder mehr
Scheinwerfern kann man sich vorstellen, wie die Rückseite des
Lichtmischpults ungefähr ausgesehen haben mag. Dafür war aber
auch nur ein beliebiges Multimeter notwendig, um den Zustand
jedes Kabels inklusive der übertragenen Daten zu kontrollieren.
DMX ersetzt alle diese Kabel durch ein einziges, und die analogen
Signale werden digital übertragen. Bis zu 512 einzelne Geräte kön-
nen in einer langen Kette hintereinander an diesen Bus angeschlos-
sen und darüber gesteuert werden. An jedem kann, meistens über
ein sogenanntes Mäuseklavier, eine individuelle Adresse eingestellt
werden. Benötigt ein Gerät, z.b. ein LED-DMX-Scheinwerfer, meh-
rere Parameter (rot, grün, blau) so belegt dieser drei aufeinander
folgende Adressen. Der nächste Scheinwerfer muss also drei Adres-
sen weiter hinten anfangen. Die meisten LED-RGB-Scheinwerfer
belegen fünf oder sogar sechs Adressen, weil dort noch weitere Son-
derfunktionen vorhanden sind. So kann ein DMX-Bus mit seinen
512 Adressen rund 80–100 dieser Scheinwerfer kontrollieren.
Für rund 30 € stellen diese Scheinwerfer eine einfache und kosten-
günstige Möglichkeit dar, Haus und Hof effektvoll zu beleuchten.
Da DMX für sehr lange Kabel entworfen wurde, werden die Daten
symmetrisch übertragen. Das bedeutet, es gibt zwei Datenleitun-
gen. Ist die eine auf »High« geschaltet, wird die andere auf null
Protokoll
Das DMX-Protokoll basiert wie RS232 auf asynchronen (also ohne
extra Taktleitung) übertragenen Bytes mit Start- und Stopbits. Die
Geschwindigkeit ist mit 250kbit/s festgelegt. Das bedeutet damit
auch, dass nur ca. 40–45 Änderungen pro Sekunde übertragen wer-
den können, wenn alle 512 Adressen auf dem Bus belegt sind. Für
normale Scheinwerfer ist das aber schnell genug.
Alle Daten werden in Paketen, sogenannten Frames, übertragen.
Damit die DMX-Teilnehmer den Beginn eines solchen erkennen
können, sendet der Master mindestens 88 μs lang eine Null auf
den Bus. Durch die Stopbits kann dieser Zustand während einer
normalen Übertragung niemals auftreten, so dass der Beginn eines
Frames zweifelsfrei festgestellt werden kann.
Danach folgt als Erstes das Startbyte, das immer Null und für die
spätere Erweiterung vorgesehen ist. Es folgen die entsprechenden
Bytes, die immer mit der Adresse Null beginnen. Das heißt, ein
DMX-Empfänger wartet auf den Start eines Frames und die darauf
folgende Null. Dann ignoriert er so viele Bytes auf dem Bus, wie es
seiner Adresse entspricht. Die dann folgenden Bytes sind die für ihn
bestimmten Daten.
Software
Von [Link] gibt es eine schöne Bibliothek für das DMX-
Protokoll. Diese kann unter [Link]
DmxSimple heruntergeladen werden. Wie schon von anderen Bibli-
otheken bekannt, werden die Dateien in das Verzeichnis [Arduino-
Verzeichnis]/hardware/libraries/DmxSimple entpackt. Nach dem
DMX 201
Neustart der Arduino-Software kann die Bibliothek dann verwen-
det werden. Sie muss dann auch im Library-Menü auftauchen.
Mit #include <DmxSimple.h> wird die Bibliothek eingebunden
(alternativ über das Menü) .
void setup() {
[Link](3); // Hier muss der Pin angegeben werden an
// welchem das DMX
// Interface angeschlossen ist. Meistens
// ist das PIN3.
}
void loop() {
int brightness;
for (brightness = 0; brightness <= 255; brightness++) {
[Link](1, brightness); // Setze DMX Kanal 1
delay(10); // ein wenig warten, damit es nicht zu schnell wird.
}
}
Barlicht
In diesem Projekt wird eine Thekenbeleuchtung für eine Bar
gebaut. Je nach Länge der Theke besteht diese aus 1 bis 32 einzel-
nen DMX-LED-RGB-Scheinwerfern, die in einer Reihe von der
Decke herab die Bar beleuchten. Solche Scheinwerfer können ab
35 EUR z.B. bei [Link] bezogen werden. Die Grundidee
bei allen abgespielten Animationen sollte dabei sein, dass der Gast
nie im Dunkeln sitzt, und anders als bei einem Discolicht sind eher
langsame, weiche Übergänge sinnvoll.
Hardware: Mehrere DMX-Scheinwerfer, die über das entspre-
chende Kabel und das DMX-Shield mit dem Arduino verbunden
werden.
Je nach Modell des verwendeten Scheinwerfers benötigt dieser 3
bis 6 DMX-Adressen. Bei mehr als einem Scheinwerfer werden die
Adressen so verteilt, dass sie sich nicht überschneiden. Bei Schein-
werfern mit 6 Adressen/Gerät z.B.: 0, 6, 12. Dabei kann es auch
sinnvoll sein, den 6er-Abstand bei Geräten mit kleinerem Adressbe-
reich einzuhalten, weil dann in der Software alle Scheinwerfer mit
dem gleichen Schema angesprochen werden können.
void setup() {
[Link](3); // Hier muss der Pin angegeben werden an
// welchem das DMX
// Interface angeschlossen ist. Meistens
// ist das PIN3.
void loop() {
// Immer wenn update = 0 ist, denken wir uns eine neue Farbe aus.
if (update == 0) {
color[0][0] = random(0,256); // Rot
color[0][1] = random(0,256); // Gruen
color[0][2] = random(0,256); // Blau
}
Barlicht 203
Wie in den Kommentaren beschrieben, wird alle 10 Sekunden der
imaginäre Scheinwerfer 0 mit einer zufälligen Farbe geladen. Zehn
mal pro Sekunde wird jetzt immer ein Vierundsechzigstel der Farbe
an den Nachbarscheinwerfer weitergereicht, sodass ein fließender
Farbverlauf erreicht wird.
RF-Steckdosen
In Bau- und Supermärkten werden immer wieder günstige Sets von
Funksteckdosen angeboten. Damit können Lampen und andere
Geräte im ganzen Haushalt kontrolliert werden, ohne dabei mit
230V in Berührung zu kommen oder neue Kabel verlegen zu müs-
sen. Damit folgende Modifikationen durchgeführt werden können,
sollte im dazugehörigen Sender ein HX2262, PT2262 oder LP801-
IC werkeln. Das ist z.B. bei den Sets von Intertechno oder Unitec
der Fall, die man in vielen Baumärkten bekommt.
Protokoll
Die ICs HX2262 und PT2262 gibt es in zwei verschiedenen Baufor-
men. Bei den 18poligen ICs ist der Pin 17 und bei den 20poligen
der Pin 19 der Datenausgang zum eigentlichen Sendemodul. Bei
dem von Intertechno verwendeten LP801 ist es der Pin 1. Wer die
gesendeten Daten also genauer ansehen möchte, sollte hier sein
Oszilloskop anschließen. Aus den Datenblättern und den Beobach-
tungen im Oszilloskop erhält man folgendes Datenprotokoll:
Alle Daten bestehen entweder aus einem kurzen Puls (25%) und
einer langen Pause (75%) oder einem langen Puls (75%) und einer
kurzen Pause (25%). Die erste Variante bezeichnen wir ab hier als
»0«, die zweite als »1«.
Um möglichst viele verschiede Steckdosen mit diesem IC schalten
zu können, hat sich der Hersteller einen interessanten Trick ausge-
dacht: Alle Eingänge können entweder mit Masse (0), oder mit der
Betriebsspannung (1) verbunden werden, zusätzlich können diese
aber auch unbeschaltet gelassen werden (F). Dadurch kann jeder
Eingang drei verschiedene Zustände annehmen.
Bei nur zwei Möglichkeiten (0/1) hätte man bei zwölf Eingängen
2^12 Möglichkeiten, was 4096 Kombinationen entspricht. Hier
sind es aber drei (0/1/F), also 3^12, also 531441 Möglichkeiten.
Wie können aber 3er-Zustände mittels Nullen und Einsen übertra-
gen werden? Für jeden Eingang werden einfach zwei Bits nach fol-
gender Tabelle gesendet:
Hardware
Am GND des Senders (da, wo der Minuspol der Batterie ange-
schlossen ist) wird eine Leitung angelötet, welche mit GND vom
Arduino verbunden wird. Der Pin 2 des Arduino wird dann Pin 17
(18polige Bauform) oder Pin 19 (20polige Bauform) des HX2262
verbunden (Pin 1 bei den Intertechno Sendern).
Abbildung 8-1
Abbildung 8-2
RF-Steckdosen 205
Software
Als Erstes brauchen wir die RF-Bibliothek von [Link]
com/overige/browsable/433MHz/ArduinoRemoteSwitchLibrary.7z
(Kopie bei [Link]) welche ins Verzeichnis
Arduino/libraries/RemoteSwitch entpackt wird.
Das wichtigste beiliegende Beispiel ist das Show_received_code-
Script. Es ist eigentlich zur Verwendung mit einem Empfänger und
zum Decodieren von eingehenden Funksignalen gedacht.
Da aber an dem hier verwendeten Pin 2 des Arduino nicht nur von
uns Daten in das Funkmodul eingespeist werden können, sondern
auch die zu sendenden Daten bei jeder Betätigung eine Knopfes auf
der Fernbedienung herauskommen, können wir uns damit anse-
hen, welche Codes mit welcher Datenrate gesendet werden.
Nachdem der Code in den Arduino geladen und der Sender mit dem
Pin 2 des Arduinos verbunden ist, sollte in der seriellen Konsole
(»serial monitor«, letzter Button oben rechts im Arduinofenster) bei
jedem Tastendruck auf der Fernbedienung Folgendes zu sehen sein:
Code: 26, period duration: 362us.
Code: 24, period duration: 362us.
Code: 4400, period duration: 362us.
Code: 4398, period duration: 362us.
Code: 1484, period duration: 362us.
Code: 1482, period duration: 362us.
Gespensterschreck
Nicht nur Gespenster, sondern auch Diebe und Einbrecher lassen
sich mit unregelmäßig ein- und ausgeschalteten Lichtern vertrei-
ben. Mittels einfacher Zeitschaltuhren lässt sich das zwar auch rea-
lisieren, man müsste dann aber beim Verlassen des Hauses immer
daran denken, sie auch alle zu aktivieren.
Hardware
Zusätzlich zum Arduino werden eine oder mehrere Funksteckdo-
sen-Sets benötigt. Wie unter Hardware beschrieben wird der Sender
der Funksteckdosen modifiziert und mit dem Arduino verbunden.
Abbildung 8-3
Software
Als Erstes benötigen wir eine Tabelle mit allen vorhandenen Steck-
dosen und deren zugehörigen Ein- und Ausschaltcodes. (Der auf-
Gespensterschreck 207
merksame Leser wird hier erkennen, dass der Code für AUS bei der
Intertechno-Fernbedienung immer um zwei kleiner ist als der dazu-
gehörige Code für EIN. Es würde also genügen, nur einen der bei-
den zu speichern, allerdings wäre der Code dann auf genau diese
Fernbedienung festgeschrieben.)
int anzahlSteckdosen = 3;
Referenzen
[Link]
RF-Bibliothek
[Link]
Intertechno-Funksteckdosen per AVR steuern
[Link]
ARCTECH-Funksteckdosen
[Link]
Die Ansteuerung von Funksteckdosen
[Link]
Arduino & HT2262
Programmierbare Kleidung
Der Trend zur programmierbaren Kleidung hat in den letzten
Monaten stark zugelegt. Gab es bei der Erstellung der ersten Auflage
dieses Buches nur sehr wenige Ressourcen und war Elektronik zum
Anziehen eher ein Nischenthema, gibt es nun eine ganze Reihe von
Webseiten, die sich damit befassen. Unter dem Schlagwort Wea-
rable Computing werden zwei grundsätzliche Bestandteile zusam-
mengefasst: Zum einen Elemente wie Fäden und Stoffe, die auch in
herkömmlicher Kleidung vorkommen. Diese gibt es auch in leiten-
den Varianten und werden als solche in erster Linie in der Industrie
eingesetzt, oder zum Beispiel bei Fechtanzügen. Leitende Fäden
können zum Beispiel von Sparkfun erstanden werden, hier gibt es in
Deutschland einige Händler wie [Link]
Leitende Stoffe sind schwieriger und oft nur über die USA zu bezie-
hen. Sachdienliche Hinweise hierzu nehmen wir gerne auf der
Website zum Buch, [Link] entgegen.
Zum anderen besteht das Wearable Computing aus klassischer
Elektronik, die oftmals angepasst wurde, damit sie besonders gut in
209
Kleidung vernäht werden kann. Die Firma Sparkfun hat in Zusam-
menarbeit mit Leah Buchley ([Link]
Pad/) das LilyPad entworfen, ein Arduino-Board, das sich durch
seine Eigenschaften besonders gut in Kleidung einarbeiten lässt.
Inzwischen ist unter diesem Label eine ganze Reihe an Komponen-
ten entstanden. Dazu gehören LEDs, Temperatursensoren oder
Schalter. Eine ganze Bandbreite dieser Produkte wird unter http://
[Link] angeboten.
Im Internet findet man mittlerweile eine große Reihe an interessan-
ten Projekten, die Kleidung und Computer verbinden. Am häufigs-
ten dürfte dabei die LED vorkommen. Jacken, T-Shirts und
Kleider, die dank Elektronik leuchten, haben schon eine recht lange
Tradition und sind nicht erst seit dem Aufkommen von LilyPad
und Co. aufgetaucht. Ein besonders interessantes Projekt, das
LEDs verwendet, ist eine Jacke für Radfahrer, die Leah Buchley auf
ihrer Seite beschreibt. Zeigt man eine Richtung an, leuchtet ein
Pfeil in die entsprechende Richtung. Besonders im Dunklen eine
sinnvolle Sache. Die koreanische Künstlerin Joo Youn Paek schuf
2006 eine Klanginstallation, die durch das Öffnen und Schließen
verschiedener Reißverschlüsse gesteuert werden konnte.([Link]
[Link]/~jyp243/jy/[Link])
Laura Bioffi, eine Studentin aus Kopenhagen, strickte einen Hand-
schuh, der zusammen mit einem LilyPad in der Lage ist aufzuzeich-
nen, wann immer einem Kommilitonen die Hand gegeben wird.
Abbildung 9-1
T-Shirt mit LilyPad
Madeleine und Chris Ball entwarfen ein T-Shirt, das die Anzahl
ungelesener E-Mails visualisiert. Dazu wurde die LilyPad-Platine
mit einer Bluetooth-Erweiterung verbunden, die damit über ein
Handy die Zahl der ungelesenen E-Mails abrufen kann. Um bis
zu 127 ungelesene EMails visualisieren zu können, wird die
Wearable Komponenten
LilyPad
Das LilyPad ist ein abgespeckter Arduino, speziell für das Vernähen
in Wearable-Projekten konzipiert. Da der ganze Programmierteil
des Arduinos fehlt, kann ein vorhandener Arduino Hilfe leisten. Im
Prinzip verwendet man dessen TX- und RX-Pins, muss jedoch auch
beachten, dass man den Mikrocontroller vorher vom Board ent-
fernt hat. Eine genaue Anleitung findet man unter [Link]
[Link]/~leah/LilyPad/01_computer_attach.html. Oder noch einfa-
cher verwendet man das dazu passende FTDI-Breakeout Board,
welches direkt mit dem LilyPad bezogen werden kann.
Abbildung 9-2
LilyPad (Abbildung mit freund-
licher Genehmigung von
Sparkfun Electronics)
Abbildung 9-3
Leitender Faden (Abbildung mit
freundlicher Genehmigung von
Sparkfun Electronics)
Leitender Stoff
Für großflächige Kontakte und mehrlagige Konstruktionen ist leit-
fähiger Stoff eine interessante Sache. Allerdings ist er sehr schwer
zu bekommen. Eine Quelle ist der Fechtturnierbedarf. Dort werden
sogenannte Elektrowesten verwendet, um Treffer des Gegners
erkennen zu können. Diese sind aus leitfähigem Stoff hergestellt.
LEDs
Ganz normale bedrahtete LEDs lassen sich, nachdem man die
Anschlussdrähte zu kleinen Ösen gebogen hat, mit leitendem
Faden vernähen. Besonders kleine SMD-LEDs integrieren sich gut
in Kleidungsstücke (Sie reißen nicht so leicht ab wie ihre großen
Schwestern, wenn sie an den Anschlüssen mit kleinen Ösen aus
Draht versehen werden. Passend zur LilyPad-Platine gibt es von
Sparkfun bereits vorgefertigte kleine LED-Platinen, die ebenfalls
Ösen zum Vernähen haben.
Abbildung 9-4
LilyPad-LED (Abbildung mit
freundlicher Genehmigung von
Sparkfun Electronics)
Beschleunigungssensor
Ebenfalls bei Sparkfun gibt es einen Beschleunigungssensor zum
Annähen. Damit kann man zum Beispiel die Armpositionen mes-
sen oder Bewegungsmuster erkennen, um dann verschiedene LED-
Muster abzuspielen oder einfach nur einen Tagesablauf aufzu-
zeichnen.
Lautsprecher
Ein kleiner magnetischer Lautsprecher, gerade laut genug, um den
Träger auf wichtige Zustände und Meldungen aufmerksam zu
machen.
Abbildung 9-6
LilyPad-Lautsprecher (Abbildung
mit freundlicher Genehmigung von
Sparkfun Electronics)
Stromversorgung
Verschiedene Batteriefächer können einen Arduino oder ein Lily-
Pad mit Strom versorgen. 3 AA- oder AAA-Batterien/Akkus reichen
dabei für ein LilyPad aus. Ein Arduinoboard benötigt etwas mehr
Spannung, da darauf ein einfacher Spannungsregler verbaut ist.
Dieser benötigt mindesten ca. 7V um den Arduino mit 5V zu ver-
sorgen. Ohne diesen Regler läuft auch das Arduinoboard mit 3 Bat-
terien. Sind diese nicht mehr ganz voll, kann der Mikrocontroller
unter Umständen aber nicht mehr richtig arbeiten. Sparkfun bietet
Abbildung 9-7
LilyPad-Batteriehalterung
(Abbildung mit freundlicher Geneh-
migung von Sparkfun Electronics)
Materialien
Neben dem Arduino (wenn möglich einem LilyPad) werden die
typischen Utensilien zum Nähen benötigt. Also eine Nähnadel oder
Nähmaschine, leitender Faden oder sehr dünner Draht, metallene
Textil-Druckknöpfe und Schaumstoff. Für die Verbindung mit dem
iPod oder iPhone (was natürlich ebenfalls vorhanden sein sollte)
benötigt man einen iPod-Dock-Konnektor. Außerdem ist es sinn-
voll, gleich daran zu denken, dass man das Kleidungsstück, nennen
wir es hier »die Jacke«, auch unabhängig von einem Netzteil betrei-
ben möchte. Ein Batteriefach für 3 AA- oder AAA-Batterien kann
dabei sehr hilfreich sein.
Technik
Wie oben schon erwähnt, lohnt es sich bei Wearables-Projekten
über den Kauf eines »LilyPad« nachzudenken. Diese Arduino-
Board ist rund, flach und klein, sodass es besonders gut in einem
Kleidungsstück versteckt werden kann. Angeblich ist es waschbar,
auf jeden Fall eignet es sich jedoch besonders gut, um leitenden
Faden anzuknüpfen, weil die Pins mit Löchern versehen sind.
Abbildung 9-8
Druckknopfschalter
Abbildung 9-9
Druckknopfschalter plus LED
Abbildung 9-10
Vorbereitete Stelle für den Taster
Abbildung 9-11
Abstandhalter aus Schaumstoff
oder anderem dicken Stoff.
Abbildung 9-13
Fertiger Tasterstapel mit
Anschlussfaden.
Abbildung 9-14
Fertiger Taster mit LED
Nähen: Im Rahmen dieses Buches sind wir leider nicht in der Lage,
einen detaillierten Exkurs in die Kunst des Nähens zu bieten. Im
Internet gibt es jedoch hervorragende Tutorials, die jede mögliche
Technik und jeden Stich genau erklären. Hier sei zum Beispiel auf
[Link] verwiesen; aber auch auf der
Webseite von Burda Moden ([Link] gibt es
gut gemachte Videos. Der Einfachheit halber wird im Folgenden
nur von »Nähen« gesprochen. Ob dies mit der Nähmaschine oder
per Hand geschieht, bleibt dem Leser selbst überlassen. Allerdings
gilt Folgendes zu beachten, wenn man leitenden Faden in der Näh-
maschine verwenden will. Dieser neigt dazu, sich sehr schnell zu
verdrehen. Deshalb empfiehlt es sich, den leitenden Faden als
Unterfaden einzunähen. Dazu wird er auf die Unterfadenspule
einer Nähmaschine gerollt und ein einfacher, dünner Faden von
oben durch die Nadel geführt. Die beiden Fäden werden ineinander
verschlungen, sodass der dünne Faden den leitenden auf dem Stoff
festzurrt. Eine genaue Anleitung findet man unter anderem unter
[Link]
faden_aid_1543.html
Play-Knopf: Der wohl einfachste Teil dieses Projektes ist ein Play/
Pause-Knopf. Hier dient ein Druckknopf, der auf der einen Seite mit
einem Pin, auf der anderen mit GND verbunden wird. Der Arduino
wird später so programmiert, dass er ein »Play«- oder »Pause«-Kom-
mando an den iPod sendet, sobald der Knopf geschlossen oder
geöffnet wird.
Aufbau: Hat man die Einzelteile zusammen, kann man einen ersten
Aufbau versuchen: Der Druckknopf und die beiden Taster werden
mit einem Arduino verbunden. Die beiden TX/RX-Pins des Ardu-
ino werden mit den Pins 12 und 13 des iPod-Konnektors verlötet,
zusätzlich muss der GND des Arduinos mit einem der GND-
Anschlüsse des iPod-Konnektors verbunden werden. Nun kann
mit der Programmierung begonnen werden. Zunächst soll der
Druckknopf als Schalter fungieren. Der entsprechende Pin wird
also auf »Input« gesetzt, und in der loop()-Funktion kontinuier-
lich ausgelesen.
Programmierung
Zunächst empfiehlt es sich, den iPod einmal ohne die selbst gebas-
telten Sensoren anzusteuern. So kann sichergestellt werden, dass
die serielle Verbindung fehlerlos funktioniert. Hierzu wird zunächst
die Bibliothek Serial eingebunden. Anschließend wird im setup()
eine serielle Verbindung mit 19200 Baud gestartet. Die Verbin-
dung läuft nur mit dieser Geschwindigkeit. Anschließend können
Kommandos an den iPod gesendet werden. Diese Kommandos fol-
Kommando Funktion
0x00 0x00 Button Released
0x00 0x01 Play/Pause
0x00 0x02 Vol+
0x00 0x04 Vol-
0x00 0x08 Skip >>
0x00 0x10 Skip <<
0x00 0x80 Stop
0x00 0x00 0x01 Play (kein Pause)
0x00 0x00 0x02 Pause (kein Play)
// IPod Befehle
int buttonRelease[] = {0xFF, 0x55, 0x03, 0x02, 0x00, 0x00};
void setup() {
[Link](19200);
// Eingänge
pinMode(volPlusPin, INPUT);
pinMode(volMinusPin, INPUT);
pinMode(playPausePin, INPUT);
void loop() {
if ([Link]()) {
// Druckknopf geöffnet -> Pull-Up macht den Eingang HIGH
if ( [Link]() == HIGH) {
// Musik aus
sendCommand(buttonPause);
sendCommand(buttonRelease);
playStatus = 0;
}
else {
// Druckknopf geschlossen -> Pin = GND/LOW
// Musik an
sendCommand(buttonPlay);
sendCommand(buttonRelease);
playStatus = 1;
}
}
if ([Link]()) {
// Taster gedrückt = GND/LOW
if ( [Link]() == LOW) {
sendCommand(buttonVolPlus);
sendCommand(buttonRelease);
}
}
if ([Link]()) {
// Taster gedrückt = GND/LOW
if ( [Link]() == LOW) {
sendCommand(buttonVolMinus);
sendCommand(buttonRelease);
}
}
if (playStatus == 1) {
// Ist der Ipod in Betrieb, soll die LED blinken
digitalWrite(ledPin,(millis()/256) % 2);
} else {
// LED aus
digitalWrite(ledPin,LOW);
}
}
Abbildung 10-1
Telharmonium
227
lässt sich bis zum heutigen Tage verfolgen, mit faszinierenden Gerä-
ten wie z.B. den Instrumenten von Godfried-Willem Raes von der
Logos Foundation aus Belgien, der herkömmliche Instrumente
modifiziert und automatisiert, sodass sie sich elektronisch steuern
lassen.
Allgemein bekanntere elektronische Musikinstrumente sind kom-
plett elektronische Klangerzeuger, die man Synthesizer nennt.
Diese benutzen elektronische Schaltungen, um verschiedenste
Klänge zu erzeugen und zu verändern. Eins der ersten dieser elek-
tronischen Instrumente war das Theremin, 1919 vom russischen
Physikprofessor Leon Theremin erfunden. Die erste Theremin-Auf-
führung fand 1920 in St. Petersburg am Physikalisch-Technischen
Institut statt. Bekannt ist das Theremin vor allem aus der Filmmu-
sik, wo es seit den ersten Horror- und Science-Fiction-Filmen für
Soundeffekte eingesetzt wurde, unter anderem in Danny Elfmans
Soundtrack zum Film »Charlie und die Schokoladenfabrik« aus
dem Jahr 2005.
Das Theremin war das erste ganz ohne Berührung spielbare Instru-
ment: Über zwei Antennen lassen sich Lautstärke und Tonhöhe
getrennt steuern. In diesem und dem nächsten Kapitel werden wir
mit einem Arduino und ein paar Drähten ein Theremin bauen.
Ein Thereminbausatz war das erste Produkt, das Bob Moog in den
1950er Jahren vertrieb. Bob Moog wurde später bekannt als Erfin-
der und Entwickler eines der ersten weit verbreiteten Synthesizer.
Der von Bob Moog entwickelte Synthesizer war ein modularer Syn-
thesizer: Er bestand aus vielen kleinen einzelnen elektronischen
Modulen, die jeweils eine bestimmte Aufgabe erfüllten. So konnte
eins dieser Module zum Beispiel einen Ton in einer bestimmten
Höhe erzeugen, ein zweites Klangsignale aus verschiedenen Quel-
len zusammenmischen und ein drittes Steuerparameter erzeugen,
die einem bestimmten Hüllkurvenverlauf entsprachen.
Modulare Synthesizer sind heutzutage immer noch sehr beliebt und
weit verbreitet, gerade weil sie ihrem Benutzer so viel kreative und
technische Freiheit lassen. Im Vergleich zu digitalen Synthesizern,
die einen Prozessor und digitale Algorithmen verwenden, um Klänge
zu erzeugen, werden analoge Synthesizer oft als »wärmer« empfun-
den, weil die vielen Ungenauigkeiten in der elektronischen Schaltung
und den einzelnen Komponenten einen sich immer wieder leicht ver-
ändernden Klang erzeugen, der deswegen auch »menschlicher«
klingt. Es gibt mittlerweile auch viele Module für modulare Synthesi-
Abbildung 10-2
Arduino WaveShield
Abbildung 10-3
Monome-Controller
Das MIDI-Protokoll
Das MIDI-Protokoll ist ein asynchrones serielles Protokoll (siehe
Kapitel 5), das getrennte Kabel für die Sende- und die Empfangs-
richtung verwendet. MIDI-Geräte verfügen also meistens über eine
Eingangsbuchse (MIDI IN) und eine Ausgangsbuchse (MIDI
OUT). MIDI-Kabel verwenden einen DIN-5-Stecker, und die dazu-
gehörigen Buchsen lassen sich problemlos auf ein Steckboard ste-
cken. MIDI-Geräte bieten oft einen sogenannten THRU-Anschluss
an, der Daten, die am MIDI-IN anliegen, spiegelt. Dadurch ist es
möglich, mehrere Synthesizer hintereinander anzuschließen, um sie
von demselben Keyboard oder Sequencer aus anzusprechen. Frü-
here Computer hatten entweder von Haus aus eingebaute MIDI-
Schnittstellen (wie der Atari 1024 ST, der bis ins 21. Jahrhundert
hinein eine beliebte Computermusikplattform war) oder boten
diese an der Soundkarte an (über den Joystick-Port). Mittlerweile
ist es allerdings üblich, einen USB- oder Firewire-MIDI-Adapter zu
verwenden, um MIDI-Geräte an Heimcomputer anzuschließen.
Das MIDI-Protokoll kann man auch komplett ohne physikalische
Schnittstelle verwenden, wenn man unterschiedliche Musikpro-
gramme auf einem Rechner verwendet. Diese benutzen dann virtu-
elle MIDI-Ports, die nur intern im Computer existieren.
In diesem Kapitel werden Projekte vorgestellt, die MIDI-Daten ent-
weder senden oder empfangen. Das heißt, dass diese Projekte ohne
weitere MIDI-Hardware oder MIDI-Software nicht viele Auswir-
kungen haben werden. Falls ein Hardware-Synthesizer oder ein
Hardware-Sequencer zur Verfügung steht, lässt sich dieser über
herkömmliche MIDI-Kabel und die unten beschriebenen Schaltun-
gen direkt an den Arduino anschließen. Es ist allerdings auch mög-
MIDI-Nachrichten
Das MIDI-Protokoll ist ein binäres Protokoll (Nachrichten werden
als numerische Werte übertragen, nicht als Zeichenketten), das auf
8-Bit-Werte aufbaut. Allerdings wird in jedem übertragenen Wert
das oberste Bit als Statusbit benutzt: Ist es gesetzt, handelt es sich
nicht um einen numerischen Wert, sondern signalisiert, dass es sich
um einen Befehl handelt und nicht um normale Daten. Dieses Sta-
tusbit vereinfacht die serielle Kommunikation sehr (siehe Kapitel 6,
um mehr über serielle Protokolle zu erfahren): Es reicht zu erken-
nen, ob das erste Bit gesetzt ist, um zu wissen, ob ein empfangenes
Byte ein Befehl oder ein numerischer Wert ist. Dadurch kann man
auch problemlos MIDI-Kabel ein- und ausstecken, ohne dass sich
Geräte neu synchronisieren müssen. Werden am Anfang unbe-
kannte Daten empfangen, reicht es, bis zum nächsten Byte mit
gesetztem Statusbit zu warten.
Bei Befehlbytes codieren die untersten 4 Bits den MIDI-Kanal. Die-
ser Kanal ist eine virtuelle Aufteilung des MIDI-Kabels in 16
getrennte Kabel. Jedes angeschlossene Gerät wird auf seinen eige-
nen Kanal konfiguriert und reagiert nur auf Nachrichten, die in den
unteren 4 Bits des Befehlbytes diesen Kanal codiert haben. Dadurch
ist es möglich, Noten nur an einen bestimmten Synthesizer zu schi-
cken, auch wenn mehrere über eine MIDI-THRU-Kette angeschlos-
sen sind (es kann auch sein, dass unterschiedliche Einheiten eines
einzelnen Synthesizers auf verschiedenen Kanälen reagieren). Oft
sind Synthesizer jedoch auf den Omnikanal eingestellt; reagiert ein
Synthesizer also auf die falschen Nachrichten oder gar nicht, lohnt
es sich nachzuprüfen, auf welchem Kanal MIDI-Nachrichten
geschickt werden und welche Kanaleinstellungen auf dem Synthesi-
zer aktiv sind.
Abbildung 10-5
Schaltung MIDI-Input und
MIDI-Output
Die MidiDuino-Bibliothek
In diesem Kapitel wird die MidiDuino-Bibliothek verwendet, die
Sie unter [Link] herunterladen können.
Diese Bibliothek wurde von einem der Autoren dieses Buches
geschrieben und wird ständig weiterentwickelt. Beim Schreiben
dieses Buches wird die erste Version 0.1 der Bibliothek verwendet.
In der ZIP-Datei der Bibliothek sind verschiedene kleine Bibliothe-
ken zu finden, die alle in den Ordner hardware/libraries der Ardu-
ino-Installation kopiert werden müssen.
Die MidiDuino-Bibliothek besteht aus zwei großen Teilen. Der
erste ist der MidiUart-Teil, der sich um die serielle Schnittstelle
kümmert. Dieser Teil wird auch verwendet, um MIDI-Nachrichten
zu senden. Der zweite Teil ist der eigentliche MIDI-Stack, der ein-
kommende Nachrichten von der seriellen Schnittstelle liest und
analysiert und daraus einzelne Nachrichten erkennt und an ver-
schiedene Callback-Funktionen weiterreicht. Callback-Funktionen
sind Funktionen aus dem Sketch, die als Argument an den MIDI-
Stack übergeben und automatisch aufgerufen werden.
In diesem ersten Sketch verwenden wir den MidiUart-Teil, um in
regelmäßigen Abständen Noten über MIDI zu schicken. Statt die
serielle Schnittstelle mit [Link]() zu initialisieren, wird diese
mit dem Aufruf [Link]() initialisiert. Wenn MIDI mit den
früher erwähnten Seriell-nach-MIDI-Konvertierungsprogrammen
S2midi oder Ardrumo verwendet wird, muss als zusätzliches
Argument an [Link]() noch die serielle Geschwindigkeit
angegeben werden, ansonsten wird die standardmäßige MIDI-
Geschwindigkeit von 31.250 Bps verwendet. Dadurch, dass MIDI-
Daten binär direkt über die serielle Schnittstelle gesendet werden,
kann die Serial-Bibliothek nicht mehr verwendet werden, um
void setup() {
// Initialisieren der MIDI-Schnittstelle
[Link]();
// Wenn Ardrumo oder S2Midi verwendet werden, wird stattdessen
// [Link](9600);
// verwendet
}
void loop() {
// Zuerst Senden einer Note On-Nachricht
[Link](100, 100);
delay(200);
// Dann senden einer Note Off-Nachricht
[Link](100);
delay(2000);
}
Ein MIDI-Zauberstab
In diesem Sketch verwenden wir einen Beschleunigungssensor, um
MIDI-Daten zu erzeugen. Das Prinzip des Beschleunigungssensors
wurde schon in Kapitel 7 erläutert. In diesem Sketch verwenden wir
den Nunchuck-Kontroller einer Wii-Konsole von Nintendo, weil
das die billigste und einfachste Methode ist, an einen Beschleuni-
gungssensor zu kommen. Für einen Preis von ungefähr 20 EUR
bekommt man einen Dreiachsen-Beschleunigungssensor, einen
Joystick und zwei Taster. Der Controller versendet diese Daten
über einen digitalen synchronen seriellen Bus, den man i2c nennt.
Dieser Bus ist weit verbreitet und wird von vielen verschiedenen
Schaltungen und Chips verwendet. Die Wire-Bibliothek, die bei
Arduino mitgeliefert wird, übernimmt alle Kommunikationsaufga-
ben, sodass der Anschluss des Nunchuck an das Arduino-Board
leicht gelingt.
Um den Nunchuck zu verbinden, kann man Drähte in die einzel-
nen Pins des Anschlusskonnektors stecken und diese an den Ardu-
ino anschließen. Von vorn gesehen, ist der linke obere Pin die
Clock-Leitung, der rechte obere Pin GND, der linke untere VCC
und der rechte untere die Datenleitung. Die Wire-Bibliothek ver-
wendet die analogen Pins 4 und 5 als Kommunikationsschnittstelle,
und in diesem Sketch werden die analogen Pins 2 und 3 als Strom-
versorgungspins verwendet. GND wird an den analogen Pin 2
angeschlossen, VCC an den analogen Pin 3, Data an den analogen
Pin 4 und Clock an den analogen Pin 5. In der folgenden Abbildung
wird der Anschluss gezeigt.
Der Code zum Einlesen der Nunchuck-Daten ist relativ lang und
wird hier deshalb nicht komplett abgebildet. Als Erstes müssen in
der Setup-Routine sowohl der MIDI-Stack als auch die Wire-Ver-
bindung zum Nunchuck initialisiert werden. An den Nunchuck
wird dann auch gleich ein Initialisierungsbefehl geschickt.
#define pwrpin PORTC3 // analoger pin 3
#define gndpin PORTC2 // analoger pin 2
void nunchuckInit() {
// Initialisierung der Stromversorgungspins
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100);
void setup () {
[Link]();
nunchuckInit();
}
return cnt;
}
byte nunchukDecodeByte(byte x) {
x = (x ^ 0x17) + 0x17;
return x;
}
void nunchuckSendZero() {
[Link](0x52); // transmit to device 0x52
[Link](0x00); // sends one byte
[Link](); // stop transmitting
}
int joystick[2] = { 0 };
int oldJoystick[2] = { 0 };
byte joystickCC[2] = { 108, 109 };
int accel[3] = { 0 };
int oldAccel[3] = { 0 };
byte accelCC[3] = { 4, 5, 6 };
int button[2] = { 0 };
int oldButton[2] = { 0 };
byte buttonNote[2] = { 60, 62 };
Mit dieser einfachen Schaltung lässt sich also leicht ein umfassen-
der MIDI-Controller mit Joystick, Tastern und Beschleunigungs-
sensoren bauen.
MIDI-Input
In diesem Sketch wird die MidiDuino-Bibliothek benutzt, um
MIDI-Daten einzulesen. Wenn ein Notenanschlag vom Arduino
erkannt wird, wird eine LED geschaltet. Dazu müssen die Daten
der seriellen Schnittstelle eingelesen und an den eigentlichen MIDI-
Stack übergeben werden, der bis jetzt nicht verwendet wurde. Das
Erkennen der Noten wird von diesem Teil übernommen. Die
Kopplung an den Sketch erfolgt über sogenannte Callback-Funktio-
nen. Das sind Funktionen, die mit dem MIDI-Stack registriert auf-
gerufen werden, sobald eine bestimme Nachricht erkannt wurde.
void setup() {
// Initialisieren der MIDI-Schnittstelle
[Link]();
// Setzen der LED-Pins auf Ausgang
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
void loop() {
MIDI-Input 245
// Überprüfen, ob MIDI-Daten empfangen wurden
if ([Link]()) {
// Einlesen des empfangenen MIDI-Bytes
byte c = [Link]();
// Übergeben an die MIDI-Library, damit diese die Daten
// erkennt
[Link](c);
}
}
247
ein Video auf der Projektwebsite unter [Link]
zeigt. Dort heißt es: »Aus der Symbiose von Pumpe und Computer
entsteht eine fruchtbare Bedeutungserweiterung beider Komponen-
ten. »Pumpbeats« spielt demzufolge mit der Verbindung einer ›alten
Kunst‹ (= Musik) und den neuen Medien.«
Diver Sequencer
Der Diver Sequencer ist eine Halbkugel, auf der vier Drehregler
angebracht sind. Ein Arduino gibt nun in regelmäßigen Abständen
vier Töne nacheinander ab. Diese einzelnen Töne können durch die
Drehregler bestimmt werden, indem die Frequenz moduliert wird.
Zusammen mit der Geschwindigkeit, die ebenfalls gesteuert wer-
den kann, ergibt sich also ein kleiner Sequencer, mit dem sich
rhythmische wiederkehrende Tonfolgen erzeugen lassen. Diese
Töne sind allerdings relativ rau, sodass die blinkende Halbkugel
mit ihren Knöpfen wohl mehr Aufsehen erregen dürfte als das, was
sie produziert. Mehr über das Projekt können Sie sich unter http://
[Link]/2009/04/08/diver-sequencer-on-acid/ ansehen.
Komponenten
Die Anzahl zusätzlicher Komponenten ist bewusst klein gehalten.
Verwendet werden eine Stereoklinkenbuchse zum Anschluss eines
Kopfhörers, ein Potentiometer (10.000 Ohm logarithmisch) und
ein Widerstand (1.000 Ohm) zum Einstellen der Lautstärke, sowie
zwei 1 mikro-Farad- Folienkondensatoren zum Filtern des digitalen
Ausgangs aus dem Arduino. Für steuerbare Sketche werden zwei
weitere Potentiometer (linear, von 5.000 Ohm bis 100.000 Ohm)
und zwei Taster eingesetzt.
Schaltungsaufbau
Der Ausgangspin 9 des Arduino wird verwendet, um Klänge zu
erzeugen. Dazu sind eine Kopfhörerbuchse, ein Widerstand, ein
Potentiometer und zwei Folienkondensatoren notwendig. Der
Widerstand wird eingesetzt, um allzu hohe Lautstärken zu verhin-
dern, während das Potentiometer benutzt wird, um die Lautstärke
generell einzustellen. Das Potentiometer ist ein logarithmisches
Potentiometer, das im Bereich kleiner Widerstandswerte eine grö-
ßere Auflösung hat. Der Grund dafür ist, dass das menschliche
Gehör Lautstärke logarithmisch empfindet, wodurch es möglich
ist, sowohl leichtes Getröpfel als auch einen Düsenjäger zu hören.
Die Folienkondensatoren werden sowohl als Entkopplungskon-
densator (siehe Kasten »Elektronische Klangerzeugung«) wie auch
als Tiefpassfilter eingesetzt.
Elektronische Klangerzeugung
Das menschliche Ohr ist eines der genauesten sind, nennt man unipolare Spannungen.) Wei-
Sinnesorgane. Es kann minimale Tonhöhenun- terhin können konstante Spannungen (die sich
terschiede erkennen, was auch die Anforde- nicht verändern) Lautsprecher beschädigen,
rungen an den Arduino deutlich erhöht. Klang weil ihre Membran sich dauernd in Bewegung
im Raum wird durch eine Veränderung des befinden muss. Um solche Beschädigungen zu
Luftdrucks erzeugt, z.B. durch die vibrierende vermeiden, werden
Membran eines Lautsprechers oder Kopfhörers. Entkopplungskondensatoren eingesetzt, die
Eine periodische Veränderung des Luftdrucks konstante Spannungen herausfiltern. Eine will-
(durch eine Klangwelle) nimmt das mensch- kommene Nebenwirkung ist, dass so ein Kon-
liche Gehirn als Tonhöhe war. Je schneller die densator auch eine sich verändernde unipolare
Luft vibriert, desto höher ist die wahrgenom- Spannung in eine bipolare umwandelt.
mene Tonhöhe.
Die Ausbreitung der Kopfhörer- oder Lautspre-
chermembran lässt sich über eine Spannung
steuern (die meistens von einen Verstärker ver-
stärkt wird, um auch große Membranen bewe-
gen zu können). Je höher die Spannung, desto
größer die Ausbreitung der Membranen. Diese
Spannungen werden als analoge Spannungen
Abbildung 11-2: Klangerzeugung
bezeichnet, weil sie eine große Menge von
Werten annehmen können, z.B. von – 5 V bis Anschaulich heißt das, dass das Audiosignal 0
+ 5 V (also –5 V, – 4,8 V, 3 V, 3,1123 V usw . . .). Volt wird, wenn es lange gleich bleibt, und
Digitale Spannungen können nur zwei Werte sonst um 0 Volt herumpendelt.
annehmen, die »An« oder »Aus« signalisieren.
Weiterhin bewegt sich die
Lautsprechermembran sowohl nach vorn als
auch nach hinten (vom Ruhezustand aus gese-
hen), sodass Audiosignale meistens als
bipolare Spannungen übermittelt werden, die
sowohl negativ als auch positiv sein können.
(Spannungen, die nur negativ oder nur positiv Abbildung 11-3: Bipolare Signale und Entkopplung
In diesem ersten Sketch mit schneller PWM wird nur ein einzelner
statischer Ton erzeugt. Es wird ein Zähler hochgezählt, der von 0
bis 1.024 geht. Da die PWM-Breite nur von 0 bis 255 geht, wird
dieser Wert durch 4 geteilt, bevor er mit der Funktion writeAudio()
ausgegeben wird. Dadurch wird eine Sägezahn-Wellenform er-
zeugt, weil die erzeugte analoge Spannung immer von 0 bis 5 Volt
geht und dann wieder zurück auf 0 fällt. Die Geschwindigkeit, mit
der diese Spannung hochgezählt wird, bestimmt auch die Tonhöhe.
Diese lässt sich in der Variablen inc einstellen.
int audioPin = 9; // Definition des Audio-Ausgangspins
// Funktion zum Setzen des PWM-Wertes, dazu wird das PWM-Register
// OCR1A verwendet
void writeAudio(uint8_t val) {
OCR1A = (val);
}
Abbildung 11-4
Aufruf der Interrupt-Routine
Durch Ändern der Werte in den Tabellen lassen sich neue Melodien
schreiben. Das Konzept kann auch weitergeführt werden, um neue
Melodien auf Knopfdruck zu generieren. Besonders interessant ist,
Tonlängen unabhängig von den Tonhöhen zu generieren. Wenn
der Taster gedrückt wird, werden beide Tabellen neu gefüllt, und
eine separate Variable mit der Länge der Tabellen wird neu gesetzt.
Theremin
Der Klang des ursprünglichen Theremins (ein elektronisches
Musikinstrument, das ohne körperliche Berührung gespielt wird)
ähnelt im Vergleich mit klassischen Instrumenten am ehesten einer
Geige und klingt ähnlich wie ein Fuchsschwanz.
Gesteuert wird das Theremin mit den Händen, die zwei kapazitive
Sensoren rechts und links am Gehäuse beeinflussen. Die Form die-
Hardware
Die zwei Antennen des Theremins werden aus zwei ca. 30 bis 40 cm
langen Drähten gebogen und mit den Pins 4 und 5 verbunden.
Zusätzlich wird jeweils ein 10-Mega-Ohm-Widerstand mit der
Antenne und Pin 3 verbunden. Da 10-Mega-Ohm-Widerstände
nicht so leicht zu finden sind, können mehrere 1-Mega-Ohm
Widerstände zusammengelötet werden.
Abbildung 11-5
Theremin-Aufbau
Software
Um das Theremin hörbar zu machen, gibt es verschiedene Mög-
lichkeiten: Die Sensordaten können an den PC gesendet werden
Mit den zwei Werten gew_neg und gew_pos kann die Geschwindig-
keit, mit der sich der Nullpunkt an geänderte Bedingungen anpasst,
verändert werden. Dabei ist aber zu beachten, dass gew_pos ziem-
lich klein sein sollte, da sich das Instrument sonst beim Spielen ver-
stimmt.
Die Werte ton_null und volume_null können nun vom Raw-Wert
abgezogen werden: Das Ergebnis ist eine Zahl, die nicht mehr von
der Umgebung abhängig ist. Damit ist aber noch nicht festgelegt,
was der höchste Wert und damit der höchste Ton oder die lauteste
Lautstärke ist. Auch hier kann der gleiche adaptive Algorithmus
verwendet werden, sodass nach dem Einschalten nur einmalig die
Hand bis ganz zum Instrument (aber ohne die Antenne zu berüh-
ren) geführt werden muss, um immer den gleichen Tonumfang zu
Je nach Laune könnte man die Töne jetzt noch quantisieren, also
auf ganze Zahlen aufrunden, wodurch das Spielen einfacher wird,
man aber auch viel von der Ausdruckskraft des Theremins verliert,
die ja gerade in der Möglichkeit besteht, frei zu spielen.
Wir wollen für das Theremin einen schönen, weichen Sinusklang
erzeugen. Dafür verwenden wir eine Tabelle mit 256 Sinuswerten,
da das Berechnen eines Sinus viel zu lange dauern würde. Abhängig
von der Tonhöhe müssen jetzt Werte aus dieser Tabelle gelesen
und mit PWM ausgegeben werden. Dazu wird ein Zähler benutzt,
der angibt, welches der nächste Wert aus der Tabelle ist. Abhängig
davon, um wie viel dieser Zähler in jedem Durchgang erhöht wird,
entsteht eine andere Tonhöhe.
Würden hier ganze Zahlen verwendet, könnten nur der Grundton
und Vielfache davon erzeugt werden. Ein 16-Bit-Wert kann aber
auch so interpretiert werden, als ob die oberen 8 Bit die Ganzzahl
darstellen und die unteren hinter dem Komma stehen würden.
Wird jetzt z.B. jedes Mal 64 zum Zähler addiert, ändern sich die
oberen 8 Bit erst nach dem vierten Mal. Die oberen 8 Bit geben uns
also an, welcher Wert aus der Sinustabelle verwendet werden soll;
dieser Wert muss nur noch mit der gewünschten Lautstärke multi-
pliziert werden, bevor er ausgegeben wird.
Arduino-Boards
Arduino Duemilanove/Diecemila
Der Arduino Duemilanove ist wohl der derzeit am meisten verkaufte
Arduino und kann als das »Standardmodell« angesehen werden. In
diesem Buch wird bei allen Workshops ein Duemilanove eingesetzt.
Er verfügt über 14 digitale Pins, von denen sechs PWM-fähig sind,
sowie sechs Analoge Eingänge. Weiterhin ist auf dem Board ein
USB-Port angebaut, der dem Duemilanove erlaubt, über eine serielle
Verbindung mit einem PC zu kommunizieren. Als Stromquelle dient
entweder der USB-Port oder ein 5-Volt-Netzteil, für das eine Buchse
angebracht ist. Der Duemilanove läuft standardmäßig mit einem
Atmega168- oder Atmega328p-Controller, der auf einem Steckso-
ckel angebracht ist. Eine ausführliche Erläuterung finden Sie unter
[Link]
Der Diecemila (italienisch für 10.000) ist der Vorgänger des Due-
milanove. Die Unterschiede dabei liegen in Details. So muss die
Stromquelle für den Duemilanove nicht mehr per Hand umge-
schaltet werden. Da der Diecemila keinerlei Vorteile bietet, emp-
fiehlt es sich nicht, ihn noch zu kaufen. Wer ein solches Board
besitzt, kann damit aber die Workshops in diesem Buch ebenso
durchführen wie mit einem Duemilanove. Mehr Informationen fin-
den Sie unter [Link]
265
Arduino Mega
Der Arduino Mega hält, was der Name verspricht: Ein Atmega1280
ist in der Lage, 54 digitale Pins zu steuern, von denen 14 PWM-
fähig sind. Er verfügt zudem über 16 analoge Inputs, vier serielle
Ports, 128 KByte Speicher und 8 KByte Arbeitsspeicher. Dieses
Monster kann eingesetzt werden, wenn die Fähigkeiten eines Due-
milanove nicht mehr ausreichen, zum Beispiel bei Installationen
mit vielen LEDs oder Displays oder wenn man mit mehr als einem
Gerät kommunizieren will. Sie sollten dabei die höhere Betriebs-
spannung von 7 bis 12 Volt beachten. Der Arduino Mega ist mit 50
Euro allerdings auch etwa doppelt so teuer wie der Duemilanove.
Arduino Bluetooth
Die besonders edle Variante des Arduino ist der Arduino Blue-
tooth. Er besitzt statt eines USB-Ports einen Bluetooth-Chip, der
mit 115.200 Bit pro Sekunde mit einer Gegenstelle kommunizieren
kann. Das ist zwar für die Entwicklung relativ egal, bietet aber
enorme Vorteile, wenn der Arduino irgendwo im Raum angebracht
werden und dennoch mit einem Rechner kommunizieren soll.
Dank dem Bluetooth-Chip ist diese Variante allerdings so teuer,
wie sie komfortabel ist. Einige Informationen zu diesem nicht sehr
weit verbreiteten Board gibt es unter [Link]
ArduinoBoardBluetooth.
Arduino Pro 5V
Die auf dem Arduino Duemilanove angebrachten Steckverbindun-
gen sind zwar praktisch, können aber auch hinderlich sein, wenn
man zum Beispiel Drähte anlöten oder den Arduino in einem
Gehäuse verbauen möchte, das möglichst dünn sein soll. Der Ardu-
ino Pro kommt in zwei Varianten (3,3 Volt und 5 Volt) daher und
ist im Prinzip ein »nacktes« Arduino-Board. Der Atmega168 ist fest
verlötet, die Pins sind nur als Kontaktstellen auf dem Board verfüg-
bar. Das macht den Arduino Pro auch um etwa ein Drittel günstiger
als den Duemilanove. Wer also professionellere Ansprüche hat und
auf Luxus verzichten kann, mag mit einem Pro gut beraten sein.
Einsteigern empfehlen wir trotzdem den Duemilanove. Mehr Infor-
mationen zum Arduino Pro finden Sie unter [Link]
Main/ArduinoBoardPro.
Weitere Boards
Die Menge der Arduino-Varianten ist riesig, wächst stetig und kann
kaum erfasst werden. Die Änderungen reichen dabei von einfachen
Layoutabweichungen und anderen Mikrocontroller-Varianten bis
hin zu Boards, die für spezielle Einsatzgebiete wie etwa die Robotik
angepasst sind.
Der Sanguino ([Link] wurde zum Beispiel entwi-
ckelt, um den RepRap anzutreiben, einen 3-D-Drucker. Ursprüng-
lich hatte man dafür einen Arduino verwendet, musste dabei aber
Kompromisse eingehen. Der Sanguino verwendet 32 digitale Pins
Arduino-Boards 267
und hat seine eigene Bauform, die etwas kompakter und in die
Länge gezogen ist.
Mit dem Roboduino ([Link]
ino) soll es leicht möglich sein, die Motoren und anderen Bauteile
von Robotern anzusteuern. Dafür verfügt das Board neben jedem
digitalen Pin noch über zwei Pins für einen weiteren Stromkreis.
Das soll vor allem das Anbringen erleichtern, da nun die anderen
Bauteile über einfache Steckverbindungen angebunden werden
können.
Weil der Arduino Duemilanove gerade für viele LEDs oder Matri-
zen nicht ausreicht, wurde der Illuminato ([Link]
com/shop/show/ILL/Illuminato) entwickelt. Er soll verhindern, dass
jeder Pin auf dem Arduino extra mit Erweiterungsbauteilen gega-
belt werden muss. Der Illuminato verfügt daher über 42 digitale
Pins. Der Arduino Fio ist mit anderen Arduino-Boards vergleich-
bar, verfügt aber neben 8 analogen und 14 digitalen Pins auch
zusätzlich über einen Xbee-Socket.
Weil sein Erfinder es leid war, sich mit den Steckverbindungen
eines Arduino herumzuärgern, schuf er den Boarduino, dessen
Bauform so entworfen ist, dass er genau auf ein Steckbrett passt.
Das macht natürlich das Entwickeln von Prototypen besonders
einfach. Mehr dazu finden Sie unter [Link]
[Link]?main_page=product_info&cPath=19&products_id=72,
wo es auch eine USB-Variante des Boards zu kaufen gibt.
Der Ardupilot wurde entwickelt, um alle wichtigen Funktionen
einer autonomen Flugdrohne wahrnehmen zu können. Dieses
spezielle Board hat deshalb Pins für Beschleunigungssensoren und
ein GPS-Modul sowie die Kontrolle von Servos. Zudem besitzt
das Board einen zweiten Stromkreis, der beim Ausfall des ersten
aktiv wird. Das verhindert das Abstürzen des Flugobjektes. Mehr
dazu finden Sie unter [Link]
705844%3ABlogPost%3A44814.
Wie in Kapitel 10 ausführlich erklärt wurde, eignet sich der Arduino
auch zur Verwendung als Midi-Controller. Über eine entsprechende
Steckverbindung kann er an Midi-Geräten angebracht werden, um
beispielsweise Ton über besondere Eingabemethoden zu steuern.
Der Miduino wurde dafür geschaffen, mit genau diesen Midi-Buch-
sen zu arbeiten. Sie können ihn unter [Link]
miduino/[Link] bestellen, wo auch die Schaltpläne und eine
genaue Dokumentation verfügbar sind.
Arduino-Shields
Möchte man viele Sensoren oder Aktoren an den Arduino anschlie-
ßen, kann das zu komplexen Schaltungen führen, die möglicher-
weise auch nicht ganz stabil angebracht werden können. Dafür gibt
es viele verschiedene sogenannte Shields, die auf die Pins des Ardu-
ino aufgesteckt werden können. Einige gängige Shields sollen hier
kurz vorgestellt werden. Jeder Absatz enthält auch einen Link zu
weiteren Informationen über den entsprechenden Shield. Viele
davon sind leider nur als Import erhältlich, allerdings sollten Sie
auch die deutschen Websites wie [Link] oder http://
[Link] im Auge behalten. Zudem werden auch bei her-
kömmlichen Elektronik-Webshops wie [Link] oder
[Link] Shields angeboten.
Prototypen-Shields
Was der Protoduino für das Arduino-Board, ist der Arduino Proto
Shield für die passenden Aufsätze: eine Platine, auf der lediglich
die Pins des Arduino sowie zwei LEDs, der Reset-Knopf und ICSP-
Header aufgebracht sind. Er kann zum Entwickeln von weiteren
Shields verwendet werden und zum Beispiel ein Steckbrett ein-
fassen. Das Shield ist unter [Link]
beschrieben.
Ähnlich verhält sich das Breadboard-Shield, auf dem bereits ein
Steckbrett angebracht ist. Er ist deshalb nicht so flexibel wie der
Proto Shield, aber er ist ja auch nur zum schnellen Ausprobieren
und nicht zum Entwickeln gedacht ([Link]
07/11/arduino-breadboard-shield/)
Arduino-Shields 269
Arduino RepRap Shield
Das RepRap ist ein Gestell, das unter anderem als 3-D-Drucker ver-
wendet werden kann. Um die nötigen Motoren, Düsen und ande-
ren Teile anzuschließen, wurde der RepRap-Shield entwickelt. Er
bietet robuste Schraubanschlüsse für den Arduino Duemilanove
und ist deshalb auch für andere Anwendungen geeignet. Mehr
Informationen bietet das Blog des RepRap, das Sie unter [Link]
[Link]/2008/04/[Link] finden.
Propellurino
Der Propellurino steuert nicht etwa ausschließlich Propeller, wie
der Name vielleicht vermuten lässt. Vielmehr verfügt er zusätzlich
über Anschlüsse für einen VGA-Monitor, eine PS/2-Maus oder PS/
2-Tastatur, Midi und ein Mikrofon. Zudem hat er zwei DAC-Aus-
gänge, um Ton auszugeben. Bastelanleitungen und andere Infor-
mationen finden Sie auf der deutschen Website [Link]
[Link]/forum/[Link]?f=5&t=72.
Battery Shield
Möchte man den Arduino autonom betreiben, also ohne externe
Stromquelle, kann man den Battery Shield verwenden. Er repliziert
alle Pins des Arduino und hat in der Mitte eine Halterung für einen
Lithium-Ionen-Akku. Je nach Akkutyp kann das Projekt dann viele
Stunden betrieben werden, bevor es neu aufgeladen werden muss,
was über den USB-Port möglich ist. Dieser Shield ist in Deutsch-
land leider nicht erhältlich, kann aber aus den USA von liquidware.
com bezogen werden ([Link]
BP/Lithium+BackPack).
Drahtlose Kommunikation
Neben Bluetooth, für das man am besten einen Arduino Bluetooth
verwendet, gibt es noch weitere drahtlose Übertragungsprotokolle.
WLAN ist allerdings für die meisten Zwecke übertrieben, komplex
und ein Stromfresser. Zigbee hingegen wird in vielen Projekten ein-
gesetzt, weil es einfach ist und eine gute Reichweite hat. Dieses
Protokoll wurde ursprünglich entwickelt, um Haushaltsgeräte zu
steuern und Sensordaten zu übermitteln. Der Xbee-Shield bringt
dieses Protokoll auf den Arduino und kann zum Beispiel verwen-
det werden, um Roboter oder Fluggeräte zu bedienen. Mehr Infor-
mationen darüber gibt es unter [Link]
Shields/Xbee01.
Die Radio Frequency Identification, kurz RFID, findet ihren Weg in
immer mehr Bereiche. Ein Lesegerät sendet dabei elektromagneti-
sche Frequenzen aus, die einen stromlosen Schaltkreis anregen.
Dieser emittiert dann darin gespeicherte Daten, um sich zu identifi-
zieren. Je nach Bauart können so über mehrere Meter oder wenige
Zentimeter einige Kilobytes an Informationen übermittelt werden.
Marc Boon bietet auf seiner Website einen entsprechenden Shield
an, den man auch selbst herstellen kann, wenn man möchte. Alle
Informationen dazu finden Sie unter [Link]
category2.
Musik-Shields
Mit dem Wave Shield (ebenfalls von [Link]) können Sound-
dateien abgespielt werden. Tonausgabe auf dem Arduino ist recht
kompliziert und begrenzt. Der Shield bietet Platz für eine SD-Karte,
auf der unkomprimierte Wave-Dateien (also keine MP3s und ähnli-
che Formate) gespeichert werden können. Ein Soundchip sorgt für
eine qualitativ hochwertige Ausgabe auf dem ebenfalls angebrach-
Arduino-Shields 271
ten Kopfhöreranschluss. Mehr über den Wave Shield finden Sie
unter [Link]
Eine weitere Möglichkeit, Musik zu machen, ist der SID-Chip, der
schon dem Commodore 64 8-Bit-Klänge entlockte. Er ist immer
noch sehr beliebt, weil er einen ganz eigenen Klang produziert, statt
reale Musikinstrumente nachzuahmen. Im auf der Arduino-Web-
site beschriebenen SID-Shield ([Link]
Main/SID-emulator) arbeitet ein Atmega168-Mikrocontroller, der
diesen SID-Chip emuliert und von einem Arduino gesteuert wird.
Der Arduinome ist kein Shield im eigentlichen Sinne, da er nicht für
weitere Projekte verwendbar ist. Vielmehr wird er auf den Arduino
aufgesteckt, um ein Monome zu emulieren, einen USB-Midi-Cont-
roller, der auf einer Matrix von Tasten basiert, die jeweils mit einer
LED beleuchtet werden. Der Arduinome kann so an einen PC ange-
schlossen werden, um diese Eingabedaten zu verarbeiten, oder er
erzeugt selbst weiteren Output. Das Arduinome-Projekt finden Sie
unter [Link]
MicroSD Module
Der Speicher des Arduino ist vergleichsweise klein und eignet
sich kaum dazu, über einen längeren Zeitraum Werte aufzu-
zeichnen. Glücklicherweise gibt es auch dafür eine Lösung: das
MicroSD-Modul ([Link]
=0827727742), das eine MicroSD-Karte fassen und beschreiben
kann. Die kann man dann später über den Arduino oder einen
Kartenleser auslesen.
Eingabe-Shields
Eingabesensoren wie Schieberegler oder Joysticks benötigen keine
komplexe Programmierung. Passende Shields bieten vor allem Fas-
sungen, um eine möglichst einfache Montage zu erlauben. Der
Danger Shield von Zach Hoeken ([Link] [Link]/dan-
ger-shield-v1-0) ist so einer und verfügt unter anderem über drei
Schieberegler und drei Taster. Zudem hat er allerlei andere Senso-
ren (z.B. einen Temperatur- und einen Klopfsensor) und Aktoren
(wie ein Siebensegment-Display und einen Piezo-Lautsprecher). Er
ist also quasi ein Allround-Shield, der für viele verschiedene Ardu-
ino-Projekte verwendet werden kann.
Ein anderer Shield ist der InputShield von LiquidWare ([Link]
[Link]/shop/show/INPT/InputShield). Er eignet sich zum
Beispiel dazu, einen Controller für eine Spielkonsole zu bauen, und
verfügt über einen Joystick, zwei Knöpfe, einen Vibrationsmotor
und ein serielles Interface. Damit kann man zum Beispiel eine
kleine Handheld-Konsole bauen, deren Vorbild der Game Boy von
Nintendo ist.
Arduino-Shields 273
Der Adafruit Motor Shield erlaubt den Anschluss mehrerer Moto-
ren. So enthält er Anschlüsse für zwei 5-Volt-Servos, vier Gleich-
strommotoren oder zwei Schrittmotoren. Mehr Informationen gibt
es unter [Link]
275
othek ausgewählt wird, ergänzt die Entwicklungsumgebung den
aktuellen Sketch automatisch um die Zeile #include.
Für fortgeschrittene Benutzer wird auf der Arduino-Website unter
[Link] im Detail erklärt, wie
man eine eigene Bibliothek erstellt.
EEPROM-Bibliothek:
Werte langfristig speichern
Wie in Kapitel 6 beschrieben wird, kann der Arduino-Prozessor
Werte langfristig in seinem internen EEPROM-Speicher festhalten.
Um Werte aus dem EEPROM zu lesen und zu speichern, bietet
Arduino die EEPROM-Bibliothek. Sie muss mit der Zeile #include
<EEPROM.h> eingebunden werden.
[Link](adress)
Mit dieser Funktion kann ein Byte an der angegebenen Adresse aus
dem EEPROM-Speicher gelesen werden. Mögliche Adresswerte
gehen von 0 bis 511. Werte, die noch nie beschrieben worden sind,
sind im Arduino-Prozessor auf 255 initialisiert. Man sollte im Auge
behalten, dass die geschriebenen Werte auch nach dem Ausstecken
des Arduino erhalten bleiben, im Speicher also durchaus noch
Werte von anderen Programmen stehen können.
[Link](adress, value)
Mit dieser Funktion kann ein Bytewert an der angegebenen Adresse
in den EEPROM-Speicher geschrieben werden. Auch hier sollte
man bedenken, dass die Adresse vielleicht auch von einem anderen
Sketch verwendet wird, um Daten zu speichern. Gehen Sie beim
Schreiben also vorsichtig vor, wenn noch gespeicherte Daten von
anderen Sketchen verwendet werden sollen.
Beispiel
void setup() {
[Link](9600);
[Link](0, 15); // 15 an Adresse 0 des EEPROM-Speichers
// schreiben
byte daten = [Link](0); // Adresse 0 lesen
[Link](daten); // und an den Computer schicken
}
void loop() {
}
Serverfunktionalität
Mit der Serverfunktionalität der Ethernet-Bibliothek kann der
Arduino einen Internetdienst anbieten. Dieser wird mit durch ein
Server(port)
Mit dieser Funktion wird ein Serverobjekt erzeugt, das auf dem
angegebenem Port lauscht. Standardwerte für port sind z.B. 23 für
einen Telnetdienst, 25 für einen Mailserver, und 80 für einen Web-
server.
[Link]()
Nachdem [Link]() aufgerufen wurde, kann ein Serverobjekt
Verbindungen annehmen.
[Link]()
Diese Funktion überprüft, ob ein Serverobjekt eine Verbindung
angenommen hat. Wenn das der Fall ist, gibt sie ein Clientobjekt
zurück, das benutzt werden kann, um mit dem Gegenpunkt der
Verbindung zu kommunizieren. Es besteht kein Unterschied zwi-
schen einem Clientobjekt, das als Folge einer Serververbindung
erzeugt wurde, und einem Clientobjekt, das erzeugt wurde, weil
der Arduino sich mit einem Server verbunden hat (siehe unten).
Wenn keine Verbindung angenommen wurde, gibt [Link]-
lable() NULL zurück.
[Link](data)
Mit dieser Funktion können Daten an alle verbundenen Gegenstel-
len des Serverobjekts geschrieben werden. data ist dabei ein Byte
oder ein Buchstabe.
Clientfunktionalität
Mit der Clientfunktionalität der Ethernet-Bibliothek kann der
Arduino sich mit einem Internetdienst verbinden. Weiterhin wird
die Clientfunktionalität verwendet, wenn eine externe Gegenstelle
sich mit einem Server verbindet, der auf dem Arduino läuft. Man
kann daher die Clientfunktionalität auch als »Verbindungsfunktio-
nalität« betrachten. Eine Verbindung wird als ein Clientobjekt dar-
gestellt, das entweder von Hand erzeugt wird, um mit einem
externen Server zu kommunizieren (in diesem Fall werden Adresse
und Port des Dienstes auf diesem Server angegeben), oder beim
Aufruf von [Link]() (siehe oben).
Nachdem der Arduino sich erfolgreich mit der Gegenseite verbun-
den hat (über einen Aufruf von [Link]() oder weil das Cli-
entobjekt von einem auf dem Arduino laufenden Server erzeugt
wurde), können mit dem Clientobjekt Daten an die Gegenstelle
geschickt und von ihr empfangen werden.
Client(ip, port)
Mit dieser Funktion wird ein Clientobjekt erzeugt, das mit dem
angegebenen Dienst verbunden wird. Die IP-Adresse wird wie
gehabt als Tabelle von vier Bytes angegeben, und der Port als Inte-
ger-Wert.
[Link]()
Wenn diese Funktion aufgerufen wird, versucht der Ethernet-
Shield sich mit der Gegenstelle zu verbinden. Gelingt das, gibt die
Funktion TRUE zurück, kann keine Verbindung erstellt werden,
FALSE.
[Link](data)
Mit dieser Funktion können Daten an alle verbundenen Gegenstel-
len des Clientobjekts geschrieben werden. data ist dabei ein Byte
oder ein Buchstabe.
[Link]()
Ähnlich wie bei der seriellen Schnittstelle werden bei einer TCP-
Verbindung die empfangenen Daten auf dem Arduino gepuffert.
Mit dieser Funktion kann abgefragt werden, ob sich Daten in die-
sem Zwischenpuffer befinden, die dann später mit [Link]()
ausgelesen werden können. Diese Funktion gibt die Anzahl der vor-
handenen Bytes zurück.
[Link]()
Mit dieser Funktion kann ein einzelnes Byte aus dem Puffer ausge-
lesen werden. Mit [Link]() kann zuerst überprüft wer-
den, ob überhaupt Bytes im Puffer vorhanden sind. Sind keine
Bytes vorhanden, gibt [Link]() –1 zurück.
[Link]()
Mit dieser Funktion wird die TCP-Verbindung mit der Gegenstelle
getrennt.
Beispiel
#include <Ethernet.h>
byte mac[] = { 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed };
byte ip[] = {10, 0, 0, 27};
byte server[] = {64, 233, 187, 99 }; // Google
Client client(server, 80); // Verbindung zum Google-Webserver
void setup() {
[Link](mac, ip);
[Link](9600);
[Link]();
if ([Link]()) {
[Link](»Mit google verbunden");
[Link]("GET /search?q=arduino HTTP/1.0"); // Suchkette
// verschicken
[Link]();
} else {
[Link]("Verbindung erfolglos");
}
}
void loop() {
if ([Link]()) {
char c = [Link]();
[Link](c);
}
if (![Link]()) {
[Link]("Verbindung getrennt");
[Link]();
for (;;) ; // Leere Schleife
}
}
Firmata-Bibliothek
Die in Kapitel 5 vorgestellte Firmata-Bibliothek ist ein nützliches
Werkzeug, um einen Arduino mit einem normalen Desktopcompu-
ter zu verbinden (unter anderem mit Programmen, die in Proces-
sing oder Max/MSP geschrieben sind). Mit Firmata können über
die serielle Schnittstelle viele Befehle an den Arduino gesendet und
Informationen vom Arduino empfangen werden (z.B. der Status
Firmata-Bibliothek 281
einzelner Pins, aber auch beliebige Zeichenketten und numerische
Werte). Die Bibliothek ist eine sehr große und etwas komplexe
Bibliothek, mit der die Firmata-Funktionalität in normale Sketche
mit eingebunden werden kann (im Vergleich zur »normalen«
Firmata-Firmware, die nur die Standardfunktionalität des Proto-
kolls unterstützt). Hier sei auf die ausführliche Dokumentation
des Firmata-Protokolls und der Firmata-Bibliothek im Netz ver-
wiesen, die viele nützliche Beispiele über ihre Verwendung gibt. Die
Dokumentation finden Sie unter [Link]
Interfacing/Firmata.
LiquidCrystal-Bibliothek
Mit der Bibliothek LiquidCrystal kann ein LCD-Bildschirm, der
auf einem Hitachi HD44780 oder einem seiner zahlreichen Klone
aufgebaut ist, angesprochen werden. Es gibt viele verschiedene
Varianten dieser LCD-Bildschirme, die kostengünstig bei Vertrie-
ben wie [Link] [Link] oder [Link]
bestellt werden können. Diese LCD-Bildschirme können Buchsta-
ben anzeigen und haben meistens Größen wie 2 × 16 (zwei Zeilen
mit je 16 Buchstaben), 1 × 16, 2 × 40, 4 × 16 usw. Da es viele
HD44780-kompatible Chips gibt, kann es oft zu leichten Unter-
schieden zwischen den einzelnen Displays kommen. Oft sind
gerade kleine Zeitunterschiede bei der Initialisierung oder beim
Senden von Daten wichtig, weshalb manchmal eine Anpassung der
Sketche notwendig ist. Um die genauen Zeiten herauszube-
kommen, müssen Sie im Datenblatt des Chips nachsehen, wie
lange z.B. Daten anliegen müssen oder wie lange nach bestimmten
Kommandos gewartet werden muss. Diese Zeiten kann man dann
mit delayMicroseconds() einbauen. Auch die Pinbelegung der Dis-
plays kann verschieden sein, besonders der Anschluss der Rückbe-
leuchtung variiert. Oft ist es notwendig, die Rückbeleuchtung über
einen Transistor zur Stromverstärkung anzuschließen.
Displays können in zwei verschiedenen Modi angesteuert werden:
im 4-Bit-Modus oder im 8-Bit-Modus. Beim 8-Bit-Anschluss wer-
den zwar mehr digitale Output-Pins am Arduino benutzt, die
Datenübertragung ist dafür aber deutlich schneller, sodass zum Bei-
spiel flüssigere Animationen auf dem Display dargestellt werden
können. Im 4-Bit-Modus werden vier Datenleitungen (d0 bis d3)
weniger benutzt.
[Link]()
Mit dieser Funktion werden das LCD-Display gelöscht und der
Kursor nach links oben zurückgesetzt.
[Link]()
Mit dieser Funktion wird der Kursor des LCD-Displays in die linke
obere Ecke bewegt. Ab dieser Position werden dann weitere Ausga-
ben auf dem Display angezeigt.
[Link](col, row)
Mit dieser Funktion kann der Kursor frei auf dem LCD-Display
bewegt werden. col bezeichnet dabei die Spalte und row die Zeile,
in die der Kursor bewegt werden soll. 0 ist dabei die erste Spalte
bzw. Zeile.
[Link](data)
Mit dieser Funktion kann ein einzelner Buchstabe auf dem Display
angezeigt werden.
LiquidCrystal-Bibliothek 283
Servo-Bibliothek
Mit dieser Bibliothek können ein oder zwei Servomotoren an den
Arduino angeschlossen und gesteuert werden, ohne dass anderer
Programmcode dadurch beeinflusst wird (die Steuerung läuft paral-
lel in einer Interrupt-Routine). Dazu werden die zwei PWM-Pins 9
und 10 benutzt. Wird nur ein Servo angeschlossen, kann der
andere Pin nicht als PWM-Ausgang benutzt werden (man kann die
Funktion analogWrite also nicht auf ihn anwenden). Wie in
Kapitel 6 beschrieben wurde, schließt man einen Servomotor an
GND, VCC und Pin 9 oder 10 an. Um einen Servomotor zu kon-
trollieren, muss ein Objekt des Typs Servo erzeugt werden, der
dann mit der Funktion attach vor der Benutzung konfiguriert wird.
[Link](winkel)
Mit dieser Funktion kann der Servo kontrolliert werden. Auf einem
normalen Servo wird so der Winkel eingestellt (von 0 bis 180), auf
einem kontinuierlichen Servo wird die Geschwindigkeit des Servos
eingestellt. (In diesem Fall ist ein Winkel von 0 die volle Geschwin-
digkeit in die eine Richtung und 180 die volle Geschwindigkeit in
die andere Richtung, und ein ungefährer Wert von 90 die Position,
an der sich das Servo nicht bewegt.)
[Link]()
Mit dieser Funktion kann der zuletzt eingestellte Winkel ausgelesen
werden. Sie gibt einen Wert von 0 bis 180 zurück.
[Link]()
Mit dieser Funktion kann überprüft werden, ob das Servo-Objekt
schon mit einem Pin verbunden wurde. Sie gibt TRUE zurück,
wenn das Objekt schon verbunden wurde, sonst FALSE.
Debounce-Bibliothek
Wie in Kapitel 3 beschrieben wurde, können bei Tastern und Schal-
tern schnell Fehler auftreten. Weil sie auf federnden Effekten basie-
ren, öffnen und schließen sie sich beim Betätigen mehrmals, am Pin
kommen also mehrere HIGH- und LOW-Signale an, was ein uner-
wünschter Effekt ist. Dieses Phänomen wird als »Prellen« oder
»Bouncing« bezeichnet, weshalb die Bibliothek, die dagegen helfen
soll, »Debounce« heißt. Sie sorgt dafür, dass der Input-Pin nach
einer Eingabe für eine bestimmte Anzahl Millisekunden gesperrt
wird, sodass alle weiteren Signale ausgesperrt werden.
Debounce-Bibliothek 285
[Link]()
Liest den Pin neu ein und prüft, ob sich das Signal unter Berück-
sichtigung der Debounce-Zeit geändert hat. Ist das der Fall, wird
TRUE zurückgegeben, ansonsten FALSE.
[Link]()
Liest den aktuellen Wert des mit dem Objekt verbundenen Pins ein
und berücksichtigt dabei die Debounce-Zeit.
[Link]()
Schreibt den aktuellen Debounce-Wert in den Speicher des Objekts
und auf den mit dem Objekt verbundenen Pin.
Beispiel
// schalte eine LED durch Betätigung eines Schalters an und aus
#include <Debounce.h>
#define SCHALTER 5
#define LED 13
// instanziiere ein Debounce-Objekt mit einer Debounce-Zeit von 20 ms
Debounce debouncer = Debounce( 20 , SWITCH );
void setup() {
pinMode(SWITCH,INPUT);
pinMode(LED,OUTPUT);
}
void loop() {
// update den Debouncer
[Link] ( );
// verwende den neuen Wert, um die LED damit zu schalten
digitalWrite(LED, [Link]() );
}
Wire-Bibliothek
Um mit dem Arduino über das Two-Wire-Interface bzw. das Proto-
koll I²C (inter-integrated circuit) zu kommunizieren, verwendet
man die Wire-Bibliothek. Das I²C-Protokoll ist ein sogenannter
Datenbus. Das heißt, dass auf einer Leitung mehrere Geräte ange-
schlossen werden können. Ein Hauptgerät, der Master, sendet
Daten, während die Slaves diese empfangen und darauf reagieren.
Die Wire-Bibliothek erlaubt, sowohl als Master- als auch als Slave-
Gerät an einem TWI/I²C-Bus teilzunehmen. Der Bus basiert dabei
[Link]() /[Link](address)
Meldet den Arduino am Bus an. Wird eine Adresse (7 Bit, 0–127)
mitgegeben, geschieht diese Anmeldung als Slave, ohne Adresse als
Master.
[Link](address, quantity)
Fordert von einem Gerät Informationen an. address bezeichnet
dabei die 7-Bit-Geräteadresse, quantity die Anzahl von Bytes, die
erwartet werden.
[Link]()
Gibt die Anzahl von Bytes zurück, die auf dem Bus gelesen werden
können. Wenn der Arduino als Slave registriert ist, kann er so
Daten vom Master empfangen, andersherum wird festgestellt, wie
viele Bytes der Slave nach einer requestFrom-Anfrage gesendet hat.
[Link]()
Empfängt das nächste Byte, das auf dem Bus für das Gerät vorliegt
und gibt dieses als »Byte« zurück.
[Link](address)
Beginnt eine Übertragung als Master an die in address angegebene
Slave-Adresse.
[Link]()
Beendet den Übertragungsblock, der mit beginTransmission()
gestartet und mit send() vorbereitet wurde. Mit endTransmission()
wird der gesamte Block übertragen.
Wire-Bibliothek 287
[Link](handler)
Mit dieser Funktion kann eine weitere Funktion festgelegt werden,
die aufgerufen werden soll, wenn ein Slave Daten vom Master
erhält. Dabei wird der Funktionsname übergeben, die Funktion
selbst wird im weiteren Verlauf des Sketches deklariert. Sie sollte
genau einen Int-Parameter besitzen, an den die Anzahl der übertra-
genen Bytes übergeben wird.
[Link](handler)
Diese Funktion verhält sich wie onReceive(), allerdings für den
Fall, dass der Master Daten anfordert. Die mitgegebene Funktion
hat weder einen Rückgabewert noch Parameter. Sie wird bei einem
Request aufgerufen und kann zum Beispiel die Anweisung enthal-
ten, einen Sensor auszulesen und mit write() wieder an den Master
zu senden.
Beispiel
// schließt den Arduino als Master an und sendet eine Anfrage an
// einen Slave mit Adresse 1; dann werden die Antwort gelesen und
// der Inhalt wieder an den Slave gesendet
#include <Wire.h>
void setup() {
// initialisiere die Bus-Verbindung
[Link]();
}
void loop() {
// fordere ein Byte von Gerät 1 an
[Link](1, 1);
if ([Link]()) {
byte empfangeneDaten = [Link]();
[Link](1);
[Link](empfangeneDaten);
[Link]();
}
}
capSense-Bibliothek
Mit dieser Bibliothek können auf dem Arduino einfach kapazitive
Sensoren implementiert werden. Wie in Kapitel 7 beschrieben
wurde, sind dazu nur ein Widerstand (von 100.000–50 Mio. Ohm)
und ein Stück Draht oder Aluminiumfolie notwendig. Der Wider-
stand muss zwischen zwei Pins gesteckt werden, bei dem der eine
Pin als Sendepin fungiert und der andere als Empfangspin. An den
Empfangspin muss der Draht oder die Alufolie als Antenne ange-
schlossen werden. Für einen kapazitiven Sensor wird die CapSen-
CapSense(sendePin, empfangsPin)
Mit dieser Funktion wird ein CapSense-Objekt erzeugt, mit dem
ein kapazitiver Sensor gemessen werden kann. Der Widerstand
muss zwischen Sende- und Empfangspin gesteckt werden (beides
müssen digitale Pins sein) und die Antenne an den Empfangspin
angeschlossen sein.
[Link](samples)
Mit dieser Funktion kann die Kapazität des Sensors gemessen wer-
den, in einer beliebigen Einheit. Der samples-Parameter gibt die
Zeit an, über die gemessen wird. Je länger diese Zeit und damit der
Messvorgang ist, desto genauer der gemessene Wert. Das Ergebnis
wird nicht durch die Zeitdauer geteilt, sondern es wird einfach der
rohe Messwert zurückgegeben. Die Funktion gibt -2 zurück, wenn
der gemessene Wert über CS_Timeout_millis liegt (das mit der
Funktion set_CS_Timeout_Millis eingestellt werden kann und stan-
dardmäßig 2.000 Millisekunden beträgt).
[Link](samples)
Ähnlich wie die [Link]-Funktion misst diese Funk-
tion die Kapazität des Sensors über einen gewissen Zeitrahmen.
Allerdings misst [Link] auch die Kapazität im nicht
aktivierten Zustand und zieht diese vom gemessenen Wert ab. Cap-
[Link]() sollte deswegen im nicht aktivierten Zustand
einen niedrigen Wert zurückgeben. Die automatische Kalibrierung
wird in regelmäßigen Intervallen ausgeführt, die mit der Funktion
set_CS_AutocaL_Millis eingestellt werden können. Die Autokali-
brierung wird normalerweise alle 20 Sekunden ausgeführt. Diese
Funktion gibt -2 zurück, wenn der gemessen Wert über CS_
Timeout_millis liegt.
capSense-Bibliothek 289
CapSense.set_CS_Timeout_Millis(millis)
Mit dieser Funktion wird die maximale Messzeit eingestellt.
CapSense.reset_CS_AutoCal()
Mit dieser Funktion wird sofort eine Kalibrierung der Kapazität im
nicht aktivierten Zustand ausgelöst.
CapSense.set_CS_AutoCaL_Millis(millis)
Mit dieser Funktion kann die Periode der automatischen Kalibrie-
rung eingestellt werden. Die automatische Kalibrierung kann deak-
tiviert werden, indem millis auf 0xFFFFFFFF gesetzt wird.
Beispiel
#include <CapSense.h>
CapSense cs = CapSense(4, 2); // Widerstand zwischen Pin 4 und 2
// 2 ist der Empfangspin
CapSense cs2 = CapSense(4, 3); // ein weiterer Sensor an
// Empfangspin 3
void setup() {
cs.set_CS_AutocaL_Millis(0xFFFFFFFF);
[Link](9600);
}
void loop() {
long start = millis(); // Messdauer festhalten
long wert1 = [Link](30); // ersten Sensor messen
long wert2 = [Link](30); // zweiten Sensor messen
// Messzeit und Messwerte ausgeben
[Link](millis() – start);
[Link](": ");
[Link](wert1);
[Link](", ");
[Link](wert2);
delay(10);
}
Übersicht: Programmiersprachen
In diesem Anhang wird die Arduino-Programmiersprache ausführ-
lich erklärt. Es werden zuerst die Syntax der Programmiersprache
(also was in der Sprache zulässig ist) und die Struktur eines Ardu-
ino-Sketches erklärt (notwendige Sketch-Funktionen, Programm-
flusskonstrukte, mathematische Operatoren). Anschließend werden
häufig benutzte Funktionen zur Steuerung der Arduino-Hardware
gezeigt. An vielen Stellen wird auf potenzielle Fehlerquellen hinge-
wiesen (Programmieren ist nicht gerade die leichteste Aufgabe). Das
soll auf keinen Fall der Abschreckung dienen, sondern eher die Feh-
lersuche erleichtern und Ihnen generell ein Gefühl für mögliche Fal-
len geben. Es kann praktisch wenig passieren, außer dass der
Arduino sich merkwürdig benimmt oder stehen bleibt. Es reichen
also bei einem Programmfehler meistens ein Reset, ein bisschen
Nachdenken und das erneute Hochladen der korrigierten Software.
Ein Arduino-Programm ist eine Folge von Programmierbefehlen,
die dem Arduino-Prozessor Anweisungen dafür geben, welche
Berechnungen er auszuführen hat. Eine Folge von Anweisungen,
die eine bestimmte Aufgabe erfüllen, nennt man Algorithmus.
Diese Anweisungen können rein mathematische Anweisungen sein
(»nimm den Wert, der an dieser Stelle im Speicher steht, addiere 3
und speichere ihn an dieser anderen Stelle«) oder auch Programm-
flussanweisungen (»wenn der Eingabewert größer als 5 ist, dann
führe diese Anweisungen aus, ansonsten führe diese anderen
Anweisungen aus«). Weiterhin gibt es eine Reihe von Strukturan-
weisungen, die es ermöglichen, bestimmte Teile eines Programms
291
flexibel zu gestalten und auch getrennt zu bearbeiten. Die Program-
mierbefehle, die diese Anweisungen beschreiben, werden vom Pro-
grammierer in einer sogenannten Programmiersprache oder
Computersprache (also nicht auf Englisch oder Deutsch) in eine
Textdatei geschrieben.
Eine Computersprache braucht eine feste Syntax, damit der Com-
puter verstehen kann, was mit dem Programm bewirkt werden soll.
Beim Hochladen eines Sketches auf den Arduino wird der Pro-
grammtext in Maschinencode übersetzt. Dieser Schritt heißt »kom-
pilieren« und wird von einem eigenen Programm namens
»Compiler« durchgeführt. Falls Arduino in diesem Schritt einen
Programmfehler antrifft (z.B. einen Tippfehler), wird der Vorgang
abgebrochen und der Fehler in der Konsole angezeigt. Der Ardu-
ino-Editor springt an die fehlerhafte Zeile im Programmcode und
markiert sie gelb. So lassen sich schnell Probleme in einem Pro-
gramm finden. Das erfolgreiche Übersetzen des Programms heißt
jedoch noch nicht, dass es auch korrekt ist, denn es können noch
viel mehr Fehler auftreten als nur Syntaxfehler.
Abbildung C-1
Programmfehler im
Arduino-Edito
Syntax
Eine Programmiersprache ist eine formale Sprache, die strikt defi-
nierten Regeln folgt, damit der Computer sie auch verstehen kann.
Anstatt Sätze zu schreiben, werden in einer Programmiersprache
Befehle an den Arduino geschrieben, die man Anweisungen nennt.
Eine Anweisung kann zum Beispiel sein: »Addiere 2 und 5, oder
setze den Ausgangspin 5 auf HIGH.«
Syntax 293
In Arduino muss jede dieser Anweisungen mit einem Semikolon
abgeschlossen werden. Vergisst man, eine Anweisung mit einem
Semikolon abzuschließen, wird Arduino einen Fehler melden. Es
kann allerdings passieren, dass der Fehler, der durch ein fehlendes
Semikolon ausgelöst wird, sehr kryptisch ist, weil der Compiler die
Programmstruktur nicht korrekt erkennen kann. Wenn Arduino
also einen »absurden« Fehler meldet, ist es sinnvoll, zuerst nach
Syntaxfehlern im Programmquellcode zu suchen.
Beispiel
int buttonPin = 2;
a = a + 3;
meineFunktion();
Syntax 295
statement2; // Einzeilige Kommentare kann man allerdings
// schachteln.
}
*/
Datentypen
Weiterhin hat eine Variable einen Datentyp. Der interne Speicher
des Arduino besteht aus einer langen Tabelle von 8-Bit-Werten;
eine Variable kann allerdings noch viel mehr Arten von Daten ent-
halten. Datentypen kann man in zwei Gruppen unterteilen: nume-
rische und zusammengesetzte Datentypen.
Numerische Datentypen werden benutzt, um Zahlen oder Boole-
sche logische Werte abzubilden. Sie unterscheiden sich grundsätz-
lich durch den Zahlenbereich, den sie abbilden können. Hier muss
man zwischen ganzzahligen numerischen Typen unterscheiden, die
nur ganze Zahlen darstellen können, und Fließpunktkommazah-
len, die Kommazahlen darstellen können. Die Datentypen float und
double werden benutzt, um Fließkommazahlen zu speichern. Der
Arduino basiert auf einem 8-Bit-Prozessor, sodass Kommazahlen
nur mit viel Mehraufwand eingesetzt werden können. Falls schnelle
Berechnungen notwendig sind (oder ein kürzerer Programmcode)
ist es besser, ganze Zahlen einzusetzen.
Zusammengesetzte Datentypen lassen sich in Tabellen und Daten-
strukturen unterteilen. Datenstrukturen sind ein fortgeschrittenes
Thema und werden in diesem Buch nicht behandelt. Datentabel-
len sind Listen von vielen Werten eines Datentyps, auf die inde-
xiert zugegriffen werden kann. Diese Werte werden hintereinander
im Speicher abgelegt. Einen speziellen zusammengesetzten Daten-
typ bilden Zeichenketten, die als Tabelle von char-Werten im Spei-
cher abgebildet werden. Der letzte Wert in einer Zeichenkette ist
immer 0.
Fließkommazahlen
Fließkommazahlen werden benutzt, um Zahlen darzustellen, die
ein Komma (das ja durch einen Punkt dargestellt wird) haben.
Allerdings sind diese Zahlen nicht genau, sondern nähern diesen
Wert soweit möglich. Der darstellbare Zahlenbereich geht von –3.
4028253E+38 bis 3.4028235E+38. Dadurch, dass diese Zahlen
nicht genau sind, kann es vorkommen, dass z.B. 6.0 geteilt durch 3.
0 nicht gleich 2.0 ist. Der Prozessor auf einem Arduino-Board kann
nicht mit Fließkommazahlen umgehen, sodass eine zusätzliche
Library benutzt wird, die diese Berechnung auf 8-Bit-Zahlen abbil-
det. Dadurch sind Fließkommaberechnungen sehr langsam, und
bei zeitkritischen Berechnungen ist es oft notwendig, sie auf ganze
Zahlen umzuwandeln.
Buchstaben (char)
Buchstaben werden in der Arduino-Programmiersprache als nume-
rische Werte gespeichert. Ein Buchstabe ist ein Byte groß und kann
Tabellen (Arrays)
Tabellen speichern Listen von Werten desselben Datentyps.
Anhand eines numerischen Index kann dann auf einen Wert aus
einer Liste zugegriffen werden. Es gibt mehrere Arten, Arrays zu
erzeugen.
Beispiel
int meineTabelle[6];
int meineWerte[] = {4, 5, 6, 7, 8, 9, 10};
int meineNummern[5] = { 4, 5, 6, 7, 8}
In der ersten Zeile in diesem Beispiel wird eine Tabelle mit dem
Datentyp int erzeugt, die sechs Werte speichern kann. Im Speicher
werden also zwölf Bytes benutzt (weil ein int-Wert zwei Bytes
belegt), um diese sechs Werte zu speichern. Diese sechs Werte wer-
den automatisch auf 0 initialisiert.
In der zweiten Zeile wird die Größe des Array nicht explizit defi-
niert, sondern implizit durch die folgenden (sieben) Initialisie-
rungswerte gesetzt.
Im der dritten Zeile werden die Größe des Array definiert und Initi-
alisierungswerte übergeben. Stimmt die Größe der Initialisierungs-
werte nicht mit der Größe des Array überein, wird vom Compiler
ein Fehler gemeldet.
Diese Tabellen werden im Arbeitsspeicher des Arduino-Prozessors
gehalten, der relativ klein ist (2 oder 4 KByte auf einem Arduino
Duemilanove, je nach Herstellungszeitpunkt). Der Arduino-Editor
wird allerdings keinen Fehler signalisieren, wenn eine Tabelle zu
groß für den Arbeitsspeicher ist. Es ist also wichtig, sich darüber im
Indexe für Tabellen fangen bei 0 an und gehen bis zur Größe der
Tabelle minus eins. Deswegen wird in Programmen generell von 0
aus gezählt, nicht von 1 aus (das ist besonders bei Schleifen wich-
tig, siehe Abschnitt Kontrollstrukturen). Bei einer Tabelle der
Größe 6 geht der Indexwert also von 0 bis 5. Es ist sehr wichtig
sicherzustellen, dass der Indexwert innerhalb der zugelassenen
Größe liegt. Der Arduino-Prozessor wird das beim Ausführen des
Tabellenzugriffes nicht überprüfen und wird irgendwo im Speicher
lesen (was nicht so schlimm ist, aber zu komischen Ergebnissen
führt) oder schreiben (was deutlich schlimmer ist und zu sehr
schwer nachvollziehbaren Fehlern führt, z.B. dass das Arduino-
Board spontan neu startet oder in Funktionen springt, die gar nicht
angegeben worden sind). Bei Tabellenzugriffen ist also äußerste
Vorsicht geboten.
Es ist oft nützlich, eine Tabelle mit einer for-Schleife zu durchlau-
fen (siehe Abschnitt Kontrollstrukturen). Dazu wird eine Variable
hochgezählt, die jeden möglichen Index-Wert für die Tabelle
annimmt.
Beispiel
for (int i = 0; i < 5; i++) { // i nimmt alle Werte von 0 bis 5 an
meineTabelle[i] = i; // Zugriff auf das i-te Element aus
// meineTabelle
}
Zeichenketten
Zeichenketten sind einfach Tabellen von char-Werten. Zusätzlich
muss allerdings noch die Länge der Zeichenkette angegeben wer-
Variablen
Mit Variablen lassen sich Speicherbereiche mit symbolischen
Namen verbinden. Das erleichtert erheblich die Programmierung,
weil sich so mit einem informativen Namen Werte auslesen und
speichern lassen. Zum Beispiel kann die Variable sensorWert
benutzt werden, um den zuletzt ausgelesenen Statuswert eines Sen-
sors zu speichern.
Jede Variable ist mit einem Datentyp verbunden. So kann beim
Kompilieren des Programms berechnet werden, welcher Bereich im
Speicher belegt ist und wie mit den dort gespeicherten Werten
gerechnet werden muss. Dadurch können Tabellenzugriffe und
Zeichenkettenzugriffe berechnet werden.
Variablen sind eines der wichtigsten Konzepte beim Programmie-
ren, und sie sind in quasi jedem Programm mehrfach anzutreffen.
Die Wahl der benutzten Variablen (also der Namen für Speicherbe-
reiche) ist äußerst wichtig für die Strukturierung eines Programms.
Namen dienen auch zur menschlichen Verständlichkeit eines Pro-
gramms. So sollte eine Variable namens zaehler nicht benutzt wer-
den, um eine Zeichenkette zu speichern, da das verwirrend sein
kann, wenn man ein Programm nach einiger Zeit wieder modifizie-
ren und dazu verstehen will.
Beispiel
char meinString[] = "hallo"; // Die Variable meinString speichert
// einen String.
int meineZahl = 5; // Die Variable meineZahl speichert eine Zahl
Konstanten
Konstanten sind eine besondere Art von Variablen, die nicht verän-
dert werden können. Konstanten belegen meistens auch keinen
Speicherplatz (außer Tabellen und Zeichenketten) und werden oft
benutzt, um bestimmten festen Werten symbolische Namen zuzu-
ordnen (zum Beispiel die Nummer eines Pins, der eine bestimmte
Funktion erfüllt, die Nummer eines bestimmten Kommandos auf
einem externen Sensor oder ein Konfigurationsparameter der Soft-
ware). Eine Konstante wird mit dem Wort const deklariert. Bei
Schreibzugriffen auf diese Variable meldet die Arduino-Software
einen Programmierfehler.
Beispiel
const int ledPin = 5; // ledPin kann nicht verändert werden und
// hat den Wert 5.
Ausdrücke
Die einfachste Art Ausdruck in der Arduino-Programmiersprache
haben wir schon oft gesehen. Es ist ein einfacher expliziter Wert,
z.B. eine Zahl oder die Angabe einer Zeichenkette. Dieser Aus-
druck hat den Typ des expliziten Werts, und der Wert ist natürlich
die angegebene Zahl. Bei Zeichenketten ist der Wert die Adresse
der Speicherkette, dieses Detail ist allerdings in den meisten Ardu-
ino-Programmen nicht von Bedeutung.
Beispiel
5; // Zahlenausdruck mit Wert 5
"arduino"; // Der Wert dieses Ausdrucks ist die Adresse der
// Zeichenkette.
// Beide Ausdrücke werden vom Compiler ignoriert.
Variablenzuweisung
Ein weiterer Ausdruck ist die Variablenzuweisung, die das Gleich-
heitszeichen (=) als Symbol verwendet. Auf der linken Seite des =
steht die Variable, der ein Wert zugewiesen werden soll, und auf
der rechten Seite steht der Ausdruck, der berechnet und anschlie-
ßend gespeichert werden soll.
Eigentlich ist die Variablenzuweisung eine Anweisung, sie hat
jedoch den zugewiesenen Wert als Rückgabewert und den Typ der
zugewiesenen Variable als Rückgabetyp (das ist wichtig bei der
automatischen Datentypkonvertierung, die weiter unten erklärt
wird). Dadurch ist es möglich, mehrere Variablenzuweisungen zu
schachteln und Variablenzuweisungen innerhalb von weiteren Aus-
drücken zu verwenden. Hier ist aber wieder Vorsicht geboten, weil
deswegen die Zuweisungsreihenfolge von Variablen nicht unbe-
dingt klar ersichtlich ist. Es ist deswegen ratsam, Zuweisungen bes-
ser als getrennte Anweisungen in das Programm zu schreiben.
Beispiel
int i = 0; // Die Variable i wird mit 0 initialisiert
// (kein Ausdruck).
int j = 2; // Die Variable j with mit 2 initialisiert.
i = 5; // Der Variable i wird der Wert 5 zugewiesen.
Operationen
Der Großteil der Ausdrücke in der Arduino-Programmiersprache
sind Operationen, die aus einem oder mehreren Argumenten einen
neuen Wert berechnen. Es gibt mehrere Arten von Operationen,
die innerhalb von Ausdrücken benutzt werden können. Eine Ope-
ration nimmt einen oder mehrere Werte und berechnet daraus
einen neuen Ergebniswert. Je nach Operationsart und Typ der Ein-
gabewerte werden Werte mit unterschiedlichen Datentypen
berechnet.
Wir stellen Ihnen jetzt zuerst die verschiedenen Operationen im
Überblick vor und erklären sie im weiteren Abschnitt dann detail-
liert.
Ausdrücke 311
Arithmetische Operationen berechnen aus Zahlenwerten einen
neuen Zahlenwert: Es sind die bekannten Operationen wie Addie-
ren, Subtrahieren, Multiplizieren und Teilen. Logische Operatio-
nen berechnen aus Bitmasken neue Bitmasken (Bitmasken sind
binär dargestellte Zahlen), es sind die Operationen »und« (&),
»oder« (|), »exklusiv oder« (^), »Negieren« (~) und »Shiften« (<<
und >>). Boolesche Operationen berechnen aus den Booleschen
Werten »wahr« und »falsch« neue Boolesche Ergebniswerte, die
Operationen »und« (&&), »oder« (||) und »Negieren« (!). Diese sind
sehr einfach mit den logischen Operationen zu verwechseln, sind
aber ganz anders definiert (die Unterschiede werden weiter unten
im Abschnitt über logische Operationen erläutert).
Viele Operationen arbeiten mit Booleschen Werten (also mit
»wahr« oder »falsch«). Diese Werte müssen natürlich auch im Spei-
cher des Arduino-Prozessors gespeichert werden, entweder als Bit
in einem größeren numerischen Wert oder als eigener Wert (z.B.
wenn dieser Boolesche Wert in einer Variable gespeichert wird).
Deswegen gibt es Konvertierungsregeln, die einen Booleschen Wert
in einen numerischen Wert (oder Bitwert) konvertieren und anders
herum. Falsch wird generell als 0 kodiert (also als numerischer
Wert 0 oder als Bitwert 0). Wahr sind dementsprechend alle Werte,
die nicht 0 sind (also der Bitwert 1 und jeder mögliche numerische
Wert ungleich 0). Diese Unterscheidung mag ein bisschen übertrie-
ben klingen, ist aber sehr wichtig, besonders wenn Vergleichsope-
rationen und logische Operationen verwendet werden.
Datentypkonvertierung
Diese Konvertierung von numerischen Werten zu Booleschen Wer-
ten ist eigentlich nur ein kleiner Einblick in ein größeres Thema: die
Datentypkonvertierung. Generell ist es möglich, Operationen auf
unterschiedliche Datentypen anzuwenden, um zum Beispiel eine
long-Zahl zu einer short-Zahl zu addieren oder um eine signed-Zahl
mit einer unsigned-Zahl zu vergleichen. Es gibt zwei Arten von
Datentypkonvertierungen: implizite und explizite. Implizite Daten-
typkonvertierungen werden automatisch ohne spezielle Markie-
rung vom Programmierer vom Compiler eingefügt, wenn z.B.
unterschiedliche Datentypen im selben Ausdruck vorkommen.
Explizite Datentypkonvertierungen werden vom Programmierer
eingefügt. Es ist nur selten notwendig, explizite Datentypkonvertie-
rungen einzuführen, aber besonders auf einem Mikrocontroller wie
dem Arduino-Prozessor, der über eine begrenzte Menge an Spei-
cher verfügt und intern mit 8 Bit rechnet, ist es in fortgeschrittenen
Ausdrücke 313
Besonders knifflig wird die Thematik, wenn signed-Werte und unsi-
gned-Werte im selben Ausdruck verwendet werden. Dadurch wird
der Ausdruck zu einem signierten Ausdruck, und es kann bei der
Zuweisung des Ergebnisses oder beim Vergleich mit unsignierten
Werten schnell zu unerwarteten Ergebnissen kommen. Solche Feh-
ler sind besonders schwer herauszufinden, weil sie beim Lesen des
Programms nicht sofort ersichtlich sind. Falls also bei Rechen-
ausdrücken oder Vergleichen (insbesondere in Schleifen) unerwar-
tete Werte auftreten, ist es manchmal notwendig, die Ausdrücke
ganz genau unter die Lupe zu nehmen, und zur Not explizite
Datentypkonvertierungen zu verwenden.
Einer der häufigsten Fehler ist der Vergleich von signed- und unsig-
ned-Zahlen, der immer wahr oder immer falsch ist und zum Bei-
spiel zu nie endenden Schleifen führen kann. Solche simplen Fehler
werden häufig vom Compiler erkannt, aber nur als Warning
gekennzeichnet, sodass man sie in der Arduino-Umgebung, wenn
die verbose-Kompilation nicht angeschaltet ist, nicht zu sehen
bekommt.
Explizite Datentypkonvertierungen werden vom Programmierer
eingefügt. Hier wird vor dem zu konvertierenden Ausdruck in
Klammern der Zieldatentyp angegeben. Es gelten die gleichen
Regeln und Warnungen wie für implizite Datentypkonvertierungen.
Beispiel
short s = 2;
int i = (int)s; // explizite Konvertierungen von short nach int
Präzedenzregeln
Bei Ausdrücken gibt es in der Arduino-Programmiersprache festge-
legte Präzedenzregeln (in welcher Reihenfolge Ausdrücke berechnet
werden). Generell gelten die üblichen arithmetischen Regeln (Mul-
tiplikation und Division vor Addition und Subtraktion), ansonsten
wird der Ausdruck von links nach rechts ausgewertet. Das ist bei
längeren Ausdrücken schwer nachzuvollziehen, insbesondere wenn
Operationen verwendet werden, die programmiersprachenspezi-
fisch sind. Es ist möglich, die Auswertungsreihenfolge explizit zu
beschreiben, indem man runde Klammern benutzt. Ausdrücke
innerhalb von Klammern werden als Erstes berechnet und ihr
Ergebnis im übergeordneten Ausdruck eingesetzt. Runde Klam-
mern können beliebig geschachtelt werden.
Arithmetische Operationen
Die arithmetischen Operationen in der Arduino-Programmierspra-
chen sind die üblichen mathematischen Operationen: Addition,
Subtraktion, Multiplikation und Division.
Eine spezielle arithmetische Operation ist die Modulo-Operation,
die den Restwert einer ganzzahligen Division berechnet. Die
Modulo-Operation ist auf Fließkommazahlen nicht definiert. Die
Modulo-Operation wird häufig benutzt, um einen Wert innerhalb
eines bestimmten Bereichs zu halten (z.B. innerhalb der Größe
einer Tabelle). Die Modulo-Operation mit einem Teiler, der eine
Zweierpotenz ist (also 2, 4, 8, 16, 32 usw.), lässt sich auf einem
Computer besonders effizient ausführen. Es ist also aus Geschwin-
digkeitsgründen wichtig, bei häufig benutzten Tabellen, auf die
mithilfe der Modulo-Operation zugegriffen wird, eine Zweierpo-
tenz als Größe zu wählen.
Beispiel
byte b = 5 % 3; // Der Wert von b ist 2, weil 2 der Restwert von 5
// geteilt durch 3 ist.
byte b2 = 65 % 20; // Der Wert von b2 ist 5, weil 5 der Restwert
// von 65 geteilt durch 20 ist.
int tabelle[64]; // eine Tabelle mit 64 Werten
int index = 40;
tabelle[index % 64] = 5; // So ist gewährleistet, dass der
// Indexwert immer innerhalb der Tabelle
// ist.
tabelle[index % 64]; // Diese Operation ist um ein Vielfaches
// schneller als:
tabelle[index % 63];
Ausdrücke 315
lige Division angewendet. Soll eine Fließkommazahl berechnet
werden, muss mindestens eins der Divisionsargumente eine Fließ-
kommazahl sein (also vom Datentyp float oder double). Das lässt
sich entweder durch explizite Datentypkonvertierung erreichen,
oder indem literale Werte mit einem Komma (geschrieben als
Punkt) angegeben werden (zur Not mit ».0«).
Beispiel
byte b = 5 / 2; // Der Wert von b ist 2.
float f = 5 / 2; // Der Wert von f ist 2.0.
float f2 = 5.0 / 2.0; // Der Wert von f2 ist 2.5.
Logische Operationen
Logische Operationen rechnen mit Bitwerten, also mit 0 und 1. Da
sich aber einzelne Bitwerte nicht direkt auf dem Arduino-Prozessor
speichern lassen, arbeiten die logischen Operationen mit den ein-
zelnen Bits der normalen numerischen Datenwerte (also mit der
Bitmaskendarstellung, siehe Abschnitt Datentypen). Die logische
Operation wird auf jedes einzelne Bit des numerischen Wertes
getrennt angewendet.
Das logische UND (&) und das logische ODER (|) ähneln den Boo-
leschen Operatoren UND (&&) und ODER (||), und beide Operato-
ren sind leicht zu verwechseln. Die logischen Operationen arbeiten
jedoch auf numerische Werte und beeinflussen jedes einzelne Bit
dieser Werte, während die Booleschen Operatoren mit Booleschen
Werten arbeiten (0 ist falsch, alles andere ist wahr). Dazu werden
numerische Argumente erst in Boolesche Werte konvertiert (siehe
oben im Abschnitt »Datentypkonvertierung« in diesem Anhang).
Viele der logischen Operatoren werden benutzt, um einzelne Bits
auf 0 oder auf 1 zu setzen. Deswegen bietet die Arduino-Program-
mierumgebung ein Funktion, um eine Bitmaske zu erzeugen, in der
Ausdrücke 317
Beispiel
byte a = 5; // a ist 00000101 in Binärdarstellung.
byte b = 3; // b ist 00000011 in Binärdarstellung.
byte c = a & b; // c ist a & b = 00000101 & 00000011 = 00000001 = 1.
a = 0xFE; // a ist 11111110 in Binärdarstellung.
c = a & b; // c ist a & b = 11111110 & 00000011 = 00000010 = 2.
Ähnlich lassen sich z.B. die vier unteren Bits oder die vier oberen
Bits aus einem Wert extrahieren (das ist manchmal notwendig,
wenn z.B. ein Sensor zwei 4-Bit-Werte in einem Byte zurückgibt).
Um die Werte auch richtig zu bearbeiten, wird oft noch der Shift-
Operator (siehe Abschnitt über Shift-Operator) eingesetzt, um die
extrahierten Bits an die unterste Stelle zu bewegen.
Beispiel
byte a = 0xfe;
byte untereBits = (a & 0xF); // extrahiert die 4 unteren Bits, da
// 0xF = 00001111
byte obereBits = (a & 0xF0) >> 4; // extrahiert die 4 oberen Bits,
// da 0xF0 = 11110000
|: Logisches ODER
Das | ist der logische ODER-Operator. Er gibt 1 zurück, wenn min-
destens eins seiner Argumente auch 1 ist. Seine Funktionsweise
lässt sich am besten mit der folgenden Tabelle erläutern.
^: Exklusives ODER
Das ^ ist der exklusive ODER-Operator. Er gibt 1 zurück, wenn
genau eins seiner Argumente auch 1 ist. Seine Funktionsweise lässt
sich am besten mit der folgenden Tabelle erläutern .
Ausdrücke 319
Tabelle C-7 a b a^b
Exklusive ODER-Operation
0 0 0 ^ 0 = 0
0 1 0 ^ 1 = 1
1 0 1 ^ 0 = 1
1 1 1 ^ 1 = 0
~: Logische Negierung
Die Tilde ~ ist der logische Negierungsoperator, der ein einzelnes
Argument annimmt (das auf eine rechte Seite geschrieben wird). Er
gibt 1 zurück, wenn er auf 0 angewendet wird, und 0, wenn er auf 1
angewendet wird, wie der folgenden Tabelle zu entnehmen ist.
Tabelle C-8 a ~a
Logische Negierung
0 ~0 = 1
1 ~1 = 0
Ausdrücke 321
>>: Shift nach rechts
Die >>-Operation verschiebt die Bits in einem Wert um eine
bestimmte Anzahl von Stellen nach rechts. Im Unterschied zur
Shift-nach-links-Operation werden allerdings die »entstehenden«
Stellen nicht immer mit Nullen gefüllt. Wegen der Zweierkomple-
ment-Darstellung (siehe Abschnitt über Datentypen) ist bei negati-
ven Zahlen das oberste Bit auf 1 gesetzt. Um das Vorzeichen eines
Wertes beim Shiften nach rechts zu erhalten, wird dementspre-
chend bei negativen Zahlen mit Einsen aufgefüllt. Deswegen ist
Vorsicht beim Shiften nach rechts geboten, weil unerwartete Werte
herauskommen können.
Um zu vermeiden, dass mit dem obersten Bit bei negativen Zahlen
aufgefüllt wird, kann der Wert vor dem Shiften mit einer expliziten
Datentypkonvertierung zuerst in einen unsigned-Wert konvertiert
werden.
Beispiel
byte a = 5; // a ist 00000101 in Binärdarstellung.
byte b = a >> 2; // b ist 00000001 in Binärdarstellung,
// der Wert von a wurde um zwei Stellen nach
// rechts verschoben. Da a keine signed Nummer
// ist, wird hier mit 0 aufgefüllt.
Mit dem >>-Operator und dem logischen UND (&) lassen sich ein-
zelne Bits aus einem Wert extrahieren und in einem anderen spei-
chern.
Beispiel
byte b = (a >> 2) & 1; // Das dritte Bit von a wird in b
// gespeichert.
Vergleichsoperationen
Vergleichsoperationen sind eine der am häufigsten eingesetzten
Arten von Operationen, insbesondere kombiniert mit dem Einsatz
Ausdrücke 323
a > 5; // ist falsch
a >= 5; // ist wahr
a < 300; // ist für jeden Wert von a wahr
Boolesche Operationen
Boolesche Operationen ähneln sehr ihren äquivalenten logischen
Operationen. Allerdings arbeiten Boolesche Operationen mit den
Wahrheitswerten »wahr« und »falsch«, nicht mit Bits. Mit Boole-
schen Operationen lassen sich verschiedene Boolesche Ausdrücke
(z.B. Vergleichsoperationen) miteinander verknüpfen.
Das Boolesche UND && (im Unterschied zum logischen UND &)
gibt »wahr« zurück, wenn seine beiden Argumente wahr sind. Das
Boolesche ODER || (im Unterschied zum logischen ODER |) gibt
»wahr« zurück, wenn mindestens eines seiner Argumente wahr ist.
Die Boolesche Negierung ! (im Unterschied zur logischen Negie-
rung ~) gibt »wahr« zurück, wenn ihr Argument falsch ist, und
»falsch«, wenn ihr Argument wahr ist.
Da mit Booleschen Operatoren oft kompliziertere Vergleichsopera-
tionen verknüpft werden, ist es meist ratsam, runde Klammern ein-
zusetzen, um die Auswertungsreihenfolge explizit zu formulieren –
sonst kann es unter Umständen zu fehlerhaften Ausdrücken kom-
men (insbesondere wenn mehrere &&- und ||-Operatoren verknüpft
werden). Wie man leicht sehen kann, können Boolesche Ausdrücke
ähnlich kompliziert werden wie arithmetische Ausdrücke. Auch
hier ist es oft hilfreich (und meistens nicht langsamer), Zwischenva-
riablen einzuführen, um die Ausdrücke zu vereinfachen.
Beispiel
byte a = 5;
byte b = 10;
(a < 10) && (a > 4); // ist wahr
Zusammengesetzte Operationen
Es kommt häufig vor, dass mit einer Variablen gerechnet und das
Ergebnis anschließend wieder in dieser Variablen gespeichert wird.
Um das Schreiben solcher Vorgänge zu vereinfachen, gibt es eine
Ausdrücke 325
Reihe zusammengesetzter Operationen, die eine Zuweisungsopera-
tion mit einer arithmetischen oder logischen Operation verknüpfen.
Zwei spezielle zusammengesetzte Operation sind die Inkrementie-
rungsoperation, die 1 zu einer Variablen hinzuaddiert, und die
Dekrementierungsoperation, die 1 von einer Variablen subtrahiert.
Beide werden oft in Schleifen eingesetzt, um einen Wertebereich zu
durchlaufen. Bei diesen beiden Operationen gibt es zwei mögliche
Schreibweisen. Man kann den Operator vor die zu inkrementie-
rende (oder dekrementierende) Variable schreiben – in diesem Fall
spricht man von Prä-Inkrementierung bzw. Prä-Dekrementierung.
Wenn man ihn hinter die Variable schreibt, spricht man von Post-
Inkrementierung bzw. Post-Dekrementierung. Der Unterschied
zwischen beiden Schreibweisen ist der Rückgabewert des Aus-
drucks. Im Fall der Prä-Operationen wird zuerst die Variable modi-
fiziert; der Rückgabewert des Ausdrucks ist der Wert der Variablen
nach der Inkrementierung oder Dekrementierung. Im Fall der Post-
Operationen wird die Variable erst nach der Auswertung der Vari-
ablen inkrementiert oder dekrementiert, d.h. der Wert des Aus-
drucks ist der Wert der Variablen vor der Modifikation. In den
meisten Fällen werden Post-Operationen verwendet.
Inkrementierung und Dekrementierung werden oft bei while-
Schleifen eingesetzt, die im folgenden Abschnitt erläutert werden.
Beispiel
byte a = 5;
byte b = a++;
// b hat jetzt den Wert 5, a hat den Wert 6.
b = ++a;
// b hat jetzt den Wert 7, a hat auch den Wert 7.
Kontrollstrukturen
Bis jetzt wurden Datentypen, Variablen und Ausdrücke vorgestellt.
Mit diesen Konstrukten lassen sich Werte berechnen, es fehlt aber
noch eines der grundlegenden Fundamente der Programmierung:
Kontrollstrukturen. Ohne Kontrollstrukturen ist es kaum möglich,
auf unterschiedliche Daten (aus externen Sensoren, dem Daten-
speicher oder der seriellen Schnittstelle) zu reagieren.
Kontrollstrukturen steuern den Programmfluss, also in welcher
Reihenfolge der Arduino-Prozessor das Programm abarbeitet. Ein
Algorithmus (also eine Folge von Anweisungen, die eine bestimmte
Aufgabe ausführen) lässt sich oft auf unterschiedliche Arten imple-
mentieren (also als Programm niederschreiben). Viele der Kontroll-
strukturen der Programmiersprache lassen sich durch andere
ersetzen. Die Auswahl der benutzten Kontrollstrukturen wird
durch mehrere Parameter beeinflusst: Effizienz (wie schnell kann
der Arduino-Prozessor diese Anweisungen ausführen), Lesbarkeit
(je nach Aufgabe sind bestimmte Kontrollstrukturen besser geeig-
net, und einen Algorithmus zu beschreiben) und Programmierstil
(jeder Programmierer hat seine eigenen Vorlieben). Bestimmte
Strukturen lassen sich auch leichter debuggen, falls Fehler auftre-
ten, manche anderen lassen sich später leichter modifizieren.
In diesem Abschnitt stellen wir die unterschiedlichen Kontroll-
strukturen der Arduino-Programmiersprache vor und gehen auf
ihre jeweiligen Einsatzbereiche, Vor- und Nachteile ein.
if
Die if-Kontrollstruktur ist die einfachste Kontrollstruktur in der
Arduino-Programmiersprache und auch eine der am häufigsten
benutzten. Mit ihr lässt sich ein Programmblock ausführen, wenn
eine bestimmte Bedingung zutrifft. Diese Bedingung ist ein Boole-
scher Ausdruck (also ein Ausdruck, der als Boolescher Wert inter-
pretiert wird). Meistens ist dieser Ausdruck ein Vergleichsoperator,
wie in den folgenden Beispielen. Die Syntax der if-Kontrollstruktur
ist folgende:
Kontrollstrukturen 327
if (Boolescher Ausdruck) {
// Dieser Block wird nur dann ausgeführt, wenn der Boolesche
// Ausdruck wahr ist.
}
Beispiel
if (a == 5) {
// Dieser Funktionsaufruf wird nur ausgeführt, wenn die Variable
// a den Wert 5 hat.
[Link]("a ist 5");
}
if ((a < 5) || (b > 10)) {
// Dieser Funktionsaufruf wird nur ausgeführt,
// wenn a kleiner als 5 ist oder wenn b größer als 10 ist.
[Link](»a ist kleiner als 5 oder b ist größer als 10.");
}
if … else
Die if ... else-Kontrollstruktur ist eine Erweiterung der if-Kon-
trollstruktur. Mit ihr es möglich, die Alternative zu beschreiben,
falls die Bedingung falsch ist, ohne gleich eine zweite if-Struktur
benutzen zu müssen. Die einfache Syntax der if ... else-Kontroll-
struktur ist folgende:
if (Boolescher Ausdruck) {
// Dieser Block wird nur dann ausgeführt, wenn der Boolesche
// Ausdruck wahr ist.
} else {
// Dieser Block wird nur dann ausgeführt, wenn der Boolesche
// Ausdruck falsch ist.
}
Kontrollstrukturen 329
Beispiel
if (a > 10000) {
[Link]("a ist groß.");
} else if (a > 500) {
[Link]("a ist mittelgroß.");
} else if (a > 10) {
[Link]("a ist klein.");
} else {
[Link]("a ist sehr klein.");
}
Die break-Anweisung bewirkt einen Sprung ans Ende der switch ...
case-Kontrollstruktur. Falls die break-Anweisung fehlt, wird der
nächste Programmblock in der Struktur ausgeführt, was in speziel-
len Fällen praktisch sein kann (man sagt, dass das Programm in den
nächsten switch ... case-Block »fällt«). Meistens ist das aber eher
eine Fehlerquelle, weshalb es wichtig ist, sicherzustellen, dass die
break-Anweisung am Ende der einzelnen Programmblöcke auch
wirklich vorhanden ist.
Kontrollstrukturen 331
Es ist sinnvoll, immer einen default-Block zu definieren, der unde-
finierte Fälle abfängt und zur Not einen Fehler anzeigt oder das
Programm neu initialisiert. Damit lassen sich beim Entwickeln Feh-
ler abfangen.
Programmblöcke sind einfache Listen von Anweisungen, die mit
einem Semikolon getrennt werden. Es ist auch möglich, nach einer
case-Anweisung lokale Variablen zu definieren, indem der Pro-
grammblock mit geschweiften Klammern abgeschlossen wird.
switch (Ausdruck) {
case Wert1: {
int lokaleVariable;
programmBlock1;
}
break;
case Wert2:
programmBlock2;
break;
Kontrollstrukturen 333
case MotorAnCommand:
motorAn();
break;
case MotorAusCommand:
motorAus();
break;
default:
// unbekanntes Kommando ignorieren
break;
}
}
}
for
Die for-Kontrollstruktur wird eingesetzt, um einen Programm-
block mehrmals in einer Schleife auszuführen. Oft wird diese
Struktur gemeinsam mit einem Schleifenzähler eingesetzt, um den
Programmblock eine bestimmte Anzahl von Malen zu wiederho-
len oder eine Tabelle oder Zeichenkette zu durchlaufen (siehe
Abschnitt über Tabellen und Zeichenketten). Die Syntax der for-
Kontrollstruktur sieht so aus:
for (Initialisierung; Schleifenbedingung; Schleifenanweisung) {
// Schleifencode
}
Kontrollstrukturen 335
Beispiel
for (int i = 1; i < 10; i++) {
// Die Variable i ist nur innerhalb des Schleifenblocks sichtbar.
analogWrite(ledPin, i * 25);
}
while
Die while-Kontrollstruktur ist eine weitere Kontrollstruktur, mit
der sich Schleifen implementieren lassen. Im Vergleich zur for-
Kontrollstruktur, die eher darauf ausgelegt ist, Schleifen mit Zäh-
lervariablen zu beschreiben, führt eine while-Schleife den Schleifen-
block so lange aus, wie die Schleifenbedingung wahr ist. Die
Schleifenbedingung wird vor dem ersten Durchlauf der Schleife
ausgewertet. Ist sie dort schon falsch, wird die Schleife gar nicht
ausgeführt. So lässt sich z.B. eine Schleife ausführen, bis ein Sensor
einen bestimmten Wert meldet oder ein Taster betätigt wird. Die
Syntax der while-Kontrollstruktur ist folgende:
while (schleifenBedingung) {
// Schleifenblock
}
Kontrollstrukturen 337
Im folgenden Beispiel wird die LED solange an- und ausgeschaltet,
bis ein Taster gedrückt wird.
Beispiel
while (!tasterGedrueckt()) {
blinkLed();
}
do … while
Die do ... while-Kontrollstruktur ist eng verwandt mit der while-
Kontrollstruktur. Bei dieser Kontrollstruktur wird die Schleifenbe-
dingung allerdings erst nach dem Schleifenblock ausgewertet,
sodass die Schleife mindestens einmal ausgeführt wird. Die Syntax
der do ... while-Kontrollstruktur ist folgende:
do {
// Schleifenblock
} while (schleifenBedingung);
Funktionen
Mit den bis jetzt erklärten Konstrukten lassen sich schon alle
möglichen Programme schreiben. Allerdings kommt es relativ oft
vor, dass bestimmte Programmabschnitte immer wieder ausge-
führt werden sollen, nur mit leicht unterschiedlichen Werten oder
Programmanweisungen. Diese immer wieder verwendeten Pro-
grammblöcke kann man als getrennte Funktionen schreiben, die
aufgerufen werden können (das nennt man Funktionsaufruf, und
viele der bisherigen Programmbeispiele haben schon solche Funk-
tionsaufrufe enthalten), das heißt, sie werden von einer anderen
Stelle im Programm aus angesprungen und ausgeführt.
Beim Funktionsaufruf kann man einer Funktion eine Anzahl von
Werten übergeben, die man Parameter nennt. Mit Parametern lässt
sich das Verhalten der Funktion steuern. Man kann zum Beispiel
Berechnungen mit unterschiedlichen Werten ausführen oder
bestimmte Teile der Funktion deaktivieren. Nachdem eine Funk-
tion ausgeführt wurde, springt sie wieder zur Stelle zurück, an der
sie aufgerufen wurde, und gibt gegebenenfalls einen Wert zurück
(den Rückgabewert).
Funktionen 339
zur eigenen Referenz ist es sinnvoll, einen kurzen Kommentar vor
die Funktion zu schreiben, der die Argumente und den Rückgabe-
wert beschreibt. In diesem Kommentar sollte man auch mögliche
Nebenwirkungen der Funktion auflisten (z.B. dass sie einen
bestimmten Pin in der Richtung ändert).
Funktionsaufruf
Das Aufrufen einer Funktion ist ein Ausdruck (und keine Anwei-
sung), d.h. er hat einen Wert, der in weiteren Ausdrücken eingesetzt
werden kann. Es ist allerdings auch möglich, den Rückgabewert
einer Funktion zu ignorieren (das sollte man allerdings mit Vorsicht
tun, oft wird der Rückgabewert benutzt, um z.B. Fehler zu signali-
sieren). Die Syntax eines Funktionsaufrufs sieht so aus:
funktionsName(argumente);
Die Argumente sind eine Folge von Werten, die an die Funktion
übergeben wird. Sie werden mit einem einfachen Komma getrennt.
Es ist wichtig, die richtige Anzahl von Argumenten zu geben, da der
Compiler sonst einen Fehler meldet (bestimmte Funktionen können
eine variable Anzahl von Argumenten bearbeiten, was zum Beispiel
im Anhang Libraries deutlich wird. Es ist auch wichtig, dass die ein-
zelnen Argumente den passenden Datentyp haben. Dazu werden
die gleichen Konvertierungsregeln benutzt, die in Abschnitt »Daten-
typkonvertierung« vorgestellt wurden. Genauso werden bei der wei-
teren Bearbeitung des Rückgabewerts (z.B. Speichern in einer
Variablen) dieselben Konvertierungsregeln angewandt. Im Folgen-
den werden einige Funktionsaufrufe vorgestellt.
Beispiel
machNichts(); // ruft die Funktion machNichts auf, die keine
// Argumente braucht
byte knopfWert = knopfGedrueckt(); // Der Rückgabewert von
// knopfGedrueckt wird in
// knopfWert gespeichert.
int x = analogRead(sensorEinsPin) + 2 * analogRead(sensorZweiPin);
do {
machWas(); // führt die Funktion machWas aus, solange der Knopf
// nicht gedrückt wurde
} while (!knopfGedrueckt())
Funktionsdefinition
Das Hinschreiben einer Funktion (mit Namen, Parametern und
Programmrumpf) nennt man Funktionsdeklaration oder Funk-
tionsdefinition. Eine Funktionsdeklaration ähnelt stark einer Vari-
Funktionen 341
Parameterwert in das erste Argument kopiert, der zweite Parame-
terwert in das zweite Argument usw.
Es ist auch möglich, Tabellen und Zeichenketten als Argumente zu
übergeben. Dazu wird der Tabellentyp in eckigen Klammern ange-
geben. Unten sehen Sie verschiedene Argumentenlisten als Bei-
spiele. Oft ist es bei Tabellen notwendig, der Funktion auch noch
die Tabellengröße zu übergeben (bei Zeichenketten kann die Funk-
tion die abschließende Null erkennen), es sei denn, alle Tabellen,
die der Funktion als Argumente übergeben werden, haben dieselbe
Größe.
Funktionsargumente werden als Werte übergeben (diese Eigen-
schaft nennt man in der Programmierwelt »call-by-value«). Wird
also an einer Stelle eine Variable als Argument übergeben und
dieses Argument innerhalb der Funktion modifiziert, wird die
ursprüngliche Variable nicht modifiziert. Stattdessen wird beim
Aufruf der Funktion eine lokale Kopie der Variablen erzeugt und
im Funktionsrumpf verwendet. Das ist ein bisschen gewöhnungs-
bedürftig (und nicht unbedingt leicht zu verstehen), erhöht aber die
Wiederverwendbarkeit von Funktionen und verhindert auch viele
Programmfehler.
Funktionen können deswegen nur den globalen Status eines Pro-
gramms (globale Variablen) verändern (und natürlich den Zustand
des Arduino-Prozessors). Weitere Veränderungen müssen vom Pro-
grammierer explizit angegeben werden, indem zum Beispiel der
Rückgabewert der Funktion gespeichert wird. Nach dem Zurück-
kehren aus einer Funktion werden alle lokalen Variablen (und alle
Argumente) gelöscht und sind nicht mehr zugänglich. Es ist also
nicht möglich, einen lokalen Wert als Speicherplatz zu verwenden,
der von Funktionsaufruf zu Funktionsaufruf bestehen bleibt. Dazu
muss eine globale Variable verwendet werden.
Beispiel
int zaehlHochFalsch() {
// Diese Funktion gibt immer 1 zurück, weil bei jedem
// Aufruf a neu initialisiert wird.
int a = 0;
a++;
return a;
}
int a = 0;
int zaehleHochRichtig() {
// Diese Funktion gibt bei jedem Aufruf einen hochgezählten
// Wert zurück (also 1, 2, 3 usw.). Nach 32767 wird der
// Wert -32768, weil die Variable a übergelaufen ist.
Funktionen 343
int machWasMitReferenz(int &a) { // a ist jetzt ein call-by-
reference-Argument.
a = a + 10; // Auch die ursprüngliche wird verändert.
}
int foo = 0;
machWas(foo);
// foo ist immer noch 0.
foo = machWas(foo);
// foo ist jetzt 10.
machWasMitReferenz(foo);
// foo ist jetzt 20.
foo = machWas(foo);
// foo ist jetzt 30 (wird aber zweimal zugewiesen).
Funktionen 345
Wert zu berechnen. Das Ergebnis dieser Berechnung wird als Rück-
gabewert an die aufrufende Programmstelle zurückgegeben. Der
Rückgabewert wird aber auch oft benutzt, um den Status der Aus-
führung einer Funktion zurückzugeben (um zum Beispiel zu signa-
lisieren, dass ein Fehler bestimmte andere Ereignisse eingetreten
sind). Für einen einfachen Rückgabestatus »erfolgreich« bzw.
»nicht erfolgreich« reicht ein boolean-Rückgabetyp. Dadurch kann
man auch gleich den Funktionswert in einer Kontrollstruktur ein-
setzen, wie im folgenden Beispiel gezeigt wird. Hier können Sie
außerdem sehen, wie man eine Funktion flexibler gestaltet, indem
man ihr einen zusätzliches Argument übergibt.
Beispiel
boolean istKnopfEinsGedrueckt() {
if (digitalRead(knopfEinsPin) == HIGH) {
return true;
} else {
return false;
}
}
// Diese Funktion kann man auch flexibler schreiben, indem man ihr
// die Nummer des Pins übergibt, an dem ein Knopf angeschlossen ist.
boolean istKnopfGedrueckt(int knopfPin) {
if (digitalRead(knopfPin) == HIGH) {
return true;
} else {
return false;
}
}
Sketch-Struktur
Ein Arduino-Programm wird Sketch genannt. Ein Sketch wird im
Arduino-Editor geschrieben und als Ordner gespeichert, der alle
Daten und Programmdateien enthält, die für das Ausführen not-
wendig sind. Die Programmdateien haben die Endung .pde.
Sketch-Struktur 347
In der Hautpdatei des Sketches müssen zwei Funktionen auf jeden
Fall implementiert werden: setup() und loop().
Die Funktion setup() wird beim Programmstart aufgerufen (also
wenn das Arduino-Board eingeschaltet oder Reset gedrückt wird).
In dieser Funktion werden Variablen initialisiert, Pinmodi gesetzt
sowie benutzte Libraries und zusätzliche Hardware initialisiert.
setup() wird nur einmal ausgeführt.
Beispiel
int buttonPin = 2;
int meinZaehler;
void setup()
{
meinZaehler = 0;
pinMode(buttonPin, INPUT);
[Link](9600);
}
Loop
Die Funktion loop() wird auch als Hauptfunktion bezeichnet. Von
hier aus werden andere Bestandteile des Programms aufgerufen und
Befehle abgearbeitet. Wie der Name schon verrät, läuft loop() in
einer Schleife, das heißt sie beginnt immer wieder von vorn, sobald
sie durchlaufen wurde. In dieser Funktion wird meistens die
gesamte Funktionalität des Sketches implementiert. Einzige Aus-
nahme ist die Funktionalität, die über Interrupt-Routinen imple-
mentiert wird. Interrupts sind allerdings ein fortgeschrittenes
Konstrukt von Arduino und werden meistens in Libraries gekapselt.
Beispiel
void loop()
{
if (meinZaehler > 100) {
Sketch-Struktur 349
und setup() verwendet werden. Eine Strukturierung, die sich als
sinnvoll erwiesen hat, ist, in jeder Datei passende Funktionen loop-
Dateiname() und setupDateiname() zu definieren, die dann in den
eigentlichen loop()- und setup()-Funktionen aufgerufen werden.
Zugriff auf globale Konfigurationswerte wird in sogenannte Getter
und Setter gekapselt. Eine Getter-Funktion liefert nur den Wert
einer Variablen zurück, während eine Setter-Funktion den Wert
einer Variablen setzt. Im folgenden Beispiel werden der Zugriff auf
die globale Variable ZeitInterval gekapselt und eine zweite Datei
[Link] benutzt.
Beispiel
// Dies ist die Hauptdatei des Sketches.
int zeitInterval = 10; // globale Konfigurationsvariable
int getZeitInterval() { // Getter-Funktion zum Lesen von
// zeitInterval
return zeitInterval;
}
void setZeitInterval(int wert) { // Setter-Funktion zum Schreiben
// von zeitInterval
zeitInterval = wert;
}
void setup() {
setupZeit(); // Aufruf der setup-Funktion in der Datei [Link]
}
void loop() {
loopZeit(); // Aufruf der loop-Funktion in der Datei [Link]
}
// Dies ist die Datei [Link] des Sketches.
void setupZeit() {
setZeitInterval(20); // Setzen von zeitInterval auf 20 in der
// Initialisierungsphase
}
void loopZeit() {
delay(getZeitInterval()); // Hauptroutine der Datei [Link] mit
// Lesen der zeitInterval-
// Konfigurationsvariable
}
Funktionsreferenz
In diesem Abschnitt werden die in der Arduino-Programmierspra-
che vordefinierten Funktionen vorgestellt. Sie decken eine breite
Menge von unterschiedlichen Bereichen ab, von der Kommunika-
tion mit der elektronischen Außenwelt (digitale und analoge Ein-
und Ausgabe) über Zeitfunktionen (Zeitmessen und Warten) und
mathematische Funktionen bis hin zur Kommunikation mit dem
Computer über die serielle Schnittstelle (bzw. die USB-Schnittstelle).
pinMode(pin, mode)
Diese Funktion initialisiert die »Richtung« eines digitalen Pins. pin
ist die Nummer des Pins, wie sie auf dem Arduino-Board geschrie-
ben steht. Jeder Pin, auch die als »analog« markierten, kann als
digitaler Eingangs- und Ausgangspin initialisiert werden. .mode
definiert die Richtung und kann entweder INPUT sein, um den Pin
als Eingangspin zu initialisieren, oder OUTPUT, um den Pin als Aus-
gangspin zu initialisieren.
Beispiel
pinMode(13, OUTPUT); // initialisiert Pin 12 als Ausgangspin
pinMode(9, INPUT); // initialisiert Pin 9 als Eingangspin
digitalWrite(pin, value)
Diese Funktion setzt die Spannung eines als Ausgangspin definier-
ten digitalen Pins oder aktiviert die Pull-up-Funktionalität für Pull-
up-Widerstände eines als Eingangspin definierten digitalen Pins.
Wird der Wert des digitalen Ausgangspins auf HIGH gesetzt, legt
der Arduino-Prozessor eine Spannung von 5 Volt (bzw 3,3 auf
Boards mit 3,3-Volt-Versorgungsspannung) an den Pin an. Wird
der Wert auf LOW gesetzt, legt der Arduino-Prozessor eine Span-
nung von 0 Volt an.
Ist der Pin als Eingangspin definiert, wird beim Schreiben eines
HIGH-Wertes der interne Pull-up-Widerstand des Arduino akti-
viert, und der Pin wird auf die Versorgungsspannung »hochgezo-
gen«. Wird auf den Eingangspin der Wert LOW geschrieben, wird
der Pull-up-Widerstand deaktiviert.
Beispiel
pinMode(13, OUTPUT); // initialisiert Pin 12 als Ausgangspin
digitalWrite(13, HIGH); // Jetzt liegen 5V an Pin 13 an.
digitalWrite(13, LOW); // Jetzt liegen 0V an Pin 13 an.
pinMode(9, INPUT); // initialisiert Pin 9 als Eingangspin
digitalWrite(0, HIGH); // Der Pull-up-Widerstand auf Pin 9 ist aktiviert.
digitalWrite(0, LOW); // Der Pull-up-Widerstand auf Pin 9 ist deaktiviert.
Funktionsreferenz 351
int digitalRead(pin)
Mit dieser Funktion lassen sich digitale Werte (HIGH oder LOW)
auslesen, die an einem digitalen Eingangspin anliegen. Der Pin
muss vorher als digitaler Eingangspin festgelegt worden sein. Liegt
keine definierte Spannung am Eingangspin an (z.B. wenn nichts
angeschlossen wurde), kann digitalRead einen zufälligen Wert
zurückgeben.
Beispiel
pinMode(9, INPUT); // initialisiert Pin 9 als Eingangspin
int val = digitalRead(9);
int analogRead(pin)
Mit analogRead wird die Spannung, die an einem analogen Ein-
gangspin anliegt, ausgelesen. Der Rückgabewert geht von 0 (0V)
bis 1.023 (Referenzspannung). Das Einlesen analoger Werte dauert
deutlich länger als das Einlesen digitaler Werte, was unter Umstän-
den berücksichtigt werden muss.
Wie bei digitalRead werden bei einem Pin, an dem keine definierte
Spannung anliegt, einigermaßen zufällige Werte zurückgegeben (je
nachdem, wie nah der Benutzer am Arduino ist, wie hoch die Luft-
feuchtigkeit ist und ob mit einem Gummihuhn über der Schaltung
gewedelt wird).
analogWrite(pin, value)
Obwohl die analogWrite-Funktion in der analogen Kategorie aufge-
listet wird, wird sie konkret benutzt, um den Arbeitszyklus eines
PWM-Pins festzulegen. Wie in Kapitel 3 beschrieben, wird bei
PWM-Pins (auf dem Arduino Duemilanove sind das die Pins 3, 5,
6, 9, 10 und 11) periodisch zwischen HIGH und LOW alterniert.
Mit analogWrite lässt sich die Länge der HIGH-Periode einstellen
(aber nicht die Periodendauer).
analogReference(type)
Mit analogReference lässt sich die Referenzspannung, die der AD-
Wandler benutzt, umstellen. Dies ist eine fortgeschrittene Funktion
und sollte mit großer Vorsicht eingesetzt werden, weil man damit
den Arduino-Prozessor beschädigen kann. Die Referenzspannung
bestimmt, welche Spannung den Wert 1.023 beim Aufruf von ana-
logRead() bekommt. Ist die Referenzspannung 5 Volt, wird 0 Volt
als 0 gelesen, 5 als 1.023, und 2,5 als 512. Ist die Referenzspannung
allerdings 1 Volt, wird 0 Volt als 0 gelesen, 1 als 1.023, und 0,5 als
512. Wird eine höhere Spannung als die Referenzspannung an einen
analogen Eingang angelegt, besteht die Möglichkeit, den Arduino-
Prozessor zu beschädigen. Es ist also große Vorsicht geboten, wenn
die Referenzspannung verändert wird, was bei bestimmten Sensoren
zur Erhöhung der Genauigkeit notwendig ist. Die Referenzspan-
nung kann nicht höher als die Versorgungsspannung liegen (in den
meisten Fällen 5 Volt, auf einigen Arduino-Clones allerdings 3,3).
Weiterhin ist es sehr sinnvoll, Referenzspannungen an den AREF-
Pin über einen 5.000-Ohm-Widerstand anzuschließen, um den
Arduino-Prozessor zu schützen. Dadurch wird ein zu großer Strom-
fluss verhindert, falls die aktuellen Referenzspannungseinstellun-
gen nicht kompatibel zum Aufbau der Schaltung sind.
Es gibt drei mögliche Einstellungen für die Referenzspannung, die
mit dem type-Argument gesetzt werden. Die normale Einstellung
(wenn als Argument DEFAULT übergeben wird), die für die meisten
Fälle ausreichen sollte, ist das Verwenden von AVCC (also der
analogen Betriebsspannung, die 5 Volt beträgt) als Referenzspan-
nung. Der AREF-Pin muss frei sein und wird intern mit AVCC
beschrieben.
Funktionsreferenz 353
Die zweite Möglichkeit ist das Anschließen einer internen Span-
nung von 1,1 Volt als Referenzspannung. Dazu muss type als
INTERNAL gesetzt werden.
Die dritte Möglichkeit ist das Konfigurieren der Referenzspannung
über den AREF-Pin, indem type als EXTERNAL gesetzt wird. Dazu
wird die Spannung an AREF angelegt (am besten über einen 5.000-
Ohm-Widerstand, um Fehler zu vermeiden). Diese Spannung wird
dann als Referenzspannung benutzt.
Funktionsreferenz 355
Timeout als drittes Argument zu übergeben), gibt die Funktion 0
zurück. Die Zeitmessungen dieser Funktionen können von 10
Mikrosekunden bis ungefähr 3 Minuten gehen, werden allerdings
ungenauer, je länger der Puls ist.
Beispiel
pinMode(9, INPUT); // initialisiert Pin 9 als Eingangspin
int pulsLaenge = pulseIn(9, HIGH); // misst einen positiven Puls
// auf Pin 9
pulsLaenge = pulseIn(9, HIGH, 400);// misst einen positiven Puls
// auf Pin 9, gibt 0 zurück, falls
// innerhalb von 400 Mikrosekunden
// kein Puls erkannt wurde
Zeitfunktionen
Es ist oft notwendig, Zeiten zu messen und auch bestimmte Zeiten
zu warten, um Programme zu implementieren. Diese Zeiten lassen
sich in zwei größere Ebenen einteilen: »menschliche Zeit«, also
Zeitintervalle, die für Menschen bemerkbar sind. Diese reichen von
ein paar Millisekunden (wenn z.B. LEDs blinken sollen) bis zu
mehreren Sekunden oder gar Minuten (wie z.B. beim Brainma-
chine-Workshop in ). Auf der anderen Seite gibt es die »Compu-
terzeit«, die deutlich schneller ist. Sie wird z.B. benötigt, um auf
bestimmte Sensoren oder Chips zu warten, um ein Kommunikati-
onsprotokoll genau zu implementieren, um Lichter zu dimmen (sie
also so schnell flackern zu lassen, dass der Mensch es nicht
bemerkt).
Deswegen sind die zwei Zeitfunktionen (eine Funktion zum
Messen von Zeit und eine Funktion zum Warten) immer in zwei
Versionen vorhanden: eine für Millisekunden und eine für Mikro-
sekunden (es gibt 1.000 Millisekunden in einer Sekunde und 1.000
Mikrosekunden pro Millisekunde). Der Arduino-Prozessor läuft
mit 16 MHz, d.h. er kann bis zu 16 Millionen Instruktionen pro
Sekunde ausführen. Das setzt auch die unterste Grenze für die Auf-
lösung gemessener Zeitwerte fest. Jeder Zyklus ist genau 0,0625
Mikrosekunden lang, es ist also nicht möglich, mit dem Arduino
sehr genaue Werte in Mikrosekunden überhaupt zu messen. Wei-
terhin entstehen durch den Aufruf der Funktion und unterschiedli-
che andere Nebenwirkungen (wie z.B. periodische Interrupts, die
in Arduino verwendet werden) Verzögerungen, die sich nicht vor-
aussagen lassen. Dadurch ist die Genauigkeit dieser Zeitfunktionen
mit Vorsicht zu genießen.
delay(ms)
Diese Funktion hält das Ausführen des Programms für die angege-
bene Zeit ms (Millisekunden) an. In Wirklichkeit läuft der Prozes-
sor weiter (es werden z.B. auch Interrupt-Funktionen weiter
aufgerufen) und führt nur Anweisungen aus, die nichts bewirken.
Die serielle Schnittstelle läuft deswegen problemlos weiter und
empfangene Bytes werden weiter im Puffer gespeichert. Auch mit
PWM gepulste Pins (siehe ) laufen während eines delay-Aufrufs
weiter. Allerdings ist es in dieser Zeit auch nicht möglich, z.B. wei-
tere Werte aus einem Sensor oder von Tastern auszulesen. Deswe-
gen ist es bei längeren Pausen (von mehr als nur ein paar
Funktionsreferenz 357
Millisekunden) besser, auf die Funktionen micros() und millis()
auszuweichen, um bestimmte zeitabhängige Verhalten zu imple-
mentieren.
Da Interrupts weiterlaufen, während delay() ausgeführt wird, ist
die zeitliche Genauigkeit der Funktion nicht sehr hoch. Sie sollte
nicht eingesetzt werden, um zeitkritische Verhalten zu implemen-
tieren. Auch in diesem Fall ist es besser, die Funktion millis() zu
benutzen oder die Interrupts zu deaktivieren.
In dem folgenden einfachen Beispiel wird eine LED zum Blinken
gebracht.
Beispiel
int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT); // Der LED-Pin wird als Ausgang
// initialisiert.
}
void loop() {
digitalWrite(ledPin, HIGH); // LED anschalten
delay(1000); // 1000 Millisekunden warten (also eine
// Sekunde)
digitalWrite(ledPin, LOW); // LED ausschalten
delay(1000); // eine weitere Sekunde warten
}
Das folgende Beispiel zeigt, wie man das Blinken der LED ohne
delay() implementieren kann. Dazu wird in jedem loop()-Aufruf
die Zeit gemessen, die verlaufen ist, und entsprechend die LED an-
und ausgeschaltet. Das Beispiel scheint relativ uninteressant zu
sein, aber im Vergleich zum vorigen Programmbeispiel lassen sich
jetzt z.B. problemlos Taster abfragen. Würde man delay() mit Tas-
tenabfragen kombinieren, würden viele verloren gehen, weil der
Prozessor in dieser Zeit damit beschäftigt wäre, delay() auszufüh-
ren.
Beispiel
int ledPin = 13;
int ledValue = LOW; // der aktuelle Wert der LED
long ledSchaltZeit = 0; // die Zeit, zu der die LED zuletzt
// geschaltet wurde
long intervall = 1000; // die Länge des Intervalls zwischen jedem
// Schalten
void setup() {
pinMode(ledPin, OUTPUT); // Der LED Pin-wird als Ausgang
// initialisiert.
}
void loop() {
// zeit speichert die Dauer seit dem letzten Schalten.
delayMicroseconds(us)
delayMicroseconds() ist das Mikrosekunden-Pendant zur delay()-
Funktion. Auch hier gibt es wichtige Unterschiede. Im Unterschied
zur delay()-Funktion ist delayMicroseconds() zwischen ungefähr 3
Mikrosekunden und 16.383 Mikrosekunden sehr genau. Um diese
Genauigkeit zu erreichen, werden allerdings die Interrupts deakti-
viert, d.h. es werden keine Daten auf der seriellen Schnittstelle
empfangen, und Zeiten, die von millis() und micros() zurückge-
geben werden, werden nicht hochgezählt. delayMicroseconds()
sollte man deswegen nur für sehr kurze Pausen benutzen, delay()
dagegen für längere. Wegen der Art, wie delayMicroseconds()
geschrieben wurde (um diese Genauigkeit einzuhalten), führt
delayMicroseconds(0) zu einer deutlich längeren Pause von unge-
fähr 1.020 Mikrosekunden.
min(x, y)
Diese Funktion gibt die kleinere der beiden Zahlen x und y zurück.
Sie kann auf alle numerischen Datentypen angewandt werden. Aus
Funktionsreferenz 359
nicht ganz intuitiven Gründen wird min oft benutzt, um die obere
Grenze einer Variable zu setzen. Aus Implementationsgründen
sollte man vermeiden, weitere Ausdrücke in die Parameter von min
zu schreiben, da die Gefahr besteht, sie mehrmals auszuführen.
Deswegen sollte man unbedingt darauf achten, reine Zahlen und
Variablen als Argumente an min (und an max) zu übergeben.
Beispiel
int x = 13;
x = min(x, 12); // x wird nie größer als 12 sein.
min(x++, 20); // Diese Schreibweise ist falsch, x++ könnte
// mehrmals ausgeführt werden.
x++;
min(x, 20); // Dies ist die richtige Schreibweise.
max(x, y)
Diese Funktion gibt die größere der beiden Zahlen x und y zurück.
Wie min kann auch max auf alle numerischen Datentypen ange-
wandt werden. Auch nicht ganz intuitiv ist die Anwendung von max
zum Setzen der unteren Grenze einer Variablen. Zum Einschränken
einer Variablen nach oben und unten sollte man allerdings auf die
schwer lesbare Kombination von min und max verzichten und statt-
dessen die Funktion constrain einsetzen. Auch hier sollten nur
Variablen und Zahlen als Argumente übergeben werden.
Beispiel
int x = 13;
x = max(x, 5); // x wird nie kleiner als 5 sein.
// Folgendes ist schwer zu lesen.
int y = 80;
y = max(min(y, 100), 20); // y wird immer zwischen 20 und 100
sein.
abs(x)
Diese Funktion gibt den Absolutwert einer Zahl zurück (also x,
wenn x positiv ist, und –x, wenn x negativ ist) und kann auf alle
numerischen Datentypen angewandt werden. Auch an abs dürfen
nur Variablen und numerische Zahlenwerte übergeben werden,
keine beliebigen Ausdrücke.
Beispiel
int x = 13;
int y = abs(x); // y ist 13.
x = -13;
y = abs(x); // y ist 13.
sq(x)
Diese Funktion gibt das Quadrat einer Zahl zurück.
Funktionsreferenz 361
pow(base, exponent)
Diese Funktion gibt die Potenz der Zahl base zurück. Der Grad der
Potenz wird im Argument exponent übergeben. Die Argumente der
pow-Funktion sind Fließkommazahlen, sodass auch Bruchwerte als
Potenzen eingesetzt werden können (z.B. um Wurzeln oder expo-
nentielle Werte zu berechnen). Allerdings ist deswegen die Funk-
tion relativ langsam und sollte sparsam (oder mithilfe von Lookup-
Tabellen, siehe Kapitel 4, »LED-Matrix«) eingesetzt werden. Alle
weiteren Funktionen (insbesondere die trigonometrischen) in die-
sem Abschnitt arbeiten mit Fließkommazahlen und komplizierten
Algorithmen und sind deswegen sehr langsam.
sqrt(x)
Diese Funktion gibt die quadratische Wurzel einer Fließkomma-
zahl zurück.
sin(rad)
Diese Funktion gibt den Sinus eines Winkels rad, der in Radian
angegeben ist, zurück.
cos(rad)
Diese Funktion gibt den Kosinus eines Winkels rad, der in Radian
angegeben ist, zurück.
tan(x)
Diese Funktion gibt den Tangens eines Winkels rad, der in Radian
angegeben ist, zurück.
Zufallszahlen
Es ist möglich, auf dem Arduino-Prozessor Zufallszahlen zu erzeu-
gen. Allerdings sind diese nicht »echte« Zufallszahlen, sondern
werden algorithmisch generiert. Ein sogenannter PRNG (pseudo-
random number generator, pseudozufälliger Zahlengenerator) rech-
net immer wieder neue Zahlen aus, die in keiner ersichtlichen
logischen Reihenfolge zueinander stehen. Wird dieser PRNG mit
demselben Wert initialisiert (das Initialisieren nennt man auf eng-
lisch seeding, also »Samen pflanzen«, den Initialisierungswert seed,
also »Samen«), generiert er auch dieselbe Folge an Zufallszahlen.
Das kann ein Vor- oder ein Nachteil sein. Auf der einen Seite kön-
nen immer wieder gleiche Zufallszahlen nach einer gewissen Zeit
randomSeed(seed)
Mit dieser Funktion wird der PRNG initialisiert.
Serielle Kommunikation
Mit den folgenden Funktionen lässt sich die serielle Schnittstelle
des Arduino-Prozessors konfigurieren und benutzen (siehe ). Diese
serielle Schnittstelle ist über einen weiteren Chip an die USB-
Schnittstelle angebunden und kann so einfach an jedem Computer
angebracht werden. Die Funktionen in diesem Abschnitt können
verwendet werden, um sowohl Daten vom Arduino-Prozessor an
den Computer zu schicken als auch Daten vom Computer aus an
den Arduino-Prozessor zu übermitteln.
[Link](speed)
Bevor die serielle Schnittstelle verwendet werden kann, um Daten
zwischen Computer und Arduino-Prozessor auszutauschen, muss
erst die Geschwindigkeit der Übertragung eingestellt werden. Diese
Geschwindigkeitseinstellung (und weitere Initialisierungen der seri-
ellen Schnittstelle und der dazugehörigen Speicherdaten) werden
Funktionsreferenz 363
durch die Funktion [Link]() implementiert. Als Argument
wird ihr die gewünschte Geschwindigkeit der Schnittstelle in Bits
pro Sekunde (oder auch Baud) mitgegeben. Aus technischen und
historischen Gründen sind allerdings nicht alle Geschwindigkeiten
möglich, sondern nur folgende (die vielleicht noch aus Modemzei-
ten bekannt sind): 300, 1.200, 2.400, 4.800, 9.600, 14.400, 19.200,
28.800, 38.400, 57.600 oder 115.200 Bits pro Sekunde. Es ist wich-
tig, dass auf der empfangenden Seite (auf dem Computer) und im
Sketch die gleichen Geschwindigkeiten eingestellt sind.
Es ist nicht möglich, die serielle Schnittstelle vor der Initialisierung
zu benutzen. Deswegen ist in den meisten Sketches, die die serielle
Schnittstelle verwenden, ein Aufruf an die Funktion [Link]()
als erste Anweisung in der Funktion setup zu sehen. Ein weiterer
wichtiger Punkt ist, dass nach dem Initialisieren der seriellen
Schnittstelle die Benutzung der ersten zwei digitalen Pins nicht
mehr möglich ist, weil diese Pins die eigentliche serielle Schnitt-
stelle bilden (ein Pin für den Datenempfang und einer für den
Datenversand).
int [Link]()
Der Arduino-Prozessor empfängt Daten, die vom Computer aus
über die serielle Schnittstelle geschickt wurden, automatisch in
einer getrennten Interrupt-Routine. Diese Routine speichert die
empfangenen Daten in einem kleinen Puffer, damit der Sketch, der
auf dem Arduino-Prozessor läuft, nicht dauernd unterbrochen
wird. Die Funktion [Link]() prüft, ob Daten in diesem
Zwischenpuffer empfangen wurden, und gibt zurück, wie viele
Bytes an Daten vorhanden sind. Es ist wichtig, regelmäßig Daten
aus diesem Puffer mithilfe der Funktion [Link]() auszulesen
oder ihn mit [Link]() zu leeren, damit er nicht überläuft (er
kann maximal 128 Bytes zwischenspeichern).
int [Link]()
Diese Funktion liest das nächste Byte aus dem Empfangspuffer und
gibt es zurück. Dadurch wird wieder ein Byte in diesem Puffer frei.
Falls keine Daten empfangen wurden, gibt die Funktion –1 zurück.
Beispiel
void setup() {
[Link](9600); // Initialisieren der seriellen
// Schnittstelle auf 9600 Baud
}
[Link]()
Mit dieser Funktion lässt sich der komplette Empfangspuffer leeren
(z.B. beim Neuinitialisieren des Programms). Diese Funktion ist
auch nützlich, wenn z.B. ein Überlauf des Empfangspuffers erkannt
wurde und die enthaltenen Daten nicht mehr gebraucht werden.
[Link](data) / [Link](data)
Mit diesen zwei Funktionen können beliebige ganzzahlige Werte
und Zeichenketten auf der seriellen Schnittstelle ausgegeben wer-
den. Die Funktion [Link]() fügt eine Leerzeile an das Ende
der Ausgabe ein.
Wird [Link] ohne zweites Argument verwendet, wird das
erste Argument in Dezimaldarstellung ausgegeben. Es ist allerdings
möglich, die Darstellung als zweites Argument an [Link]()
zu übergeben, um so z.B. eine Zahl in Hexadezimaldarstellung aus-
zugeben. Es ist so möglich, mit DEC eine Zahl in Dezimaldarstellung
auszugeben, mit HEX in Hexadezimaldarstellung, mit OCT in Oktal-
darstellung, mit BIN in Binärdarstellung und mit BYTE als ASCII-Zei-
chen.
Es ist nicht möglich, Fließkommazahlen auf der seriellen Schnitt-
stelle auszugeben; sie werden in ganzzahlige Zahlen konvertiert. Es
ist allerdings möglich, diese Fließkommazahlen vor dem Ausgeben
noch mit 10 oder 100 zu multiplizieren, um so zumindest ein paar
Nachkommaziffern anzeigen zu können.
Beispiel
void setup() {
[Link](9600); // Initialisieren der seriellen
// Schnittstelle auf 9600 Baud
}
void loop() {
// gibt die Zahlen von 0 bis 9 auf der seriellen Schnittstelle aus
Funktionsreferenz 365
for (int x = 0; x < 10; x++) {
[Link]("Normal: ");
[Link](x);
[Link]("DEC: ");
[Link](x, DEC);
[Link]("OCT: ");
[Link](x, OCT);
[Link]("HEX: ");
[Link](x, HEX);
[Link]("BIN: ");
[Link](x, BIN);
}
}
Händler Internet
bausteln [Link]
TinkerSoup [Link]
367
Index
| 369
Prototypen 7 B
Proxy 137
BakerTweet 15
Pulsweitenmodulation 251
Banzi, Massimo 2
Reset-Schalter 19
Basis
Sensoren 20
Transistor 105
serielle Kommunikation 131
Battery Shield 270
serielle Konsole 132
Bausteln-Projekt 21
Shield 269
Bauteile
Sounderzeugung 12
Bedrahtete 44
Spiele 12
Oberflächenbauteile 44
Stromanschluss 19
parallel schalten 39
Syntax 291
passive Komponente 44
Übertragungsleuchte 19
surface mounted devices (SMD) 44
USB-Chip 18
Benutzerschnittstelle 33
USB-Port 18
Beschleunigungssensor 241
Varianten 267
Beschleunigungssensoren 176
visuelle Effekte 9
Betawellen 121
Webserver 157
Bibliothek 275
Wii Balance-Board 14
Biegungssensor 186
Arduino Bluetooth 266
Bilderrahmen 17
Arduino Duemilanove 18, 265
bipolare Spannung 250
Arduino Lilypad 267
Bitübertragungsschicht 153
Arduino Mega 266
Blinkenlights 12
Arduino Mini 267
Blinkenlights-Projekt 109
Arduino Nano 267
Boarduino 268
Arduino Pro 5V 266
Boolesche Operation 324
Arduino Proto Shield 269
Bootloader 62
Arduino RepRap Shield 270
Botanicalls 161
Arduino, Giovanni 2
Bouncing
Arduinoboy 14
Prellen 95
Arduino-Entwicklungsumgebung
Boxsack 11
Codefenster 27
Brain Machine 122
Konsole 27
Brainmachine 65
Sketch 26
BrainPong 185
Sketchbook 28
Brainwave 128
Skizzenbuch 28
Breadboard-Shield 269
Symbolleiste 26
Brewboard 15
Syntax Highlighting 28
BrewTroller 15
Arduinome 272
Buchse 58
Arduino-Shield 269
Buchsenleisten 60
ArduPilot 268
Buchstaben 301
Argumentenliste 341
Byte 130
arithmetische Operation 315
Arnold, Frank 247
Array 91 C
Arrays 302 Cadmiumsulfid 175
Atari 12 Cahill, Thaddeus 227
Atmega168 18 Callback-Funktion 244
Atmega328 18 capSense-Bibliothek 288
Ausdruck 309, 310 Channel Pressure-Nachricht 236
Chip 41
370 | Index
Codierung E
analoge 41
EAGLE 46
digitale 41
Echtzeit-MIDI-Nachricht 236
Controller Change-Nachricht 236
EEPROM 165, 276
Creative Commons 3
Lebensdauer 170
Cuartielles, David 2
Schreibzyklen 169
Eingabepin 87
D Eingabesensoren 273
Dance Dance Revolution 34 Eingabe-Shields 273
Datenblätter 44 Elektret-Kondensatormikrofone 183
Datenblattsammlungen 45 Elektretmikrofone 183
Datentyp 86 elektrische Regel 43
Variablen 86 elektrischer Leiter 43
Datentypen 297 elektrischer Strom 36
Numerische 298 Elektroenzephalografie 185
Datentypkonvertierung 312 Elektrolytkondensator 53
Debounce-Bibliothek 94, 285 elektromechanische Klangerzeugung 227
Dehnungsmessstreifen 186 Elektron 36
Dekrementierungsoperation 326 Elektronische Klangerzeugung 250
Deltawellen 121 elektronisches Klavier 248
Desktopcomputer 33 Elko 53
Die binäre Brücke 11 Entkopplungskondensator 250, 260
Diecemila 265 Entlöten 71
Differenzdrucksensor 185 Entlötlitze 71
Digiripper 9 Entlötpumpe 72
Digital-Analog-Wandler 251 Entwicklungsumgebung
digitale Codierung 41 Processing 2
Digitale Ein- und Ausgabe 351 Epoxidharz 43
digitale Kommunikation 129 E-Reihen 50
Dihardja, Daniel 247 Erschütterungssensor 194
Dimmen 107 Ethernet 277
Diode 55 exklusiver ODER-Operator 319
Anode 55 EyeToy 34
Kathode 55
diskrete Spannungswerte 41 F
Display
Fehlerquellen 77
Siebensegment 111
Feldeffekttransistor 105
Diver Sequencer 248
Fernbedienung 173
DMX 273
Feuchtigkeitssensor 182
DMX-shield 273
Filtern 260
do ... while-Kontrollstruktur 338
Fingerabdruckssensoren 184
Dorsum Arduino 2
Firmata 144, 281
DPDT (Double Pole, Double Throw) 49
Bibliothek 281
DPST (Double Pole, Single Throw) 49
Schnittstelle 281
Drehknopf 102
Flash 4
Helligkeit 102
Flexsensoren 53
Drehregler 172
Fließkommazahlen 301
Dreiachsen-Beschleunigungssensor 241
Flugdrohne 173, 177
Drei-Wege-Handshake 154
Fluidforms 11
Drucksensoren 53
Flusskontrolle 151
Dynamisches Mikrofon 183
Index | 371
for-Kontrollstruktur 334 Hirnwellenfrequenz 127
Fototransistor 175 HMC6352 182
Fotowiderstand 53 Hochpräzisionswiderstände 50
Fotowiderstand (LDR) 175 Holm, Eric 13
Fotozelle 53 Honeywell 182
[Link] XVI HTTP 155
Frequenzen 260 Hygrometer 182
Frequenztabelle 259 Hypertext Transport Protocol (HTTP) 155
Funktion 92, 338, 342
Argumente 92 I
Funktionsargumente 342
i2c 241
Funktionsaufruf 338
IC 61
Funktionsdefinition 340
if ... else-Kontrollstruktur 328
Funktionsdeklaration 340
if-Kontrollstruktur 327
Igoe, Tom 3
G Illuminato 268
Gadget 16 IMAP 155
Galliumarsenid 105 In-Circuit Serial Programming
Gammawellen 121 ICSP 19
Gasdrucksensor 185 Infrarotsensoren 181
gEDA 46 Inkrementierungsoperation 326
Gehirnmaschine 122 Input 32
Gehirnwellenmaschine 16 Input-Output
Geschweifte Klammern ({}) 294 IO 88
Glasfaser 43 [Link] XVII
Gleichspannung 56 Integer
Gleichstrommotor 188 Zahl 86
Glühbirnen vs. LED 106 integrated circuit 41
GND Interaction Design 2
Ground 85 Interaction Design Institute Ivrea (IDII) 2
Gobetwino 137 Interactive Telecommunications Program 3
Gotcha 14 Internet Protocol (IP) 153
GPS-Shield 272 Interrupt-Routine 255
Grundton 263 IO
Gyroskop 178 Pin 88
IP-Adresse 154
H iPhone 33
iterieren 91
Halbleiter 40
Halbleitermaterial 54
Hall, Edwin 180 J
Hall-Sensor 180 Joystick 173, 273
Handluftpumpen 247
Hauptfunktion 84 K
loop() 84
Kabel 58
Hayward, David 107
Kapazitiver Pad 173
Heißluftpistole 72
kapazitiver Sensor 179
Helligkeitsstufen 102
Kathode 85
Hexadezimaldarstellung 301
Katze 17
HIGH-Spannung 41
372 | Index
Key Pressure-Nachricht 236 libraries 275
KiCad 46 Lichtschranke 176
Kingbright TA20 110 Lichtsensor 146
Klangstufen 10 Lichtwechsel 93
Kleidung 8 Lichtwecker 107
Kohleschichtwiderstände 50 Light Intensity 175
Kollision 148 Lilie, Anita 16
Kommentare 295 Linux 22
Kommunikation LiquidCrystal 282
Protokoll 129 Liquidware 273
Kompass 182 Liquidware TouchShield 271
Kompilieren 95 Lochrasterplatine 43, 65
Kondensator 53 Logarithmustabelle 100
Farad 53 Logische Negierung 320
Filter 54 Logische Operation 316
Konstanten 308 Löten 64
Kontrollstruktur 327 Sicherheit 72
Kraftsensor 185 Lötkolben 67
Krokodilklemmen 59 Lötpunkte 70
Künstler 8 Lötspitze 67
Kupferleiterbahn 43 Lötvorgang 69
Kupferlitze 59 Lötzinn 68
Flussmittel 68
L ROHS-Regelung 68
Low Frequency Oscillator (LFO) 257
L293 189
LOW-Spannung 41
Ladyada XVII
LSBFIRST 355
Lampe
Luftfeuchtigkeit 182
Farbverläufe 100
Luftverschmutzung 9
Lampen 106
Laptop 130
RS232-Schnittstelle 130 M
Laserharfe 248 Mac OS X 22
Laserspiele 13 Make Magazine XVI
Laufschrift 109 March Frame Projec 16
Lautsprechermembran 250 Maskierung 317
LCD-Bildschirm 282 Masse 85
LDR (Fotowiderstand) 53, 162, 175 mathematische Funktion 359
LED 109, 187 Matrix 109
Anode 85 Flackern 115
Auge 98 MAX/MSP 11
Diode 84 Max/MSP 4
Kathode 85 [Link] XVII
Lichtfarbe 85 Mellis, David 2
light emitting diodes 84 Melodien 259
Matrix 110 MEMS 176
Leistung 39 Messung
Leuchtdioden 106 analoger Eingang 102
Leuchtstofflampen vs. LED 106 Metalldetektor 180
Leyh, Arvid 122 Metalloxid-Halbleiter-Feldeffekttransistor
LFO 257 Mosfet 105
Index | 373
Metallschichtwiderstände 50 Nintendo Gameboy 14
MicroSD Module 272 Note Off 236
MIDI 231 Note On 236
Temposynchronisation 236 NPN-Transisto 105
Timing Master 236 Nullpunkt 262
Timing Slave 236 Nunchuck 173, 241
Midi 143
Midi Monitor 235 O
MidiDuino 239
Obertöne 260
Bibliothek 239
Objekt 95
MIDI-Gerät 231
ODER-Operator 319
MIDI-Nachrichten 235
Ohmsches Gesetz 37
MIDI-Protokoll 231, 233
Open Heart Kit 65
MIDI-Sniffer 235
Open Source 5
Miduino 268
Open Systems Interconnection Model 129
Mika Satomi 186
OpenEEG 185
Mikrocontroller 32
Operationen 311
Mikrofon 106
Optokoppler 237
Mikrofone 183
OSI-Modell 129
Milk Lamp 107
Oszilloskop 81
MIT Media Lab 2
Output 32
Mittelwert 101
Modulo 93
Modulo-Operation 315 P
Moll-Arpeggio 258 Pad 173
Mollterz 258 Paintball 13
Monome 232 Parameter 338
Moog, Bob 228 Parker, Alastair 13
Morup, Mikael 137 Perner-Wilson, Hannah 186
Motion-Capturing 186 Physical Computing 31
Motor-Driver 189 Grundlagen 35
Motoren 188 Rechnen 42
MSBFIRST 355 Sensoren 171
Multimeter 78 Piezoeffekt 184
Spannungen messen 80 Piezoelektrisches Mikrofon 184
Ströme messen 81 Pin
Widerstandswerte messen 80 Festlegung 84
Multitouch-Oberfläche 33 Setup-Routine 84
Musik-Shield 271 Pinzette 64
Platine 43
N Pocket Piano Shield 249
Nam June Paik 9 Pong 12
Natal 34 POP3 155
Negative Zahlen 300 Potentiometer 102, 172
Negierungsoperator 320 Powerball 13
Nervenzellen Präzedenzregeln 314
Spannungsimpulse 121 Prellen 94
Niedrigfrequenzoszillator 258 Bouncing 95
PRNG (pseudorandom number generator) 362
Nintendo 177
374 | Index
Processing 2, 142 S
Drehknopf 145
s2midi 234
Program Change-Nachricht 236
Sanguino 267
Programmblock 294
Schaltbild
Programmiersprache 84
Verbindungen 46
Programmrumpf 340
Schalter 48, 87
Programmstruktur 293
Ball Switches 48
Propellurino 270
Taster 49
Protoduino 269
Schaltkreis 36, 61
pseudozufälliger Zahlengenerator 362
elektrischer 35
Pulswellenmodulation
Schaltung 43
PWM 97
analoge 40
Zähler 98
digitale 40
Punkten 42
Schaltungen
PWM
Fehlersuche 73
Pulsweitenmodulation 97
Temperatursensortransistorverstärkungsschal-
tung 74
Q Schieberegler 273
Quadrokopter 178 Fader 52
Quecksilberspeicher 230 Schleife
Quinte 258 for() 91
loop() 91
R Schleifendurchlauf 91
Schrittmotor 189
R.E.M. 142 Schutzbrille 122
Radio Frequency Identification, (RFID) 271 Seitenschneider 63
Raes, Godfried-Willem 228 Semikolon 294
Rails 65 Sensor
Rapid Prototyping XI resistiver 39, 53
Rauschen 260 Sensoren 171
Raute (#) 138 Septime 258
Reed-Relais 180 Sequencer 229
Relais 54 Serielle Kommunikation 363
RepRap 267 Servo
reservierte Zeichen 296 Bibliothek 284
resistive Sensoren 172 Servo (siehe Servomotor) 139
Resistiver Pad 173 Servomotor 138, 188
resistiver Touchscreen 174 Servomotoren 284
Resistor Capacitator (RC) 180 shiften 321
Restwert 315 Shift-Register 62
RFID 271 SID-Chip 272
RGB-LED 106 Siebensegment 111
Ribbon Controller 173 Signal
Roaming Drone 175 digitales 86
Roboduino 268 elektrisches 35
Roboter 12 Silizium 54
Rotor 189 Sketch 347
Rückgabetyp 309 Funktionsreferenz 350
Rückgabewert 309 Kompiliervorgang 26
Index | 375
loop() 348 Thetawellen 121
.pde 349 Tiefpassfilter 106, 249, 260
Stop-Symbol 27 Tilde (~) 320
Struktur 347 Tildenoperator (~) 116
Sleeptracker 16 [Link] XVI
SMTP 155 Tischzange 69
SN754410NE 189 dritte Hand 69
Sniffer 155 Tomczak, Sebastian 9
Solenoid 190 Tonhöhe 127
Sonar 181 Touchpad 173
Sonic Body 11 Touchscreen 174
Soundchip 271 TouchShield 271
Spannung 35, 41, 86 Transistor 54
U 86 Basis 105
Volt 35 Emitter 105
Spannungsregler 56 Kollektor 105
Spannungsteiler 38 NPN 105
Spannungswert 50 PNP 105
SparkFun 176 Transistoren 105
SPDT (Single Pole, Double Throw) 49 Treiberbaustein 61
Spielekonsolen 12 TSL230R-LF 175
Spielzeugroboter 12 Tweetie 160
Spitzzange 64 Tweets 160
SPST (Single Pole, Single Throw) 49 Twhirl 160
Stahlwolle 68 Twitter 160
Steckbrett 43, 57
Stecker 58 U
Steckernetzteil 56
UDP 154
Stereoklinkenbuchse 249
Ultraschallsensor 17
Strom 36
Umgang mit Strom
Studentenkneipe
Fehlerstromsicherung 40
Arduino 2
Sicherheitsregeln 40
switch ... case-Kontrollstruktur 331
Umwandlung aus Energie
Synthesizer
Wärme 36
modularer 228
UND-Operator 317
Systeme
unipolare Spannung 250
mikroelektrisch-mechanische 176
T V
Vakuumröhren 105
T.V.-be-Gone 65
Val, Olaf 9
Tabellen 302
Variable 297, 306
Tamagotchi 118
Variablenzuweisung 310
Tank Shield 273
Vergleichsoperation 323
Taos 175
VGA 9
Taster 48, 87
virtual instrument 230
TCP 154
virtuelles Instrument 230
Telharmonium 227
void 92
Temperatursensor 182
Vorwiderstand 86
Theremin 228, 260
Vorzeichenmarker 98
Thermistoren 53
VVVV 4
376 | Index
W Wireshark 155
Wiznet W1500 156
Wärmeleitpaste 106
WLAN-Modul 154
Watt 39
Wave Shield 271
Wearable Computing XVII X
LilyPad 8 x0xbox 65
Webduino 160 Xbee-Shield 271
Webserver 138, 157
Wellenform 258 Z
Sägezahn 258
Tonhöhen 258 Zahl
while-Kontrollstruktur 337 Integer 86
Widerstand 36, 50, 86 Zahlen 300
Drehpotentiometer 52 Zählvariable 91
Farbcode 50 Zapfanlage 15
lichtempfindlicher 53 Zeichenketten 304
Ohm 36 Zeitfunktion 356
R 86 Zeitschaltuhr 32
Schieberegler 52 Zigbee 271
Variabler 52 Zilius, Jonas XVIII
Wii 34 Zufallszahlen 362
Wiimote 173 Zusammengesetzte Operation 325
Windows 22 Zylinderspule 190
Wire-Bibliothek 286
Index | 377
Über die Autoren
Manuel Odendahl ist Selbstständiger und stellt unter dem Namen
»Ruin & Wesen« Opensource-MIDI-Kontroller her.
Julian Finn ist Informatikstudent kurz vor dem Diplom und arbei-
tet bei der Gameforge AG in Karlsruhe, sowie als freier Autor. Er
hat die Texte für mehrere Computerspiele verfasst und beschäftigt
sich ansonsten mit den Randbereichen von Technik, Kunst und
Gesellschaft. Dazu gehört die Arbeit an Medienkunstinstallationen
genauso wie Text- und Diskussionsbeiträge zu digitaler Kultur,
freiem Wissen und Netzpolitik.
Alex Wenger wollte schon als Kind wissen wie die Welt im Inneren
funktioniert und kein elektrisches Gerät war vor Ihm sicher. Nach
dem Physik- und Dipl. Ing. Informationstechnikstudium entwickelt
er hauptberuflich Software und Elektronik für Display-Anwendun-
gen. Zu den weiteren Beschäftigungen gehört die Arbeit als
Medienkünstler und Dozent.
Yunjun Lee ist in Südkorea geboren und arbeitet momentan als
Gastkünstler am Karlsruher Zentrum für Kunst- und Medientech-
nologie (ZKM). Yunjun Lee entwickelt vielseitige Medienkunstpro-
jekte, bei denen er seine Fähigkeiten als Maler, Bildhauer und
Musiker mit technischen Mitteln erweitert.
Jonas Zilius studiert Architektur an der Universität Karlsruhe.
Neben seiner Tätigkeit als freier Grafiker für Print- und Web-
Medien ist seine Leidenschaft die Photographie. Er ist studentischer
Mitarbeiter in der zentralen Fotowerkstatt der Fakultät Architektur.
Arbeiten aus den Bereichen Veranstaltungen/Konzerte, Sport, Port-
rait und Produkte zählen zu seinen Referenzen. Ein Reise-Bildband
über Tirana/Albanien ist in Arbeit.
Kolophon
Das Coverlayout dieses Buchs hat Michael Oreal gestaltet. Als
Textschrift verwenden wir die Linotype Birka, die Überschriften-
schrift ist die Adobe Myriad Condensed und die Nichtproportio-
nalschrift für Codes ist LucasFont's TheSansMono Condensed.
Eingebettete Computer in alltäglichen Geräten sind Mikrocontroller, die über physikalische Schnittstellen mit der Umgebung und Benutzern kommunizieren. Diese Schnittstellen, wie z.B. Sensoren und Aktoren, unterscheiden sich stark von den traditionellen Ein- und Ausgabegeräten wie Tastatur und Monitor. Herkömmliche Computer führen Programme aus und sind für allgemeine Aufgaben konzipiert. Eingebettete Systeme hingegen sind auf spezifische Aufgaben spezialisiert und in Geräte integriert, um deren Funktionalitäten zu verbessern, etwa in Kaffeemaschinen und Kühlschränken .
Physical Computing erweitert die kreative Reichweite von Künstlern und Designern, da sie interaktive Installationen und intelligente Geräte schaffen können, die auf den Betrachter reagieren. Sensoren und Aktoren ermöglichen dynamische Kunstwerke, die sich basierend auf Umweltbedingungen oder Benutzerinteraktionen verändern. Beispielsweise können Lichtinstallationen entwickelt werden, die auf Bewegungen oder Geräusche reagieren, oder Geräte, die auf Social Media-Interaktionen abstimmen. Dadurch verschwimmen die Grenzen zwischen digitaler und physischer Kunst .
Das Löten einer Schaltung auf eine Platine bietet mehrere Vorteile gegenüber der Verwendung eines Steckbretts. Eine gelötete Schaltung ist stabiler und robuster, was wichtig ist, wenn sie in Gehäuse eingebaut oder in Kunstinstallationen verwendet werden soll. Gelötete Verbindungen sind weniger anfällig dafür, sich zu lösen, was bei Steckbrettern oft ein Problem ist, insbesondere wenn sie bewegt werden. Zudem kann die Schaltung auf einer Platine ästhetischer und platzsparender sein .
MIDI-Daten auf einem Arduino werden über serielle Schnittstellen verarbeitet. Mit der MidiDuino-Bibliothek können Arduinos MIDI-Daten empfangen, auswerten und über Aktoren Klänge erzeugen oder Gerätschaften steuern. Dies bietet die Möglichkeit, traditionelle MIDI-Controller zu simulieren und an die spezifischen Bedürfnisse von Musikern anzupassen. Zudem erlaubt es das Erstellen eigenständiger Musikinstrumente oder Sequencer, die mit kommerziellen Geräten interagieren können .
Ethernet-Shields erlauben einem Arduino, sowohl als Server als auch als Client zu fungieren, und ermöglichen damit die Kommunikation über lokale Netzwerke und das Internet. Ein Arduino kann so beispielsweise Webserver-Funktionalitäten bereitstellen oder Daten an externe Server senden. Damit sind etwa Projekte wie das Übermitteln von Sensordaten an eine Webseite oder das Ansteuern von Arduino-Geräten über das Internet möglich .
Globale Variablen in der Arduino-Programmierung sind nützlich, da sie innerhalb des gesamten Programms zugänglich sind, ohne dass sie explizit durch Funktionsargumente weitergereicht werden müssen. Jedoch erhöht ihr Einsatz die Gefahr von ungewollten Nebenwirkungen, da jede Funktion ihre Werte ändern kann. Daher sollten sie, wo möglich, durch lokale Variablen ersetzt werden, um den Code weniger fehleranfällig zu machen. In Ausnahmefällen können sie gezielt für call-by-reference übergebene Argumente verwendet werden, um Tabellen effizient zu modifizieren .
Das Verständnis der elektrischen Eigenschaften neuer Bauteile ist wichtig, um sicherzustellen, dass sie innerhalb ihrer spezifizierten Grenzen betrieben werden. Beispielsweise sind minimale und maximale Strom- und Spannungswerte kritisch, um Schäden zu vermeiden und die ordnungsgemäße Funktion der Schaltung zu gewährleisten. Bei der Einführung neuer Bauteile ist oft das Studium ihrer Datenblätter erforderlich, um die Bedingungen korrekt einzustellen und somit eine gesicherte Funktionalität in der Schaltung zu gewährleisten .
Mit Physical Computing kann eine Lampe über einen Mikrocontroller gesteuert werden, wodurch komplexe Schaltprogramme möglich werden. Dadurch kann, z.B., das Licht nach einem bestimmten Muster blinken, nur für eine gewissen Zeit leuchten, oder sich an- und ausschalten, sofern bestimmte Bedingungen erfüllt sind, wie die Anwesenheit von Personen. Solche Steuerungsmöglichkeiten sind mit bloßen mechanischen Schaltungen nicht möglich .
Kontrollstrukturen wie Schleifen und Bedingungen sind entscheidend für die Verarbeitung von Eingaben und das Umsetzen in Steuerungsbefehle in Physical Computing Projekten. Schleifen erlauben das kontinuierliche Lesen von Sensoren und das Anpassen von Aktoren in Echtzeit. Zum Beispiel kann eine Schleife in einem Arduino-Programm verwendet werden, um Sensorwerte kontinuierlich zu überwachen und entsprechend LEDs zu steuern. Bedingungen ermöglichen Entscheidungen basierend auf den Sensordaten, wie das Ein- oder Ausschalten von Geräten .
Der Einsatz von Platinen verbessert die Entwicklung und Nutzung komplexer Schaltungen erheblich, indem sie eine stabile und dauerhafte Grundstruktur bieten, die der Schaltung Solidität und Eleganz verleiht. Im Gegensatz zu Steckbrettern, die Kabelverbindungen instabil machen können, erlauben Platinen das feste Anbringen von Bauteilen durch Löten, was die Schaltungen robuster und langlebiger macht . Platinen erlauben auch das Design von komplexen Schaltungen durch die Verwendung von Kupferleiterbahnen, die eine feste Verknüpfung der Komponenten ermöglichen . Dies macht es einfacher, Schaltungen zu erweitern und Anpassungen vorzunehmen, ohne dass die Stabilität oder Ordnung der Schaltung leidet . Dennoch sollte das Design und die Anordnung der Bauteile im Voraus gut durchdacht sein, um Platzmangel und Kurzschlüsse zu vermeiden .