Clemens Valens
Mikrocontroller
verstehen und anwenden Schnell und einfach mit Arduino und Elektor-Shield Mit diesem Buch erweitert der Leser seine Mikrocontroller-Kenntnisse auf Grund eigener Erfahrungen und Erfolgserlebnisse und wird dazu noch ganz nebenbei in die Welt des Arduino und seiner Entwicklungsumgebung eingeführt. Am Ende dieses vergnüglichen und fast spielerischen Lehrgangs stellen Begriffe wie I/O, Speicherplatz, Interrupts, Kommunikationsstandards, A/D-Konverter (und vieles mehr) keine Geheimnisse mehr dar und der Leser ist in der Lage, auch andere Mikrocontroller zu programmieren. Mit anderen Worten: ein erstes MikrocontrollerBuch mit Happy End.
Mikrocontroller verstehen und anwenden
Clemens Valens
Mikrocontroller
verstehen und anwenden Schnell und einfach mit Arduino und Elektor-Shield
Neues Konzept: Dieses Buch überrascht mit einem völlig neuen Konzept an Schaltungsbeispielen: Mit speziellen Arduino-Anwendungen vertreiben Sie störende Freunde und Familienmitglieder sicher und zuverlässig aus Ihrer Umgebung und machen so Schluss mit lästigen gesellschaftlichen Verpflichtungen, so dass Sie in Zukunft Ihre komplette Freizeit nur noch der Programmierung von Mikrocontrollern widmen können. • Originelle Anwendungsbeispiele • Geringe Hardware-Kosten • Freie und offene Software (Open Source) Alle gezeigten Programme können kostenlos von der Elektor-Website heruntergeladen werden.
ISBN 978-3-89576-296-3
Clemens Valens
Dieses Buch ist für Sie geeignet, wenn Sie Anfänger auf dem Gebiet der Mikrocontroller sind, als Arduino-User bzw. -Enthusiast Ihre Kenntnisse vertiefen möchten, Elektronik studieren oder als Lehrer inspiriert werden möchten.
Elektor-Verlag GmbH 52072 Aachen www.elektor.de Cover_Mikrocontroller_verstehen+anwenden_rz.indd 1
28.05.14 11:11
enarvuino_14x21.book Page 1 Mercredi, 6. ao没t 2014 4:04 16
Clemens VALENS (www.polyvalens.com)
Mikrocontroller verstehen und anwenden Schnell und einfach mit Arduino und Elektor-Shield
www.elektor.de/arduino
enarvuino_14x21_00.fm Page 2 Vendredi, 8. août 2014 8:49 08
Aus dem Englischen übersetzt von Kurt Diedrich ©2014: Elektor International Media BV Übersetzung der 2. englischen Ausgabe von 2013 ©2014: Elektor-Verlag GmbH, Aachen. Alle Rechte vorbehalten. 1. Auflage 2014 Die in diesem Buch veröffentlichten Beiträge, insbesondere alle Aufsätze und Artikel sowie alle Entwürfe, Pläne, Zeichnungen und Illustrationen sind urheberrechtlich geschützt. Ihre auch aus-zugsweise Vervielfältigung und Verbreitung ist grundsätzlich nur mit vorheriger schriftlicher Zustimmung des Herausgebers gestattet. Die Informationen im vorliegenden Buch werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Die in diesem Buch erwähnten Soft- und Hardwarebezeichnungen können auch dann eingetragene Warenzeichen sein, wenn darauf nicht besonders hingewiesen wird. Sie gehören dem jeweiligen Warenzeicheninhaber und unterliegengesetzlichen Bestimmungen. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autor können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für die Mitteilung eventueller Fehler sind Verlag und Autor dankbar. Koordination: Rolf Hähle Umschlaggestaltung: www.etcetera.de, Aachen Satz und Aufmachung: Mariline Thiebaut-Brodier Druck: Wilco, Amersfort (NL) Printed in the Netherlands ISBN 978-3-89576-296-3 Elektor-Verlag GmbH, Aachen www.elektor.de 129009-1/D
enarvuino_14x21.book Page iii Mercredi, 6. août 2014 4:04 16
Inhalt
1.
Schnelle Hilfe am Anfang. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1
Software Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2
Hardware Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2.1
1.2.2
1.2.3
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Board mit FTDI-Chip (Uno, Mega 2560 oder neuere Version) . . . . . . 13 Board mit FTDI Chip (Duemilanove, Nano, Diecimila, usw.) . . . . . . . 13 Serielle Portnummer unter Windows herausfinden . . . . . . . . . . . . . . . 14 Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Board ohne FTDI chip (Uno, Mega 2560 oder jünger) . . . . . . . . . . . . . 15 Board mit FTDI-Chip (Duemilanove, Nano, Diecimila, usw.) . . . . . . . 16 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.3
Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.
Einführung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1
Es klopft an der Tür . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2
Wohin gehen wir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.
Kennen Sie Ihren Mitspieler? . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1
Eine kurze Geschichte der Mikrocontroller . . . . . . . . . . . . . . . . . . . . . . 23
3.2
Schönes Gehäuse, doch was ist drin? . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5
Der Prozessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Der Oszillator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Speichereinheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Eingabe/Ausgabe-Ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
enarvuino_14x21.book Page iv Mercredi, 6. août 2014 4:04 16
iv 3.2.6 3.2.7 3.2.8 3.2.9 3.2.10
3.3
Analog/Digital Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Digital/Analog Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Module zur Datenübertragung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Zeit-Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Sonstige Peripheriegeräte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.3.1 3.3.2 3.3.3
Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Ein Programm in die MCU laden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.
Auf italienische Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1
Auf drei Beinen steht man besser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2
Hardware, Software, Kundennähe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3
Die Zutaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.4
Die Arduino-IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6
4.5
Datei-Menü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Edit-Menü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Sketch Menü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Tools Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Hilfe-Menü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Tabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.5.1 4.5.2
Pin-Nummern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Der Boot-Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.
Elementare Programmstrukturen . . . . . . . . . . . . . . . . . . . . 63
5.1
Richtiger Umgang mit Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.2
Setup und loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.3
Einfacher geht’s nicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4
Eine Frage des Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5
Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.6
Blinkende Lichter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.7
Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
enarvuino_14x21.book Page v Mercredi, 6. août 2014 4:04 16
v 5.8
Wenn und dann und andernfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.9
Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6.
Digitale Signale: Alles oder Nichts . . . . . . . . . . . . . . . . . . 79
6.1
Ein Überraschungsprogramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.2
Weitere Überraschungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.3
Das Matrix Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.4
Vom Multiplexing zum Charlieplexing . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.5
Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.6
Das Märchen von den drei Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 6.6.1 6.6.2 6.6.3
Tausendmal und mehr: Die for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . 91 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.7
Mehr Tasten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.8
Ghost (key) Busters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.9
Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.10
LED Mini-Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.11
Matrix-Kino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.12
Ein bisschen Schummeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.13
Schreibweisen und Notationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.14
Null ist nicht Nichts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.15
Schneewittchens Apfel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
6.16
Der Kern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.17
Ein nützlicher Trick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.
Analoge Signale: Weder schwarz noch weiß . . . . . . 127
7.1
Digital Switchover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 7.1.1 7.1.2 7.1.3 7.1.4
Konvertierung von Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Ein wenig gerechnet und viel präsentiert . . . . . . . . . . . . . . . . . . . . . . 132 Ein Tipp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 A/D-Wandler-Referenzspannungen . . . . . . . . . . . . . . . . . . . . . . . . . . 133
enarvuino_14x21.book Page vi Mercredi, 6. août 2014 4:04 16
vi 7.2
PWM versus D/A-Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.3
Mess- und Regeltechnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 7.3.1 7.3.2 7.3.3 7.3.4 7.3.5 7.3.6 7.3.7 7.3.8
Motor Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Messung der Sprungantwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Zusammengesetzte Bedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Der PID Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Das digitale Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Dynamisches Duo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Nerd-Ecke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Was liegt an (der Schnittstelle)? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
7.4
Entspannung mit dem Misophon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
7.5
Ein bisschen C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.6
Das „no“ in Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.7
Aus analog mach digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
8.
Kommunikation: Kunst und Wissenschaft. . . . . . . . . 173
8.1
Daten-Visualisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.2
Zwei Arten der seriellen Kommunikation . . . . . . . . . . . . . . . . . . . . . . . 179
8.1.1 8.2.1 8.2.2
8.3
Ein paar Feinheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Verkettung von Zeichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Neues im Sketch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Ein NMEA-0183A-Decoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Vom String zur Zahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Bitte wenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Schluss mit Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Zweidrahtverbindungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 8.4.1 8.4.2
8.5
Asynchron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Synchron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
RS-232 oder serielle Schnittstelle? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 8.3.1 8.3.2 8.3.3 8.3.4 8.3.5 8.3.6 8.3.7
8.4
Anschluss eines Flüssigkristall-Displays . . . . . . . . . . . . . . . . . . . . . . 176
I²C, TWI und Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Atmosphärischer Drucksensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Verbindungen mit drei und vier Leitungen . . . . . . . . . . . . . . . . . . . . . . 215 8.5.1 8.5.2
Verbesserter Grafik-Display-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Feuchtesensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
8.6
Alle zusammen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
8.7
Ohne Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
enarvuino_14x21.book Page vii Mercredi, 6. ao没t 2014 4:04 16
vii 8.8
Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
8.9
Wussten Sie schon ...? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.
Die Uhr tickt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
9.1
Hier ist Radio Frankfurt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
9.2
Von Bits zu Sekunden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
9.1.1
9.3
DCF77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Decodierung eines Bit-Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 9.3.1
DCF77 Decoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
9.4
Millis und Micros, zwei kleine Funktionen . . . . . . . . . . . . . . . . . . . . . . 254
9.5
PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 9.5.1
Zwei Arten von PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
9.6
Meister der Zeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
9.7
Netz-Antenne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
9.8
IR-Fernsteuerung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
9.9
Raus oder Weiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
9.10
Multiplizieren vor Dividieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
9.11
Struct und Union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
9.6.1
9.8.1
9.11.1 9.11.2 9.11.3
DCF77 Sender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Wie viele haben Sie? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
struct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
9.12
Ist es ein Bild? Sind es Daten? Es ist Superfile! . . . . . . . . . . . . . . . . . . 278
9.13
Kommunikationsprotokolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
9.12.1 9.13.1
Das SVG Dateiformat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Das NEC-1 Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
9.14
Gehe direkt zum Ziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
9.15
Auf Sendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 9.15.1 9.15.2 9.15.3
9.16
Pulsfolgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Ende der Pulsfolge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Fl眉chtige Momente einfangen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Spielverderber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
enarvuino_14x21.book Page viii Mercredi, 6. août 2014 4:04 16
viii 9.17
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 9.17.1 9.17.2 9.17.3
Normalmodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 CTC Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 Capture Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
10. Interrupts: Die Büchse der Pandora . . . . . . . . . . . . . . . . 307 10.1
Mein erster Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 10.1.1 10.1.2
10.2
Makros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 10.2.1
10.3
Timer/Counter 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 Erzeugung eines 1-kHz-Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Vektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Flaschenpost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
10.4
Außer Kontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
10.5
Interrupt-Request-Pins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 10.5.1
10.6
Ein Interrupt zu viel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 10.6.1
10.7
Wir bauen ein Flip-Flop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Der Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Multiplexen von Interrupts - A: Theorie . . . . . . . . . . . . . . . . . . . . . . . . 324 10.7.1
Multiplexen von Interrupts - B: Praxis . . . . . . . . . . . . . . . . . . . . . . . . 325
10.8
Es lebe der Drehwinkelgeber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
10.9
Was geschieht beim Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 10.9.1
POR, BOR und BOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
10.10 Rollentausch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 10.10.1 Quälgeist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
10.11 La Cucaracha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 10.11.1 Das 1-Draht-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
10.12 Feuer! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 10.12.1
Der SMBus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
11. Schaltungen und Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . 355 11.1
Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 11.1.1 11.1.2
Ein Format für alles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 Auf geht’s! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
enarvuino_14x21.book Page ix Mercredi, 6. août 2014 4:04 16
ix 11.2
LED-Dimmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
11.3
Motor-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
11.4
Misophon-Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
11.5
Daten sichtbar machen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
11.6
GPS Experimente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
11.7
Barometer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
11.8
Feuchtigkeits- und Temperaturmesser . . . . . . . . . . . . . . . . . . . . . . . . . 368
11.9
DCF77-Empfänger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
11.10 DCF77-Sender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 11.11 Infrarot-Empfänger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 11.12 Infrarot Sender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 11.13 Spielverderber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 11.14 Quälgeist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 11.15 La Cucaracha in “Stereo” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 11.16 Feuermelder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 11.17 Bonus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Programmliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 Bilderliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 Tabellenliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
enarvuino_14x21.book Page x Mercredi, 6. ao没t 2014 4:04 16
x
enarvuino_14x21.book Page 11 Mercredi, 6. août 2014 4:04 16
1.
Schnelle Hilfe am Anfang
Die meisten Leute, und da schließe ich mich nicht aus, sind einfach viel zu ungeduldig, um lange in einer Anleitung zu blättern, bevor sie sich mit einem Projekt oder einem neuen technischen Gerät beschäftigen. Das gilt auch für den Arduino. Aus diesem Grunde folgt hier zunächst ein einfacher „Start Guide“; sozusagen, eine Kurzanleitung, nach der man sofort „loslegen“ kann. Sollte es Ihnen jedoch auch nach der Lektüre dieser Kurzanleitung immer noch nicht gelingen, die LED auf der Arduino-Platine zum Blinken zu bringen, dann würde ich Ihnen raten, sich zunächst die ersten paar Kapitel dieses Buches in aller Ruhe zu Gemüte zu führen und es dann erneut zu probieren.
1.1
Software Installation
Auf der Download-Webseite von Arduino (www.arduino.cc) stehen die jeweiligen Versionen für Windows, Mac OS X und Linux zum Herunterladen zur Verfügung. In diesem Buch geht es ausschließlich um die Versionen 1.0.x. Die Version 1.5.x kann unter Vorbehalt ebenfalls verwendet werden: Als ich mit dem Schreiben dieses Buches fertig war (Mai 2013), befand sie sich noch in der BetatestPhase. Die Arduino-Software ist sehr umfangreich. Zum Installieren des kompletten Archivs muss die herunter geladene Software mit der von Ihrem Betriebssystem angebotenen Methode entpackt und auf Festplatte oder USB-Stick gespeichert werden. Eine Installations-Software mit grafischer Oberfläche steht leider nicht zur Verfügung. Unter Umständen muss zusätzlich noch Java auf dem betreffenden Computer installiert werden. Ob dies notwendig ist oder nicht, wird von Ihrem Betriebssystem automatisch angezeigt.
1.2
Hardware Installation
Die Installation der Arduino-Hardware ist etwas komplizierter als die Installation der Software. Dies liegt an der angebotenen Vielfalt der Boards und seriellen Schnittstellen. Zur Vereinfachung beschränke ich mich auf die Arduino-Boards mit serieller USB-Schnittstelle. Diese Familie besteht aus zwei Gruppen: Boards, deren serieller Port auf einem von FTDI hergestellten Chip basiert, und Boards, 11
enarvuino_14x21.book Page 12 Mercredi, 6. août 2014 4:04 16
1. Schnelle Hilfe am Anfang
Bild 1.1: Eine Auswahl verschiedener Arduino-Boards
deren serieller Port von einem Chip der Marke Atmel verwaltet wird. Es handelt sich hierbei um die jüngsten Arduino-Boards, die sich als sehr zuverlässig erwiesen haben. ✦
Finden Sie heraus, zu welchem Typ Ihr Board gehört. Dies sollte nicht schwer sein, da es in großen Buchstaben auf Ihrem Bord aufgedruckt ist.
✦
Verbinden Sie das Board mit einem freien USB-Anschluss Ihres Computers. Es kann sein, dass der Computer nun ein akustisches Signal erzeugt, eine Nachricht auf dem Bildschirm ausgibt – oder beides (oder nichts von beiden), um Sie darüber zu informieren, dass er gemerkt hat, dass irgendetwas an ihn angeschlossen wurde. Eine bestimmte, auf dem Arduino montierte LED sollte nun aufleuchten. Ist dies nicht der Fall, dann sollten Sie überprüfen, ob das Board auch wirklich über USB vom Computer mit Strom versorgt wird. Bei einigen Boards (zum Beispiel beim Diecimila) muss zuerst ein Jumper gesetzt werden, damit es über USB versorgt werden kann.
Der nächste Schritt hängt von Ihrem Betriebssystem ab. Wir beschränken uns an dieser Stelle auf die zum Zeitpunkt der Veröffentlichung dieses Buches am meisten verbreiteten Syteme:
12
enarvuino_14x21.book Page 19 Mercredi, 6. août 2014 4:04 16
2.
Einführung
2.1
Es klopft an der Tür
Mikroprozessoren oder Mikrocontroller sind programmierbare Bausteine, die heute in immer mehr Anwendungen an Bedeutung gewinnen. Dank ihrer ständig fallenden Preise und ihrer ständig wachsenden Leistung … (Entschuldigung, es klopft gerade an der Tür, während ich diese Zeilen schreibe…. „Herein!“) …ist es auch bei einfachen Anwendungen von Vorteil, gleich einen ganzen Mikrocontroller einzusetzen, statt wenige diskrete Bauteile zu verwenden.
„Oh! Hi Dennis, Marilyn … was gibt’s?“ Dennis und Marilyn sind die Redakteure, die dieses Buchmanuskript noch mal durchlesen und korrigieren, bevor es zum Druck geht. „Tja also, Clemens, wir finden diese Einleitung ziemlich belanglos“. „Echt?“ „Ja, sie ist so … so nichts sagend. Du hättest die Leser zum Beispiel fragen können, wie viele Mikrocontroller sie seit dem Aufstehen heute Morgen schon benutzt haben, ohne es zu merken“. „Hmm …“ „Hier zum Beispiel, in diesem Radiowecker, in der Gastherme im Bad, in der Kaffeemaschine, Im Fahrstuhl, in der automatischen Tür im Auto, im Zug, im Bus und, und, und.. Es müssten Hunderte sein“! 19
enarvuino_14x21.book Page 20 Mercredi, 6. août 2014 4:04 16
2. Einführung „Meine Leser haben ’ne automatische Tür im Auto“? „OK: Ich habe das Komma zwischen „Tür“ und „im“ vergessen, aber das ändert nichts an der Thematik“. „Mag sein, aber sie nehmen den Wagen, den Zug und den Bus? Die Armen. Wohnen sie so weit von der Arbeit weg“? Dennis zu Marilyn: „Haaa, haaa. Sehr witzig. Aber Ich glaube, jetzt hat er’s kapiert“! [Dennis und Marilyn gehen hinaus]. Äh – wo war ich stehen geblieben? Ach ja: Der Mikrocontroller ist allgegenwärtig. Sogar eine blinkende LED kann mit einem Mikrocontroller besser realisiert werden als mit konventionellen, diskreten Bauteilen. Die Rechnerei, die zur Dimensionierung der aktiven und passiven Bauteile notwendig ist, wird dann durch Programmierarbeit ersetzt. Die Entwicklung von Mikrocontroller-Anwendungen war früher meist den Experten auf diesem Gebiet vorbehalten, da die benötigten Werkzeuge teuer und schwer zu bedienen waren. Dies hat sich heutzutage grundlegend geändert: Heute kann jeder elektronikbegeisterte Anfänger eine Schaltung auf Mikrocontrollerbasis entwickeln – sogar ich. Erschwingliche Controller gibt’s im Internet in Hülle und Fülle, und Programmierwerkzeuge sind heute einfacher anzuwenden als früher und werden oft sogar kostenlos angeboten. Der Mikrocontroller ist in der Tat zum Allgemeingut geworden. Doch Vorsicht: „Allgemeingut“ bedeutet noch lange nicht, dass es sich um ein Kinderspiel handelt. Obwohl die Hersteller versuchen, ihre Technologie den Massen zugänglich zu machen, sind gute Fachkenntnisse immer noch das A und O, um einen auf einem Experimentierbord aufgebauten Prototypen in ein Qualitätsprodukt zu verwandeln.
2.2
Wohin gehen wir?
Dieses Buch hat das Ziel, den Leser mit Mikrocontrollern und deren Programmierung vertraut zu machen und verwendet dazu die Arduino-Rapid-Prototyping Plattform. Diese Plattform, die aus einem preiswerten Mikrocontroller Entwicklungsbord und einer kostenlosen Programmiersoftware besteht, gibt mir die Möglichkeit, die verschiedenen Aspekte der Mikrocontroller-Programmierung leicht nachvollziehbar und dazu noch kostendämpfend vorzustellen. 20
enarvuino_14x21.book Page 23 Mercredi, 6. août 2014 4:04 16
3.
Kennen Sie Ihren Mitspieler?
Ein Mikrocontroller bzw. eine Mikrocontroller-Einheit (engl.: MCU) ist eine integrierte Schaltung, die eine Recheneinheit, eine Speichereinheit und periphere Bauelemente enthält. Im Gegensatz zum Mikroprozessor mit seinen komplizierten arithmetischen Einheiten benötigt der Mikrocontroller keine externen Bauelemente zur Ausführung eines Programms. Mikrocontroller, die im „stand.alone“-Betrieb arbeiten (von Sensoren und Aktuatoren wie LEDs, Motoren und Displays einmal abgesehen), werden immer häufiger angewendet. Da die Preise von Mikrocontrollern weiterhin fallen, wachsen auch ihre Einsatzgebiete, die sich mittlerweile auf alle Arten von Anwendungen wie Mobiltelefone, Haushaltsgeräte, Spielzeug, Fahrstühle, Smart Cards und viele andere Bereiche erstrecken. Ein modernes Auto kann bis zu 50 Mikrocontroller enthalten, und einige Milliarden Exemplare werden jedes Jahr verkauft.
3.1
Eine kurze Geschichte der Mikrocontroller
Wahrscheinlich wurde der erste Mikrocontroller im Jahre 1971 von Texas Instruments (TI) Ingenieuren entwickelt. Ich verwende bewusst das Wort „wahrscheinlich“, da sich zu dieser Zeit auch andere Unternehmen mit ähnlichen Schaltkreisen beschäftigt haben. Noch im Jahre 1971 wurde der TMS1802NC von Texas Instruments seiner kommerziellen Verwendung zugeführt. Dabei handelte es sich um einen Rechner auf einem Chip, der mit einem ROM (Read Only Memory), einem kleinen RAM (Random Access Memory), einer Recheneinheit, einem TastaturInterface (Matrix-Keypad) und einem Siebensegment-LED-Displaytreiber ausgestattet war. Im Jahre 1976 brachte Intel den 8048 auf den Markt; ein Prozessor, der zu einem phänomenalen Erfolg wurde, da man ihn zur Steuerung von PC-Keyboards verwendete. Aus dem 8048 entwickelte sich eine ganze Prozessorgeneration: Die MCS-48Familie, die im Jahre 1980 durch den 8051 und seine MCS-51-Familie ersetzt wurde. Der Kern des 8051-Prozessors konnte von einer großen Anzahl von Chipherstellern in Lizenz gebaut werden und wurde schnell weltbekannt. Sogar heute sind noch viele Mikrocontroller im Handel erhältlich, die auf diesem Kern basieren (beim bekannten 8052 handelt es sich um einen verbesserten 8051).
23
enarvuino_14x21.book Page 24 Mercredi, 6. août 2014 4:04 16
3. Kennen Sie Ihren Mitspieler?
Bild 3.1: Benjamin Franklin konnte nicht ahnen, dass seine in einer Leydener-Flasche eingefangene Blitzenergie nach 250 Jahren einmal zu winzigen und leistungsfähigen Mikrocontrollern führen würde.
Bis dahin existierten zwei verschiedene Arten von MCUs: Solche mit ROM, die vom Hersteller programmiert wurden, und solche mit EPROM (Erasable Programmable Read-Only Memory), die vom Anwender, wenn sie über das passende Werkzeug verfügten, immer wieder neu programmiert werden konnten. Zum Löschen der Speicherzellen wurde UV-Licht verwendet. 1993 wurde von der Firma Microchip das legendäre, erste EPROM mit der Bezeichnung PIC16C84 vorgestellt, das auf elektrischen Wege gelöscht werden konnte und daher EEPROM genannt wurde: Electrically Erasable Programmable Read-Only Memory. Zur gleichen Zeit stellte Atmel den ersten 8051 mit Flash Memory vor. Beide Speichertypen können auf elektrische Weise gelöscht werden, so dass es nun möglich wurde, einen Prozessor an Ort und Stelle in seiner Systemumgebung zu programmieren – ganz ohne Hilfe teuerer Programmiergeräte und ohne ihn aus seiner Schaltung zu entfernen. Heute besitzen fast alle Mikrocontroller einen Flash-Speicher oder einen vergleichbaren, elektrisch löschbaren Speicher. Daneben gibt es auch Mikrocontroller mit so genanntem maskiertem ROM, dessen einmalige Programmierung beim Hersteller erfolgt und eine kostengünstige Massenproduktion erlaubt. Trotz der neuen 32-Bit-Mikrocontroller, deren Entwicklung durch die Smartphone und 24
enarvuino_14x21_04.fm Page 41 Mercredi, 6. août 2014 4:36 16
4.
Auf italienische Art
Arduino aus Italien ist eine schnelle Plattform zum Erstellen von Prototypen für Mikrocontroller-Anwendungen. Hierbei handelt es sich um eine Reihe von Tools, die zur Vereinfachung des Designs von Schaltungen auf Basis von Mikrocontrollern entwickelt wurden, ohne dass der Entwickler dabei allzu viel Zeit mit dem Erlernen von Details verschwenden muss. Mit dem Arduino wird auch Ihnen der Umgang mit Mikrocontrollern und dem Themengebiet „Embedded Electronics“ leicht fallen. Ich mache Ihnen ein Angebot, das Sie nicht ablehnen können: Kaufen Sie sich eines dieser preisgünstigen Arduino-Boards, installieren Sie die kostenlosen Software-Tools, halten Sie sich einen Abend frei und ich werde Ihnen beibringen, wie das alles funktioniert und wie man es benutzt.
4.1
Auf drei Beinen steht man besser
Arduino muss in Bezug zum so genannten Open-Source Technologie-popularisierende Projekte Processing betrachtet werden, von dem seine Programmierumgebung und die Grundlagen seiner Code-Bibliotheken stammen. Was hat es damit auf sich? Processing ist eine Open Source Programmiersprache bzw. Programmierumgebung für Menschen, die sich mit Grafik, Animation und Interaktivität beschäftigen. Ursprünglich als Software-Sketchbook dazu entwickelt, Grundlagen der Computerprogrammierung innerhalb eines sichtbaren Kontextes zu lehren, hat sich Processing inzwischen in ein Tool zur Erstellung abgeschlossener, professioneller Arbeiten entwickelt (Quelle: www.processing.org). Wiring ist ein Programmierumgebung für Mikrocontroller, die „zusammen mit Designern und Künstlern zu dem Zweck entwickelt wurde, eine weltweite Gemeinschaft von Anfängern und Experten zum Austausch von Ideen, Kenntnissen und ihren kollektiven Erfahrungen zu ermutigen“ (Quelle: www.wiring.org.co). Arduino (www.arduino.cc) stammt aus der gleichen Schule wie Wiring und stellt eine Vereinfachung dieser Sprache dar, die selbst bereits sehr einfach anzuwenden war. Ursprünglich war Wiring kein Open-Source-Projekt, doch unter dem Druck des Arduino-Teams willigte man schließlich ein, den Wiring Quellcode zu veröffentlichen, was dem Arduino-Team wiederum zu einem Aufschwung verhalf. Das Ziel von Arduino ist es, Mikrocontroller auch Menschen zugänglich zu machen, die keine Experten sind: Studenten, Künstler, Designer oder einfach nur 41
enarvuino_14x21_04.fm Page 42 Mercredi, 6. août 2014 4:36 16
4. Auf italienische Art Enthusiasten, die am Gestalten interaktiver Objekte und Umgebungen interessiert sind und nicht über die erforderlichen, guten Elektronikkenntnisse und finanziellen Mittel verfügen. Aus diesem Grunde beschloss das Arduino-Team, dass sein Board nicht mehr als 25 € kosten sollte. Inzwischen sind die Preise jedoch langsam gestiegen, so dass ein Board im Jahre 2013 je nach Bezugsquelle bis zu 30 € kosten kann. Die ersten Boards von Arduiono waren einfacher gestaltet als diejenigen von Wiring, aber mit der Zeit wurde die Arduino-Hardware immer ausgereifter, wogegen sich Wiring auf die stetige Vereinfachung seiner Boards konzentrierte. Heute (2013) sind beide Marken ziemlich ähnlich. Trotz dieser Tatsache war Wiring nicht so erfolgreich auf dem Markt wie Arduino. Von Anfang an hat das ArduinoTeam alles darangesetzt, seinen Bekanntheitsgrad durch die kostenlose Verbreitung des kompletten Quellcodes zu erhöhen. Auch für Schaltpläne, Platinenlayouts und detaillierte Dokumentationen wurde kein Geld verlangt, während das Wiring-Team stets das Gegenteil praktizierte. Im Herbst 2012 waren weltweit bereits über 600 000 Arduino-Boards verkauft. Arduino-Libraries basieren auf denjenigen von Wiring, und die auf Processing gründende Integrierte Entwicklungsumgebung (IDE = Integrated Development Environment) ist fast identisch mit derjenigen von Wiring. Der einzig auffallende Unterschied besteht in der Farbe: Orange bei Wiring und hellblau bei Arduino. Processing verwendet Grauschattierungen für seine IDE, deren Aussehen den beiden anderen stark ähnelt. Auch andere Projekte haben mit der Processing-IDE begonnen, so dass man inzwischen fast von einem Standard sprechen kann. Die IDE von Wiring unterstützt zwar die Arduino-Hardware, aber die ArduinoIDE kennt die Wiring-Hardware nicht. Arduino beschränkt sich auf einige wenige Mikrocontroller aus der 8-Bit-AVR-Familie von Atmel, während sich Wiring einer ganzen Palette von Mikrocontrollern zuwendete. Dazu gehören zum Beispiel Exemplare von Mikrochip, Texas Instruments oder Mikrocontrollern, die auf einem Kern von ARM basieren. Auch Arduino hat sich, allerdings unfreiwillig, in eine Multi-CPU-Plattform verwandelt. Die Arduino-Philosophie wurde von vielen Enthusiasten begeistert aufgenommen und von diesen auf verschiedene Plattformen unterschiedlichster Hersteller übertragen. Es dauerte ein paar Jahre, um die Arduino-IDE so zu verändern, dass sich auch Compiler für andere Mikrocontroller einbeziehen ließen, aber mit Version 1.5 und der Einführung des Arduino Due wurde dieses Ziel erreicht: Der Due besitzt eine auf dem ARM Cortex-M3 basierende MCU.
42
enarvuino_14x21_05.fm Page 63 Mercredi, 6. août 2014 4:38 16
5.
Elementare Programmstrukturen
In der Computerwelt ist es eine Tradition, einen Computerkurs mit dem Schreiben eines kleinen Programms namens „Hello World“ beginnen zu lassen. Auf einem Computer mit Bildschirm ist dies nichts weiter als ein paar Zeilen Programm, die dafür sorgen, dass die besagte Meldung als Text ausgegeben wird. Auf einem Mikrocontroller-System ohne Display jedoch könnte man diese Nachricht zum Beispiel über einen seriellen Port an den Computer schicken. Wesentlich einfacher ist es jedoch, eine LED zum Blinken zu bringen. Obwohl der serielle Port des Arduino einfacher anzusteuern ist als die on-board LED, wollen wir uns dennoch für die blinkende LED entscheiden. Da Arduino in C und C++ programmiert wird, müssen wir die Syntax dieser Sprachen kennen. C++ ist eine komplexe Programmiersprache, die ich Ihnen hier mit ein paar Zeilen nicht beibringen kann. Wenn Sie mehr wissen möchten, empfehle ich ein gutes Buch zu diesem Thema. Auch wenn Sie im Internet viele Einzelheiten zu dieser Sprache finden, reicht ein bisschen Surfen nach Feierabend nicht aus, um mit diesem umfangreichen Thema vertraut zu werden. Die Sprache C++ ist kompatibel zu ihrer einfacheren Vorgängerversion C, und alles, was in C möglich it, funktioniert auch in C++. Für dieses Buch reichen ein paar C-Kenntnisse jedoch völlig aus. Die dazugehörigen Hintergründe werden im Verlaufe des Buches immer dann beleuchtet, wenn dies nötig ist.
Und dann drück' Deine Lippen ganz zärtlich auf ...
Bild 5.1: Die notwendige Theorie wird ganz nebenbei erklärt
63
enarvuino_14x21_05.fm Page 64 Mercredi, 6. août 2014 4:38 16
5. Elementare Programmstrukturen
5.1
Richtiger Umgang mit Funktionen
Das Wichtigste in einem C-Programm ist die Funktion (in C++ oft auch als „Methode“ bezeichnet). Es ist möglich, alles, was das Programm machen soll, in einer einzigen, großen Funktion unterzubringen. Dies ist jedoch nicht empfehlenswert, da es nicht besonders praktisch ist und außerdem die Lesbarkeit des Programms erschwert. Daher teilt man das Programm in mehrere kleine Abschnitte auf, in denen die gewünschten Funktionalitäten enthalten sind. Hier zum Beispiel die Funktion „nichtstun“, die nichts weiter macht als zu zeigen, worum es grundsätzlich geht. void nichtstun(void) { }
Eine Funktion kann Argumente enthalten und ein Ergebnis zurückgeben. Für unsere Beispielfunktion trifft dies nicht zu, was durch das zweimalige Vorkommen des Begriffes void zum Ausdruck gebracht wird. Das void auf der linken Seite steht für das zurück zu gebende Ergebnis, während das rechte void die Argumente ersetzt. Der Ausdruck void ist ein C-Schlüsselwort und daher fett gedruckt. Schlüsselwörter dürfen nicht als Namen für Variablen, Konstanten oder Funktionen verwendet werden. Bei C und C++ spielt der Unterschied zwischen Klein- und Großbuchstaben eine wichtige Rolle. So bedeuten zum Beispiel die Ausdrücke „void“ und „Void“ nicht dasselbe. Der Compiler wird alle von „void“ abweichenden Schreibweisen (Void, voiD, VoId and VOID) als Namen verschiedener Funktionen, Variablen oder Konstanten interpretieren. Die Argumente, wenn vorhanden, werden stets zwischen zwei Klammern gesetzt. Mehrere Argumente werden durch ein Komma getrennt. Das in den Klammern rechts stehende Schlüsselwort void kann weggelassen werden, wenn es keine Argumente gibt. Die Klammern werden dann zwar geschrieben, bleiben jedoch leer. Ich empfehle aus Sicherheitsgründen jedoch, dieses void dennoch dorthin zu schreiben. Damit teilen Sie dem Compiler (und dem Leser Ihres Codes) , dass das Argument absichtlich weggelassen wurde. Das erste void für den Rückgabewert darf jedoch nicht weggelassen werden1.
1. Genau genommen stimmt das nicht. Die meisten Compiler werden annehmen, dass eine Funktion, in der der Return-Typ nicht angegeben ist, einen Integer-Wert zurückgeben (int).
64
enarvuino_14x21_06.fm Page 79 Mercredi, 6. août 2014 4:49 16
6.
Digitale Signale: Alles oder Nichts
Von allen Anschlüssen eines Mikrocontrollers sind die digitalen Ein- und Ausgänge diejenigen, die am bekanntesten und am weitesten verbreitet sind. In der Fachliteratur werden sie als General Purpose Input Output oder GPIO-Ports bezeichnet. Als Ausgänge stellen sie Signale zur Verfügung, die sich nicht häufig ändern und die zur Steuerung von Transistoren und LEDs genutzt werden oder dazu dienen, andere ICs zu aktivieren (enable-Funktion) oder untergeordnete Schaltungen zu versorgen. Als Eingänge konfiguriert ermöglichen sie das Ablesen der Zustände von Tastern und Schaltern und empfangen Interrupt-Request-Signale und Ähnliches. Obwohl solche Signale in vielen Anwendung recht langsam sind, heißt das nicht, dass digitale I/O-Anschlüsse keine schnellen Signale verarbeiten könnten – im Gegenteil: Digitale Ausgänge können zum Beispiel zur Lieferung schneller Taktsignale für andere Chips herangezogen werden. Digitale Ein- und Ausgänge können auch kombiniert werden, um serielle oder parallele Interfaces zur Datenübertragung zu erzeugen. Außerdem lassen sich mit ihnen Standard- oder I²C Interfaces zur Datenübertragung aufbauen, wenn eines bei der verwendeten MCU fehlt. In diesem Falle ist von Soft(ware)Communication Ports, also von Soft-Schnittstellen zu Datenübertragung die Rede, um sie von den vergleichbaren, bereits in der Hardware enthaltenen Ports zu unterscheiden.
6.1
Ein Überraschungsprogramm
Beim Arduino sind die digitalen I/O-Verbindungen der MCU einfach zu handhaben, da sie nur über die drei Funktionen pinMode, digitalRead und digitalWrite verfügen. Mit pinMode wird ein Pin als Ein- oder Ausgang definiert. Der Zustand eines Ausgangs wird mit digitalWrite bestimmt, und ein Eingang kann mit digitalRead gelesen werden. Im letzten Kapitel haben wir bereits gesehen, wie ein Ausgang eingestellt und verwendet wird. Auch bei einem Eingang ist dies genau so einfach. Hier ein Beispiel eines kurzen Sketchs voller Überraschungen. Er liest den Wert eines Eingangs und entscheidet, ob die LED des Arduino-Boards eingeschaltet wird oder nicht.
79
enarvuino_14x21_06.fm Page 80 Mercredi, 6. août 2014 4:49 16
6. Digitale Signale: Alles oder Nichts /* * key 1 */ int led = 13; int key = 8; void setup(void) { pinMode(led,OUTPUT); } void loop(void) { int val = digitalRead(key); digitalWrite(led,val); }
Die erste Überraschung besteht darin, dass ich die Variable für den Eingang key genannt habe. Warum? Weil es Sinn macht, einen Taster oder ein Keyboard an diesen Eingang anzuschließen, um die LED zu steuern. An diesem Punkt möchte ich Sie weiterhin mit einer Anmerkung zum Thema Sprache überraschen: Bitte gewöhnen Sie sich daran, in Englisch zu programmieren. Dies mag angesichts der zunehmenden Verfremdung des Deutschen durch Anglizismen etwas ungewöhnlich erscheinen, aber bedenken Sie bitte, dass der Arduino weltweit einen großen Bekanntheitsgrad erlangt hat. Was geschieht, wenn sich irgendwann ein Programmierer am anderen Ende der Welt mit Ihrer Software beschäftigt? Da bedarf es natürlich schon einer gemeinsamen Basis. „Englisch“ programmieren bedeutet in diesem Zusammenhang, dass Sie den Variablen, Konstanten und Funktionen englische Namen verleihen und auch Kommentare in Englisch verfassen. Auch eventuelle Programmoberflächen, die auf irgendeinem Monitor erscheinen können, sollten eine englische Beschriftung aufweisen. Wenn Sie ein Programm jedoch grundsätzlich nur für sich nutzen, kann es natürlich auch deutsche Namen (oder Namen einer beliebigen anderen Sprache) enthalten. Die dritte Überraschung besteht darin, dass es keine Anweisung gibt, die den keyPin als Eingang konfiguriert. Die vierte Überraschung: Schließen Sie keinen Taster an. Doch erst mal zurück zur dritten Überraschung: Das fehlende Statement pinMode(key,INPUT). Wie schon in Abschnitt 5.3 (Seite 67) erwähnt, werden zu Beginn standardmäßig alle Pins als Eingang definiert. Daher ist es nicht notwendig, dies beim key-Pin zu wiederholen. Dies gilt höchstwahrscheinlich für alle Pins aller Mikrocontroller der Welt, die als Ein- und Ausgang arbeiten können. Genau genommen ist es so, dass Mikrocontroller nach einem Reset dazu tendieren, ihre Ausgänge zu unterbrechen und die Pins, die als Eingänge funktionieren können, auch als Eingänge konfigurieren. Das Ziel dieser „Überlebensstrategie“ 80
enarvuino_14x21_07.fm Page 127 Mercredi, 6. août 2014 4:41 16
7.
Analoge Signale: Weder schwarz noch weiß
Im vorigen Kapitel war von Signalen die Rede, die nur zwei Pegel annehmen konnten, und für die spezielle, digitale Ein- und Ausgänge zur Verfügung stehen: Digitale Signale. Doch in der realen Welt gibt es nicht nur die Farben schwarz und weiß, sondern auch Zwischentöne in allen Grauschattierungen und in Farbe. Nur wenige Dinge sind wirklich binär, wie zum Beispiel Tod oder Leben, und selbst im lebendigen Zustand kann es nahezu unendlich viele, unterschiedliche Zustände (z.B. krank oder gesund) geben. In der Welt der Mikrocontroller werden Signale, die außer HIGH und LOW noch andere Zustände einnehmen können, als „analog“ bezeichnet, ganz gleich, ob sie nun aus drei Pegeln oder aus unendlich vielen Pegeln zusammengesetzt sind1. Um mit solchen Signalen zu interagieren, sind Mikrocontroller mit so genannten Analog-Digital-Wandlern ausgestattet, die analoge Signale in digitale Signale verwandeln. Es gibt auch Wandler, die digitale Signale in analoge Signale umwandeln – so genannte Digital-Analog-Wandler. Diese Sorte von Wandlern ist in MCUs jedoch eher selten vorzufinden.
7.1
Digital Switchover
Der Analog-Digital-Wandler (kurz A/D-Wandler genannt) ist eine Einheit, die ein am Eingang vorhandene, analoge Spannung in einen proportionalen, digitalen Wert umwandelt. Achtung! Wir sprechen hier nicht von binären, sondern von digitalen Werten. Dazu ein Beispiel: Eine Spannung von 0 Volt entspricht dem binären Wert 0. Eine Spannung von einem Volt wird in den Wert 100 verwandelt - aus zwei Volt ergibt sich die Zeichenfolge 200. Dieser Vorgang wird auch als Digitalisierung bezeichnet. Der A/D-Wandler ist wie eine Messlatte zur Bestimmung der Höhe einer Spannung - und wie eine Messlatte ist auch er in seiner Genauigkeit durch die Auflösung seiner Skala begrenzt Wenn die Skala in Millivolt unterteilt ist, lassen sich Spannungen von 10 oder 11 mV genau messen, aber es ist in diesem Falle nicht möglich, Spannungen von beispielsweise 10,3 mV zu digitalisieren. Beim Umwandeln von analog zu digital werden die Ergebnisse quantisiert. 1. Ich möchte an dieser Stelle auf die philosophische Diskussion, ob binäre Signale wirklich binär sind, verzichten. In diesem Buch gibt es sie jedenfalls: Die binären bzw. digitalen und die analogen Signale.
127
enarvuino_14x21_07.fm Page 128 Mercredi, 6. août 2014 4:41 16
7. Analoge Signale: Weder schwarz noch weiß Die Auflösung eines D/A-Wandlers ist gleichzusetzen mit dem kleinsten Unterschied zwischen zwei analogen Werten, die er gerade noch unterscheiden kann. Sie hängt ab von der Anzahl der Bits, die ein Wandler am Ausgang zur Verfügung stellt. Mit 10 Bit kann der Eingangsbereich in 1024 Stufen unterteilt werden. Bei 8 Bit sind es nur 256 Stufen und bei 16 Bit wächst die Skala auf über 65000 Unterteilungen. Das Arduino-Board besitzt einen 10-Bit A/-Wandler. Die niedrigste, binäre Ausgangszahl ist 0 und die höchste Zahl beträgt 1023 (nicht 1024). Um die Zahl 1024 darzustellen, müssten wir eine weitere Binärstelle hinzufügen. Sie können dies an einem einfachen Beispiel mit einer Binärzahl, die aus drei oder vier Bits besteht, leicht nachvollziehen. Wenn mein Lexikon Recht hat, dann bedeutet „Messen“ so viel wie, etwas anhand eines Referenzwertes zu beurteilen. Das Messen einer Spannung mit einem A/DWandler erfordert daher eine Referenzspannung, Vref. Diese Spannung wird meistens von der Versorgungsspannung abgeleitet, die bei den Uno- und MegaBoards mit ihren AVR-Mikrocontrollern 5 V beträgt. Dies wiederum bedeutet, dass der Wert 1023 einer Spannung von 5 V entspricht. Überschreitet die Eingangsspannung diese Referenzspannung, so bleibt der Ausgang des A/DWandlers bei 1023 stehen (solange die Maximalspannung nicht überschritten wird). Um genau zu sein: Der Maximalwert 1023 ist gleich dem Wert der Referenzspannung, vermindert um die Spannung, die einem Bit entspricht. Das sind genau 4,995 mV. Das liegt daran, dass der Gesamtbereich in 1024 Stufen unterteilt ist. Jede Stufe hat eine „Höhe“ von 4,883 mV, und 1023 × 4,883 mV ergibt 4,995 V. In diesem Buch können und werden wir diesen kleinen Unterschied jedoch ignorieren. Die Referenzspannung werden wir später noch einer genaueren Betrachtung unterziehen. So wie bei allen Mikrocontrollern hat auch der A/D-Wandler des AVR nur einen Eingang - auch wenn im Datenblatt etwas anders zu lesen ist. Dennoch besitzen viele Boards mehrere Analogeingänge, auch „Kanäle“ genannt. Diese werden im Multiplexverfahren nacheinander abgefragt, da der A/D-Wandler immer nur einen Kanal zur gleichen Zeit bearbeiten kann. Die MCU des Uno besitzt sechs solcher Analogkanäle, und der Mega ist sogar mit 16 Kanälen ausgestattet. Der A/D-Wandler des AVR ist nicht besonders schnell. Ein Konvertierungsvorgang benötigt eine Mindestzeit von 13 µs, und das Lesen von 16 Kanälen dauert daher 16 Mal so lang. Das sind 208 µs, was einer Samplerate von 5 kHz entspricht. Das ist nicht sehr hoch. Gemäß der Arduino-API-Dokumentation benötigt ein Wandlungsvorgang etwa 100 µs, was sieben Mal langsamer ist als die beste Wandlungszeit des AVR. Es ist leicht einzusehen, dass der Arduino nicht gerade die
128
enarvuino_14x21_08.fm Page 173 Mercredi, 6. août 2014 4:43 16
8.
Kommunikation: Kunst und Wissenschaft
In den letzten Jahrzehnten wurde von Chipherstellern, Ingenieuren, Wissenschaftlern und vielen anderen Gruppen eine solch große Vielfalt an Kommunikationsstandards erfunden, entwickelt und eingeführt, dass es heute kein Problem mehr sein dürfte, nach einiger Recherche die richtige Lösung für nahezu jede Anwendung zu finden. Dass es so viele Standards gibt, wird verständlich, wenn man bedenkt, dass sogar innerhalb eines Mikrocontroller-Systems auf vielen verschiedenen Ebenen kommuniziert wird: Mit dem Anwender Zwischen den Systemen ✦ Zwischen den Komponenten ✦ Zwischen den On-Chip-Peripheriegeräten ✦ ✦
Die Kommunikation mit dem Anwender erfolgt über ein so genanntes HMI (Human-Machine-Interface), das aus Kontrollleuchten, LEDs, Displays, Buttons und anderen Einheiten besteht. So überraschend es klingen mag: Diese Art der Kommunikation ist kaum standardisiert, weshalb Sie auch das Manual eines jeden Gerätes, das Sie kaufen, gut lesen und noch besser aufbewahren sollten - eine Fähigkeit, zu der leider nur wenig Leute in der Lage sind. Doch davon soll in diesem Buch nicht die Rede sein (aber vielleicht in einem anderen). In diesem Kapitel werden wir uns mit drei Ebenen der Kommunikation beschäftigen; Ebenen, die wir als „gemeinsamen Nenner“ der Kommunikation zwischen Maschinen betrachten können. Auch das Schlagwort „machine-to-machine communication“ (M2M) wäre in diesem Zusammenhang recht passend, obwohl es sich bei den „Maschinen“ hier wohl eher um kleinere Elektronikgeräte handeln dürfte. Im Gegensatz zum Mensch-Maschine-Kommunikation sind die Kommunikationsprotokolle anderer Maschinen sehr häufig standardisiert und gut dokumentiert. Das bedeutet leider jedoch nicht, dass wir die betreffenden Handbücher ignorieren dürfen, da die Art der Protokolle von Entwickler zu Entwickler recht unterschiedlich sein kann und manche Standards sehr kompliziert sind. Die Kombination der Begriffe Kommunikation und Protokolle mag verwirrend sein, aber ich denke, es ist legitim. In meinem Lexikon wird Kommunikation wie folgt definiert:
173
enarvuino_14x21_08.fm Page 174 Mercredi, 6. août 2014 4:43 16
8. Kommunikation: Kunst und Wissenschaft „Ein Prozess, bei dem Information zwischen Individuen über ein gemeinsames System von Symbolen, Zeichen und Verhalten ausgetauscht wird“. Das stimmt mit meinen Vorstellungen recht gut überein. Die erste Hälfte klingt für mich wie Kommunikation; die zweite Hälfte bezieht sich darauf, wie sie vonstatten geht, das heißt: das Protokoll. Kommunikation ist also der Akt des Kommunizierens. Der Plural des englischen Begriffes für Kommunikation lautet: „Communications“, was wiederum so viel bedeutet wie: „Die beim Transport von Nachrichten verwendete Technik“ oder „Ein System zum Senden oder zum Austausch von Information“ sowie „jegliche mit der Aussendung von Information verbundene Tätigkeit wie Werbung, Journalismus oder Funk- und Printmedien. Abgesehen von der letzten passen alle oben aufgeführten Definitionen zu diesem Kapitel. Sie enthalten alles vom Verbindungskabel bis hin zu jenen Dingen, die zu Missverständnissen führen und uns Zeit verlieren lassen. Kommunikation braucht einen Übertragungskanal wie zum Beispiel ein Kabel oder eine drahtlose Verbindung, wobei es nicht nur um Funk, sondern auch um Licht, Schall, Geschmack oder Geruch handeln kann. Das Medium transportiert die Information und beeinflusst die Art und Weise, wie die Daten ausgetauscht werden können. Die Kapazität und die Zuverlässigkeit des Übertragungskanals bestimmen zum Teil das Kommunikationsprotokoll, das benötigt wird, damit all dies auch funktioniert. Das Protokoll kapselt die zu übertragenden Daten mit zusätzlichen Informationen ein, damit der Empfang fehlerfrei vonstatten geht. Je zuverlässiger ein Übertragungsweg ist, desto einfacher kann das Protokoll sein, und desto mehr Informationen können über diesen Weg pro Zeiteinheit übertragen werden. Der Abstand zwischen zwei Kommunikationseinheiten ist umgekehrt proportional zur Zuverlässigkeit der Übertragungskanäle. Ein Kabel ist im Allgemeinen zuverlässiger als eine kabellose Verbindung, aber sie ist nicht immer ökonomisch oder praktisch. Die Komplexität des Protokolls und die Möglichkeiten und Eigenschaften des Übertragungsweges hängen vom Wesen der zu übermittelnden Daten ab. Ein Geldautomat und eine Bank kommunizieren nicht auf die gleiche Weise miteinander wie dies bei einem Computer und einem GPS-Empfänger der Fall sein mag. Mehrere parallele Kanäle können mehr Daten pro Zeiteinheit übertragen als ein einzelner Kanal1. Es gab eine Zeit, in der die parallele Übertragung zum Standard in Computersystemen gehörte und die Daten über Flachbandkabel mit Dutzenden von Einzelleitungen übertragen wurden. Vielleicht hat Ihr PC ja noch einen Parallelport? Den erkennt man sofort an der Breite der betreffenden Anschlussbuchse. Wahrschein1. MIMO (Multiple In Multiple Out) Technik für drahtlose Systeme.
174
enarvuino_14x21_09.fm Page 241 Mercredi, 6. août 2014 4:45 16
9.
Die Uhr tickt
„Was ist Zeit? Wenn niemand mich fragt, weiß die Antwort ich wohl. Will ich’s dem Fragenden erklären, so weiß ich’s nicht1“. Augustinus von Hippo war nicht der Einzige, der über das Phänomen Zeit nachdachte. Der Mensch hat immer schon über die Natur der Zeit und die Möglichkeit ihrer Messung nachgegrübelt. Grundsätzlich ist die Zeit durch astronomische Phänomene definiert: Die Dauer einer Drehung der Erde um sich selbst definiert die Länge eines Tages, und die Zeit, die die Erde zur Umrundung der Sonne benötigt, entspricht einem Jahr. Das Problem der Zeitmessung wurde im Jahre 1967 endgültig gelöst, als die „General Conference on Weights and Measures“ (Allgemeine Konferenz für Maße und Gewichte GPM) die Sekunde neu definierte. Sie entspricht seitdem genau 9,192,631,770 Schwingungen eines in einem Cäsium-133-Atom durch Elektronenübergang erzeugten Photons. Die neu definierte Länge musste natürlich extrem genau mit der historisch ermittelten und astronomisch bedingten Länge übereinstimmen, da ansonsten die Sonne irgendwann in der Zukunft um Mitternacht am Zenith stehen, und die Bäume im Juni ihre Blätter abwerfen würden. Das letzte Wort bei der Definition der Sekunde scheint jedoch noch nicht gesprochen zu sein: Im Jahre 2012 erhielt der Physiker David Wineland den Nobelpreis2 für das Einfangen von Ionen mittels Laser, was laut Experten zu einer Neudefinition der Sekunde führen könnte.
9.1
Hier ist Radio Frankfurt
Die neue, auf Atomen basierende Zeit hat zur Entwicklung extrem genauer, so genannter Atom-Uhren geführt. Auch wenn solche eine Uhr für den Hausgebrauch unerschwinglich ist, muss niemand auf sie verzichten: Jeder GPS-Satellit ist zum Beispiel mit einer Atomuhr ausgestattet, so dass in einigen von GPS-Empfängern erzeugten NMEA-0183A-Sätzen die genaue Zeit enthalten ist3. 1. Die Bekenntnisse des heiligen Augustinus, Buch 11, Kapitel 14 (397 n. Chr.) 2. Er teilte sich den Preis mit dem Franzosen Serge Haroche, der eine ähnliche Leistung erbrachte. 3. Stimmt natürlich nicht ganz: Die Laufzeit elektromagnetischer Wellen zwischen Sender und Empfänger muss noch berücksichtigt werden (300.000 km/sec).
241
enarvuino_14x21_09.fm Page 242 Mercredi, 6. août 2014 4:45 16
9. Die Uhr tickt Auch ein terrestrischer Empfang der Atom-Uhr-Zeit ist möglich; zum Beispiel über den Sender DCF771 in Mainflingen bei Frankfurt, den Sender MSF in England oder über France Inter, dessen Signale aus Frankreich zu uns gelangen. Das DCF77-Signal wird häufig genutzt, weil es fast in ganz Europa zu empfangen ist und kleine und preiswerte Empfänger dafür gut erhältlich sind. Die Art und Weise, wie die absolute Zeit im Signal codiert ist, macht diesen Sender zum idealen Objekt für Experimente zur Mikrocontroller-Zeiterfassung und -Anzeige. Statt die genaue Funktion solch eines DCF77-Empfängers im Detail zu beschreiben, beschränke ich mich auf die Struktur der übermittelten Daten, da, wie schon erwähnt, preisgünstige, fertige Empfänger in großer Vielfalt auf dem Markt angeboten werden. Im Abschnitt 9.4 (Seite 254) finden Sie ein paar weitere Einzelheiten zur Modulation des Signals. Das DCF77-Signal ist sehr langsam: Die Daten werden einmal pro Minute mit einer Frequenz von einem Hertz (1 Baud) übertragen. Das ist mehr als zehntausend Mal langsamer als beim ersten Internet-Modem mit seinen „rasanten“ 14,4 KBaud. Die Bits selber stellen hier einen Sekundenzähler dar, der im Datenstrom nicht enthalten ist. Ein Bit kann zwei verschiedene Längen haben: Eine logische Null dauert 100 ms und eine logische 1 dauert 200 ms. Bit 59 (oder Sekunde 59) wird nicht gesendet, was dem Empfänger eine Resynchronisation auf den Datenstrom erlaubt. Der Beginn des ersten Bits, Bit 0, entspricht dem Start eines neuen Zeitfensters (time frame). 9.1.1 DCF77 Alle im Handel erhältlichen DCF-77-Empfänger sind mit einem digitalen Ausgang ausgestattet. Es ist auch möglich, ein entsprechendes Modul aus einem fertigen Funkwecker oder einer Funkuhr auszubauen. Solche Uhren sind ebenfalls zu geringen Preisen erhältlich. Einige Module besitzen einen Ausgang mit offenem Kollektor, so dass ein Pullup-Widerstand nötig ist. Die Versorgungsspannung kann bei verschiedenen Modulen variieren, aber die meisten arbeiten mit 5 V. Ist dies nicht der Fall, so sind für die Anpassung an den Arduino Pegeladapter erforderlich. Das in diesem Buch beschriebene und von mir verwendete Modul gehört zu den Exemplaren, die am preiswertesten und am einfachsten erhältlich sind. Es wird mit 5 V versorgt und hat zwei Ausgänge, die gegeneinander invertiert sind.
1. Die Abkürzung des Senders ist nicht so leicht zu entziffern wie sein Signal. D steht für Deutschland, C bedeutet Langwellensender, und F bezieht sich auf Mainflingen (bei Fankfurt), wo der Sender steht, und 77 steht für die Trägerfrequenz 77,5 KHz.
242
enarvuino_14x21_10.fm Page 307 Mercredi, 6. août 2014 4:47 16
10.
Interrupts: Die Büchse der Pandora
Bisher war es bei unseren Beispielprogrammen so, dass immer dann, wenn auf das Eintreten eines Ereignisses gewartet wurde, die MCU nichts zu hatte und sozusagen mit „Däumchen-Drehen“ beschäftigt war. Solch ein Ereignis konnte zum Beispiel ein bestimmtes Signal wie eine Flanke oder ein Pegel an einem Eingang sein - oder das Erreichen eines bestimmten Variablenwertes. Dass dies nicht sehr effizient ist, wäre nicht weiter schlimm, aber in manchen Fällen kann es sogar von Nachteil sein, die MCU während des Wartens zu blockieren. Stellen wir uns ein System vor, in welchem ein Mikrocontroller auf zwei oder sogar mehr Ereignisse, die zu beliebigen Zeiten auftreten können, unterschiedlich reagieren soll. Wenn Ereignis A immer vor Ereignis B stattfindet, kann zuerst auf A und dann auf B gewartet werden. Doch wenn die Ereignisse unabhängig voneinander stattfinden und Ereignis A tritt genau dann auf, wenn sich die MCU gerade in einer Schleife befindet, um auf Ereignis B zu warten, so kann sie nicht auf Ereignis A reagieren. Schlimmstenfalls könnten von solchen Situationen sogar Menschenleben abhängen, wenn diese in Computern auftreten, die in lebenswichtigen Alarmsystemen eingebaut sind. Zum Schutz solchen Szenarien wurden die so genannten „Interrupts“ erfunden. Sie geben den Entwicklern von Mikrocontroller-Systemen die Möglichkeit, aus kritischen Programmsituationen zu „flüchten“. Ein Interrupt ist ein Signal, das dazu dient, die MCU jederzeit auf ein bestimmtes Ereignis sofort reagieren zu lassen. Die MCU unterbricht (interrupt = Unterbrechung) ihre momentane Aktivität und führt stattdessen eine ganz bestimmte, andere Funktion aus. Das oberste Ziel der MCU ist dabei immer, alles „stehen und liegen“ zu lassen und so schnell wie möglich auf den Interrupt zu reagieren. Das ist so, wie sich die meisten Menschen bei einem Telefonanruf verhalten: Sie unterbrechen das momentane Gespräch und greifen zum Hörer. Natürlich gehen sie dabei nicht so hektisch vor, dass Sie gleich ihre Kaffeetasse fallen lassen: Sie stellen sie auf dem Tisch ab. Soviel Zeit muss sein - auch bei der MCU. Bei ihr dauert dies jedoch nur ein paar Mikrosekunden. Nachdem der Interrupt verarbeitet wurde, kehrt die MCU zur zuvor unterbrochenen Arbeit zurück. Viele Programmier-Anfänger haben Angst vor Interrupts. Wenn man jedoch ein paar Regeln beachtet, ist das Ganze gar nicht so schwer. Für ein sauberes Interrupt-Management ist es allerdings eine Grundvoraussetzung, die Funktionsweise von Interrupts zu verstehen.
307
enarvuino_14x21_10.fm Page 308 Mercredi, 6. août 2014 4:47 16
10. Interrupts: Die Büchse der Pandora
10.1 Mein erster Interrupt Die MCU besitzt eine Tabelle, in der für jeden bekannten und erlaubten Interrupt die entsprechende Adresse (Vektor) der Funktion aufgelistet ist, die beim Auftreten des entsprechenden Interrupts ausgeführt werden muss. Wenn ein Interrupt auftritt, beendet die MCU die Ausführung der aktuellen Instruktion und notiert in einem speziellen Speicherbereich, womit sie während des Auftretens des Interrupts gerade beschäftigt war (wie z.B. die Werte einiger wichtiger Register). Dann schaut sie in der Tabelle nach, wo sie hingehen muss, um auf den betreffenden Interrupt zu reagieren, springt schnell dorthin und führt den dort stehenden Code aus. Die auszuführende Funktion, die Interrupt Service Routine (ISR)1, sollte endlich sein, damit die MCU die Aktivitäten, mit denen sie vor dem Auftreten des Interrupts beschäftigt war, wieder aufnehmen kann – aber das ist nicht zwingend. 10.1.1 Timer/Counter 0 Hier ein einfacher Sketch, der mit Interrupts arbeitet: /* * interrupts 1 */ void setup(void) { } void loop(void) { }
Nein, ich mache keine Witze: Obwohl in diesem Sketch scheinbar nichts passiert, wird seine Ausführung fast jede Millisekunde von timer/counter0 unterbrochen. Wie schon im vorhergehenden Kapitel erklärt, ist dieser Zähler im Arduino für die Funktion millis und Konsorten reserviert. Der Zähler wird gestartet, wenn ein Sketch gestartet wird. Ohne Eingriff des Anwenders wird er nur angehalten, wenn man die Versorgung der MCU abschaltet. Im Arduino wird dieser 8-Bit-Zähler mit 250 kHz getaktet (16 MHz/64) und zählt von 0 bis 255 (256 Werte). Bei einem Zählerüberlauf wird ein Interrupt-Request erzeugt, der bewirkt, dass der Mikrocontroller die damit verbundene Interrupt-Service-Routine ausführt.
1. Interrupts sind wie Gäste oder Kunden: Sie werden immer bevorzugt und mit einem Lächeln bedient.
308
enarvuino_14x21_11_TravauxPratiques.fm Page 355 Mercredi, 6. août 2014 4:30 16
11. 11.1
Schaltungen und Übungen Einführung
Nach dem Lesen aller bisherigen Kapitel mit alle ihren Schaltungsvorschlägen haben Sie vielleicht Lust bekommen, mal wieder öfter zum Lötkolben zu greifen. Haben Sie auch alle Vorschläge wirklich nachgebaut und ausprobiert? Einige waren ja recht einfach, aber ich bin nicht sicher, ob sich auch alle Leser an die komplexeren Schaltungen dieses Buches gewagt haben. Falls nicht: Keine Angst. Ich bin niemandem böse, da ich weiß, dass dies eine ziemlich mühsame Arbeit sein kann. Aus diesem Grunde habe ich für Sie eine spezielle Platine entwickelt, mit der Sie Ihre neu erworbenen Programmierkenntnisse auf komfortable Weise an realistischer Hardware ausprobieren können 11.1.1 Ein Format für alles Wenn Sie die in den vorhergehenden Kapiteln beschriebenen Schaltungen im Überblick betrachten, werden Sie feststellen, dass man sie in verschiedene Gruppen unterteilen kann, und dass für jede Gruppe immer dieselbe, mit dem Arduino zu verbindende Experimentierplatine möglich wäre. Diese Art der Gruppierung und Schaltungs-Weiterentwicklung ist nicht zufällig, sondern hat sich beim Schreiben dieses Buches automatisch ergeben. Wenn ein Board vollständig belegt war, habe ich mit einem neuen Board begonnen. Eine einzige Platine für alle Schaltungen zu entwerfen, ist daher zwar eine logische Weiterentwicklung, aber nicht ganz einfach. Die betreffende Platine ist daher ein Kompromiss und nicht ganz so multifunktional wie erhofft: Die Schaltungen aus Kapitel 6 werden von der Platine nicht unterstützt. Der H-Brücken-Motor aus Kapitel 7 kann auf der Platine nicht montiert werden, aber das Experiment ist dennoch möglich. Außerdem gibt es noch Probleme bezüglich der Erhältlichkeit von Bauelementen: Der Drucksensor aus Kapitel 8 (HP03S) ist inzwischen leider nicht mehr lieferbar, so dass ich ihn durch eine analoge Version ersetzen musste.
355
enarvuino_14x21_11_TravauxPratiques.fm Page 356 Mercredi, 6. août 2014 4:30 16
11. Schaltungen und Übungen 11.1.2 Auf geht’s! Der Schaltplan der Multifunktionsplatine wird in Bild 11.1 gezeigt. Wie man sieht, bietet die Platine Platz für eine ganze Reihe Hardware, deren Montage durch eintsprechende Aufdrucke auf der Platine ein Kinderspiel ist. Wie Sie in den folgenden Abschnitten noch sehen werden, verwenden wir die vorgegebenen Lötaugen auch für andere Zwecke als angegeben. Man kann auch nicht alle Bauteile gleichzeitig einlöten, da manche sich ihre Anschlüsse mit anderen Bauelementen teilen. Löten Sie zuerst die Pfostenverbinder ein (K2 bis K5) auf der Kupferseite (Leiterbahnseite) der Platine ein. Alle anderen Komponenten müssen auf der entgegengesetzten Seite angebracht werden (Bauteile-Seite). Kommen wir nun zu den einzelnen Schaltungen in der Reihenfolge ihrer Beschreibung in diesem Buch.
11.2
LED-Dimmer
Inspiriert von Bild 7.3 braucht diese kleine Schaltung nur drei Bauteile: P1, R1 und LED1. Den dazugehörigen Sketch finden Sie in Abschnitt 7.2 (Seite 134). Doch Vorsicht: Ohne eine kleine Änderung funktioniert das Ganze nicht: Vergleichen Sie bitte die Bilder 11.2 und 7.3. Sehen Sie den Unterschied beim Schleifer von P1? Wie man die Änderung durchführt, müssten Sie inzwischen selber herausfinden können. Daher möchte ich an dieser Stelle nicht mehr verraten. Im Zweifelsfalle können Sie dazu auch noch einmal den Abschnitt 7.2 dieses Buches durchlesen.
356
Clemens Valens
Mikrocontroller
verstehen und anwenden Schnell und einfach mit Arduino und Elektor-Shield Mit diesem Buch erweitert der Leser seine Mikrocontroller-Kenntnisse auf Grund eigener Erfahrungen und Erfolgserlebnisse und wird dazu noch ganz nebenbei in die Welt des Arduino und seiner Entwicklungsumgebung eingeführt. Am Ende dieses vergnüglichen und fast spielerischen Lehrgangs stellen Begriffe wie I/O, Speicherplatz, Interrupts, Kommunikationsstandards, A/D-Konverter (und vieles mehr) keine Geheimnisse mehr dar und der Leser ist in der Lage, auch andere Mikrocontroller zu programmieren. Mit anderen Worten: ein erstes MikrocontrollerBuch mit Happy End.
Mikrocontroller verstehen und anwenden
Clemens Valens
Mikrocontroller
verstehen und anwenden Schnell und einfach mit Arduino und Elektor-Shield
Neues Konzept: Dieses Buch überrascht mit einem völlig neuen Konzept an Schaltungsbeispielen: Mit speziellen Arduino-Anwendungen vertreiben Sie störende Freunde und Familienmitglieder sicher und zuverlässig aus Ihrer Umgebung und machen so Schluss mit lästigen gesellschaftlichen Verpflichtungen, so dass Sie in Zukunft Ihre komplette Freizeit nur noch der Programmierung von Mikrocontrollern widmen können. • Originelle Anwendungsbeispiele • Geringe Hardware-Kosten • Freie und offene Software (Open Source) Alle gezeigten Programme können kostenlos von der Elektor-Website heruntergeladen werden.
ISBN 978-3-89576-296-3
Clemens Valens
Dieses Buch ist für Sie geeignet, wenn Sie Anfänger auf dem Gebiet der Mikrocontroller sind, als Arduino-User bzw. -Enthusiast Ihre Kenntnisse vertiefen möchten, Elektronik studieren oder als Lehrer inspiriert werden möchten.
Elektor-Verlag GmbH 52072 Aachen www.elektor.de Cover_Mikrocontroller_verstehen+anwenden_rz.indd 1
28.05.14 11:11