Sie sind auf Seite 1von 122

32 | So funktionierts

Arduino
Teil 1

www.elvjournal.de

Arduino_Teil_1.indd 32 06.11.13 12:14


So funktionierts | 33

verstehen und anwenden


Einstieg in die Hardware: Arduino und AVR-Mikrocontroller

Dies ist der erste Teil einer Artikelserie zum The- Das Konzept einer unkomplizierten und preisgns-
ma Arduino. In diesem Beitrag werden zunchst die tigen Hardwareplattform zusammen mit einer frei ver-
Kapitel fgbaren, leicht zu beherrschenden Programmierober-
Arduino das erfolgreichste Mikrocontroller-Board che (die sogenannte IDE = Integrated Development
der Welt Environment) fand auch bei anderen Anwendergruppen
Das Arduino-Board als Basis fr C-Anwendungen wie etwa Hobbyisten oder Technikakademien Anklang.
Arduino-Varianten vom Mikro zum Mega Schlielich erkannten auch Schulen und Hochschulen
Schneller Einstieg mit der Arduino-Entwicklungs- im wissenschaftlichen und technischen Bereich das
umgebung enorme Potenzial der Arduino-Idee. Neben immer neu-
behandelt. en Hardware-Versionen entstanden auch aufsteckbare
Erweiterungsplatinen, sogenannte Shields, und die Er-
In weiteren Beitrgen werden dann u. a. die Themen folgsgeschichte des Arduinos nahm ihren Lauf.
Programmierung und Programmierpraxis Inzwischen sind die Verkaufszahlen der einzelnen
Programmbibliotheken und Shields Arduino-Versionen recht beachtlich, und der Arduino
Schnittstellen wie USB, RS232 und I2C, Ethernet kann mittlerweile sicherlich als das erfolgreichste Mi-
und WLAN krocontroller-Board aller Zeiten gelten.
Sensortechnik und Messwerterfassung Fr diesen berragenden Erfolg des Arduinos gibt
Interrupts und Polling es mehrere Grnde. Einerseits wird durch das kom-
Displaytechnik plett aufgebaute Prozessorboard der Einstieg in die
Physical Computing Hardware enorm erleichtert. Die typischen Anfnger-
vorgestellt. probleme wie falsche Spannungsversorgungen, Prob-
leme mit dem Quarzoszillator oder ungltige Kon-
Arduino das erfolgreichste gurationsparameter, sogenannte Fuse-Bits, sind beim
Mikrocontroller-Board der Welt Arduino unbekannt. Das Board wird einfach mit der
Die Idee zum Arduino wurde im Jahr 2005 am Insti- USB-Schnittstelle des PCs oder Laptops verbunden
tut fr Interaktives Design in Ivrea (Italien) geboren. und kann innerhalb weniger Minuten programmiert
Die erste Version des Arduinos bestand aus einem Bau- werden.
satz mit wenigen Einzelkomponenten und dem damals Die einfache Handhabung fhrte insbesondere bei
sehr populren ATmega8 als zentralem Mikrocontroller. Jugendlichen, aber auch bei Angehrigen der lteren
Nachdem diese ersten Baustze innerhalb krzester Generation, die noch niemals mit Elektronik in Berh-
Zeit verkauft waren, folgten rasch weitere Auagen. rung gekommen sind, zu einer ungeahnten Begeiste-
Knstler und Designer aus anderen Regionen nahmen rung fr die Mikrocontrollertechnik.
die Idee auf, und das Arduino-Prinzip verbreitete sich Ein weiterer Erfolgsfaktor ist die zugehrige Pro-
ber Italien und Europa schlielich in der ganzen grammieroberche. Diese steht als kostenlose Open-
Welt. Source-Version zur Verfgung. Eine langwierige Instal-

ELVjournal 5/2013

Arduino_Teil_1.indd 33 06.11.13 12:14


34 | So funktionierts

a) 6 Analog-Eingnge
L-LED Rx-/Tx-LED
Reset b) 14 digitale Ein- und Ausgnge
USB- Button c) Buchsen fr die Stromversorgung
Buchse
(GND, 3,3 V und 5 V)
d) Eingnge fr Referenzspannung und Reset
On-LED

ber diese Buchsenreihen kann auf alle fr die


Anwendungen relevanten Controllerpins zugegriffen
werden.
Externe
Span- Anschluss fr eine externe Spannungsversorgung
nungs-
versor- Eine ber eine Hohlbuchse zugefhrte externe Ver-
gung sorgungsspannung wird auf dem Board geregelt und
geglttet.

Eine USB-Schnittstelle
Die USB-Schnittstelle dient zur Programmierung des
Controller Controllers. Darber hinaus kann diese Schnittstelle
auch fr die Kommunikation des Mikrocontrollers mit
Bild 1: Arduino Uno einem PC whrend der Programmausfhrung einge-
setzt werden.

lation ist nicht erforderlich, und einfache Einstiegsbeispiele sorgen fr Der wichtigste Baustein auf dem Arduino ist der
den schnellen Erfolg. Komplizierte Parametereinstellungen wie bei ande- Mikrocontroller. Hierbei handelt es sich um einen
ren Entwicklungstools sind nicht erforderlich. Die ersten Beispielprogram- Halbleiterchip, der neben einer Prozessoreinheit auch
me knnen so im Handumdrehen auf den Arduino geladen und getestet verschiedene Peripheriefunktionen in einem einzigen
werden. IC vereinigt.
Der letzte Grund fr die groe Popularitt des Arduinos ndet sich in Meist ist auch der Arbeits- und Programmspeicher
der ganz eigenen Philosophie des Projekts. Alle Hard- und Softwarekom- auf dem gleichen Chip integriert. Ein Mikrocontroller
ponenten unterliegen dem sogenannten Open-Source-Prinzip. So werden ist somit mit einem kompletten Ein-Chip-Computer-
die Schaltplne und Layouts aller Arduino-Varianten im Internet verf- system vergleichbar [1].
fentlicht. Gleiches gilt fr die Software und die zugehrigen Quellcodes. Die bekannten Kriterien fr Prozessoren bestimmen
Weiterhin wird der Arduino-Anwender durch eine Flle von Software-Bi- auch die Einsatzmglichkeiten eines Mikrocontrollers.
bliotheken untersttzt. Diese ntzlichen Libraries werden zum Teil direkt Tabelle 1 fasst die wesentlichen Leistungsmerkmale
mit der Standard-IDE mitgeliefert. Beispiele hierfr sind Anwendungen des ATmega328 zusammen.
zur Thema Ethernet, LC-Displays oder die Ansteuerung von Schrittmoto- Auf modernen Mikrocontrollern der ATmega-Reihe
ren und Modellbauservos. nden sich zustzlich zu den einfachen Eingabe-/
Darber hinaus hat die Arduino-Community eine nahezu unberschau- Ausgabe-Ports auch komplexere Peripheriefunktionen
bare Flle von Bibliotheken fr alle mglichen Mikrocontroller-Applika- wie z. B.
tionen hervorgebracht. Damit lassen sich auch komplexere Aufgaben wie serielle Schnittstellen
etwa die Detektion von IR-Fernbedienungssignalen, das Ansteuern von IC-(Inter-Integrated-Circuit-)Bus
Ultraschallsensoren oder das Auslesen von SD-Speicherkarten problemlos PWM-Ausgnge
und schnell bewltigen. Analog-digital-Wandler

Arduino-Boards als Basis fr C-Anwendungen Damit lassen sich alleine mit dem Controller bereits
Das aktuell am weitesten verbreitete Board ist der Arduino Uno (Bild 1). umfangreiche Praxisprojekte realisieren. Als Beispiel
Dieses Board arbeitet mit dem ATmega328 und ergnzt ihn zu einem uni- fr die Leistungsfhigkeit eines modernen Controllers
versellen Mikrocontroller-System. zeigt Bild 2 eine selbst gefertigte Digitaluhr, die al-
Neben dem Prozessor selbst weist das Board hierfr noch die folgen- lein mit einem ATmega als integriertem Baustein aus-
den Hauptfunktionseinheiten auf: kommt. Es sind keinerlei weitere ICs erforderlich [2].

Resetschaltung mit Taster


Mit dem Taster kann der Controller manuell neu gestartet werden. Resets
sind aber im Gegensatz zu einem Windows-PC nur sehr selten erforderlich. ATmega328
32 KBytes Flash-Speicher
Quarz fr eine zuverlssige und przise Taktversorgung 1 KByte EEPROM
Falsch angeschlossene Quarze oder Lastkapazitten sind die hugste 2 KBytes SRAM
Ursache bei selbst entwickelten Controllerboards. Durch den fest instal-
2 8-Bit-Timer/-Counter
Tabelle 1

lierten Quarz entfllt diese Fehlerursache beim Arduino vollstndig.


1 16-Bit-Timer

Buchsenreihen fr den Anschluss externer elektronischer 6 Kanle fr 10-Bit-ADC


Bauelemente 23 programmierbare I/Os
Die Buchsen sind in vier Hauptgruppen unterteilt:

www.elvjournal.de

Arduino_Teil_1.indd 34 06.11.13 12:14


So funktionierts | 35

Die Stromversorgung des Arduino-Boards kann ber zwei verschiedene


Wege erfolgen:
ber die USB-Schnittstelle:
Dabei wird die Versorgungsspannung direkt dem angeschlossenen
Computer entnommen.
ber eine externe Spannungsquelle:
Ist der Arduino fertig programmiert, kann er auch ohne angeschlosse-
nen PC arbeiten. Dazu muss er nur mit einer externen Spannungsquelle
versorgt werden. Diese kann sowohl aus einem einfachen, unstabili-
sierten Steckernetzteil (Spannungsbereich 712 V) oder auch aus ei-
nem Batteriesatz (5x 1,5 V oder 9-V-Block) bestehen.

Bild 2: Selbst gefertigte Digitaluhr aufgebaut nur mithilfe eines


An dieser Stelle noch zwei wichtige Hinweise: Mikrocontrollers
TIPP I: Das Arduino-Board muss stets auf einer elektrisch isolieren-
den Unterlage liegen. Andernfalls kann es zu Kurzschlssen kom-
men, und sowohl der USB-Port des Rechners als auch der Arduino
knnen Schaden nehmen (Bild 3).
TIPP II: Will man den USB-Port des Rechners schtzen, kann man
einen USB-Hub mit eigener Spannungsversorgung einsetzen. Die-
se Hubs sind meist gut gegen berlastung abgesichert, und das
Durchschlagen eines Kurzschlusses ber den Hub hinweg zum
Rechner ist sehr unwahrscheinlich.
Bild 3: Das Board
steht unter Strom.
Arduino-Varianten vom Mikro zum Mega
Auer dem Klassiker Arduino Uno existiert noch eine Vielzahl weiterer
Boardvarianten. Neben dem Uno selbst sollen hier zwei weitere interes-
sante Vertreter dieser Familie genauer besprochen werden.
Eine Nummer kleiner als der Uno ist der Arduino Mikro (Bild 4). Dieser Mikro noch bei verschiedenen Projekten zum Einsatz
hat den Vorzug, dass er direkt in ein Breadboard gesteckt werden kann. kommen.
Er eignet sich daher hervorragend fr den Aufbau von Prototypen oder Falls mehr Rechenleistung oder eine hhere An-
fertigen Kleingerten. Im Rahmen dieser Artikelserie wird der Arduino zahl von Ports bentigt wird, kann der Arduino Mega
(Bild 5) eingesetzt werden. Dieser ist wesentlich gr-
er als der Uno und bietet zustzliche Pins fr um-
fangreichere Projekte.
Mini-USB-Buchse L-LED Controller Reset
Ansonsten existiert noch eine Flle weiterer Bau-
formen, wie etwa das runde Lillypad oder der Esplora,
der bereits ber mehrere fest verdrahtete Taster, Sen-
soren etc. verfgt. Weitere Details zu den einzelnen
Boards nden sich unter [3].

Schneller Einstieg mit der


Arduino-Entwicklungsumgebung
Neben der standardisierten Hardware liegt der groe
Vorteil des Arduino-Systems in der benutzerfreundli-
Bild 4: Arduino Mikro chen IDE. Im Gegensatz zu einer klassischen Tool-
Chain kann diese ohne umfangreiche Vorkenntnisse
bedient werden. Auerdem erfordert sie keine lang-
wierige Installation. Die ersten Programme knnen so
USB-Buchse L-LED Rx-/Tx-LED Controller Reset
direkt nach dem Start der Entwicklungsumgebung auf
den Mikrocontroller geladen werden.
Die aktuelle Version der IDE kann gratis herunter-
geladen werden unter: arduino.cc/en/Main/Software
Es stehen verschiedene Versionen fr die gebruch-
lichsten Betriebssysteme (Windows, Mac OS und Linux)
zur Verfgung. Fr Linuxfreunde ist die Arbeit unter
Ubuntu besonders einfach, da bereits bei der System-
installation ein Download-Icon im APPs-Bereich zur
Verfgung gestellt wird. Die Bedienoberche der
Externe Spannungsversorung Ubuntu-IDE ist weitgehend identisch mit der Win-
dows-Variante, sodass die hier dargestellte Vorgehens-
Bild 5: Arduino Mega weise auch fr Ubuntu anwendbar ist.

ELVjournal 5/2013

Arduino_Teil_1.indd 35 06.11.13 12:14


36 | So funktionierts

Bild 6: Typisches
Arduino-Verzeichnis Unter Windows liegen die vollstndigen Programm-
pakete als komprimierte ZIP-Archive vor und knnen in
ein beliebiges Verzeichnis extrahiert werden (Bild 6).
Das Verzeichnis enthlt dann alle zur Programmie-
rung erforderlichen Komponenten. Weiterhin werden
unter examples noch verschiedene Beispielprogram-
me mitgeliefert.
Darber hinaus knnen die Mglichkeiten des Ar-
duinos mit sogenannten Bibliotheken ergnzt werden.
Bild 7: Icon fr den Mehr zu diesem Thema ndet sich in spteren Beitr-
Start der Arduino-IDE gen dieser Artikelserie.

Nach dem Entpacken des ZIP-Archivs steht im Ver-


zeichnis
..\arduino-1.0.x.
das Startprogramm fr die IDE, arduino.exe, zur Ver-
fgung (Bild 7).
Nach erfolgreichem Start erscheint kurz ein In-
formationsfenster mit den blichen Angaben zu den
Eckdaten der verwendeten Programmversion (Bild 8).
Anschlieend wird die Oberche der IDE angezeigt.
Jetzt kann der Arduino ber ein USB-Kabel mit dem
PC verbunden werden.

TIPP III: Das USB-Kabel sollte nicht zu lang


Bild 8: Leeres IDE-Fenster sein. Kabellngen von mehr als 0,5 m knnen
zu bertragungsproblemen fhren. Insbesonde-
re der Arduino Micro reagiert auf lngere Kabel
sehr empndlich und verweigert unter Umstn-
den den Verbindungsaufbau.

Der Arduino meldet sich mit einer Aufforderung zum


Installieren eines Treibers (Bild 9). Diese Installation
ist nach wenigen Schritten abgeschlossen und nimmt
nur einige Minuten Zeit in Anspruch. Falls es dabei
wider Erwarten zu Problemen kommen sollte, nden
sich unter [4] Hinweise zur Fehlerbehebung.
Nach erfolgreicher Treiberinstallation kann mit der
IDE weitergearbeitet werden.
Zunchst muss die richtige Arduino-Boardvariante
ausgewhlt werden. Dies erfolgt unter den Menein-
trgen Tools und dann Board.
Dann ist die Selektion des verwendeten virtuel-
len COM-Ports erforderlich. Meist ist dies die letzte
Position in der Liste. Falls mehrere Ports angeboten
werden, hilft das Durchtesten aller angezeigten COM-
Bild 9: Aufforderung zur Treiberinstallation
Nummern (Bild 10).
Alle fr die Programmentwicklung notwendigen
Steuersymbole nden sich unterhalb der Menleis-
te am oberen Rand der IDE. Diese Icons werden im
nchsten Beitrag der Artikelserie genauer erlutert.
Zunchst sind nur die fr das Laden eines ersten Pro-
gramms erforderlichen Icons wichtig.
Mit dem Symbol OPEN wird ein bereits vorhan-
denes Programm geffnet. Bitte whlen Sie hierfr den
Sketch blink.ino. Dieser ist unter examples\01.Basics\
Blink zu nden.
Nach dem Laden des Programms sollte die IDE so
aussehen wie in Bild 11.
Mit dem Button UPLOAD wird das Programm in
Bild 10: Auswahl des COM-Ports den Speicher des Mikrocontrollers bertragen. Die mit

www.elvjournal.de

Arduino_Teil_1.indd 36 06.11.13 12:14


So funktionierts | 37

Rx/Tx bezeichneten LEDs leuchten dabei in unregel-


migen Abstnden auf und zeigen den Datenverkehr
auf der seriellen Schnittstelle an. Gleichzeitig wird am
PC die Meldung
Uploading to I/O Board
eingeblendet.

Der Abschluss der bertragung wird mit der Nach-


richt
Done Uploading
angezeigt. Danach beginnt die LED L regelmig zu
blinken und die beiden Rx-/Tx-LEDs erlschen (Bild 12).

Nach Abschluss der Datenbertragung wird also ein


Reset durchgefhrt und automatisch mit der Ausfh-
rung des Programms Blink begonnen.
Damit wurde bereits ein erstes Programm auf einen
Mikrocontroller bertragen, und weiteren Projekten
zum Thema Mikrocontroller und Arduino steht nichts
mehr im Wege.

TIPP IV: Weitere Details zur Inbetriebnahme


und zur Fehlerbeseitigung nden sich auch im
Mikrocontroller-Onlinekurs [5].

Ausblick
Im nchsten Artikel zu dieser Serie werden die Details
zur Arduino-Entwicklungsumgebung genauer bespro- Bild 11: Blink.ino ist geladen.
chen. Daneben wird das Thema Fehlersuche und -be-
seitigung im Vordergrund stehen.
Im Praxisteil entstehen dann bereits erste eigene
Programme wie ein Alarmanlagensimulator oder eine
Morsesignalbake.

Weitere Infos:

[1] G. Spanner: AVR-Mikrocontroller in C programmieren,


Franzis-Verlag, 2010
[2] G. Spanner: Arduino Schaltungsprojekte fr Pros,
Elektor-Verlag, 2012
[3] arduino.cc/en/Main/Products
[4] forum.arduino.cc/
[5] Mikrocontroller-Onlinekurs,
Franzis-Verlag, exklusiv fr ELV, 2011

Bild 12: Die LED L blinkt im Sekundentakt.

Alle Infos zu den Produkten/Bauteilen


nden Sie im Web-Shop.
Empfohlene Produkte/Bauteile: Best.-Nr. Preis
Arduino-Uno-Platine R3 JY-10 29 70 29,95
Arduino Micro JY-10 97 74 24,95
Arduino-Mega-2560-Platine JY-10 69 18 49,95
Hama-USB-Hub, 7fach mit Netzteil JY-08 25 54 24,95
USB-2.0-Verbindungskabel A auf B JY-09 55 56 0,95 Preisstellung August 2013
aktuelle Preise im Web-Shop

ELVjournal 5/2013

Arduino_Teil_1.indd 37 06.11.13 12:14


62 So funktionierts

Arduino verstehen
und anwenden
Teil 2: Die Programmierumgebung

www.elvjournal.de

Arduino_Teil_2.indd 62 02.01.14 14:21


So funktionierts 63

Im zweiten Teil der Beitragsreihe zum Thema Arduino // blink


wird die IDE (Integrated Development Environment),
also die sogenannte Entwicklungsumgebung, genau- int led = 13;
er betrachtet.
void setup()
In den Abschnitten { pinMode(led, OUTPUT);
Die Entwicklungsumgebung auf dem PC, }
Arduino-Processing und C: ein Vergleich,
Die Funktionen der IDE, void loop()
Die Standard-Beispielprogramme der IDE, { digitalWrite(led, HIGH);
Fehlerbeseitigung delay(1000);
werden zunchst alle wichtigen Eigenschaften dieser digitalWrite(led, LOW);
Entwicklungsumgebung dargestellt. delay(1000);
}
Abschlieend entstehen dann mit den Abschnitten
Der Alarmanlagensimulator, Hier kann man ohne groe Vorkenntnisse schon vermuten, dass eine
Intuitive Programmierung: der Arduino sendet Leuchtdiode (LED) in einem bestimmten Rhythmus geschaltet wird. Ein
Morsesignale entsprechendes Standard-C-Programm sieht da schon wesentlich kryp-
erste eigene Programme. tischer aus:

Die Entwicklungsumgebung auf dem PC // blink


Die Programmierung des Arduino erfolgt ber eine
speziell fr die Arduino-Boards entwickelte IDE. GHQH)B&38 H
Diese Entwicklungsumgebung ist mit Sicherheit ei- #include <avr/io.h>
ner der wesentlichen Erfolgsfaktoren des Arduino- #include <util/delay.h>
Projektes.
Die Oberche kann einerseits sehr intuitiv be- int main(void)
dient werden und erleichtert daher den Einstieg in { DDRB = 0b1;
die Welt der Mikrocontrollerprogrammierung ganz while (1)
erheblich. Andererseits basiert sie auf der im Con- { PORTB|=(1<<0);
trollerbereich am weitesten verbreiteten Program-   BGHOD\BPV  
miersprache C. PORTB&=~(1<<0);
Anders als beispielsweise beim Einsatz von BASCOM   BGHOD\BPV  
kann der Anwender spter somit problemlos auf }
professionelle IDEs wie etwa das ATMEL-Studio um- return 0;
steigen. Die mit der Arduino-Umgebung erlernten }
Befehle und Strukturen knnen dort weitestgehend
wiederverwendet werden. Das bereits erlernte Pro- Insbesondere die fr C typischen Bitmanipulationen und die logischen
grammierfachwissen ist also nicht verloren. Operatoren (|, &, ~, << etc.) lassen den embedded C-Code schwer lesbar
Fr die Programmierung der Arduino-Boards kommt erscheinen. Andererseits wird aber auch bereits bei diesem einfachen
Processing zum Einsatz. Dabei handelt es sich aber Programmbeispiel die enge Verwandtschaft zwischen Arduino-Proces-
eben nicht um eine spezielle Anfnger-Programmier- sing und C deutlich. In der Tat ist es sogar so, dass sich im Hintergrund
sprache, sondern prinzipiell um klassisches C. Um der einfachen Arduino-IDE ein kompletter AVR-GCC-Compiler verbirgt.
den Einstieg zu erleichtern, wurden aber einige spe- Die simplen Einstiegsanweisungen wie digitalWrite() sind dabei
zielle Prozeduren und Routinen implementiert. nur vorgefertigte Funktionen und Unterprogramme von der gleichen
Die bei vielen Einsteigern gefrchtete Unlesbar- Art, wie sie in spteren Abschnitten zu dieser Artikelreihe noch nher
keit von C-Code wurde so wesentlich entschrft. erlutert werden.

Arduino-Processing und C: Die Funktionen der IDE


ein Vergleich Wie bereits im ersten Teil dieser Artikelserie erwhnt, kann die jeweils
Der direkte Vergleich zeigt die hnlichkeit von Pro- aktuelle Version der Entwicklungsumgebung kostenlos unter
cessing mit C. Es wird aber auch deutlich, dass Pro- http://arduino.cc/en/Main/Software
cessing-Programme fr Einsteiger wesentlich leichter heruntergeladen werden [1].
zu lesen sind. Die in C so beliebten Abkrzungen wer- Nach dem Download liegt das komplette Programmpaket als kompri-
den vermieden, sie werden durch wesentlich leichter miertes ZIP-Archiv vor und kann in ein beliebiges Verzeichnis extrahiert
verstndliche Anweisungen ersetzt. werden (Bild 1).
So ist ein einfaches Arduino-Programm mit Grund- Das Verzeichnis enthlt dann alle zur Programmierung des Arduinos
kenntnissen in Englisch bereits recht gut lesbar: erforderlichen Komponenten.

ELVjournal 1/2014

Arduino_Teil_2.indd 63 02.01.14 14:21


64 So funktionierts

TIPP I: Darber hinaus sind unter examples noch verschiedene Beispiel-


Beachten Sie, dass die IDE-Releases oft nicht ab- programme verfgbar.
wrtskompatibel sind. Das heit, ein Sketch, der Das Unterverzeichnis libraries enthlt ntzliche Programmbiblio-
mit Version 1.0.3 tadellos funktionierte, kann bei- theken, die unter anderem die Ansteuerung von
spielsweise mit der Version 1.0.5 Probleme berei- Modellbauservos.
ten. Man sollte also immer im Auge behalten, wel- Schrittmotoren.
cher Sketch mit welcher IDE-Release erstellt wurde. LCD-Anzeigen.
externen EEPROM-Speichern
und vielem mehr
untersttzen. Dieses Verzeichnis ist fr den Anwender auch deshalb von
besonderer Bedeutung, da hier spter weitere ntzliche Software-Bib-
liotheken eingestellt werden knnen. Weitere Details dazu nden sich
z. B. im Mikrocontroller-Onlinekurs [2].
Der Start der IDE erfolgt ber die Datei arduino.exe. Natrlich kann
man sich dazu auch eine Verknpfung auf dem Desktop erstellen.
Nach dem Starten meldet sich das Programm mit einem Infobild
(Bild 2).
Danach wird die Programmierumgebung angezeigt (Bild 3). Da das
erste, noch leere Programm noch keinen Namen hat, wird ein Default-
Wert verwendet:
sketch_MonatTagx
X steht dabei fr einen Buchstaben aus der fortlaufenden Buchstaben-
reihe x = a, b, c fr den 1., 2., 3. neuen Sketch des aktuellen
Tages.

Zur Info:
Anwendungsprogramme werden im Arduino-Umfeld auch als
Sketch bezeichnet.

Die fr die Programmierung eines Arduino erforderlichen nchsten


Schritte sind bereits aus dem ersten Beitrag bekannt:
1. Auswahl der richtigen Arduino-Board-Version
2. Auswahl des verwendeten virtuellen COM-Ports
Bild 1: Das Arduino-Verzeichnis Sollte es beim Start der IDE unerwartete Probleme geben, so kann
man im Arduino-Online-Forum kompetente Hilfe erhalten [3].

Die Funktionen der IDE


In Ergnzung zum ersten Beitrag sollen hier nun auch
die anderen Funktionen der IDE detaillierter darge-
stellt werden.
Die Bedeutungen der Symbole am oberen Rand der
IDE knnen Bild 4 entnommen werden.
Die zum Teil bereits im ersten Beitrag verwende-
ten Icons haben die folgenden Funktionen:
Prfen/Compilieren
Mit dieser Schaltche kann der aktuell geffne-
te Sketch compiliert, d. h. in Maschinensprache
bersetzt werden. Dies ist insbesondere ntzlich,
Bild 2: Start der Programmierumgebung mit den Credentials wenn man ein Programm z. B. auf Syntaxfehler hin
testen mchte, ohne dass ein Arduino-Board mit
dem PC verbunden ist.
Aktuellen Sketch zum Controller senden
Dieses Icon compiliert und sendet den aktuellen
Sketch direkt zum Arduino. Ein vorheriges, separa-
tes bersetzen ist also nicht erforderlich.
Neuer Sketch
Hier kann ein neuer Sketch begonnen werden.
Sketch ffnen
Mit diesem Icon wird ein bereits abgespeicherter
Sketch in die IDE geladen.
Aktuellen Sketch speichern
Das Speichern eines Sketches erfolgt mit diesem
Bild 3: Programmierumgebung mit Default-Einstellungen Icon.

www.elvjournal.de

Arduino_Teil_2.indd 64 02.01.14 14:21


So funktionierts 65

Seriellen Datenmonitor starten


Hier kann der serielle Datenmonitor gestartet wer-
den. Er dient zur Kommunikation zwischen Cont-
roller und PC und wird hug auch zu Test- und
Prfzwecken eingesetzt.

Die Standard-Beispielprogramme
der IDE
Die Standard-IDE enthlt bereits eine umfangreiche
Sammlung von Beispielprogrammen (Bild 5).
Es ist sicher immer eine gute Idee, diese Beispiel-
programme genauer unter die Lupe zu nehmen. Sehr
hug ndet sich hier bereits eine geeignete Basis
fr neue Projekte. Die Erfahrung zeigt sogar, dass
auch der fortgeschrittene Programmierer bei der Ent-
wicklung komplexer Projekte hug einen Einstieg
ber diese Beispielprogramme ndet.
Die nachfolgenden ersten eigenen Programme
werden auch aus diesen Standardbeispielen abgelei-
tet werden. Wie Bild 1 zeigt, kann man die Beispiel-
programme auch problemlos in der Verzeichnisstruk-
tur wiedernden.

Fehlerbeseitigung
Bereits im ersten Beitrag wurde gezeigt, wie man ei-
nen Sketch auf den Arduino ldt. Im Erfolgsfall wird
dies mit einer Meldung (Bild 6) quittiert.
Obwohl die Arduino-IDE sehr benutzerfreundlich
ist, knnen natrlich Probleme nicht immer ausge-
schlossen werden. Der hugste Fehler ist die Aus-
Bild 4: Symbole der IDE
wahl des falschen seriellen Ports. In diesem Fall wird
eine Fehlermeldung ausgegeben (Bild 7).
An zweiter Stelle der Fehlerstatistik steht die Aus-
wahl des falschen Boardtyps. In diesem Fall sieht die
Fehlermeldung so wie in Bild 8 aus.
Man erkennt, dass die Fehlermeldungen oft nicht
sehr spezisch sind. Allerdings geben sie in den
meisten Fllen doch recht brauchbare Hinweise auf
die Ursache des Problems.
Neben diesen beiden hugsten Fehlern treten
in der Praxis fter auch seltsame Fehler ohne de-
nierte Ursache auf. Oft hilft es dann, den zuletzt
ausgefhrten Vorgang noch mal zu starten.

TIPP II
Falls der Arduino einmal nicht mehr ansprechbar
sein sollte, hilft es oft, die USB-Verbindung zu l-
sen und das Board wieder neu mit dem Computer
zu verbinden. Bild 5: Die Standard-Beispielprogramme

Weitere Tipps und Tricks zur Arbeit mit der IDE sind
u. a. in der Literatur zum Arduino-Projekt zu nden
[4]. Tiefergehende Informationen zur Programmie-
rung und zum Controller selbst nden sich in [5].

Der Alarmanlagensimulator Bild 6: Upload o. k.


Das Arbeiten mit der IDE sollte nun keine Schwierig-
keiten mehr bereiten. Es ist jetzt also an der Zeit,
erste eigene Sketche zu entwickeln.
Hierfr bietet sich der Aufbau eines Alarmanla-
gensimulators an. Solche Gerte werden durchaus
auch in der Praxis eingesetzt. Sie bestehen letztend-
lich nur aus einer LED (Bild 9), die in regelmigen Bild 7: Fehlermeldung bei falschem Port

ELVjournal 1/2014

Arduino_Teil_2.indd 65 02.01.14 14:21


66 So funktionierts

Bild 8: Fehlermeldung bei falsch gewhlter Boardversion

Bild 9: Geeignete LEDs fr Mikrocontroller-Schaltungen Bild 10: Aufbau zum Alarmanlagensimulator

Abstnden kurz aufblitzt. Wird ein solches Gert an 2. Der Pin fr die LED wurde von 13 auf 2 gendert. Damit ist nun die
geeigneter Stelle eingebaut, beispielsweise in einem dort angeschlossene externe LED aktiv.
Fahrzeug, so entsteht der Eindruck einer scharf ge- 3. Die Werte in der Funktion delay wurden von jeweils 1000 auf 100
schalteten Alarmanlage. Zumindest Gelegenheitsdie- bzw. 3000 gendert. Damit wird aus dem regelmigen Blinken ein
be lassen sich damit von einem Einbruch abschrecken. kurzes Aufblitzen.
Neben einem Arduino Micro werden hierfr noch
vier weitere Bauelemente bentigt: Wenn die Schaltung korrekt aufgebaut wurde und der neue Sketch ge-
1. Rote LED laden wird, blitzt die angeschlossene LED im Abstand von jeweils 3 Se-
2. 150-1-Widerstand kunden kurz auf. Der Alarmanlagensimulator ist einsatzbereit (Bild 11).
3. Ca. 5 cm Klingeldraht Will man die elektronischen Komponenten nicht einzeln besorgen, so
4. Ein ltfreies Steckbrett kann man beispielsweise auf das Lernpaket Mikrocontroller in C pro-
Der Aufbau der kleinen Schaltung ist in Bild 10 zu grammieren [6] zurckgreifen. In diesem Lernpaket sind neben einem
sehen. Arduino auch alle weiteren fr den Einstieg in die Mikrocontroller-Welt
erforderlichen Bauelemente (Widerstnde, Kondensatoren, LEDs etc.)
Das zugehrige Programm sieht so aus: enthalten. Darber hinaus nden sich in diesem Lernpaket weitere inte-
ressante Komponenten wie etwa ein 4-stelliges 7-Segment-Display oder
// Alarmanlagensimulator eine LED-Punktmatrix fr die mikrocontrollergesteuerte Anzeige von
Zahlen und Zeichen (Bild 12).
int led = 2;
Intuitive Programmierung:
void setup() der Arduino sendet Morsesignale
{ pinMode(led, OUTPUT); Hier knnen die bereits erworbenen Kenntnisse praxisnah eingesetzt
} werden. Die Aufgabe besteht darin, den Alarmanlagensimulator in eine
automatische SOS-Bake umzubauen. Das heit, die LED soll zunchst
void loop() { 3x kurz, dann 3x lang und schlielich wieder 3x kurz aufblinken. Dann
digitalWrite(led, HIGH); soll sich die Signalfolge wiederholen.
delay(100); Versuchen Sie zunchst, den Code fr den Alarmanlagensimulator so
digitalWrite(led, LOW); abzundern, dass die LED das gewnschte Signal sendet. Anschlieend
delay(3000); knnen Sie dann Ihre Lsung mit dem folgenden Musterprogramm ver-
} gleichen.

Man kann das Programm in ein leeres Sketchfenster // SOS


eintippen oder man modiziert den bereits bekann-
ten Blink-Sketch. Die Unterschiede zum Blink-Sketch int led = 2;
bestehen in den folgenden nderungen:
1. Die Kommentarzeilen, welche mit // beginnen, void setup()
wurden angepasst. { pinMode(led, OUTPUT);

www.elvjournal.de

Arduino_Teil_2.indd 66 02.01.14 14:21


So funktionierts 67

void loop()
{ digitalWrite(led, HIGH); delay(100);
digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(100);
digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(100);
digitalWrite(led, LOW); delay(1000);

digitalWrite(led, HIGH); delay(400);


digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(400);
digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(400); Bild 11: Der Alarmanlagensimulator ist scharf geschaltet.
digitalWrite(led, LOW); delay(1000);

digitalWrite(led, HIGH); delay(100);


digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(100);
digitalWrite(led, LOW); delay(500);
digitalWrite(led, HIGH); delay(100);
digitalWrite(led, LOW); delay(1000);
delay(2000);
}

Natrlich ist dies nicht die eleganteste Methode, aber


man sieht, dass so bereits ohne genaue Kenntnis der
verwendeten Programmiersprache eigene Projekte
realisierbar sind. In spteren Beitrgen zu dieser Rei-
he wird natrlich noch genauer darauf eingegangen,
wie man ein derartiges Programm wesentlich efzi- Bild 12: Zahlendarstellung mit dem Dot-Matrix-Display aus dem Lernpaket AVR-Mikrocont-
enter implementieren kann. roller in C programmieren [6]

Empfohlene Produkte/Bauteile: Best.-Nr. Preis Alle ARDUINO-Produkte wie


Arduino Micro JQ-10 97 74 24,95 Mikrocontroller-Platinen,
Mikrocontroller-Onlinekurs JQ-10 20 44 99, Shields, Fachbcher und
LEDs, z. B. Kemo Leuchtdioden, ca. 30 Stck JQ-10 66 60 1,65 Zubehr nden Sie unter:
Widerstnde, Kemo-Sortiment, ca. 200 Stck JQ-10 66 57 1,85 www.arduino.elv.de
Steckbretter sind in verschiedenen Franzis Lernpaketen enthalten oder im Web-
Shop unter www.elv.de/experimentierboards.html erhltlich. Preisstellung November 2013
aktuelle Preise im Web-Shop.

Dennoch erfllt das Programm seinen Zweck. Ver-


wendet man als LED einen besonders lichtstarken Weitere Infos:
Typ, so kann die Schaltung beispielsweise in See-
oder Bergnot durchaus ntzlich sein.
Weitere Anwendungen und Projekte mit dem [1] http://arduino.cc
Arduino wie verschiedene LED-Effekte etc. nden ist die ofzielle Homepage des Arduino-Projektes
sich beispielsweise in [2] und [6]. [2] Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV,
2011, Best.-Nr.: JQ-10 20 44
Ausblick [3] http://forum.arduino.cc
Nachdem nun die Arbeit mit der Arduino-IDE prob- [4] G. Spanner: Arduino Schaltungsprojekte fr Pros,
lemlos von der Hand geht, wird im nchsten Beitrag Elektor-Verlag, 2012, Best.-Nr.: JQ-10 94 45
zu dieser Reihe die eigentliche Programmiersprache [5] G. Spanner: AVR-Mikrocontroller in C programmieren,
im Vordergrund stehen. Dabei sollen dann neben ei- Franzis-Verlag, 2010, Best.-Nr.: JQ-09 73 52
nigen grundlegenden Betrachtungen zur Programm- [6] Lernpaket AVR-Mikrocontroller in C programmieren,
struktur insbesondere die Arduino-spezischen Be- Franzis-Verlag, 2012, Best.-Nr.: JQ-10 68 46
fehle besprochen werden.

ELVjournal 1/2014

Arduino_Teil_2.indd 67 02.01.14 14:21


72 So funktionierts

Arduino verstehen
und anwenden
Teil 3: Einfhrung in die Programmierung

www.elvjournal.de

Arduino_Teil_3.indd 72 28.02.14 09:13


So funktionierts 73

Der dritte Teil der Artikelreihe zum Arduino fhrt in Es ist sicher leicht einzusehen, dass durch solche Denitionen die
die Struktur der Programmiersprache Processing Programmierarbeit erheblich erleichtert wird. Kommen im Laufe der
ein. Die Themen in diesem Beitrag sind: Programmentwicklung mehrere LEDs ins Spiel, so kann man sich deren
Die Grundstruktur eines Processing-Programms Pin-Nummern kaum mehr merken. Sinnvolle Bezeichnungen dagegen
Praxisbeispiel LED-Ansteuerung: knnen wesentlich leichter im Kopf behalten werden.
12-Kanal-Lauicht
Die Anweisung
Im Praxisteil wird diesmal bereits ein etwas kom- void setup()
plexerer Aufbau realisiert. Mit 12 LEDs entsteht ein ist eine Spezialitt von Processing. Hier wird unter anderem festgelegt,
exibel einsetzbares Lauicht. Als Anwendungs- welche Aufgaben die einzelnen Arduino-Pins erfllen sollen.
bung knnen verschiedene Laufgeschwindigkeiten
und unterschiedliche Lichtmuster programmiert In unserem Fall wird der oben denierte ledPin als Ausgang genutzt:
werden. pinMode(ledPin, OUTPUT);

Die Grundstruktur eines Processing- In einem Processing-Sketch muss immer auch die Anweisung void
Programms setup() enthalten sein, selbst wenn sie berhaupt keine Denitionen
Im Folgenden soll das schon aus dem ersten Beitrag enthlt. Durch ihren Aufruf werden nmlich verschiedene interne Zuord-
bekannte Programm Blink genau analysiert werden. nungen ausgefhrt, die die Arbeit mit dem Arduino erleichtern.

// Blink: Using LED L Mit


void loop()
LQWOHG3LQ 'HQLWLRQV startet das Hauptprogramm. Typisch fr Mikrocontroller ist, dass das
6HWXSURXWLQHIRUGLJLWDOSRUWFRQJXUDWLRQ Hauptprogramm praktisch immer innerhalb einer Endlosschleife (loop)
abluft. Da ein Mikrocontroller nicht ber ein eigenes Betriebssystem
YRLGVHWXS verfgt, wrde er am Ende eines Programms einfach stehenbleiben oder
^3RUWDVRXWSXW undenierte Aktionen ausfhren. Erst nach einem Reset knnte die
SLQ0RGH OHG3LQ287387  sinnvolle Abarbeitung von Befehlen wieder aufgenommen werden.
} Um dieses Verhalten zu verhindern, muss das Hauptprogramm also
in einer Endlosschleife ablaufen, die dafr sorgt, dass der Prozessor so
0DLQSURJUDP lange arbeitet, bis die Betriebsspannung abgeschaltet wird.

YRLGORRS Mit der Anweisung


^GLJLWDO:ULWH OHG3LQ+,*+  /('RQ digitalWrite(ledPin, HIGH);
GHOD\   ZDLWVHF PV wird nun der ledPin auf HIGH, d. h. hohes Potential, in unserem Fall
GLJLWDO:ULWH OHG3LQ/2:  /('R auf 5 V geschaltet. Damit beginnt die LED zu leuchten.
GHOD\   ZDLWVHF PV
} Mit der Anweisung
delay(1000);
Die erste Zeile erhlt der Prozessor den Auftrag, 1000 ms = 1 s zu warten.
// Blink: Using LED L
stellt einen sogenannten Kommentar dar. Schlielich wird mit
Kommentare werden durch den doppelten Slash digitalWrite(ledPin, LOW);
// gekennzeichnet. Der nach diesem Zeichen ste- die LED wieder ausgeschaltet und das Spiel beginnt nach einer Pause
hende Text wird vom Compiler nicht beachtet. Er von 1 s von vorne, da wir uns ja in einer Endlosschleife benden.
dient also nur dazu, Programme leichter lesbar zu
gestalten. Die LED blinkt also nun mit einer Periodendauer von 2 s oder einer
Frequenz von 0,5 Hz. Im Projekt Alarmanlagensimulator im letzten
Beitrag wurde ja bereits gezeigt, wie man die Blinkfrequenz und -dauer
TIPP I: Nicht zu sparsam mit Kommentaren um- den gegebenen Erfordernissen anpassen kann.
gehen! Langfristig sind nur gut kommentierte
Programme wirklich ntzlich. Praxisbeispiel:
Lauicht fr Modellughfen oder -eisenbahnen
Wie bereits beim Alarmanlagensimulator werden auch hier externe LEDs
Die nchste Zeile verwendet. Nachdem bislang aber immer mit nur einer externen LED
int ledPin = 13; // Denitions gearbeitet wurde, soll der Arduino nun mehrere LEDs steuern.
deniert den Pin 13 als ledPin. Damit kann man Mit 12 LEDs kann bereits ein eindrucksvolles Lauicht aufgebaut wer-
nun berall im Sketch ledPin schreiben, wenn der den. Derartige Lauichter sind z. B. auf den Landebahnen von Gro-
Pin 13 gemeint ist. ughfen oder an Autobahnbaustellen zu nden. Dort soll der laufende

ELVjournal 2/2014

Arduino_Teil_3.indd 73 28.02.14 09:13


74 So funktionierts

Mit den gewhlten 220-1-Widerstnden (Farbringfolge Rot-Rot-


Braun) liegt man also auf der sicheren Seite.
Will man Lichtmuster erzeugen, in welchen alle 12 LEDs gleichzeitig
betrieben werden, so ergibt sich ein Gesamtstrom von 12 x 20 mA =
240 mA. Dies stellt bereits eine erhebliche Belastung fr den USB-Port
dar. In diesem Fall sollte man darber nachdenken, den Arduino mit
einem externen Netzteil zu betreiben.
Eine andere Mglichkeit wre die Verwendung von sogenannten Low-
Current-LEDs. Diese bentigen bei sehr guten Helligkeitswerten nur ei-
nen Strom von 4 mA. Die Vorwiderstnde ergeben sich in diesem Falle zu:
Rv = (5 V 1,7 V) / 4 mA = 825 1
Mit 1-k1-Widerstnden erreicht man immer noch eine gute Helligkeit
und der Gesamtstromverbrauch bei 12 aktiven LEDs reduziert sich auf
unter 50 mA.

Das Steuerprogramm zum Lauichteffekt


Um den Code etwas kompakter zu gestalten, soll hier kurz auf eine neue
Anweisung vorgegriffen werden. Die Anweisung
for(int i=a; i<=b; i++)
sorgt dafr, dass der nachfolgende Befehlsblock wiederholt ausgefhrt
wird. Zudem kann die sogenannte Laufvariable i in diesem Befehlsblock
zu Steuerzwecken verwendet werden. So werden beispielsweise mit
Bild 1: LED-Lauicht for(int i=1; i<=3; i++)
die nachfolgenden Anweisungen 3-mal ausgefhrt. Die genaue Be-
Lichtpunkt Flug- oder Fahrzeugen den richtigen Weg schreibung, wie diese und andere sogenannte Kontrollstrukturen ar-
weisen. Aber auch in Partykellern, Diskotheken oder beiten, folgt im nchsten Beitrag zu dieser Artikelserie. Hier gengt es
auf Volksfesten erfreuen sich entsprechende Licht- zunchst zu wissen, dass die for-Anweisung zum denierten Wieder-
effekte groer Beliebtheit. holen von Befehlen angewendet werden kann.
Jede der 12 LEDs bekommt ihren eigenen Vor- Damit sollte das Programm zum Lauichteffekt keine Verstndnis-
widerstand. Prinzipiell wre es auch mglich, mit probleme mehr bereiten:
einem einzigen Widerstand auszukommen. Dieser
msste dann in die gemeinsame Masseleitung aller /('FKDVHU
Dioden eingesetzt werden. Falls immer nur eine LED
aktiv sein soll, ist die Lsung mit nur einem Vorwi- YRLGVHWXS 
derstand durchaus akzeptabel. ^IRU LQWL L L
Allerdings ergibt sich ein Problem, wenn mehr als SLQ0RGH L287387  VHWSLQWRDVRXWSXWV
eine LED leuchten soll. In diesem Fall mssen sich alle }
aktiven LEDs sozusagen einen Widerstand teilen. Je
mehr LEDs eingeschaltet werden, desto grer wre YRLGORRS 
der Gesamtstrom durch den Widerstand. Dies wrde ^IRU LQWL L L
aber natrlich zu einem immer hheren Spannungs- ^GLJLWDO:ULWH L+,*+  VHWWKH/('RQ
abfall am Widerstand fhren, so dass die verbleiben- GHOD\   ZDLWIRUDVHFRQG
de LED-Spannung immer weiter abnehmen wrde. Je GLJLWDO:ULWH L/2:  VHWWKH/('R
mehr LEDs also eingeschaltet wrden, desto dunkler }
wrde jede einzelne LED werden. Wird fr jede LED }
ein eigener Vorwiderstand verwendet, tritt dieser
meist unerwnschte Effekt nicht auf. Weitere Details Im Setup werden zunchst die Ports 2 bis 13 als Ausgnge geschaltet:
und Informationen zum Ansteuern von LEDs nden void setup()
sich auch in [1]. Bild 1 zeigt den Aufbau. { for(int i=2; i<=13; i++)
pinMode(i, OUTPUT); //.
}
TIP II: Falls eine oder mehrere LEDs nicht
leuchten, sind sie wahrscheinlich falsch herum
eingebaut. Ein Umpolen der entsprechenden Tipp III: Die Digital-Pins 0 und 1 besitzen eine zustzliche Son-
LEDs behebt das Problem. derfunktion. Neben der einfachen Portfunktion dienen sie auch
als Ein- und Ausgang fr die serielle Schnittstelle. Dies kann bei
einigen Anwendungen zu unerwarteten Ergebnissen fhren. Es ist
Vorwiderstnde und Low-Current-LEDs daher sinnvoll, diese Ports nicht zu verwenden, solange dies nicht
Noch ein Wort zur Berechung der Vorwiderstnde. Die unbedingt erforderlich ist.
meisten einfachen LEDs bentigen einen Strom von
ca. 20 mA. Der Spannungsabfall ber einer roten LED
betrgt immer etwa 1,7 V. Damit ergibt sich: Im Hauptprogramm wird dann zunchst mit
Rv = (5 V 1,7 V) / 20 mA = 165 1 digitalWrite(i, HIGH); // set the LED on

www.elvjournal.de

Arduino_Teil_3.indd 74 28.02.14 09:13


So funktionierts 75

die erste LED in der Kette eingeschaltet. Nach einer /('EDQG


Wartezeit von 100 ms delay(100); wird sie wieder
ausgeschaltet. Dann folgt die zweite LED, bis sich das YRLGVHWXS 
Spiel nach der zwlften LED wiederholt. Auf diese ^IRU LQWL L L
Weise entsteht der gewnschte Lauichteffekt. SLQ0RGH L287387  VHWSLQWRDVRXWSXWV
}
Natrlich ist dies nur eine Mglichkeit, um ein Lauf-
licht zu realisieren. Im nchsten Beitrag zu dieser YRLGORRS 
Artikelreihe lernen Sie die sogenannten Kontroll- ^IRU LQWL L L
strukturen von C kennen. Damit kann das obenste- ^GLJLWDO:ULWH L+,*+  VHWWKH/('RQ
hende LED-Lauicht-Beispiel elegant und einfach um GHOD\   ZDLWIRUDVHFRQG
weitere interessante Lichteffekte ergnzt werden. }
Aber auch bei dieser einfachen Version sind wie- IRU LQWL L L
der verschiedene Varianten realisierbar. So knnen ^GLJLWDO:ULWH L/2:  VHWWKH/('R
beispielsweise die folgenden bungen durchgefhrt GHOD\   ZDLWIRUDVHFRQG
werden. }
}
1. Verndern Sie die Geschwindigkeit des Lauichts
2. Programmieren Sie ein sogenanntes Pendel-Lauf- Ausblick
licht. Das bedeutet, dass der Lichtpunkt nicht nur In diesem Beitrag kam erstmals eine etwas umfangreichere externe Be-
in eine Richtung laufen und dann wieder bei der schaltung des Arduinos zum Einsatz. Die grundlegende Programmstruk-
ersten LED starten soll, sondern dass er hin und tur und einige Arduino-spezische Befehle wurden genauer erlutert.
her pendelt. Der nchste Beitrag in der Reihe wird nher auf die Programmierung
eingehen und es werden weitere Befehle im Detail vorgestellt. Damit
LED-Band knnen dann auch komplexere Programme fr eigene Projekte erstellt
Abschlieend soll noch eine weitere Programm-Va- werden.
riante vorgestellt werden. Hier wird ein sich in der
Lnge vernderndes Lichtband erzeugt (Bild 2). Empfohlenes Material
In der Praxis werden solche Lichtbnder in hnli- Im Mikrocontroller-Onlinekurs [2] werden die hier vorgestellten Grund-
cher Form hug fr die Anzeige von analogen Mess- lagen weiter vertieft. Das Hardwarepaket zu diesem Kurs enthlt ein
werten wie etwa Ladezustnden von Akkumulatoren umfangreiches Bauteilesortiment fr den erfolgreichen Einstieg in die
oder Maschinendrehzahlen eingesetzt. Mikrocontrollertechnik.
Der Vorteil der einzelnen Vorwiderstnde tritt da- Auch viele Franzis Lernpakete wie etwa Elektronik enthalten geeig-
bei deutlich zu Tage. Selbst wenn alle 12 LEDs leuch- netes Material wie ein ltfreies Steckbrett, Widerstnde, LEDs etc. ,
ten, ist die Helligkeit jeder LED gegenber der Hellig- das fr den Aufbau von Schaltungen mit dem Arduino Micro gut geeig-
keit bei nur einer aktiven LED unverndert. net ist.

Weitere Infos:
[1] G. Spanner: Arduino Schaltungsprojekte fr Pros,
Elektor-Verlag, 2012, Best.-Nr. J2-10 94 45
[2] Mikrocontroller-Onlinekurs,
Franzis-Verlag, exklusiv fr ELV, 2011, Best.-Nr. J2-10 20 44

Preisstellung Februar 2014 aktuelle Preise im Web-Shop

Empfohlene Produkte/Bauteile: Best.-Nr. Preis


Arduino-Uno-Platine R3 J2-10 29 70 27,95
USB-2.0-Verbindungskabel A auf B J2-09 55 56 0,95
Mikrocontroller-Onlinekurs J2-10 20 44 99,
LEDs, z. B. Kemo Leuchtdioden,
ca. 30 Stck J2-10 66 60 1,65
Widerstnde, Kemo-Sortiment,
ca. 200 Stck J2-10 66 57 1,85
Steckbretter sind in verschiedenen Franzis Lernpaketen enthalten oder
im Web-Shop unter www.elv.de/experimentierboards.html erhltlich.

Alle ARDUINO-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher


Bild 2: Das variable LED-Band in Aktion und Zubehr nden Sie unter: www.arduino.elv.de

ELVjournal 2/2014

Arduino_Teil_3.indd 75 28.02.14 09:13


92 So funktionierts

Arduino verstehen
und anwenden
Teil 4: Programmierpraxis: Befehle, Variablen und Funktionen

www.elvjournal.de

Arduino_Teil_4.indd 92 28.04.14 08:27


So funktionierts 93

Im vierten Teil der Serie Arduino verstehen und anwenden geht es INPUT/OUPUT
um den Einstieg in die Programmierpraxis. Hier werden die Strukturen Sind fr die pinMode()-Funktion vorgesehen und
vorgestellt, ohne die keine hhere Programmiersprache auskommt: legen fest, ob ein PIN als Eingang (INPUT) oder
Syntaxelemente Ausgang (OUTPUT) genutzt werden soll.
Konstanten und Variablen
Operatoren Variablendenition
Kontrollstrukturen Die Festlegung von Variablen ist bereits aus frheren
Wie sonst auch soll in diesem Beitrag die Praxis nicht zu kurz kommen. Artikeln bekannt, z. B. wird mit der Programmzeile:
So werden die einzelnen Abschnitte wieder durch Anwendungsbeispiele int ledPin = 10;
fr den Arduino ergnzt und vertieft. eine Variable ledPin festgelegt und auch gleich auf
den Wert 10 gesetzt.
Die Sprachelemente von Processing bzw. C Variablen zeichnen sich dadurch aus, dass sie wh-
Nach dem Durcharbeiten der ersten drei Artikel dieser Serie ist man nun rend des Programmablaufes verndert werden.
bereits in der Lage, einfachere Programme zu verstehen, zu modizieren Da Variablen in der Programmierung von hchster
und in den Controllerchip des Arduinos zu laden. Es ist nun also an der Wichtigkeit sind, wurden verschiedene Variablen-Ty-
Zeit, sich etwas nher mit den Details der Programmierung zu beschf- pen festgelegt. Diese sind in Tabelle 1 zusammen-
tigen. gefasst.
Nachfolgend werden daher die wesentlichen allgemeinen Sprachele- Die verschiedenen Typen dienen dazu, die be-
mente von Processing erlutert. Weitere Erklrungen zu speziellen Be- grenzten Speicherplatzressourcen eines Mikrocont-
fehlen und Anweisungen folgen in den jeweiligen Anwendungen. rollers optimal zu nutzen. Man sollte also immer den
Typen auswhlen, der nicht mehr Speicher belegt als
Programm-Struktur notwendig.
Wie wir in vorhergehenden Artikeln am Beispiel Blink schon gesehen Auerdem ergeben sich bei der korrekten Auswahl
haben, besteht ein Sketch aus zwei Hauptteilen: von Variablen-Typen auch Geschwindigkeitsvorteile.
1) void setup() So kann der Arduino Integer-Berechnungen deutlich
2) void loop() schneller ausfhren als Float-Operationen.
Die Setup-Funktion wird beim Programmstart genau einmal aufgerufen. Bei einfachen Programmen, die nur wenige Be-
Hier werden Schnittstellen und Pin-Funktionen etc. initialisiert. rechnungen enthalten, fllt das natrlich kaum ins
Void setup() muss immer im Programm stehen, auch wenn nichts ex- Gewicht. Wenn allerdings komplexere Rechenvorgn-
plizit deniert werden muss. Die Routine hat nmlich auch die Aufgabe, ge mit umfangreichen Daten erforderlich sind, so
Standardfunktionen zur Verfgung zu stellen. kann die Verwendung einer reinen Integer-Arithme-
In der Endlosschleife loop() wird der eigentliche Programmcode fest- tik ber den Erfolg oder Misserfolg eines Projektes
gelegt. Alle in der loop enthaltenen Anweisungen und Befehle werden entscheiden.
nacheinander immer wieder ausgefhrt, bis der Controller von der Ver- Klassische Beispiele, die eine hohe Rechenge-
sorgungsspannung getrennt wird. schwindigkeit erfordern, sind schnelle digitale Re-
gelungen. Wird hier mit optimierten Integer-Werten
Einfache Syntaxelemente gearbeitet, kann der Arduino bereits recht komplexe
hnlich wie eine natrliche Sprache ihre Satzzeichen hat, so bentigt Aufgaben wie etwa die Lageregelung eines Quadro-
auch Processing einen gewissen Grundvorrat an Syntaxelementen: kopters bernehmen.
Semicolon ;
Das Semicolon schliet jeden Befehl ab. Variablenfelder
Geschweifte Klammern {} Variablenfelder, auch als arrays bezeichnet, stellen
Geschweifte Klammern fassen einen Befehlsblock zusammen. Bei- eine Zusammenfassung von Variablen dar, auf die mit
spiele hierzu nden sich weiter unten bei den Kontrollstrukturen. Hilfe einer Index-Zahl zugegriffen werden kann.
Einzeiliger Kommentar // Alle nachfolgenden Anweisungen legen jeweils ein
Mit dem Doppel-Slash wird ein einzeiliger Kommentar gekennzeichnet. Array fest:
Mehrzeiliger Kommentar /* */ int myIntegers[4];
Erstreckt sich ein Kommentar ber mehrere Zeilen muss dieser mit int OutPins[] = {1, 3, 5, 7, 9};
/* begonnen und mit */ beendet werden. int mySpecialValues[6]
= {1, 3 ,3, -4, -1, 5};
Konstanten und Variablen char infotext[6] = hallo;
Zu den wichtigsten Elementen einer Programmiersprache gehren die
Konstanten und Variablen. Konstanten dienen zur Kennzeichnung un-
vernderlicher Werte. In Processing wurden einige vordenierte Kon- Die wichtigsten Variablen-Typen
stanten festgelegt. Diese machen den Programmcode einfacher lesbar
und erleichtern zudem den Einstieg in die Arduino-Programmierung. Die Typ Bytes Bereich
wichtigsten vordenierten Konstanten sind: Byte 1 0 bis 255
TRUE/FALSE Char 1 -127 bis 127
Tabelle 1

FALSE ist als 0 (Null) deniert, Int 2 -32.768 bis 32.767


TRUE ist ungleich 0.
Long 4 -2.147.483.648 bis 2.147.483.647
HIGH/LOW
HIGH bedeutet Logiclevel 1, d. h. ON oder 5 V, Float 4 -3,4028235E+38 bis 3,4028235E+38
LOW bedeutet Logiclevel 0, d. h. OFF oder 0 V.

ELVjournal 3/2014

Arduino_Teil_4.indd 93 28.04.14 08:27


94 So funktionierts

Mit diesen Denitionen werden jeweils Felder mit 4, Auch sie besitzen die aus der Mathematik bekannte Bedeutung.
5, 6 und wieder 6 Variablen erzeugt. Die in C blichen Abkrzungen, auch als Compound-Operatoren be-
Der Zugriff auf ein Feldelement erfolgt durch Zuwei- kannt, sind in Processing ebenfalls verfgbar:
sungen unter Benutzung des jeweiligen Index, z. B: ++ Increment: x++ steht fr x = x+1
OutPins[0] = 1; -- Decrement: x-- steht fr x = x-1
x = mySpecialValues[4]; += Compound Addition: x += y steht fr x = x+y
-= Compound Subtraktion: x -= y steht fr x = x-y
Wichtig: *= Compound Multiplikation: x*= y steht fr x = x*y
Die Indizes eines Array beginnen mit 0, das /= Compound Division: x/= y steht fr x = x/y
heit, das erste Feldelement hat immer den In-
dex 0. Kontrollstrukturen
Zur Steuerung von Programmablufen sind in Processing bzw. C ver-
Daraus ergibt sich, dass fr ein Feld mit beispiels- schiedene Strukturen vorgesehen. IF/ELSE und FOR sind die beiden
weise 4 Variablen der letzte Index 3 lautet. Wird eine wichtigsten.
Feldvariable mit dem Index 4 abgerufen, ergibt sich if
ein zuflliger Wert! berprft ob eine bestimme Bedingung erfllt ist:
Beispiel: if (Variable > 99)
int myNumbers[4]={1,4,5,2}; { // Anweisungen
// myArray[3] enthlt den Wert 2, }
// myArray[4] ist ungltig und liefert einen if...else
zuflligen Wert! gestattet eine weitergehende Kontrolle des Programmusses. Es
knnen mehrer Bedingungen unterschieden werden:
Mathematische Operatoren if (Input < 500)
Um mit Variablen rechnen zu knnen, werden Opera- { // Aktion A
toren bentigt. Die wichtigsten Operatoren sind die }
Rechenzeichen. Sie haben in Processing die blichen else
mathematischen Bedeutungen: { // Aktion B
+ Addition }
- Subtraktion for
* Multiplikation erlaubt es, eine Anweisung zu wiederholen. Die Anzahl der Wieder-
/ Division holungen ist dabei nicht von irgendwelchen Bedingungen abhngig:
% Modulo, d. h. Rest der Division for (init; cond; inc)
{ //Anweisungen
Auch fr die Vergleichsoperatoren gelten die norma- }
len mathematischen Bedeutungen: Zunchst wird eine Startbedingung init gesetzt. Jedesmal wenn die
= = ist gleich Schleife durchlaufen wurde, wird die Bedingung cond geprft und die
!= ungleich Aktion inc ausgefhrt. Wenn die Bedingung nicht mehr erfllt ist,
< kleiner wird die Schleife beendet.
> grer while()
<= kleiner gleich while-Schleifen werden so lange durchlaufen, bis die Abbruch-
>= grer gleich bedingung erfllt ist:
while(logischer Ausdruck)
= Zuordnung { // Anweisungen
}
Lediglich die Zeichen wie etwa ) fr kleiner do... while
gleich wurden durch ASCII-kompatible Doppelzei- Die dowhile-Schleife funktioniert hnlich wie die while-Schleife
chen wie <= ersetzt. mit dem Unterschied, dass die Bedingung erst am Ende der Schleife
geprft wird. Die dowhile-Schleife wird also immer mindestens
Hinweis: einmal durchlaufen.
Die Zuordnung = darf nicht mit dem Gleich- do
heitsoperator = = verwechselt werden! {// Anweisungen
Im ersten Fall wird einer Variablen ein Wert zu- } while (logischer Ausdruck);
gewiesen, z. B.: break
ledPin = 10; Mit break kann jede do-, for-, oder while-Schleife verlassen werden.
Im zweiten Fall wird auf Gleichheit berprft,
z. B.: Programmierpraxis
if (a = = 1) Nachdem nun verschiedene Programmelemente theoretisch beleuchtet
wurden, sollen diese in einem Praxisbeispiel umgesetzt werden.
Die Booleschen Logikoperatoren werden durch die Das folgende Programm squares soll eine Tabelle der Quadratzahlen
folgenden Zeichen realisiert: von 1 bis 9 in gut lesbarer Form ausgeben.
&& (and)
|| (or)
! (not)

www.elvjournal.de

Arduino_Teil_4.indd 94 28.04.14 08:27


So funktionierts 95

// sqares

int x;
int y[10];

void setup()
{ Serial.begin(9600);
Serial.println("Squares table");
Serial.println();
}

void loop()
{ for (int x = 1; x<=9; x++)
{ y[x] = x*x;
Serial.print(x, DEC);
Serial.print(" ");
Serial.println(y[x], DEC);
}
while(1);
}

Zunchst wird eine Variable vom Typ Integer deniert. Dann folgt die
Deklaration eines Arrays y, fr das 10 Elemente reserviert werden.
Die Anweisungen im Setup-Teil sorgen fr die Kommunikation zum
PC. Sie werden etwas weiter unten erlutert.
Bild 1: Das Programm squares in der IDE
Die Zeile
for (int x = 1; x<=9; x++)
deniert eine Schleife, welche die Zahlen 1 bis 9 durchluft.
Mit
y[x] = x*x;
werden den Elementen des Arrays y die Quadrate des Laundex x zu-
gewiesen. Der Laundex der Schleife wird zudem in der nchsten Pro-
grammzeile,
Serial.print(x, DEC);
an den PC ausgegeben. Die Zeile
Serial.print(" ");
sorgt durch Einfgen von Leerzeichen fr eine lesbare Formatierung der
ausgegebenen Werte.
Schlielich werden die im Array gespeicherten Quadratzahlen aus-
gegeben:
Serial.println(y[x], DEC);
Die Anweisung while(1) sorgt dafr, dass das Programm hier stehen- Bild 2: Start des seriellen Monitors
bleibt. Bild 1 zeigt den Code nach erfolgreicher Compilierung in der IDE.
Nach dem Laden des Programms in den Arduino muss noch der so-
genannte Serielle Monitor gestartet werden. Dazu muss auf das Lu-
pensymbol rechts oben in der IDE geklickt werden (siehe Bild 2). Hier
erfolgt dann die Ausgabe der gewnschten Quadratzahlen-Tabelle, so
wie in Bild 3 dargestellt.
Um den Ausgabekanal zu aktivieren, wurde im setup die Zeile
Serial.begin(9600);
eingefgt. Danach knnen dann ber die Serial.print-Anweisung Werte
und Texte wie beispielsweise
Serial.println("Squares table");
am PC-Bildschirm ausgegeben werden.
ber
Serial.print(x, DEC);
wird der Wert der Variablen x zum seriellen Monitor gesendet. Der Zu-
satz DEC sorgt dabei dafr, dass die Variable im Dezimalsystem aus-
gegeben wird. Wird dem Print-Befehl die Endung ln (fr engl. line)
angefgt, so wird eine neue Ausgabezeile begonnen.
Weitere Details zu Nutzung dieser seriellen Schnittstelle folgen in
einem spteren Artikel. Bild 3: Ausgabe von Quadratzahlen

ELVjournal 3/2014

Arduino_Teil_4.indd 95 28.04.14 08:27


96 So funktionierts

bungen und Variationen pow(base, exponent); sqrt(x)


Falls Sie mit den Programmelementen von C noch berechnen die Potenzfunktion
nicht besonders gut vertraut sind, sollten Sie die fol- und die Quadratwurzel
genden bungen durchfhren: sin(rad); cos(rad); tan(rad)
Lassen Sie sich die Quadratzahlen von 10 bis 100 liefern entsprechend die Sinus-,
berechnen und ausgeben. Kosinus- und Tangenswerte im
Ersetzen Sie die for-Schleife durch eine while- Bogenma
Schleife.
Ersetzen Sie den Compound-Operator x++ durch Zufallszahlen
die entsprechende Langschreibweise. Die Funktion
Berechnen Sie nur die Quadrate der ungeraden randomSeed(seed)
Zahlen zwischen 11 und 25! startet den Pseudo-Zufallsgene-
Fr Zahlen grer 4 soll nicht das Quadrat, son- rator; mit seed wird dabei der
dern die 3. Potenz ausgegeben werden Startpunkt in einer pseudo-zu-
(Hinweis: if-Verzweigung!). flligen Zahlenreihe festgelegt
long random(min, max)
Spezielle Funktionen erzeugt eine Pseudo-Zufallszahl
Processing verfgt ber spezielle Funktionen, die vor zwischen min und max
allem den Einstieg in die Programmiersprache C sehr
erleichtern. Diese Funktionen werden der bersicht- Praxisbungen
lichkeit halber im Folgenden zusammengefasst: ndern Sie das Programm
pinMode(pin, mode) squares so ab, dass es die
konguriert den pin entweder als Eingang oder Quadratwurzeln der ganzen
als Ausgang (mode = INPUT oder mode = OUTPUT) Zahlen zwischen 0 und 9 be-
digitalWrite(pin, value) rechnet!
setzt den pin auf high oder low (value = HIGH Welcher Variablentyp ist dabei
oder value = LOW) fr y sinnvoll?
int digitalRead(pin) Erstellen Sie eine Tabelle der Bild 4: Arduino zeichnet eine Sinus-Kurve!
liest den Pegel von pin und gibt entsprechend Sinuswerte fr die Winkel zwi-
HIGH oder LOW zurck schen 0 und 360 in 10-Schritten!
Dass der Arduino auch einfache Graken ausgeben kann, zeigt
Zeitsteuerung Bild 4. Schaffen Sie es, das zugehrige Programm zu erstellen?
Bereits im Programm Blink wurde von Zeitverz-
gerungen Gebrauch gemacht. Die folgenden Befehle Ausblick
stehen dafr zu Verfgung. Im nchsten Artikel wird erklrt, wie Programm-Bibliotheken fr den
unsigned long millis() Arduino nutzbringend eingesetzt werden knnen. Auch die Erstellung
gibt die Anzahl der Millisekunden an, die vergan- eigener Bibliotheken wird erlutert werden.
gen sind, seit das aktuelle Programm gestartet
wurde Empfohlenes Material
Natrlich knnen die Programmelemente einer so umfangreichen Spra-
Hinweis che wie C bzw. Processing in Rahmen eines einzelnen Beitrags nicht in
Die Variable millis springt nach ca. 50 Tagen auf allen Details dargelegt werden. Weitergehende Informationen zum The-
null zurck. Bei Langzeitanwendungen ist dies ma nden sich jedoch im Mikrocontroller-Onlinekurs [1]. Weiterfhren-
unbedingt zu beachten, da es sonst zu unerwar- de praktische Beispielprogramme und interessante Anwendungen sind
teten Effekten kommen kann! in [2] zu nden.

Die bereits in mehreren Beispielen verwendete Funk-


tion
delay(ms) Weitere Infos:
bewirkt eine Verzgerung von ms, also Millise-
kunden, im Programmablauf [1] Mikrocontroller-Onlinekurs,
delayMicroseconds(us) Franzis-Verlag, exklusiv fr ELV, 2011, Best.-Nr. J3-10 20 44
sorgt fr eine Verzgerung von us, also Mikrose- [2] G. Spanner: Arduino Schaltungsprojekte fr Pros,
kunden, im Programmablauf Elektor-Verlag, 2012, Best.-Nr. J3-10 94 45

Mathematische und trigonometrische Preisstellung April 2014 aktuelle Preise im Web-Shop


Funktionen Empfohlene Produkte/Bauteile: Best.-Nr. Preis
Abschlieend sollen hier noch die wichtigsten ma-
Arduino-Uno-Platine R3 J3-10 29 70 27,95
thematischen Funktionen angesprochen werden. Die-
USB-2.0-Verbindungskabel A auf B J3-09 55 56 0,95
se haben auch in Processing ihre bliche Bedeutung:
Mikrocontroller-Onlinekurs J3-10 20 44 99,
min(x, y); max(x, y); abs(x)
liefern das Minimum, das Maximum von x und y Alle ARDUINO-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
bzw. den Absolutwert von x und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_Teil_4.indd 96 28.04.14 08:27


92 So funktionierts

Arduino verstehen
und anwenden
Teil 5: Nutzung und Erstellung von Programmbibliotheken

www.elvjournal.de

Arduino_Teil_5.indd 92 01.07.14 14:49


So funktionierts 93

Bild 1: LiquidCrystal in der Arduino-IDE

Der fnfte Teil der Artikelserie Arduino verstehen Wire ermglicht die Kommunikation mit Two-Wire- bzw. I2C-Inter-
und anwenden dreht sich um das Thema Programm- face-Bausteinen und -Sensoren wie z. B. DACs oder Echtzeituhren-ICs
bibliotheken.
Sogenannte Bibliotheken oder Libraries gehren Eine der besonders hug genutzten Bibliotheken ist die LiquidCrys-
zu den besonderen Strken der Arduino-Idee. Diese tal-Library. Sie ermglicht das einfache Ansteuern eines LC-Displays.
Programmierhilfen erleichtern das Erstellen komple- Damit kann der Arduino auch unabhngig vom PC Zahlen und Texte
xerer Projekte ganz erheblich. So muss man nicht ausgeben. Hochinteressanten praktischen Anwendungen wie etwa ei-
immer das Rad neu ernden, sondern man kann auf ner Digitaluhr oder einem digitalen Innen-und-Auenthermometer mit
bereits vorhandenen Grundlagen aufbauen. LCD-Anzeige steht damit nichts mehr im Weg. Diese ntzliche Biblio-
Zu den sogenannten Standardbibliotheken zhlen thek soll daher im Folgenden als einfhrendes Beispiel dienen.
u. a:
EEPROM Schreiben und Lesen des EEPROM- Einbinden einer Bibliothek in einen Arduino-Sketch
Speichers im Controllerchip Die LCD-Bibliothek wird bereits mit der Standard-Arduino-IDE mitge-
LiquidCrystal Ansteuerung eines textbasierten liefert. Sie arbeitet mit allen LC-Displays, die mit dem bekannten
LC-Displays HD44780-Treiber von Hitachi kompatibel sind. Die Anschlusskongura-
SD Schreiben und Lesen einer SD-Speicherkarte tion dieser Module hat sich als Quasi-Standard durchgesetzt. Praktisch
(erfordert ein entsprechendes Shield) alle gngigen Anzeigeeinheiten mit 14 oder 16 Pins und 1 oder 2 Zeilen
Servo Ansteuerung von Modellbauservos 16 Zeichen sind somit mit der hier vorgestellten Bibliothek verwend-
SoftwareSerial ermglicht die Nutzung einer bar.
softwarebasierten seriellen Schnittstelle an Bild 1 zeigt, wie die Beispielprogramme der Bibliothek LiquidCrys-
einem beliebigen Digitalpin des Arduinos tal im Hauptmen der IDE ausgewhlt werden knnen.
Stepper Steuerung von Schrittmotoren Im zugehrigen Untermen nden sich dann verschiedene Beispiel-
(erfordert passende Treiberbausteine) programme dieser Library.

Bild 2: Anschluss eines


LC-Displays an den
Arduino Micro

ELVjournal 4/2014

Arduino_Teil_5.indd 93 01.07.14 14:49


94 So funktionierts

Bild 3: Die LCD-


Bibliothek in Aktion

Zunchst muss aber natrlich das LC-Display mit entsprechend 16 Zeichen in 2 Zeilen,
dem Arduino verbunden werden. Bild 2 zeigt das zu- kann im Setup bereits direkt auf das LC-Display ge-
gehrige Aufbaubild. Eine praktische Ausfhrung des schrieben werden.
Aufbaus ist in Bild 3 zu sehen.
Nachfolgend sind die notwendigen Verbindungen Mit
der Deutlichkeit halber nochmals in Tabellenform an- lcd.setCursor(5, 0);
gegeben: wird die aktuelle Schreibposition auf das 5. Zeichen
LCD RS - Digitalpin 12 in der 1. Zeile gesetzt (die Zeilenzhlung beginnt wie
LCD Enable - Digitalpin 11 in der IT blich mit 0).
LCD D4 - Digitalpin 5
LCD D5 - Digitalpin 4 Dann erfolgt die Ausgabe des Textes einfach mit
LCD D6 - Digitalpin 3 lcd.print("Hallo, ");
LCD D7 - Digitalpin 2 und
LCD R/W - Ground lcd.print(" Arduino MICRO! ");

Anwendung der Bibliothek Hier zeigt sich deutlich, wie die Verwendung einer
LiquidCrystal.h Bibliothek die Programmierung ganz wesentlich ver-
Unter Verwendung der Bibliothek LiquidCrystal.h einfacht. Nur wenige Programmzeilen gengen, um
kann das zugehrige Hauptprogramm sehr einfach ein alphanumerisches Display anzusteuern. Wollte
ausfallen: man diese Aufgabe ohne die Hilfe der Bibliotheks-
funktionen lsen, so wrde daraus ein Projekt, das
// Hallo Arduino MICRO auch einen erfahrenen Programmierer viele Stunden
lang beschftigen wrde.
#include <LiquidCrystal.h> Wenn man sich einen ersten Eindruck verschaffen
mchte, wie die Ansteuerung eines LC-Displays im
Detail aussieht, dann kann man die Datei
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); LiquidCrystal.cpp im Verzeichnis
Arduino\arduino-1.0.5\libraries\LiquidCrystal
void setup() mit einem Editor, wie etwa dem Windows-WordPad,
{ lcd.begin(16, 2); ffnen. Hier zeigt sich, welcher Aufwand durch den
lcd.setCursor(5, 0); Einsatz der fertigen Bibliothek eingespart werden
lcd.print("Hallo, "); konnte.
lcd.setCursor(0, 1);
lcd.print(" Arduino MICRO! "); Erstellen eigener Bibliotheken
} Fertige Bibliotheken sind aber natrlich nur die eine
Seite der Medaille. Whrend der Einsteiger sicherlich
void loop() {} berwiegend bereits vorgefertigte Libraries nutzt,
wird der fortgeschrittene Anwender irgendwann den
Punkt erreichen, an welchem eine eigene Bibliothek
Nach dem Einbinden der Bibliothek mit erstellt werden soll. Nachfolgend werden daher die
#include <LiquidCrystal.h> Schritte zur Erstellung eigener Bibliotheken vorge-
mssen also nur noch die Pin-Verbindungen zum LCD stellt.
angegeben werden: Bereits im 2. Teil zu dieser Beitragsreihe wurde
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); ein einfaches Programm zum Senden des SOS-Not-
fallsignals im Morsecode entwickelt. Hier soll dieses
Nach der Initialisierung mit Beispiel noch einmal aufgegriffen werden, um die Er-
lcd.begin(16, 2); stellung einer Programmbibliothek zu erlutern.

www.elvjournal.de

Arduino_Teil_5.indd 94 01.07.14 14:49


So funktionierts 95

Da alle erforderlichen Programmstrukturen und vate Teile kann nur innerhalb der Klasse zugegrif-
Befehle aus dem 3. und 4. Teil dieser Artikelserie be- fen werden. Jede Klasse verfgt ber eine spezielle
kannt sind, kann das SOS-Programm nun schon deut- Funktion, den sogenannten Constructor. Dieser wird
lich kompakter und eleganter aufgebaut werden als benutzt, um jeweils eine Instanz einer Klasse zu
noch im frheren Beitrag: erzeugen. Der Constructor hat den gleichen Namen
wie die zugehrige Klasse und gibt kein Argument
// SOS zurck.
In einen klassischen Sketch wird das Standard-File
int pin = 13; Arduino.h immer automatisch mit eingebunden. Bei
einer Bibliotheksdatei dagegen muss man dies manu-
void setup() ell erledigen, um sicherzustellen, dass alle erforderli-
{ pinMode(pin, OUTPUT); chen arduinospezischen Denitionen zur Verfgung
} stehen.
Um Probleme mit der Mehrfacheinbindung einer
void loop() Bibliothek zu vermeiden, wird der gesamte Code in
{ S();O();S(); delay(1000);} eine entsprechende if-Abfrage eingebettet. Damit
muss die Datei MorseCode.h wie folgt aussehen:
void S()
{ for(int i = 1; i <= 3; i++) // morse code generation
{ digitalWrite(pin, HIGH); delay(200);
digitalWrite(pin, LOW); delay(200); #ifndef MorseCode_h
} GHQH0RUVH&RGHBK
delay(500);
} #include "Arduino.h"

void O() class Morse


{ for(int i = 1; i <= 3; i++) { public:
{ digitalWrite(pin, HIGH); delay(1000); Morse(int pin);
digitalWrite(pin, LOW); delay(200); void S();
} void O();
delay(500); private:
} int _pin;
};
SOS_short.ino
#endif
Nun sollen verschiedene Teile des Sketches in eine
Library ausgegliedert werden. Hierfr bieten sich na- MorseCode.h
trlich die beiden Routinen S() und O() an. Diese
beiden Programmteile bernehmen die Aufgabe, die Nun muss noch die zugehrige .ccp-Datei erstellt
Morsesequenzen fr die Buchstaben S und O zu er- werden. Hier muss natrlich zunchst die zugehrige
zeugen. Nachdem die Prozeduren ber .h-Datei eingebunden werden. Auch die Arduino.h ist
void S() und void O() nochmals manuell zu aktivieren. Dann folgt die De-
deniert wurden, knnen sie ber die Anweisungen nition der einzelnen Funktionen. Um festzulegen,
S() und O() aufgerufen werden. dass diese Teil einer Klasse sind, muss man den Namen
Die Bibliothek soll aber auch noch eine einfache der Klasse gefolgt von einem doppelten Doppelpunkt
Mglichkeit bieten, den Port, an welchen das Signal voranstellen (::). Damit sieht die ccp.-Datei so aus:
ausgegeben werden soll, zu whlen.
// morse code generation
Aufbau einer Bibliothek
Eine Library muss immer mindestens zwei Dateien #include "Arduino.h"
enthalten: #include "MorseCode.h"
1. das Header-File mit der Extension .h
2. das Source-File mit der Extension .cpp Morse::Morse(int pin)
Im Header-File werden alle fr die Library erforderli- { pinMode(pin, OUTPUT);
chen Denitionen festgelegt. Hierfr wird zunchst _pin = pin;
eine sogenannte Class (engl. fr Klasse) bentigt. }
In einer Klasse knnen mehrere Funktionen und Va-
riablen zusammengefasst werden. Hier hat man zwei void Morse::S()
Mglichkeiten zu unterscheiden: { for(int i = 1; i <= 3; i++)
Public Class (ffentliche Klasse) und { digitalWrite(_pin, HIGH); delay(200);
Private Class (private Klasse) digitalWrite(_pin, LOW); delay(200);
Die als ffentlich denierten Teile knnen von allen }
Nutzern der Bibliothek verwendet werden. Auf pri-

ELVjournal 4/2014

Arduino_Teil_5.indd 95 01.07.14 14:49


96 So funktionierts

delay(500);
}

void Morse::O()
{ for(int i = 1; i <= 3; i++) In diesem Verzeichnis mssen sich die Dateien
{ digitalWrite(_pin, HIGH); delay(1000); MorseCode.h
digitalWrite(_pin, LOW); delay(200); MorseCode.cpp
} keywords.txt
delay(500); benden.
}

MorseCode.cpp

Mit diesen beiden Dateien ist die Bibliothek bereits


fertiggestellt. Zustzlich sollte noch ein Unterverzeichnis examples angelegt wer-
Das SOS-Programm wird damit unschlagbar ein- den, in welches die Beispieldatei
fach: SOS_w_lib.ino
abgelegt wird. Damit ist die Bibliothek prinzipiell vollstndig.
// SOS
Ideal ist es natrlich, wenn dazu noch weitere Informationen geliefert
#include <MorseCode.h> werden, in welchen alle Funktionen genau dokumentiert sind. Die Er-
Morse morse(13); fahrung zeigt allerdings, dass diese Dokumentation bei den meisten im
void setup(){} Internet verffentlichten Libraries fehlt. Trotzdem knnen viele dieser
void loop() kleinen Helfer nach kurzer Einarbeitung und dem Studium der einzelnen
{ morse.S(); morse.O(); morse.S(); delay(1000); Dateien, insbesondere der Beispieldatei, sehr nutzbringend angewendet
} werden.

SOS_w_lib.ino
Ausblick
Man muss also nur noch die Bibliothek einbinden, Die Arbeit mit Programmbibliotheken sollte nun keine Probleme mehr
und die darin enthaltenen Funktionen stehen fr die bereiten. Der Einsatz dieser ntzlichen Hilfsmittel ist immer dann zu
freie Verwendung zur Verfgung. empfehlen, wenn es darum geht, Standardprobleme zu lsen.
Der Arduino hat nun sozusagen das Morsealpha- Es ist in jedem Fall lohnend, vor der Implementierung eines neuen
bet gelernt und sendet beispielsweise auf den Befehl Projekts zu prfen, ob entweder fr das gesamte Vorhaben oder aber
morse.S(); automatisch drei kurze Lichtimpulse, also auch nur fr wichtige Teile geeignete Bibliotheken existieren.
das optische Morsezeichen fr S aus. Natrlich Der nchste Artikel wird sich um das Thema Sensortechnik und
kann man auch den Rest des Alphabets in die Biblio- Messwerterfassung drehen. Auch dazu sind umfangreiche Bibliotheken
thek integrieren und ist dann in der Lage, sehr kom- vorhanden. Allerdings erfordert der Einsatz spezieller thermischer oder
fortabel ganze Texte in Morsecode mit dem Arduino optoelektronischer Sensoren, etwa im Bereich der Hausautomatisierung
zu versenden. oder der Robotersteuerung, doch auch entsprechende Kenntnisse im Be-
Abschlieend sei noch auf die Datei keywords.txt reich der Erfassung und Wandlung analoger Daten.
hingewiesen. Diese ist fr die Funktion der Biblio-
thek nicht unbedingt erforderlich, bietet aber den Empfohlenes Material
Komfort, dass die in der Bibliothek verwendeten Arduino Micro, Best.-Nr. J4-10 97 74, 24,95
Schlsselwrter in der gewohnten Farbcodierung er- Mikrocontroller-Onlinekurs, Best.-Nr. J4-10 20 44, 99,
scheinen. Hierzu muss man die verwendeten Funk- Auch viele Lernpakete von Franzis wie etwa Elektronik mit ICs
tionsnamen in eine keywords.txt-Datei eintragen und enthalten Materialien wie ein ltfreies Steckbrett, Widerstnde und
mit KEYWORD1 fr die Klasse bzw. KEYWORD2 fr LEDs etc., die fr den Aufbau von Schaltungen mit dem Arduino Micro
die Funktionen kennzeichnen: gut geeignet sind.

Morse KEYWORD1
S KEYWORD2 Preisstellung Juni 2014 aktuelle Preise im Web-Shop
O KEYWORD2
Weitere Infos:
keywords.txt

Will man nun die erzeugte Bibliothek der Allgemein- G. Spanner: Arduino Schaltungsprojekte fr Pros,
heit zur Verfgung stellen, so muss man nur die drei Elektor-Verlag, 2012, Best.-Nr. J4-10 94 45, 39,80
Dateien (xxx.h, xxx.ccp und xxx.txt) weitergeben. AVR-Mikrocontroller in C programmieren,
Zustzlich wird meist noch eine Beispieldatei mitge- Franzis-Verlag, 2012, Best.-Nr. J4-09 73 52, 39,95
liefert, die die Anwendung der Bibliotheksfunktionen
demonstriert. Die Bibliothek besteht also aus einem Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
Verzeichnis Morsecode. und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_Teil_5.indd 96 01.07.14 14:49


62 So funktionierts

Arduino verstehen
und anwenden
Teil 6: Sensortechnik und Messwerterfassung

www.elvjournal.de

Arduino_Teil_6.indd 62 02.09.14 08:37


So funktionierts 63

Der sechste Teil der Artikelserie Arduino ver- V bit


stehen und anwenden hat das weite Gebiet der
Sensortechnik und der controllerbasierten Mess- 5 1023

sample
werterfassung zum Thema.

Hier ist der Mikrocontroller voll in seinem Element. 4 818

Denn in diesem Anwendungsbereich unterscheiden


sich Controller ganz wesentlich von ihren techni- 3 614 tn
h o ld
schen Gegenspielern, den Prozessoren. Mikrocon- U n = 2 ,5 8 V = 5 2 7 b it
troller zeichnen sich insbesondere dadurch aus, dass
2 409
sie ber integrierte Messwandlereinheiten verfgen.
So besitzen auch die Controller der Arduino-Serie
mehrere Analogeingnge. Damit lassen sich die un- 1 205

terschiedlichsten Messanwendungen realisieren. Zu


den Themen dieses Beitrags zhlen entsprechend die 0 t
folgenden Aufgaben:
Erfassung analoger Messdaten Bild 1: Erfassung analoger Messwerte
Auswertung von Sensorsignalen
Ausgabe und Verarbeitung von Messwerten
lern sind meist noch sogenannte Analogmultiplexer vorhanden. Diese
Im Rahmen der Praxisbeispiele werden die folgenden erlauben dann die nahezu simultane Erfassung von 6, 8 oder sogar mehr
Anwendungen vorgestellt: analogen Kanlen.
Erfassung einer Potentiometerposition durch ADCs sind wichtige Bestandteile vieler Gerte der modernen Kommu-
Messung analoger Spannungswerte nikations-, Unterhaltungs- und Haushaltselektronik. Digitale Thermo-
Elektronisches Computer-Thermometer mit meter oder Wetterstationen knnen auf ADCs ebenso wenig verzichten
bertemperaturalarm wie MP3-Player, Mobiltelefone oder digitale Kameras. Zudem werden die
Elektronisches Luxmeter Wandler in der Messwerterfassung in industriellen Anwendungen, zur
Steuerung von Maschinen und in Kraftfahrzeugen bentigt.
Erfassung von Messwerten Die Ausung eines ADCs bestimmt die maximale Genauigkeit, mit
Die Erfassung von elektronischen Messdaten gehrt der das analoge Eingangssignal digitalisiert werden kann. Die effektive
mit zu den zentralen Aufgaben eines Mikrocontrol- Przision ist durch weitere Fehlerquellen des ADCs jedoch geringer als
lers. Das Einlesen von digitalen Signalen stellt die die theoretische Ausung. So fhren etwa Nichtlinearitten oder Ab-
einfachste Mglichkeit dar. Binre Spannungspegel gleichfehler zu zustzlichen Abweichungen.
(0 V oder 5 V) knnen von jedem I/O-Pin erfasst Die Wandlungsdauer fr einen einzelnen Messwert hngt vom Wand-
werden. Allerdings muss man auch bei dieser ver- lungsverfahren ab. Neben extrem schnellen Verfahren existieren auch
gleichsweise einfachen Aufgabe hug verschiedene langsame, integrierende Methoden, die sich dafr durch hervorragende
Probleme beachten. So stellt etwa das sogenannte Unterdrckung von Streinkopplungen auszeichnen.
Prellen, also die Mehrfacherfassung eines Schalt- Die Ausung, mit der die analoge Gre gemessen wird, bewegt sich
vorgangs aufgrund von mechanischen Effekten, ein zwischen 1 und 24 Bit. Die durch die Wandlung entstehende Abweichung
nicht zu unterschtzendes Problem bei der Ansteue- zwischen dem tatschlichen Messwert und dem digitalen Ausgabewert
rung von einfachen Tastern dar. bezeichnet man als Quantisierungsfehler. Er entsteht u. a. durch un-
Aber auch analoge Spannungswerte knnen von vermeidbare Rundung, Nichtlinearitten sowie Streinstreuungen etc.
modernen Mikrocontrollern direkt gemessen werden. Bild 1 zeigt, wie der rot dargestellte analoge Spannungsverlauf mit
Die meisten gngigen Controllertypen haben dazu einem ADC digitalisiert wird. Der ADC fhrt zu bestimmten Zeitpunkten
einen sogenannten A/D-Wandler (Analog-zu-digital- tn eine Spannungsmessung durch. Dieser Spannungswert wird dann in
Umsetzer, auch ADC fr engl. Analog to Digital Con- einen Digitalwert umgewandelt. Bei einer Ausung von 10 Bit und
verter) integriert. In den entsprechenden Control- einer Referenzspannung von 5 V ergibt sich so fr eine Spannung von

ELVjournal 5/2014

Arduino_Teil_6.indd 63 02.09.14 08:37


64 So funktionierts

ADC-Wandlerverfahren

Verfahren Arbeitsweise Vorteile Nachteile Anwendung


Flash- oder teuer, Digitaloszilloskope,
pro Ausgangswert 1 Komparator sehr schnell
Parallelwandler hohe Leistungsaufnahme Forschung und Entwicklung
Sukzessive stufenweise Annherung, Standardverfahren,
schnell, genau technisch aufwendig
Tabelle 1

Approximation Wgeverfahren interne A/D-Wandler von Mikrocontrollern


Single Slope, Spannungsmessung erfolgt ber preisgnstig,
langsam Multimeter
Dual Slope Zeitmessung von Ladevorgngen gute Linearitten
Delta-Sigma Komparator und Logik-Elemente preisgnstig langsam Przisionsmessungen bis zu 24 Bit, Audio

beispielsweise 2,58 V ein abgerundeter digitaler Er- Eigenschaften des ADC-Wandlers im Arduino

Tabelle 2
gebniswert von Q = 527:
Analogeingnge 6 (A0A5)
Q = 2,58 V / 5 V * 1023 = 527
Ausung 10 Bit
Je nach Anwendungsfall werden unterschiedliche Wandlungszeit max. 260 s
Anforderungen an einen ADC gestellt. Fr die ver-
schiedenen Aufgaben wurden daher unterschiedliche
Verfahren entwickelt und implementiert. Die wich-
tigsten ADC-Verfahren sind in Tabelle 1 zusammen-
gefasst. Wie diese zeigt, besitzen alle Verfahren Die zugehrige Schaltung ist in Bild 2 zu sehen. Das Potentiometer soll-
ihre spezischen Vor- und Nachteile. Die sukzessive te einen Bahnwiderstand von ca. 100 k1 besitzen. Nach dem Laden des
Approximation stellt aber einen guten Kompromiss Programms und dem Starten des seriellen Monitors werden die Messwer-
fr viele Anwendungen dar. Sie wird daher in vielen te sichtbar (Bild 3). Da direkt der ADC-Wert ausgegeben wird, liegen die
Mikrocontrollern und insbesondere auch bei den im angezeigten Zahlenwerte im Bereich von 0 bis 210-1 = 1023.
Arduino verwendeten AVR-Typen eingesetzt. Die im
Arduino verwendeten ADCs zeichnen sich durch die in Temperaturmessung
Tabelle 2 aufgefhrten Leistungsmerkmale aus. Temperaturfhler zhlen zu den wichtigsten Sensoren in der elektroni-
schen Messtechnik. Sie berwachen die Temperaturen in den Prozesso-
Praktische Anwendung: ren moderner PCs genauso wie in Automotoren, Grorechenanlagen oder
Erfassung einer Potentiometerposition in den Prozess-Steuerungen der chemischen Industrie.
Nachdem nun die prinzipiellen Eigenschaften von Einfache Temperatursensoren bestehen meist aus mit Bindemitteln
ADCs dargelegt wurden, soll die Funktionsweise der versetzten, gepressten und gesinterten Metalloxiden. Der Nominalwi-
Analog-digital-Converter anhand eines Anwendungs- derstand eines solchen Messelements lsst sich durch das Mischverhlt-
beispiels verdeutlicht werden. Hierzu sollen die von nis verschiedener Materialien in weiten Bereichen einstellen.
einem Potentiometer erzeugten analogen Span- So entstehen sogenannte NTCs, also Temperatursensoren mit nega-
nungswerte vom Arduino erfasst und zum PC ber- tivem Temperaturkoefzienten. Ein Standardtyp dieses Bauelements
tragen werden.
Als Messkanal kommt der Analog-Eingang ADC0
zum Einsatz. Die dort anliegenden Spannungswerte
sollen erfasst und in digitale Messwerte gewandelt
werden. Anschlieend werden die Werte an einen PC
bertragen und am seriellen Monitor dargestellt.
Das Programm dazu kann so aussehen:

// ADC

int ADC0=0;
int value;

void setup()
{ Serial.begin(9600);
}

void loop()
{ value=analogRead(ADC0);
Serial.print("ADC0 = ");
Serial.println(value);
delay(5000);
}
Bild 2: Aufbau fr die Erfassung analoger Messwerte

www.elvjournal.de

Arduino_Teil_6.indd 64 02.09.14 08:37


So funktionierts 65

weist beispielsweise einen Widerstandswert von 4,7 k1 bei einer Tempe-


ratur von 25 C auf.

Elektronisches Thermometer mit bertemperaturalarm


Ein solcher NTC eignet sich hervorragend zum Aufbau eines elektroni-
schen Computer-Thermometers. Die Temperaturmesswerte sollen dabei
ber den Mikrocontroller erfasst und am PC dargestellt werden.
Neben der Darstellung der aktuellen Temperatur ermglicht ein sol-
ches Thermometer auch die zeitaufgelste Messung von Temperaturen.
Typische Anwendungen dafr sind die Temperaturberwachung von
Leistungstransistoren, Mikroprozessoren oder ganzen klimatisierten
Serverrumen.
Zustzlich kann ein bertemperaturalarm integriert werden, ber
welchen im Ernstfall ein zustzliches Khlaggregat aktiviert oder aber
sogar die Leistung einer kompletten Serverfarm heruntergefahren wer-
den knnte. Die Umrechnung des ADC-Werts in eine Temperatur erfolgt
Bild 3: Darstellung der Messwerte im seriellen Monitor
ber 2 Konstanten:
cal = 6.8
offset = 296
Die beiden Werte ergeben sich aus dem Offset sowie aus der Steilheit Den Schaltungsaufbau dazu zeigt Bild 4. Der Tempe-
der Kennlinie des NTCs. Falls die Temperatur nicht korrekt angezeigt ratursensor wird hier in einer einfachen Spannungs-
wird, knnen die beiden Konstanten an das verwendete Sensorexemplar teiler-Schaltung betrieben.
angepasst werden. Der 4,7-k1-Festwiderstand sorgt dafr, dass die
Prinzipiell ist die Kalibrationsfunktion eines NTCs nichtlinear. Fr ei- Eingangsspannung fr den ADC bei Raumtemperatur
nen Temperaturbereich von ca. 0 bis etwa 50 C knnen die Abweichun- bei ca. der halben Betriebsspannung, d. h. bei etwa
gen aber weitgehend vernachlssigt werden. Fr hchste Ansprche 2,5 V, liegt. Damit lsst sich der Temperaturbereich
bezglich der Messprzision kann selbstverstndlich auch eine nichtli- von 0 bis 50 C gut abdecken.
neare Funktion zur Berechnung der Temperatur implementiert werden. Nach dem Starten des Programms und des seriel-
Der nachfolgende Sketch zeigt, wie ein Programm zur Temperaturmes- len Monitors werden die jeweils aktuellen Tempera-
sung inklusive eines bertemperaturalarms aussehen knnte. turwerte im Abstand von ca. 1 s auf dem Bildschirm
angezeigt. Berhrt man den Sensor mit den Finger-
// Temperature sensor spitzen, wird der damit einhergehende Temperatur-
// for serial interface anstieg unverzglich sichtbar. berschreitet die Tem-
// using NTC temperature sensor peratur den in der Zeile
// incl. overtemp indication oat overtemp = 30;
festgelegten Schwellwert von 30 C, so wird die LED
int ADC0=0; // select ADC channel als Warnanzeige aktiviert.
int ADC_value;
RDWWHPS
RDWFDO FDOLEUDWLRQIDFWRUIRU17&N
RDWRVHW RVHWFRQVWDQWIRU17&N

RDWRYHUWHPS 
LQWRYHUWHPS/(' 

void setup()
{ Serial.begin(9600);
pinMode(overtempLED,OUTPUT);
}

void loop()
{ ADC_value=analogRead(ADC0);
WHPS $'&BYDOXHRVHW FDO 
Serial.print("Temp = ");
Serial.print(temp);
Serial.println(" C ");

if(temp>overtemp)digitalWrite(overtempLED,HIGH);
if(temp<overtemp)digitalWrite(overtempLED,LOW);

delay(1000);
} Bild 4: Aufbau fr ein elektronisches Computer-Thermometer mit
bertemperaturalarm

ELVjournal 5/2014

Arduino_Teil_6.indd 65 02.09.14 08:37


66 So funktionierts

Bild 5 zeigt ein Temperaturberwachungsgert


fr eine kleine Klimakammer. Hier wurden 5 der 6
vorhandenen Analogkanle mit Temperatursensoren
ausgestattet. Der jeweils aktive Kanal wird ber eine
LED angezeigt. Als Display fr die Temperaturwerte
kam hier eine 4-stellige 7-Segment-Anzeige zum Ein-
satz. Weitere Details zur Ansteuerung einer solchen
Anzeige werden in einem spteren Beitrag in dieser
Artikelserie erlutert.

Der Phototransistor als optischer Sensor


Ein weiterer sehr interessanter Sensor ist der Photo-
transistor. Dieser gestattet die Erfassung von Hel- Bild 5: Im Eigenbau erstelltes C-basiertes Computer-Thermometer mit bertemperatur-
ligkeitswerten. Typische Anwendungen dieses Bau- alarm und 5 Alarmausgngen zur berwachung von Serverrumen
elements sind Lichtschranken, Belichtungsmesser fr
Fotokameras oder Empfnger fr Infrarotfernbedie-
nungen. Den Hardwareaufbau dazu zeigt Bild 6. Im Gegensatz zum NTC weist
der Phototransistor eine Polung auf. Falls sich die Messwerte also nicht
Elektronisches Luxmeter wie erwartet mit der Umgebungshelligkeit verndern, sollte man den
Mit dem Phototransistor kann die Umgebungshellig- Lichtsensor umpolen.
keit bestimmt und der aktuelle Helligkeitswert auf Bild 7 zeigt, wie sich die Lnge des Anzeigebalkens verndert, wenn
einem PC-Bildschirm dargestellt werden. Der Sensor- der Sensor mit einer Lampe beleuchtet wird. Unterschreitet die Umge-
typ BPW40 eignet sich bestens fr diese Aufgabe. bungshelligkeit einen festgelegten Schwellwert, wird die LED 13 als Zu-
Anstelle einer numerischen Anzeige kann man satzbeleuchtung eingeschaltet. Natrlich knnte man auf diese Weise
fr die Helligkeiten auch eine grasche Darstellung auch eine leuchtstarke Power-LED als echte Zusatzlichtquelle ansteuern.
whlen. Im Beispiel wird eine sogenannte ASCII-
Grak verwendet. Das bedeutet, dass eine Zeile aus Grasche Darstellung von Messwerten
X-Zeichen ihre Lnge proportional zur aktuellen Um- auf dem PC-Bildschirm
gebungshelligkeit verndert. Wenn man die Messwerte von Sensoren nicht nur ber den seriellen
Das Prinzip dieser einfachen Grakausgabe wurde Monitor in numerischer Form oder als einfache ASCII-Graken darstellen
bereits im Artikel Programmierpraxis: Befehle, Vari- will, sondern echte grasche Ausgaben erwnscht sind, so kann man
ablen und Funktionen erlutert, sodass das Ardui- das Programm Processing einsetzen.
no-Programm dazu keine Verstndnisschwierigkeiten Dieses uerst ntzliche und universell einsetzbare Programm kann
mehr bereitet. unter [1] kostenlos aus dem Internet geladen werden. Dass das Pro-
gramm der Arduino-IDE stark hnelt, ist kein Zufall. Die Arduino-Pro-
// Luxmeter grammieroberche ist sehr eng an das am Massachusetts Institute
5Y N for Technology (MIT) entwickelte Processing angelehnt. Dies hat den
Vorteil, dass sich routinierte Arduino-Anwender schnell zurechtnden.
GHQH$ODUP/(' Zudem werden hnlich wie bei der Arduino-IDE auch bei Processing viele
interessante Beispielanwendungen mitgeliefert. Alleine das Austesten
int ADC_value; dieser Beispielprogramme ist schon eine sehr interessante und lehr-
int ADC_0=0; reiche Beschftigung und erleichtert den Einstieg in dieses Programm
LQWWKUHVKROG  ganz erheblich.
Durch vorgefertigte Bibliotheken wird die Einbindung des Arduinos
void setup() in Processing wesentlich vereinfacht. So knnen ber die virtuelle se-
{ Serial.begin(9600); rielle Schnittstelle problemlos Messdaten bertragen und dann sehr
pinMode(AlarmLED, OUTPUT); ansprechend auf einem PC-Bildschirm dargestellt werden. Bild 8 zeigt
} beispielsweise die simultane Darstellung aller 6 Arduino-Analogkanle
in Form einer Balkengrak.
void loop() Aber auch die zeitliche Vernderung von Messwerten kann grasch
{ ADC_value=analogRead(ADC_0); aufbereitet werden. So zeigt Bild 9 einen sogenannten Temperatur-Log-
if (ADC_value>0) ger. Damit knnen Temperaturverlufe ber Stunden oder Tage hinweg
{ for(int i=0; i<=(ADC_value/10); i++) aufgezeichnet und dargestellt werden. Der berwachung und Optimie-
Serial.print("X"); rung der hauseigenen Heizungsanlage steht so nichts mehr im Wege.
Serial.println("");
} Ausblick
if(ADC_value < threshold) In diesem Artikel wurde gezeigt, wie man verschiedene Sensorwerte
{ digitalWrite(AlarmLED,HIGH); ber die Analogkanle des Arduinos auslesen und verarbeiten kann. Die
} Anwendungen dieses weiten Teilbereichs der Mikrocontrollertechnik
else digitalWrite(AlarmLED,LOW); sind nahezu unbeschrnkt. Von einfachen Temperaturberwachungen
GHOD\   ber die Steuerung von Solarzellenanlagen bis hin zu komplexen Auf-
} gaben in der Mess- und Regelungstechnik berall werden Sensoren
bentigt und eingesetzt.

www.elvjournal.de

Arduino_Teil_6.indd 66 02.09.14 08:37


So funktionierts 67

Bild 6: Aufbau fr das elektronische Luxmeter Bild 7: Ausgabe von Helligkeitswerten als ASCII-Grak

In neuerer Zeit hat sich fr diese Anwendungen auch der Begriff Phy-
sical Computing etabliert. Hierunter versteht man die Erfassung und phy-
sikalische Beeinussung bzw. Steuerung der Umwelt mittels elektronischer
Sensoren und Aktuatoren. Der erste Teil, die Sensorik, wurde bereits in
diesem Artikel behandelt. Die Ansteuerung von Aktuatoren wie Schrittmo-
toren oder Servos folgt in einem spteren Beitrag.
Ein weiterer wichtiger Teilbereich des Physical Computing ist die ber-
tragung von Daten ber Schnittstellen und Interfaces wie USB, RS232 und
I2C. Diese Themen werden im nchsten Artikel dieser Serie behandelt.

Empfohlenes Material
Franzis-Lernpakete wie etwa Elektronik mit ICs enthalten Materialien wie
ein ltfreies Steckbrett, Widerstnde und LEDs etc., die fr den Aufbau von
Schaltungen mit dem Arduino gut geeignet sind.

Weitere Infos:
Bild 8: Darstellung von Analogkanlen als Balkengrak

[1] www.processing.org

G. Spanner: Arduino Schaltungsprojekte fr Pros,


Elektor-Verlag, 2012, Best.-Nr.: J5-10 94 45
G. Spanner: AVR-Mikrocontroller in C programmieren,
Franzis-Verlag, 2010, Best.-Nr.: J5-09 73 52

Preisstellung August 2014 aktuelle Preise im Web-Shop

Empfohlene Produkte/Bauteile: Best.-Nr. Preis


Arduino-Uno-Platine R3 J5-10 29 70 27,95
Mikrocontroller-Onlinekurs J5-10 20 44 99,
Lernpaket Mikrocontroller programmieren J5-10 68 46 129,

Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher und


Bild 9: Temperatur-Logger mit Processing Zubehr nden Sie unter: www.arduino.elv.de

ELVjournal 5/2014

Arduino_Teil_6.indd 67 02.09.14 08:37


32 So funktionierts

Arduino verstehen
und anwenden
Teil 7: Schnittstellenpraxis Kommunikation mit Laptop und PC

www.elvjournal.de

Arduino_Teil_7.indd 32 29.10.14 11:15


So funktionierts 33

Im siebten Teil der Artikelserie Arduino ver- Auch im Arduino Micro kommt dieser Chip zum Ein-
stehen und anwenden geht es um die bertra- satz. Erst aufgrund der besonders kleinen Gehuse-
gung von Daten ber Schnittstellen. Die zentrale bauform des Chips konnte der Micro auf die Gre
Schnittstelle des Arduino ist das USB-Interface, eines klassischen DIL-ICs reduziert werden.
ber das jeder aktuelle Arduino verfgt. Die USB-Schnittstelle ist natrlich auch ein wei-
terer Grund fr die groe Beliebtheit der Arduino-
ber die USB-Buchse wird der Arduino nicht nur mit Boards. Durch diese Schnittstelle kann der Arduino
Strom versorgt, sondern auch die gesamte Datenkom- an praktisch jeden modernen PC oder Laptop prob-
munikation luft ber diese Schnittstelle. Dabei sind lemlos angeschlossen werden. Der Anwender braucht
zwei grundlegende Methoden zu unterscheiden: sich um Schnittstellenwandler etc. keine Gedanken
bertragung von Sketchen zum Arduino mehr zu machen.
Austausch von Daten zwischen PC und Arduino, Aber auch wenn die RS232-Schnittstelle in der
whrend auf dem Prozessor ein Programm abluft modernen PC-Technik praktisch ausgestorben ist, so
ist sie doch in anderen Bereichen noch weit verbrei-
In diesem Artikel werden die Funktion dieser Schnitt- tet. So ist RS232-Kommunikation noch sehr hug in
stelle und ihre mglichen Anwendungen genauer be- folgenden Anwendungen zu nden:
handelt. Externe GPS-Module, sogenannte GPS-Muse
Seriell angesteuerte LC-Displays
Serielle Datenbertragung Messgertetechnik
Wenn Daten zwischen einem Mikrocontroller und Industrielle Steuerungen etc.
einem PC ausgetauscht werden sollen, so ist dafr
die serielle Schnittstelle noch immer das Mittel der Auch bei der Verbindung von einzelnen Mikrocont-
Wahl. Dies mag in Zeiten der allgegenwrtigen USB- rollern untereinander spielt die serielle Schnittstelle
Schnittstelle etwas berraschen, und schlielich ist noch eine groe Rolle.
der Arduino ja auch ber eine USB-Schnittstelle mit Auerdem knnen gerade auch sehr preisgns-
dem PC verbunden. tig erhltliche oder noch vorhandene ltere PCs mit
Wenn man den Aufbau des Arduino-Boards aber et- RS232-Schnittstelle in Kombination mit Mikrocon-
was genauer betrachtet, so stellt man fest, dass der trollern nutzbringend eingesetzt werden. Da hier
Mikrocontroller tatschlich nur ber eine klassische meist keine sehr hohen Anforderungen an die Leis-
serielle Verbindung kommuniziert. Erst ein weiterer tungsfhigkeit des Rechners gestellt werden, bieten
Baustein sorgt fr die Umsetzung der RS232-Signale sich solche Rechner als Terminaleinheiten fr den
auf ein USB-kompatibles Format. Arduino an.
In den frheren Arduino-Versionen wie dem Due-
millenove wurde die Umsetzung von einem Spezial- Grundlagen der seriellen
baustein bernommen, dem FT232RL der Firma Future Kommunikation
Technologies. Prinzipiell kann man zwei Methoden der Datenbertra-
Da der FT323RL verhltnismig teuer ist, wurde gung unterscheiden:
dieser Baustein beim aktuellen Arduino Uno durch Parallele Kommunikation
einen zweiten AVR-Controller, den ATmega16U2, er- Serielle Kommunikation
setzt. Dieser Controllertyp verfgt ber eine integ-
rierte USB-Schnittstelle und kann mittels einer spe- Bei der parallelen Datenkommunikation werden meh-
ziellen Firmware USB-Signale in das RS232-Format rere, meist acht Bit, gleichzeitig bertragen. Dies
umwandeln. erfordert aber immer eine parallele Verlegung von
Noch einen Schritt weiter ist der Arduino Leo- acht Leitungen bzw. acht Adern in einem Kabel (plus
nardo. Hier wurde der Controllertyp ATmeg32U4 als eine Masseverbindung), d. h. einen vergleichsweise
Hauptcontroller eingesetzt. Dieser kann, wie der hohen technischen Aufwand. Insbesondere bei sehr
Mega16U4, ebenfalls direkt USB-Signale verarbeiten. hohen Datenraten treten erhebliche Probleme mit

ELVjournal 6/2014

Arduino_Teil_7.indd 33 29.10.14 11:15


34 So funktionierts

der Synchronisierung der acht Kanle auf, so dass alle


moderneren bertragungsverfahren, wie etwa auch
USB, nur noch seriell ausgefhrt werden.

odd P arity
S tart B it

S tart B it
S top B it
MS B 7
LSB 0
Bei der seriellen bertragung werden die Daten-

B it 1
B it 2
B it 3
B it 4
B it 5
B it 6
bits zeitlich nacheinander bertragen. Im einfachs-
ten Fall kommt man daher mit einer Signalleitung
aus. Fr eine bidirektionale Verbindung sind zwei
L o g is c h 1 Leitungen ausreichend (plus Masse).
Um eine korrekte Interpretation der bertragenen
L o g is c h 0 Daten zu gewhrleisten, mssen Datensender und
-empfnger ein gemeinsames Protokoll benutzen. In
diesem Protokoll mssen die wichtigsten Parameter
1 0 1 0 1 0 0 0 1 0 1 1 1 .. 0
festgelegt sein wie:
bertragungsgeschwindigkeit
+15 V +15 V
Bitdenition
Start- und Endbedingung fr die bertragung
+3 V +3 V
0 V
-3 V -3 V Auf PC-Seite werden die verfgbaren seriellen
Schnittstellen mit COM bezeichnet. So verfgen die
-1 5 V -1 5 V meisten PCs intern noch ber diese Schnittstelle,
auch wenn sie nicht mehr ber eine Buchse am Ge-
Bild 1: RS232-Protokoll huse zur Verfgung gestellt wird. Bei der Installati-
on von sogenannten virtuellen COM-Schnittstellen
sind die internen Ports dann aber oft noch als COM1
oder COM2 vorbelegt.
Die serielle Datenbertragung haben wir prinzi-
piell schon bei der ersten Programmierung des Ar-
duino kennengelernt. Ein Anwendungsprogramm wird
nmlich ebenfalls ber das serielle Protokoll zum C
bertragen.
Deshalb war es auch notwendig, bei der Installa-
tion der Entwicklungsumgebung eine spezielle COM-
Schnittstelle auszuwhlen.
Bild 1 zeigt die prinzipielle Funktion der seriellen
Schnittstelle. Die bertragung beginnt mit einem
sogenannten Startbit. Dann folgen die Datenbits,
wobei mit dem niedrigstwertigen Bit, dem soge-
nannten Least Signicant Bit (LSB), begonnen wird.
Den Abschluss der Daten bildet entsprechend das
hchstwertige Bit (MSB: Most Signicant Bit). Ab-
schlieend folgen das Parity- und ein oder 2 Stopp-
Bits.
Ursprnglich wurden fr die bertragung auf elek-
trischer Ebene Spannungen zwischen 15 V verwen-
Bild 2: Ausgabe einer ASCII-Tabelle auf die serielle Schnittstelle det (siehe Bild 1 unten).
Bei Controller-Anwendungen kommt dagegen
meist die sogenannte TTL-kompatible Version zum
Einsatz. Diese verwendet Spannungen von 0 und +5 V
fr die Bitbertragung.

Die serielle Schnittstelle


am Mikrocontroller
Beim Arduino-Board steht die serielle Schnittstelle
an den Pins 0 und 1 zur Verfgung Diese Pins sind
deshalb auch mit RX und TX fr Receive (Empfangen)
und Transmit (Senden) gekennzeichnet. Diese beiden
Pins sind auf dem Board direkt mit dem RS232-zu-
USB-Wandler verbunden.
Damit wird die Kommunikation des Controllers mit
einem PC sehr einfach. Der einzige Parameter, der
noch eingestellt werden muss, ist die bertragungs-
geschwindigkeit. Diese wird auch als Baudrate be-
Bild 3: So sieht die Ausgabe mit falsch eingestellter Baudrate aus! zeichnet.

www.elvjournal.de

Arduino_Teil_7.indd 34 29.10.14 11:15


So funktionierts 35

Folgende Datenraten stehen zur Verfgung: Neben dem ASCII-Zeichen selbst werden hier noch
die zugehrigen Codes in dezimaler (dec), hexade-
300 1200 zimaler (hex), oktaler (oct) und binrer (bin) Form
2400 4800 dargestellt. Bild 2 zeigt die Ausgabe im Seriellen Mo-
9600 14.400 nitor der Arduino-IDE.
19.200 28.800 Einer der hugsten Fehler bei der Arbeit mit der
38.400 54.760 seriellen Schnittstelle ist, dass die Baudraten auf
115.200 Sender- und Empfngerseite nicht bereinstimmen.
Bild 3 zeigt das Ergebnis, wenn die Sendebaudrate
Die Standard-Einstellung ist 9600 Baud. wie im obigen Code-Beispiel auf 9600 gesetzt ist, die
Empfangsbaudrate am Seriellen Monitor jedoch auf
Die Befehle zur Steuerung der seriellen Schnittstelle 4800 steht.
Fr die Steuerung der seriellen Schnittstelle knnen die folgenden Be- Sollten Sie also in Zukunft unverstndliche Zei-
fehle eingesetzt werden: chenfolgen auf Ihrem Bildschirm haben, ist es immer
Serial.begin(baudrate); eine gute Idee, zu prfen, ob die Baudraten auf Sen-
der- und Empfngerseite bereinstimmen.
Hier wird die serielle Schnittstelle initialisiert. Die Baudrate ist der
einzige hierfr erforderliche Parameter. Der Arduino an der kurzen Leine:
Es ist lediglich darauf zu achten, dass die hier angegebene Baudrate direkte Steuerung des Controllers
mit der im Empfnger auf der PC-Seite identisch ist. mit dem PC
Eine sehr wichtige Aufgabe in der Technik ist die
Mit Steuerung von Hardware-Komponenten von einem
Serial.print(); Rechner aus. Diese Aufgabe ist gewissermaen die
knnen dann bereits Informationen an den PC bertragen werden. Umkehrung des letzten Praxisbeispiels.
Das folgende Programmbeispiel zeigt, wie man
Serial.println(); vom PC aus eine LED ein- und ausschalten kann.
fgt nach der Ausgabe einen Zeilenneuanfang (Line) ein. Nach dem Laden des Programms kann die LED 13
ber den Datenmonitor geschaltet werden. Das Sen-
Liefert die Abfrage von den einer 1 schaltet die LED ein. Wird eine 0 ge-
Serial.available() sendet, so erlischt die LED. Fr das Senden der Werte
einen Wert >0, so stehen Daten an der Schnittstelle bereit. kann wieder der Serielle Monitor eingesetzt werden
(Bild 4). Die gewnschten Werte werden dort in das
Diese knnen dann mit oberste Feld eingetragen und mit dem Senden-But-
Serial.read(); ton zum Arduino bertragen.
eingelesen werden.
// receive serial data
Der Arduino geht auf Sendung:
bertragung von Daten vom Arduino an den PC int recData = 0;
Als erstes Praxisbeispiel soll eine ASCII-Tabelle vom Arduino zum PC int LED = 13; //on-board LED
gesendet werden.
Der Sketch dazu kann wie folgt aussehen: void setup()
{ pinMode(LED, OUTPUT);
// ASCII table to RS232 digitalWrite(LED, LOW);
Serial.begin(9600);
void setup() }
{ Serial.begin(9600);
Serial.println("ASCII Tabelle"); void loop()
{ if (Serial.available() > 0)
for (int myByte = 65; myByte <= 126; myByte++) { recData = Serial.read();
{ Serial.write(myByte); if (recData == '0')
Serial.print(", dec: "); digitalWrite(LED, LOW);
Serial.print(myByte); if (recData == '1')
Serial.print(", hex: "); digitalWrite(LED, HIGH);
Serial.print(myByte, HEX); }
Serial.print(", oct: "); delay(100);
Serial.print(myByte, OCT); }
Serial.print(", bin: ");
Serial.println(myByte, BIN);
} Selbstverstndlich knnen nicht nur die logischen
} Pegel 0 und 1 gesendet werden. Auch beliebige
andere Werte sind bertragbar. Das folgende Pro-
void loop() {} grammbeispiel zeigt, wie ein LED-Dimmer vom PC aus
gesteuert werden kann.

ELVjournal 6/2014

Arduino_Teil_7.indd 35 29.10.14 11:15


36 So funktionierts

Durch die exponentiell zugeordneten Helligkeitswerte wird das loga-


rithmische Verhalten des Auges dagegen kompensiert und die Hellig-
keitsstufen erscheinen nahezu gleich gro.

Ausblick
Nachdem in diesem Artikel die klassischen Punkt-zu-Punkt-Schnittstel-
len behandelt wurden, steht im nchsten Artikel die Netzwerktechnik
im Vordergrund.
Bild 4: Senden eines ASCII-Wertes zum Arduino
Der Arduino wird dann ber die Ethernet-Schnittstelle in das Heim-
netzwerk eingebunden. Dafr ist ein spezielles Shield erforderlich, oder
man verwendet gleich eine Arduino-Version mit integriertem Ethernet-
// remote controlled LED dimmer Anschluss.
Ist der Arduino erst einmal in das Heimnetzwerk integriert, so kann
int recData = 0; man mit einem beliebigen Browser wie etwa dem Internet Explorer oder
int LED = 3; // PWM-LED Google Chrome auf den Controller zugreifen. Alle im Artikel Sensor-
technik und Messwerterfassung vorgestellten Sensoren knnen dann in
void setup() das heimische Netzwerk integriert werden.
{ pinMode(LED, OUTPUT); Dem modernen Thema Heimautomatisierung sind so keine Grenzen
digitalWrite(LED, LOW); mehr gesetzt. Der Arduino kann etwa Rolllden in Abhngigkeit von der
Serial.begin(9600); Sonneneinstrahlung steuern.
} Aber auch eine effektive Kontrolle oder sogar die raumindividuelle
Steuerung der hauseigenen Heizungsanlage kann so realisiert werden.
void loop()
{ if (Serial.available() > 0) Empfohlenes Material
{ recData = Serial.read(); Arduino Micro,
if (recData == '0') analogWrite(LED, 0); Best.-Nr. J6-10 97 74, 24,95
if (recData == '1') analogWrite(LED, 1); Mikrocontroller-Onlinekurs,
if (recData == '2') analogWrite(LED, 2); Best.-Nr. J6-10 20 44, 99,
if (recData == '3') analogWrite(LED, 4); Auch viele Lernpakete von Franzis wie etwa Elektronik mit ICs
if (recData == '4') analogWrite(LED, 8); enthalten Materialien wie ein ltfreies Steckbrett, Widerstnde und
if (recData == '5') analogWrite(LED, 16); LEDs etc., die fr den Aufbau von Schaltungen mit dem Arduino Micro
if (recData == '6') analogWrite(LED, 32); gut geeignet sind.
if (recData == '7') analogWrite(LED, 64);
if (recData == '8') analogWrite(LED, 128);
if (recData == '9') analogWrite(LED, 255);
}
delay(100);
}
Weitere Infos:
Nachdem das Programm geladen ist, knnen Werte
Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV,
zwischen 0 und 9 zum Arduino gesendet werden.
2011, Best.-Nr. J6-10 20 44, 99,
Eine an Pin 3 angeschlossene externe LED kann
so in ihrer Helligkeit gesteuert werden. Der Einsatz G. Spanner: Arduino Schaltungsprojekte fr Pros,
einer externen LED an Pin 3 ist erforderlich, da die Elektor-Verlag 2012, Best.-Nr. J6-10 94 45, 39,80
interne LED 13 nicht ber den analogWrite angesteu- Lernpaket AVR-Mikrocontroller in C programmieren,
ert werden kann. Diese Mglichkeit bieten nur die Franzis-Verlag 2012, Best.-Nr. J6-09 73 52, 39,95
mit einer Tilde (~) gekennzeichneten sogenannten
PWM-Ausgnge. PWM steht dabei fr Pulsweitenmo-
dulation.
Weitere Details zu diesem Thema werden in einem
Preisstellung Oktober 2014 aktuelle Preise im Web-Shop
spteren Artikel zu dieser Serie behandelt.
Betrachtet man das Programm genauer, so fllt
auf, dass die Werte im analogWrite-Befehl nicht Empfohlene Produkte/Bauteile: Best.-Nr. Preis
linear vom bertragenen Datenwert abhngen, son- Arduino Micro J6-10 97 74 24,95
dern exponentiell. Dies hngt damit zusammen, dass Arduino-Uno-Platine R3 J6-10 29 70 27,95
das menschliche Auge ein logarithmischer Empfn-
Mikrocontroller-Onlinekurs J6-10 20 44 99,
ger ist.
Wrde man die Helligkeit der LED linear ndern, NEU: Lernpaket Arduino Projects J6-11 51 22 79,95
so wrden Helligkeitsstufen bei geringer Helligkeit
der LED zunchst sehr gro erscheinen. Bei greren
Helligkeitswerten dagegen knnte das Auge kaum Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
mehr Unterschiede wahrnehmen. und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_Teil_7.indd 36 29.10.14 11:15


16 So funktionierts

Arduino verstehen
und anwenden
Teil 8: Arduino im Heimnetzwerk

www.elvjournal.de

Arduino_Teil_8.indd 16 15.12.14 14:49


So funktionierts 17

Der achte Teil der Artikelserie Arduino verstehen


und anwenden hat die Integration des Arduino in
ein Heimnetzwerk zum Thema. Prinzipiell besteht
ein solches Heimnetzwerk heute praktisch immer
aus einem LAN (fr Local Area Network).

Da der klassische Arduino nicht ber einen LAN-


Anschluss verfgt, kann er nicht direkt mit einem
Heimnetzwerk verbunden werden. Um dennoch die
Vorteile eines lokal vernetzten Arduino nutzen zu
knnen, gibt es mehrere Mglichkeiten. Besitzt man
bereits einen Arduino, beispielsweise vom Typ UNO
oder Leonardo, so kann man auf diese Platinen ein
Ethernet-Shield aufstecken.
Falls noch kein Arduino vorhanden ist, bietet sich Bild 1: Arduino-Ethernet
alternativ auch der Einsatz eines Arduino-Ethernet
an. Diese Boardversion verfgt bereits ber einen Hndler oder einfach um das Nachschlagen eines Be-
fest integrierten LAN-Anschluss (Bild 1). griffes in Wikipedia geht, das Internet ist fr die
Sowohl von der Hard- als auch von der Soft- meisten Menschen zu einem integralen Bestandteil
wareseite her verhalten sich die Lsungen praktisch ihres beruichen und privaten Lebens geworden.
identisch. Sketche, die auf einem Arduino-Ethernet Letztendlich besteht das World Wide Web aus ei-
laufen, funktionieren auch auf einem Arduino UNO ner Vielzahl von Rechnersystemen, die global mit-
mit aufgestecktem Ethernet-Shield. einander in Verbindung stehen. Prinzipiell entsteht
Falls der Arduino-Ethernet zum Einsatz kommt, ist aber schon durch den Zusammenschluss von zwei
zu beachten, dass dieser nicht ber eine USB-Pro- Computern ber ein geeignetes Kabel ein einfaches
grammierschnittstelle verfgt. Fr die bertragung Netzwerk. Werden immer mehr Rechner miteinander
der Programme ist also zustzlich noch ein externer verbunden, entstehen immer komplexere Strukturen,
USB-RS232-Wandler erforderlich. Auch die Versor- die ber verschiedene Netzwerkkomponenten wie
gungsspannung muss beim Arduino-Ethernet immer Hubs, Router und Switches miteinander verbunden
extern zugefhrt werden. Dies ist aber keine wirkli- werden knnen.
che Einschrnkung, da diese Arduino-Version ohne- Bei diesen Netzwerkkomponenten handelt es sich
hin meist als Stand-alone-Server eingesetzt wird. im Prinzip um Verteiler bzw. Netzwerkweichen, wel-
Um dem Anwender die Einbindung des Arduino zu che die Daten auf intelligente Weise an alle Netz-
erleichtern, werden in diesem Beitrag die folgenden teilnehmer versenden. Die einzelnen Rechnersysteme
Themen behandelt: mssen dabei ber Netzwerkkarten verfgen. Diese
Was ist ein Netzwerk? Karten werden wiederum ber geeignete Kabel mit
Wie kann man den Arduino in ein Netzwerk ein- den Switches oder Routern verbunden.
binden? In Bild 2 ist ein sogenannter RJ45-Stecker darge-
Was ist ein Webserver? stellt. Dieser Steckertyp ndet sich heutzutage an
jedem gngigen Netzwerkkabel.
Netzwerktechnik
Das World Wide Web, hug auch kurz als Internet
bezeichnet, ist ein weltumspannendes Netzwerk. Es
wird heutzutage von den meisten Menschen der zivi-
lisierten Welt mehrmals tglich genutzt. Egal ob es
um die Buchung der nchsten Urlaubsreise, um die
Bestellung neuer Waren bei einem der groen Online- Bild 2: RJ45-Stecker

ELVjournal 1/2015

Arduino_Teil_8.indd 17 15.12.14 14:49


18 So funktionierts

Der Arduino-Ethernet bzw. das Ethernet-Shield ver-


fgen ber eine dazu passende Buchse (Bild 3). Damit
kann ber ein sogenanntes Patch-Kabel eine Verbin-
dung mit einem Heimnetzwerk hergestellt werden. Soll
der Arduino mit einem Router verbunden werden, so
ist ein normales Patch-Kabel zu verwenden. Steht kein
Router zur Verfgung, kann der Arduino auch direkt
an die Ethernet-Buchse eines Rechners angeschlos-
sen werden. Hierfr ist dann aber ein sogenanntes
Cross-over-Kabel erforderlich. In einem solchen Kabel
sind die Empfangs- bzw. Sendeleitungen ber Kreuz
verbunden. Solche Kabel sind meist farblich entspre-
chend gekennzeichnet (hug rot oder neongelb).

LAN, Ethernet und TCP/IP


Seit Anfang der 1990er Jahre ist der Begriff Ether-
net die Standardbezeichnung fr eine ganze Familie
von kabelgebundenen LAN-Technologien (Local Area
Network). Die elektrische Verbindung der einzelnen
Rechner und Netzwerkkomponenten erfolgt dabei
ber sogenannte Twisted-Pair-Kabel. Diese Kabel Bild 3: RJ45-Buchse am Arduino-Ethernet
enthalten verdrillte Adernpaare, ber die die Daten
gegenphasig bertragen werden. Diese Technik er-
laubt eine besonders strunempndliche Signalber- Beim IP-Protokoll wird jeder Netzwerkkomponente eine eindeutige
tragung, da Streinstrahlungen gleichphasig erfol- Adresse zugeordnet. Diese Adresse kann mit den Postleitzahlen, Stra-
gen und so das gegenphasige Signal praktisch nicht ennamen und Hausnummern eines Landes verglichen werden. hnlich
beeinussen. Zudem sind Kabel des Standards CAT.5 wie die Postadresse die Zustellung von Briefen ermglicht, erlaubt die
oder besser mehrfach abgeschirmt, was die Qualitt IP-Adresse also die efziente Zustellung von Daten.
der bertragung weiter verbessert.
Wie bereits im Beitrag Schnittstellenpraxis IP-Adressen, Netzwerkmasken, Gateways
(ELVjournal 6/2014) erlutert wurde, bentigt jede und MAC-Adresse
Datenbertragung ein bestimmtes Protokoll. Das Damit ein postalischer Zustelldienst in der Lage ist, Pakete immer an
Standardprotokoll im Ethernet wird als TCP (Trans- die korrekte Adresse zu liefern, darf landesweit keine Adresse doppelt
fer Control Protocol) bezeichnet. Dieses Protokoll vorhanden sein. Ebenso muss die IP-Adresse eines Netzwerkteilnehmers
erlaubt die bertragung von Daten ber lokale oder innerhalb eines Netzwerks absolut eindeutig sein. Die IP-Adresse muss
auch globale Netzwerke und sorgt fr eine nahezu also jedem in einem Netz bendlichen Gert zugewiesen werden und
fehlerfreie Datenkommunikation. stellt dann sicher, dass das zugehrige Gert adressierbar bzw. erreich-
Die hohe bertragungsqualitt wird ber beson- bar ist.
dere Verfahren garantiert. So werden durch verschie- Die IP-Adressen der IPv4-Notation setzen sich aus 4 Byte zu je 8 Bit,
dene Fehlererkennungs- und Korrekturverfahren Da- insgesamt also 32 Bit, zusammen. Damit stehen theoretisch
tenverluste vermieden. Wird beispielsweise ber ein 232 = 4.294.967.296
Kontrollbit ein drohender Datenverlust erkannt, dann Adressen zur Verfgung. Das ist zwar eine vergleichsweise groe An-
knnen die betroffenen Datenpakete korrigiert wer- zahl, dennoch werden verfgbare Internetadressen mittlerweile so
den. Ist eine Korrektur nicht mehr mglich, so wer- knapp, dass das System auf IPv6 erweitert werden muss.
den die Daten erneut angefordert und bertragen. Im Heimnetz wird aber vorlug weiterhin mit 4 Byte langen Adres-
Der zweite Teil des Protokolls trgt die Bezeich- sen gearbeitet. Daher weist der Router im Netz jedem angeschlossenen
nung IP (fr Internet Protocol). In diesem Proto- netzwerkfhigen Gert eine Adresse der Form
kollteil erfolgt die Adressierung der zu bertragen- xxx.xxx.xxx.xxx
den Datenpakete, die vom Sender zu einem ganz also z. B. die IP-Adresse 172.142.154.126 zu.
bestimmten Empfnger geleitet werden sollen. Bei
einer einfachen Zweipunktbertragung wie der be-
reits in einem frheren Artikel vorgestellten RS232- Hinweis:
Schnittstelle ist dieser Teil nicht erforderlich, da die Aus Datenschutzgrnden wurden die IP-Adressen in diesem Artikel
Daten hier nur von einem Sender an genau einen teilweise verndert oder ausgeblendet. In realen Anwendungen
Empfnger bermittelt werden. mssen natrlich wieder gltige IP-Adressen eingesetzt werden.
In einem echten Netzwerk sind aber stets mehre-
re Sender und Empfnger vorhanden. Damit wird ein
Verfahren notwendig, das es gestattet, die zu ber- Eine derartige IP-Adresse besteht aus einem sogenannten Netzwerk-
tragenden Datenpakete immer an genau den richti- anteil und einem Host-Anteil. ber die Netzwerkmaske wird festge-
gen Empfnger zu senden. Das IP-Protokoll ist exakt legt, welche Adressen direkt angesprochen werden knnen und welche
fr diese Aufgabe zustndig. Es hat die Aufgabe, fr Adressbereiche sich in anderen Netzwerken benden.
eine korrekte Adressierung der zu bertragenden Da- Fr die Einbindung des Arduino ist es in den meisten Fllen ausrei-
tenpakete zu sorgen. chend, wenn man eine Adresse whlt, die in den ersten drei Bytes mit

www.elvjournal.de

Arduino_Teil_8.indd 18 15.12.14 14:49


So funktionierts 19

Bild 4: Netzwerkbersicht eines typischen Heimnetzes

bereits vorhandenen Netzadressen bereinstimmt. Leitung mit dem Internet verbunden ist, wird er auch
Wichtig ist aber, dass sich dann das vierte Byte von als Gateway bezeichnet. Dem Gateway ist ebenfalls
allen bereits vergebenen Adressen unterscheidet. eine spezielle IP-Adresse zugeordnet, und Datenpa-
Hierzu kann man sich alle im Heimnetz vorhande- kete, die an diese Adresse gesendet werden, leitet
nen Adressen anzeigen lassen. Details dazu nden der Gateway ber den Provider an das allgemeine In-
sich in der Betriebsanweisung zum verwendeten Rou- ternet weiter. Auf diese Art und Weise kann man mit
ter. Bild 4 zeigt einen typischen Fall. dem lokalen Rechner zuhause im gesamten globalen
Schlielich gibt es noch die sogenannte MAC- Internet surfen.
Adresse (fr Media Access Control). Hierbei handelt Gibt man in der Kommandozeile des Heim-PCs den
es sich um eine weltweit eindeutige Adresse, die je- Befehl ipcong ein, kann man die Gateway-Adresse in
dem netzwerkfhigen Gert zugewiesen werden muss. Erfahrung bringen. Bild 5 zeigt die zugehrige Aus-
Sie besteht aus 6 Byte, wobei die ersten drei 3 Byte gabe.
einen herstellerspezischen Iden-
tizierungs-Code darstellen. Die
verbleibenden Bytes werden indi-
viduell vom Hersteller vergeben.
Eine typische MAC-Adresse sieht
also so aus:
1A-6C-22-67-B3-2C
Die MAC-Adresse wird immer ben-
tigt, wenn Netzwerkkomponenten
explizit adressiert werden sollen,
um Dienste auf hheren Schichten
anzubieten. Da dies auch auf ei-
nen netzwerkfhigen Arduino zu-
trifft, muss diesem also auch eine
MAC-Adresse zugeordnet sein.
Wenn der Router eines Heim-
netzwerks auch ber eine DSL- Bild 5: ipcong-Ausgabe

ELVjournal 1/2015

Arduino_Teil_8.indd 19 15.12.14 14:49


20 So funktionierts

Der Arduino als Webserver


In einem Netzwerk kann man sogenannte Server (engl. fr Anbieter) und Clients
(Kunden) unterscheiden. Bei einem Server handelt es sich um einen Rechner, der auf die
Kontaktanfrage eines Clients reagiert und Informationen liefert.

Der folgende Sketch verwandelt den Arduino-Ethernet in einen Webserver.

// Arduino simple web server

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


IPAddress ip(172,,,);
EthernetServer server(80);

void setup()
{ Serial.begin(9600);
Ethernet.begin(mac, ip); // start Ethernet connection
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop()
{ EthernetClient client = server.available();
if (client)
{ Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected())
{ if (client.available())
{ char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank)
{ client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
// close connection after completion of response
client.println("Connection: close");
// refresh page automatically every 3 secs
client.println("Refresh: 3");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");

// output the value of each analog input pin


for (int analogChannel=0; analogChannel<2; analogChannel++)
{ int sensorReading = analogRead(analogChannel);
client.print("analog sensor #");
client.print(analogChannel); client.print(" = ");
client.print(sensorReading); client.println("<br />");
}
client.println("</html>"); break;
}
if (c == '\n')
{ currentLineIsBlank = true; // start a new line
}
else if (c != '\r')
{ currentLineIsBlank = false; // character on the current line
}
}
}
delay(1);
client.stop(); Serial.println("client disonnected");
}
}

www.elvjournal.de

Arduino_Teil_8.indd 20 15.12.14 14:49


So funktionierts 21

Bild 7: Ausgabe im seriellen Monitor mit zugewiesener IP-Adresse

Bild 6: Aufbau eines Webservers zur bermittlung von Analogwerten

Dieses Programm gestattet es, zwei Analogkanle


ber das Ethernet an einen Web-Client zu bertra-
gen. Damit denierte Werte an den Analogkanlen
anliegen, ist die Hardware-Schaltung in Bild 6 ntz-
lich. ber die beiden Potentiometer lassen sich feste
Spannungswerte einstellen. Je nach Potentiometer-
stellung liefern die A/D-Wandler Werte zwischen 0
und 1024. Diese Werte knnen in einem beliebigen
Webbrowser ausgelesen werden.
Will man auf den Arduino-Webserver zugreifen,
muss man die im Sketch angegebene IP-Adresse in
die Adresszeile des Browsers eingeben. Diese Adres-
se wird auch im seriellen Monitor der Arduino-IDE
angezeigt. Falls die Adresse fr einen bestimmten
Arduino-Server also einmal nicht mehr bekannt sein
sollte, kann man sie dort wieder in Erfahrung brin-
gen (Bild 7). Die Darstellung der Messwerte kann in
jedem gngigen Browser erfolgen.
Bild 8 zeigt beispielhaft, wie die Werte in Google
Chrome und im Internet Explorer dargestellt werden.
Dass der Arduino nicht nur numerische Werte in
das Netzwerk senden kann, zeigt das folgende Pro-
grammbeispiel. Hier werden die Analogmesswerte als
Balkengrak dargestellt. Dies erlaubt eine bersicht-
liche Darstellung, auch wenn mehrere Werte, wie bei-
spielsweise die Temperaturen in verschiedenen Ru-
men, simultan angezeigt werden sollen. Bild 8: Die ermittelten Messwerte in zwei Browsern (Google Chrome und Internet Explorer)

ELVjournal 1/2015

Arduino_Teil_8.indd 21 15.12.14 14:49


22 So funktionierts

// graphical WebServer for analog inputs

#include <SPI.h>
#include <Ethernet.h>

byte MACAddress[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};


byte IPAddress[] = {172, , , };
EthernetServer myServer(80);

void setup()
{ Ethernet.begin(MACAddress, IPAddress);
myServer.begin();
}

void loop()
{ EthernetClient client = myServer.available();
if(client)
{ client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>\n<head><title>Arduino Web-Server</title></head>\n<body>");

client.print("Kanal 0: "); client.print(analogRead(0)/10.23); client.print(" %");


FOLHQWSULQW GLYVW\OH ?KHLJKWS[EDFNJURXQGFRORU FOLHQWSULQW  
client.print("; width:"); client.print(analogRead(0)); client.println("px; \"></div>");

client.print("Kanal 1: "); client.print(analogRead(1)/10.23); client.print(" %");


FOLHQWSULQW GLYVW\OH ?KHLJKWS[EDFNJURXQGFRORU FOLHQWSULQW  
client.print("; width:"); client.print(analogRead(1)); client.println("px; \"></div>");

client.println("</body>\n</html>");
}
delay(1);
client.stop();
}

Natrlich ist es auch mglich, wesentlich ausge- Im nchsten Teil der Artikelserie geht es noch einen Schritt weiter.
feiltere grasche Oberchen zu erarbeiten, der Fan- Durch Verwendung der WLAN-Technologie kann dann sogar auf das Ether-
tasie sind hier keine Grenzen gesetzt. net-Kabel verzichtet werden. Wird der Arduino zustzlich noch mit ei-
Bild 9 zeigt, wie die Messwerte in einem Browser nem leistungsfhigen Akku-Pack ausgestattet, kann er an nahezu jedem
dargestellt werden. Ort, unabhngig von Strom oder Datenkabeln, eingesetzt werden.

Ausblick
In diesem Artikel wurde gezeigt, wie man den Ardui-
no in ein Heimnetzwerk einbinden kann. Der bertra-
gung von Messwerten aus beliebigen Sensoren (siehe Weitere Infos:
Teil 6 dieser Reihe in ELVjournal 5/2014) in das hei-
mische Intranet steht so nichts mehr im Wege. Die- Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV,
ses kann so als Basis fr eine Heimautomatisierung 2011, Best.-Nr. J7-10 20 44, 99,
dienen. Spezielle zustzliche Leitungen oder Bus- G. Spanner: Arduino Schaltungsprojekte fr Pros,
systeme sind nicht erforderlich. Das ohnehin meist Elektor-Verlag 2012, Best.-Nr. J7-10 94 45, 39,80
vorhandene lokale Ethernet kann so auf das aktuell Buch AVR-Mikrocontroller in C programmieren,
vieldiskutierte IoT, also das Internet of Things er- Franzis-Verlag 2012, Best.-Nr. J7-09 73 52, 39,95
weitert werden.

Preisstellung Dezember 2014 aktuelle Preise im Web-Shop

Empfohlene Produkte/Bauteile: Best.-Nr. Preis


Arduino-Ethernet J7-10 69 17 49,95
Ethernet-Shield J7-10 97 73 39,95

Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher


Bild 9: Grasche Anzeige der Kanle in einem Browser und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_Teil_8.indd 22 15.12.14 14:49


48 So funktionierts

Arduino verstehen
und anwenden
Teil 9: WLAN und Micro-Server-Technik

www.elvjournal.de

Arduino_Teil_9.indd 48 26.02.15 14:54


So funktionierts 49

Nachdem im letzen Beitrag zu dieser Artikel- Eine solche Einheit kann berall in Haus, Keller oder
serie der Anschluss des Arduino an das lokale, Garten positioniert werden. Je nach Reichweite des
drahtgebundene Heimnetzwerk im Vordergrund WLAN kann so ein Bereich von bis zu 30 m oder mehr
stand, geht es nun noch einen Schritt weiter. rund um den aktiven WLAN-Router abgedeckt werden.
Auf die Kabelverbindung wird verzichtet und der Von den vielen Mglichkeiten, die ein Arduino mit
Arduino wird drahtlos in ein WLAN (Wireless Local WLAN-Anschluss bietet, wird sich dieser Artikel auf
Area Network) eingebunden. die folgenden Themen konzentrieren:

Natrlich muss dazu der eingesetzte Router ber eine 1. Inbetriebnahme eines Wi-Fi-Shields
geeignete WLAN-Funktion (LAN 802.11b/g-Standard) 2. Funktionen und Anwendungen der Wi-Fi-Bibliothek
verfgen. Diese ist aber mittlerweile bei allen aktu- 3. Der Arduino im WLAN
ellen und gngigen Routern vorhanden. 4. Drahtlose bertragung von Sensordaten
Durch die Unabhngigkeit von einem LAN-Kabel
erhlt der Arduino eine bislang ungekannte Freiheit. Oft fhrt der Begriff Wi-Fi, der auch bei drahtlosen
Anstelle eines Netzwerkanschlusses ist nun nur noch Arduino-Anwendungen hug auftaucht (z. B. Wi-Fi-
eine Steckdose fr die Spannungsversorgung erfor- Bibliothek), zu Verwirrungen und Missverstndnis-
derlich. Dies erweitert die Positionierungsmglich- sen. Wi-Fi ist ein Kunstwort, das oftmals als Abkr-
keiten in einem klassischen Haushalt ganz erheblich, zung fr Wireless Fidelity aufgefasst wird. Hier
da hier blicherweise in jedem Raum mehrere Steck- kommt die Anlehnung an den Hi-Fi-Begriff der Au-
dosen zu nden sind. Ein Netzwerkanschluss ist da- diotechnik zum Ausdruck. Mit einem Wi-Fi-Netzwerk
gegen, wenn berhaupt, hug nur einmal in einem soll so ein Funkstandard fr hchste Ansprche asso-
Zimmer vorhanden. ziiert werden. Meist wird Wi-Fi aber einfach als Syno-
Die nahezu grenzenlose Freiheit erhlt man, wenn nym fr WLAN benutzt, obwohl genau genommen der
der Arduino mit Batterien oder Akkus versorgt wird. Begriff WLAN das Funknetzwerk, Wi-Fi dagegen den
Funkstandard bezeichnet.

Das Arduino Wi-Fi Shield


Im Gegensatz zum Ethernet-Anschluss hat man beim
WLAN nicht die Auswahl zwischen einem Arduino
mit integriertem WLAN-Interface und einem WLAN-
Shield. Will man einen Arduino in ein drahtloses
Netzwerk integrieren, wird immer ein klassischer
Arduino und ein zustzliches WLAN-Shield bentigt.
Bild 1 zeigt die fertig montierte Kombination.
Zustzlich wurde hier noch ein kleines Proto-Board
eingesetzt, welches einen Temperatursensor trgt.
Beim Aufstecken des Shields auf das Arduino-Board
ist zu beachten, dass nicht nur die Pins der oberen
und unteren Stiftleiste verbunden werden mssen,
sondern zustzlich auch noch die sechs Anschlsse
der ICSP-Schnittstelle.
Diese Kombination bietet die folgenden Leis-
tungsmerkmale:
Betriebsspannung: 5 V (Versorgung des Wi-Fi-
Shields erfolgt ber den Arduino)
WLAN-Protokoll: 802.11b/g
Bild 1: Arduino mit aufgestecktem Wi-Fi-Shield und Proto-Board Verschlsselung: WEP und WPA2

ELVjournal 2/2015

Arduino_Teil_9.indd 49 26.02.15 14:54


50 So funktionierts

Die Wi-Fi-Library
Wie im Arduino-Umfeld blich, wird auch zum Wi-Fi-
Shield eine umfangreiche Bibliothek mit mehreren
Beispielen zur Verfgung gestellt. Die Bibliothek ge-
hrt bei den aktuellen IDE-Versionen bereits mit zur
Standardausstattung.
Bild 2 zeigt, wie die Wi-Fi-Biliothek aufgerufen
wird. Eine sehr interessante und durchaus auch ntz-
liche Anwendung aus der Standard-Beispielsammlung
ist der Sketch ScanNetworks. Wie blich kann der
Sketch ber die Menauswahl geladen werden (siehe
Bild 2).
Nach dem Start des Sketches und des seriellen Mo-
nitors wird eine bersicht ber alle lokal verfgbaren
Drahtlosnetze angezeigt. Neben dem Funktionstest
des Shields kann man mit dieser Anwendung auch
die Signalstrken in der Umgebung des WLAN-Rou-
ters ausmessen. Mit einem etwas lngeren USB-Kabel
oder mit einem Laptop knnen so die gnstigsten Po-
sitionierungen fr WLAN-Elemente bestimmt werden.
Wie entsprechende Messungen zeigen, liegt die
Empndlichkeit und Reichweite des Arduino-Wi-Fi-
Shields im mittleren Bereich. Mit einem modernen,
Bild 2: Das Men zur Wi-Fi-Library mit integriertem WLAN ausgersteten Laptop erhlt
man deutlich bessere Reichweiten. Dies ist insbeson-
dere dadurch begrndet, dass in derartigen Laptops
grochige Empfangsantennen integriert sind.
Zustzlich verfgt das Wi-Fi-Shield genau wie die Ethernet-Versionen Smartphones dagegen sind von der WLAN-Emp-
des Arduino ber einen Onboard-microSD-Karten-Slot. Eine separate fangsleistung oftmals nicht deutlich besser als
Mini-USB-Buchse erlaubt die Aktualisierung der Firmware auf der Wi- das WLAN-Shield. Kleine und preisgnstige Mini-
Fi-Karte. WLAN-USB-Adapter erreichen dagegen sogar oftmals
Das Wi-Fi-Shield enthlt einen eigenen ATmega-32UC3-Chip. Dieser nicht die Reichweite des Shields. Dies ergibt sich
beinhaltet einen IP-Stack, welcher sowohl TCP als auch UDP untersttzt. natrlich auch aus der Tatsache, dass in die kleine
(Nhere Details zu den Netzwerkprotokollen wurden bereits im letzten Bauform der Sticks keine effektiven Antennen integ-
Artikel dargelegt.) riert werden knnen.
Die Anschlsse des Arduino sind ber die Buchsenleisten des Wi-Fi- Bild 3 zeigt die Ausgabe von Signalfeldstrken im
Shields durchgefhrt, so dass die meisten Pins fr eigene Anwendungen seriellen Monitor der Arduino-IDE. Wie ebenfalls zu
weiterhin zur Verfgung stehen. Im Bedarfsfall knnen auch weitere erkennen ist, werden alle am Standort verfgbaren
Shields auf das Wi-Fi-Board aufgesteckt werden. WLAN-Netze angezeigt. So eignet sich der Arduino
Auf den im Wi-Fi-Shield integrierten microSD-Karten-Steckplatz kann mit Wi-Fi-Shield also auch fr den Einsatz als Netz-
ber die normale SD-Bibliothek zugegriffen werden. Auf diese Weise ist werkscanner.
es mglich, auch umfangreichere Webseiten zu erstellen und auf einer
entsprechend groen SD-Karte abzulegen.
Da der Arduino sowohl mit dem Prozessor des Wi-Fi-Shields als auch Hinweis:
mit der integrierten SD-Karte ber den SPI-Bus kommuniziert, muss Wie bereits im Beitrag zur LAN-Einbindung des
auch der ICSP-Stecker elektrisch mit dem Shield verbunden werden. Arduino wurden auch hier wieder MAC- und Ether-
ber den I/O-Pin Nummer 10 wird der Chip-Select des Wi-Fi-Controllers net-Adressen sowie Passwrter etc. aus Daten-
HDG104, ber Pin 4 der Select fr die SD-Karte gesteuert. Diese beiden schutzgrnden ausgeblendet.
Pins stehen also nicht mehr fr externe Aufgaben zur Verfgung.
Der Digitalpin 7 wird fr das Handshake zwischen dem Wi-Fi-Shield
und dem Arduino eingesetzt und sollte daher ebenfalls nicht fr andere Die Signalstrke wird hier in dBm angegeben. Diese
Aufgaben verwendet werden. Einheit steht fr Dezibel Milliwatt und bezeichnet
Neben dem Zugriff auf offene und unverschlsselte drahtlose Netz- den Leistungspegel in Dezibel, bezogen auf 1 mW
werke ermglicht das Wi-Fi-Shield auch die Einbindung in WLANs mit Leistung. Zwischen der Leistung (P) in Milliwatt (mW)
WPA2- oder WEP-Verschlsselung. und dem dBm-Wert besteht folgender Zusammen-
Fr die Anzeige der Betriebszustnde verfgt das Wi-Fi-Shield ber hang:
4 Status-LEDs:
L9 (gelb): Diese LED ist mit Digitalpin 9 verbunden P/dBm = 10*log(P/1 mW)
LINK (grn): Diese LED dient als Indikator fr die Netzwerkverbin-
dung Ein Milliwatt entspricht also 0 dBm. Grere Leis-
ERROR (rot): Die rote LED zeigt Kommunikationsfehler an tungswerte haben positive, kleinere negative dBm-
DATA (blau): Die blaue Data-LED blinkt, wenn Datenpakete gesendet Werte. Negativen dBm-Werten sind damit Leistungen
oder empfangen werden zugeordnet, die kleiner sind als 1 mW.

www.elvjournal.de

Arduino_Teil_9.indd 50 26.02.15 14:54


So funktionierts 51

So entsprechen:
100 W -10 dBm
10 W -20 dBm
1 W -30 dBm
0,1 W -40 dBm
0,01 W -50 dBm
1 nW -60 dBm

Die in Bild 3 angegebenen Leistungen liegen also


erwartungsgem deutlich unterhalb von einem Mil-
liwatt, sind aber fr einen brauchbaren WLAN-Emp-
fang durchaus noch ausreichend.
Hat man so einen Standort mit gutem WLAN-Emp-
fang gefunden, kann man den nchsten Schritt in
Angriff nehmen und den Arduino in das drahtlose
Netzwerk einbinden.

Der Arduino im WLAN


Fr den Aufbau einer aktiven WLAN-Verbindung kann
man den Arduino zunchst als Wi-Fi-Webserver kon-
gurieren. Ein entsprechender Sketch (WiFiWebServer.
ino) ndet sich in der Wi-Fi-Library. Bild 3: WLAN-Netzwerkscan mit dem Wi-Fi-Shield
Bevor dieser Sketch auf den Arduino geladen wird,
mssen noch einige Kongurationen ausgefhrt wer-
den.
Ein Heimnetzwerk sollte keinesfalls ohne Ver- kontrollieren. Zudem ist auch zu bedenken, dass, wie bereits erlutert,
schlsselung betrieben werden. Eine weit verbreitete die Empfangsleistung des Wi-Fi-Shields nicht ganz so optimal ist wie
Verschlsselungsmethode ist WPA2. Das Wi-Fi-Shield die eines Tablets oder eines Laptops mit integrierter WLAN-Einheit. Hier
ist in der Lage, ber diesen Standard zu kommunizie- kann es also hilfreich sein, weitere Tests in direkter Umgebung des
ren. Im Sketch mssen dafr zwei Angaben gemacht WLAN-Routers durchzufhren.
werden: War die Verbindungsaufnahme schlielich erfolgreich (grne LED
1. In char ssid[] = "yourNetwork"; muss die Netz- leuchtet permanent), kann man in der Arduino-IDE den seriellen Moni-
werk-SSID eingetragen werden. Angaben dazu n- tor ffnen (Bild 4).
den sich im Manual zum verwendeten Router. Hier wird nun die aktive Kommunikation mit dem Drahtlos-Netzwerk
2. Das Passwort wird dem Arduino unter nochmals besttigt. Auerdem wird die IP-Adresse angegeben, welche
char pass[] = "secretPassword"; ber das Netzwerk dem Arduino zugeordnet wurde. Das folgende Bild
bergeben. zeigt die Ausgabe (zur Wahrung des Datenschutzes wurden wieder eini-
ge Angaben ausgegraut).
Dann kann der entsprechende Sketch zum Arduino Die an den seriellen Monitor ausgegebene IP-Adresse kann man nun
bertragen werden. An dieser Stelle ist jedoch ein in einen Browser (z. B. Explorer, Chrome oder Firefox) eingeben und
wichtiger Hinweis angebracht: so Kontakt zum Arduino aufnehmen. Details dazu wurden bereits im
letzten Beitrag dieser Serie erlutert. An dieser Stelle macht es keinen
Unterschied, ob der Arduino ber LAN oder WLAN eingebunden ist.
Hinweis
Die WLAN-Shields arbeiten nicht mit allen IDE-Ver-
sionen. Die besten Ergebnisse wurden mit der
IDE-Version 1.0.2 erzielt. Insbesondere mit den
aktuellen Versionen 1.0.5 bzw. 1.0.6 scheint es mit
dem Wi-Fi-Shield Probleme zu geben. Dazu gibt es
Beitrge in verschiedenen Foren und auch eigene
Versuche haben dies besttigt.

Wurden die notwendigen Angaben zur SSID und zum


Passwort korrekt eingegeben, kann der Sketch, vor-
zugsweise mit der Arduino-IDE 1.0.2, auf den Arduino
bertragen werden.
Ist der Sketch erfolgreich geladen, versucht das Wi-
Fi-Shield Verbindung zum angegebenen WLAN-Router
aufzunehmen. Sobald die Verbindung steht, leuchtet
die grne LINK-LED. Falls der Versuch fehlschlgt,
wird die rote ERROR-LED aktiviert. In diesem Fall
sollte man die Angaben im Sketch nochmals genau Bild 4: Verbindung zum WLAN-Router ist aufgebaut.

ELVjournal 2/2015

Arduino_Teil_9.indd 51 26.02.15 14:54


52 So funktionierts

Wenn alles korrekt funktio- Akkuversorgung kommen entweder NiMH- oder Li-Ionen-Zellen in Frage. Die durchschnitt-
niert, sollte im Browser-Fenster liche Stromaufnahme des Arduino mit WLAN-Shield betrgt ca. 120 mA bei 8,4 V (z. B
folgende Ausgabe erscheinen: 2x Li-Ion- oder 7x NiMH-Zellen). Damit lassen sich problemlos Laufzeiten von mehreren
Stunden bis zu einigen Tagen erreichen. Ein Sketch fr den Betrieb des Enviro-Servers kann
dann so aussehen:
analog input 0 is 411
analog input 1 is 398
// web Server using WiFi with WPA encryption - temperature sensor using NTC
analog input 2 is 207
analog input 3 is 173 int ADC0=0, int ADC_value; // select and init ADC channel
analog input 4 is 297 RDWWHPSFDO RDWRVHW FDOLEUDWLRQGDWDIRU17&N
analog input 5 is 350
LQFOXGH63,K!
LQFOXGH:L)LK!
Die Werte der Analogeingnge
sind zufllig und ndern sich in FKDUVVLG>@ :/$1%R[[[[[QHWZRUN66,'
rascher Folge, da die offenen Ein- FKDUSDVV>@ [\] QHWZRUNSDVVZRUG
gnge lediglich elektromagneti- LQWNH\,QGH[  \RXUQHWZRUNNH\,QGH[QXPEHU
int status = WL_IDLE_STATUS;
sche Strungen einfangen (siehe
:L)L6HUYHUVHUYHU  
dazu auch Teil 6 der Artikelserie
Sensortechnik und Messwerter- YRLGVHWXS 
fassung im ELVjournal 5/2014). ^6HULDOEHJLQ  
LI :L)LVWDWXV  :/B12B6+,(/' 
Der Enviro-Server ^6HULDOSULQWOQ :L)LVKLHOGQRWSUHVHQW ZKLOH WUXH `
Will man auch sinnvollere Daten ZKLOH VWDWXV :/B&211(&7(' 
als elektromagnetische Strungen ^6HULDOSULQW $WWHPSWLQJWRFRQQHFWWR66,' 
empfangen, dann kann man den 6HULDOSULQWOQ VVLG 
Arduino mit WLAN-Shield zu ei- VWDWXV :L)LEHJLQ VVLGSDVV GHOD\  
nem Server fr Umweltmessdaten, `
VHUYHUEHJLQ SULQW:L6WDWXV 
einem sogenannten Environmen-
`
tal- oder kurz Enviro"-Server,
erweitern. Die Grundlagen hierfr YRLGORRS 
sind ebenfalls bereits aus dem Ar- ^:L)L&OLHQWFOLHQW VHUYHUDYDLODEOH 
tikel zu Sensortechnik und Mess- LI FOLHQW 
werterfassung bekannt. Will man ^6HULDOSULQWOQ QHZFOLHQW 
beispielsweise Umgebungs- oder ERROHDQFXUUHQW/LQH,V%ODQN WUXH
Raumtemperaturen messen und ZKLOH FOLHQWFRQQHFWHG 
via WLAN bertragen, kann man ^LI FOLHQWDYDLODEOH 
dazu einen NTC-Temperatursensor ^FKDUF FOLHQWUHDG 
einsetzen. Bild 5 zeigt eine Schal- 6HULDOZULWH F 
LI F 
?Q
 FXUUHQW/LQH,V%ODQN 
tung dazu.
 ^FOLHQWSULQWOQ +7732. FOLHQWSULQWOQ &RQWHQW7\SHWH[WKWPO 
Zustzlich kann man nun den
FOLHQWSULQWOQ &RQQQHFWLRQFORVH FOLHQWSULQWOQ 
Arduino mit einem Akku betreiben. FOLHQWSULQWOQ '2&7<3(+70/! FOLHQWSULQWOQ KWPO! 
Da der Arduino UNO bereits einen FOLHQWSULQWOQ PHWDKWWSHTXLY ?UHIUHVK?FRQWHQW ??! 
Spannungsregler an Board hat, $'&BYDOXH DQDORJ5HDG $'& 
kann man den Akku direkt an die FOLHQWSULQW 7HPSHUDWXUH#VHUYHUVLWH WHPS $'&BYDOXHRVHW FDO 
Hohlbuchse des Controllerboards                FOLHQWSULQW WHPS   FOLHQWSULQW  &  FOLHQWSULQWOQ EU ! 
anschlieen (Bild 6). Man erhlt FOLHQWSULQWOQ KWPO! 
so einen vollkommen autarken EUHDN
Micro-Server, da nunmehr weder  `
Daten noch Stromversorgungslei- LI F 
?Q
^FXUUHQW/LQH,V%ODQN WUXH`
HOVHLI F 
?U
^FXUUHQW/LQH,V%ODQN IDOVH `
tungen erforderlich sind. Fr die
`
`
GHOD\  FOLHQWVWRS 6HULDOSULQWOQ FOLHQWGLVFRQQHFWHG 
`
`
NT C 4k7
5 V
YRLGSULQW:L6WDWXV 
A0 ^6HULDOSULQW 66,' 6HULDOSULQWOQ :L)L66,' 
4k7 ,3$GGUHVVLS :L)LORFDO,3 6HULDOSULQW ,3$GGUHVV 6HULDOSULQWOQ LS 
G ND ORQJUVVL :L)L566, 
6HULDOSULQW VLJQDOVWUHQJWK 566,  6HULDOSULQW UVVL 6HULDOSULQWOQ G%P 
`
Bild 5: Schaltung fr einen NTC-Temperatur-
sensor am Wi-Fi-Shield

www.elvjournal.de

Arduino_Teil_9.indd 52 26.02.15 14:54


So funktionierts 53

WiFi-Shield

Arduino

Akku-Pack

Bild 6: Autonomer WLAN-Server mit Akku-Pack Bild 7: Anzeige der Temperatur in einem Browser

Nachdem der Sketch auf den Arduino bertragen wurde, kann der En- erlauben, nahezu verzgerungsfrei auf unvorhergese-
viro-Server ber einen beliebigen Browser aufgerufen werden, wie in hene Ereignisse zu reagieren. Typische Anwendungen
Bild 7 zu sehen. der Interrupt-Technologie reichen dabei von kom-
Natrlich ist es nun auch mglich, den Server beispielsweise ber fortablen manuellen Eingabemethoden bis hin zur
ein WLAN-fhiges Smartphone aufzurufen. Hierzu ist wieder lediglich Alarmauslsung in Gefahrensituationen.
ein beliebiger Webbrowser zu starten. Dann muss nur noch die korrek-
te IP-Adresse angegeben werden, und der Enviro-Server kann drahtlos
von jedem beliebigen Punkt innerhalb der WLAN-Reichweite ausgele-
sen werden. Bild 8 zeigt die entsprechende Darstellung auf einem And- Weitere Infos:
roid-Smartphone.

Ausblick G. Spanner: Arduino Schaltungsprojekte


Nach der Einbindung des Arduino in ein drahtgebundenes LAN im letzten fr Pros, Elektor-Verlag 2012,
Teil der Artikelserie wurde in diesem Beitrag die drahtlose WLAN-Tech- Best.-Nr. J8-10 94 45, 39,80
nologie genutzt, um einen autarken, Arduino-basierten Micro-Server Mikrocontroller-Onlinekurs, Franzis-Verlag,
abzufragen. exklusiv fr ELV, 2011,
Damit ist der Ausug in den Bereich der Netzwerktechnik zunchst Best.-Nr. J8-10 20 44, 99,
abgeschlossen. Der nchste Teil der Artikelserie wird sich um das Thema Grundlagen zur elektronischen Schaltungs-
Interrupts und Polling drehen. Hier kommen dann bereits recht fort- technik nden sich in der E-Book-Reihe
geschrittene Programmiertechniken zum Einsatz, die es beispielsweise Elektronik!
(www.amazon.de/dp/B00OXNCB02)
Buch AVR-Mikrocontroller in C
programmieren, Franzis-Verlag 2012,
Best.-Nr. J8-09 73 52, 39,95

Preisstellung Februar 2015 aktuelle Preise im Web-Shop

Empfohlene Produkte/
Bauteile: Best.-Nr. Preis
Arduino-Wi-Fi-Shield J8-11 02 51 89,95
Arduino UNO J8-10 29 70 27,95
Mikrocontroller Online-Kurs J8-10 20 44 99,

Alle Arduino-Produkte wie Mikrocontroller-Platinen,


Shields, Fachbcher und Zubehr nden Sie unter:
Bild 8: Ablesen der Server-Daten auf einem Mobilgert www.arduino.elv.de

ELVjournal 2/2015

Arduino_Teil_9.indd 53 26.02.15 14:54


42 So funktionierts

Arduino verstehen
und anwenden
Teil 10: Richtig auf unerwartete Ereignisse reagieren Interrupts und Polling

www.elvjournal.de

Arduino_Teil_10.indd 42 27.04.15 12:13


So funktionierts 43

Der zehnte Artikel der Beitragsreihe Arduino ver- gaben beschftigt ist, bleibt der Tastendruck ohne Wirkung. Natrlich
stehen und anwenden dreht sich um den Bereich kann ein solches Verschlucken von Eingabewerten in der Praxis nicht
Interrupts und Polling. Dabei stehen die folgenden toleriert werden.
Themen im Vordergrund: Auf rein softwaretechnischem Weg ist das Problem nicht zu beheben.
Was ist ein Interrupt und wozu wird er bentigt? Hier ist eine zustzliche controllerinterne Hardware-Schaltung erforder-
Was ist der Unterschied zwischen Interrupts und lich, die kontinuierlich und ohne Unterbrechung einen Schaltpegel an
Polling einem bestimmten Pin berwachen kann.
Welche Interruptquellen stehen auf einem Mikro- Da dieses Problem sehr hug auftritt, wurde dafr eine spezielle
controller zur Verfgung Lsung implementiert, die sogenannte Interruptsteuerung. Interrupts
unterbrechen unmittelbar das Hauptprogramm und springen in eine so-
Wie in dieser Serie blich, wird wieder besonderer genannte Interruptroutine. Erst nach dem Abarbeiten dieser speziellen
Wert auf praktische Anwendungen gelegt. Dazu wer- Befehlsfolge erfolgt wieder ein Rcksprung in das Hauptprogramm.
den die folgenden Praxisbungen durchgefhrt: Damit kann z. B. ein Tastendruck zu keinem Zeitpunkt mehr verloren
Tasterabfrage mit Polling gehen. Bild 1 veranschaulicht diesen Vorgang.
LED-Steuerung mit Interrupts
Wirkung verschiedener Interrupt-Modi
Multitasking: simultanes Blinken und Schalten
von LEDs
Blinken ohne Delay!

Wozu bentigt man Interrupts? Programm-


start
Gerade in der Mikrocontroller-Technik ist es oftmals
erforderlich, dass ein Programm auf unerwartete Er-
eignisse schnell und sicher reagiert. Ein klassisches
Beispiel ist die Auslsung von Alarmen beim Vorlie-
gen eines Fehlers. Hier ist eine schnelle und unver-
zgliche Reaktion erforderlich. Aber auch bei Einga-
Interrupts
ben ber Tastaturen will der Anwender nicht warten, aktivieren mit sei;
bis das laufende Programm zu irgendeinem Zeitpunkt
in die Tastenabfrage springt, sondern jede Eingabe
soll unverzglich bernommen werden.
Zudem liefern Sensoren oftmals unvorhersehbare
Werte. Soll z. B. beim berschreiten einer bestimm-
ten Temperatur ein Gert abgeschaltet werden, so Interrupt Abarbeiten der
muss der Mikrocontroller (C) unverzglich reagieren. Interrupt-Sequenz
Ist er gerade mit komplizierten Berechnungen aus- Hauptprogramm-
gelastet, kann das betroffene Gert bereits berlas- schleife
tet sein, bis der Controller einen bestimmten Eingang
abfragt und die vorprogrammierte Aktion startet. Rcksprung in
Prinzipiell knnte man einen Taster oder auch ei- das
nen Sensorwert in regelmigen Abstnden ber Hauptprogramm
digitalRead(pushButton);
abfragen. Dieses Abfragen eines Schaltzustandes in
regelmigen Abstnden wird als Polling (engl. fr
Abfragen) bezeichnet.
Wird der betreffende Taster allerdings gedrckt,
whrend das Anwendungsprogramm mit anderen Auf- Bild 1: Programmablauf mit Interruptaufruf

ELVjournal 3/2015

Arduino_Teil_10.indd 43 27.04.15 12:13


44 So funktionierts

Interruptquellen Das folgende Programm zeigt, wie eine LED ber ei-
Mikrocontroller besitzen meist mehrere Interruptquellen. Dadurch kann nen Interrupt gesteuert werden kann:
ein C auf verschiedene unvorhergesehene Ereignisse reagieren.
Einzelne Interrupts werden ber sogenannte Interruptvektoren an-
gesprochen. Diese Vektoren sorgen dafr, dass die Ausfhrung immer
an der korrekten Adresse startet. Deshalb muss man sich beim Program- // LED control via interrupt
mieren mit Processing nicht um spezielle Adressierungen kmmern. Es
ist vollkommen ausreichend, wenn man die richtigen Interruptvektoren int ledpin = 13;
volatile int state = LOW;
kennt. Die wichtigsten Interruptquellen sind:
Reset
void blink() // Change state of LED
Externer Interrupt 0 { state = !state;
Externer Interrupt 1 digitalWrite(ledpin, state);
Timer-/Counter-Ereignisse }
UART-Zeichen empfangen
Fr sogenannte externe Interrupts steht die Funktion void setup()
attachInterrupt(interrupt, function, mode) { pinMode(ledpin, OUTPUT);
zur Verfgung. attachInterrupt(0, blink, RISING);
Auf dem Arduino stehen zwei Pins fr Interruptzwecke bereit: }
1. Fr Interrupt0 der Digital Pin 2
2. Fr Interrupt1 der Digital Pin 3 void loop()
{
Die Parameter der Funktion attachInterrupt haben dabei die folgenden
}
Bedeutungen:
interrupt: Nummer des Interrupts (0 oder 1)
function: Diese Funktion wird aufgerufen, wenn der Interrupt ausge-
lst wurde, sie wird auch als Interrupt-Service-Routine (ISR)
bezeichnet Die LED 13 kann nun ber den Drucktaster ein- und
mode: Legt den Auslsemodus fest ausgeschaltet werden.
Das Programm weist eine Besonderheit auf:
Fr die Funktion mode sind 4 Varianten vordeniert: Die Hauptprogrammschleife ist vllig leer!
LOW: Auslsung, sobald der Interrupt-Pin auf LOW geht Dies demonstriert, dass die Interruptaufrufe ab-
CHANGE: Interrupt wird bei jedem Signalwechsel am Interrupt-Pin solut unabhngig von einem Hauptprogramm er-
ausgelst folgen knnen. Wenn die Interruptbehandlung mit
RISING: bergnge von LOW nach HIGH lsen den Interrupt aus attachInterrupt erst einmal initialisiert ist, werden
FALLING: bergnge von HIGH nach LOW lsen den Interrupt aus die Interrupt-Pins vllig unabhngig von anderen
Programmteilen berwacht.
Der Programmcode innerhalb einer ISR sollte keine greren Verzgerun- Den zugehrigen Aufbau zeigt Bild 2. Der 100-nF-
gen enthalten. Trifft nmlich ein neuer Interrupt ein, whrend der alte Kondensator parallel zum Taster reduziert das soge-
noch nicht abgeschlossen ist, so kann dieser nicht korrekt abgearbeitet nannte Tasterprellen. Wird der Kondensator ent-
werden. Zwar ist es prinzipiell mglich, mehrere Interruptebenen zuzu- fernt, dann kann es bei einem einzelnen Tastendruck
lassen, jedoch sollte diese Technik aufgrund ihrer Fehlertrchtigkeit nur zu mehreren Umschaltvorgngen kommen. Weitere
angewendet werden, wenn es keine anderen Mglichkeiten mehr gibt. Details zu diesem meist unerwnschten Effekt wer-
den in einem spteren Beitrag zu dieser Artikelserie
behandelt.
TIPP:
Interrupt-Service-Routinen sollten immer mglichst kurz und einfach Wirkung der verschiedenen
gehalten werden! Interrupt-Modi
Ersetzen Sie den Interrupt-Modus RISING nachein-
ander durch die anderen drei Betriebsarten:
LOW
CHANGE
FALLING
und beobachten Sie, wann genau die LED jeweils ge-
schaltet wird.

Der nchste Sketch demonstriert ein einfaches Mul-


titasking. Whrend im Hauptprogramm eine LED kon-
tinuierlich blinkt, kann eine weitere LED unabhngig
davon ein- und ausgeschaltet werden. Die zweite LED
muss dazu an Port 12 angeschlossen werden (ber
einen geeigneten Vorwiderstand).

Bild 2: Aufbau zur Interruptsteuerung

www.elvjournal.de

Arduino_Teil_10.indd 44 27.04.15 12:13


So funktionierts 45

// LED control via interrupt


// Blink without using delay-function
// Blink a LED and simultaneously switch
// another one
#include "TimerOne.h" // include timer lib
// Interrupt 0 on DigitalPin 2
int ledpin = 13;
double tc = 1000000;
int led1pin = 13;
// timeCounter = 1000000 s = 1 s
int led2pin = 12;
volatile int state = LOW;
volatile int state = LOW; // Status LED_1

void setup()
void switch_led1() // Change state of LED
{ pinMode(ledpin, OUTPUT);
{ state = !state;
Timer1.initialize(tc);
digitalWrite(led1pin, state);
Timer1.attachInterrupt(switch_led);
}
}

void setup()
void switch_led() // Change state of LED
{ pinMode(led1pin, OUTPUT);
{ state = !state;
pinMode(led2pin, OUTPUT);
digitalWrite(ledpin, state);
attachInterrupt(0, switch_led1, RISING);
}
}

void loop()
void loop()
{ // main loop empty!
{ digitalWrite(led2pin, HIGH); // LED on
}
delay(100);
GLJLWDO:ULWH OHGSLQ/2: /('R
delay(100);
}

Der Interrupt wird hier durch einen C-internen


Timer ausgelst. Durch den Befehl
Flchtige Variablen Timer1.attachInterrupt(switch_led);
Eventuell ist Ihnen in den beiden obenstehenden
Programmen der Zusatz volatile bei der Variablen- wird festgelegt, dass nach Ablauf des Timers die In-
deklaration bereits aufgefallen. Volatile bedeutet terruptroutine switch_led aufgerufen wird. Diese
vernderlich, chtig. Routine sorgt dann wie im vorhergehenden Beispiel
Nun sind Variablen naturgem vernderlich, was dafr, dass die LED ein- bzw. ausgeschaltet wird. Dies
ist also das Besondere an einer als volatile de- hat den groen Vorteil, dass der Controller auf diese
nierten Variablen? Weise nicht blockiert wird. Wird die delay()-Funk-
Wird eine Variable nur innerhalb einer Inter- tion verwendet, kann der Arduino in dieser Verz-
ruptroutine verndert, so ist diese Vernderung im gerungsphase keine anderen Aufgaben ausfhren. Er
Hauptprogramm nicht sichtbar. ist praktisch vollstndig mit Warten ausgelastet.
Je nach Compilereinstellung wre es bei der ber- In einem einfachen Blink-Programm spielt das keine
setzung des Quellcodes mglich, dass die Variable groe Rolle. Bei komplexeren Anwendungen mchte
durch eine Speicherplatz sparende Konstante ersetzt man den Controller aber selbstverstndlich nicht mit
wird. Im Normalfall wrde dies zu einem kompakte- Wartebefehlen auslasten.
ren und schnelleren Code fhren. Man erkennt, dass auch hier die Hauptschleife
Ist aber eine Interruptroutine vorhanden, so muss vollkommen leer ist. Diese Programmebene kann also
dies ausgeschlossen werden, damit das Programm weiterhin unabhngig genutzt werden.
korrekt arbeitet. Der Zusatz volatile bei einer Vari- In dieser Anwendung kommt auch bereits ein
ablendenition sorgt dafr, dass immer eine echte Counter zum Einsatz. Die Verwendung dieser ntzli-
Variable erzeugt wird, auch wenn diese scheinbar im chen controllerinternen Funktionseinheiten wird im
Hauptprogramm gar nicht verndert wird. nchsten Artikel dieser Reihe nher erlutert werden.
Das Schlsselwort volatile teilt dem Compiler Die fr diesen Sketch erforderliche Bibliothek
also mit, dass die damit deklarierte Variable durch TimerOne kann unter
Ereignisse auerhalb der Kontrolle des Hauptpro- http://code.google.com/p/arduino-timerone/
gramms verndert werden kann. downloads/list
kostenlos aus dem Internet geladen werden. Die
Praxisbung: Blinken ohne Delay! Details zur Installation von Bibliotheken wurden
In diesem Beispiel wird eine weitere Interruptquel- bereits im Arduino-Artikel Teil 5 Nutzung und Er-
le vorgestellt. Nicht nur externe Ereignisse, wie der stellung von Programmbibliotheken erlutert (ELV-
Pegelwechsel an einem Pin, knnen Interrupts aus- journal 4/2014).
lsen, sondern auch controllerinterne Auslsungen
sind mglich. Praxisprojekt: Fahrradrcklicht
Das folgende Beispiel zeigt, wie eine LED zum mit Interruptsteuerung
Blinken gebracht werden kann, ohne dass die De- Zum Abschluss soll hier noch das Modell eines Fahrrad-
lay-Funktion zum Einsatz kommt. rcklichts mit verschiedenen Betriebsmodi vorgestellt

ELVjournal 3/2015

Arduino_Teil_10.indd 45 27.04.15 12:13


46 So funktionierts

// Bike-Light with polling

byte ledPin[5] = {8, 9, 10, 11, 12}; // LEDs on pins 8 to 12


int switchPin = 2; // switch on pin 2
int checkSwitch, switchState=0; // variables for switch control
int mode = 0; // display mode

void setup()
{ for (int n=0; n<5; n++) { pinMode(ledPin[n], OUTPUT); }
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // activate internal pull-up
Bild 3: Fahrradrcklicht mit verschiedenen Betriebsmodi }

void loop()
werden. Moderne akkubetriebene Fahrradrcklichter { checkSwitch = digitalRead(switchPin); // check switch
if (checkSwitch != switchState) // switch status changed!
verfgen ber mehrere LEDs. Diese knnen meist
{ if (checkSwitch == LOW)
in verschiedene Betriebsmodi geschaltet werden.
{ mode++; if (mode > 3) mode=0;
Neben einem einfachen Dauerlicht sind auch un- }
terschiedliche Blink- und Lauichteffekte aktivier- }
bar. Bild 3 zeigt ein solches Rcklicht in Aktion. switchState = checkSwitch; // save switch status
Das Modell eines solchen Rcklichts eignet sich
bestens als Demonstrationsbeispiel fr den Einsatz switch (mode)
von Interrupttechniken. { case 0:
Bild 4 zeigt einen Aufbauvorschlag fr die Arduino- ^DOO/('VR
Hardware dazu. for (int n=0; n<5; n++) { digitalWrite(ledPin[n], LOW); }
Der Wert fr den eingezeichneten Kondensator } break;
kann zwischen 100 nF und ca. 10 F liegen. Der Kon-
case 1:
densator hat hier wieder die Aufgabe, das Tastenprel-
{ // all LEDs on
len zu reduzieren. Den optimalen Wert fr den Kon- for (int n=0; n<5; n++) { digitalWrite(ledPin[n], HIGH); }
densator bestimmt man am besten experimentell. So } break;
knnen bei bestimmten Tastern bereits mit Werten
im Nanofarad-Bereich gute Ergebnisse erzielt wer- case 2:
den, whrend stark prellende Taster Kondensatoren { // blink
von bis zu einigen Mikrofarad erfordern. for (int n=0; n<5; n++) { digitalWrite(ledPin[n], HIGH); }delay(100);
Das zugehrige Programm Bike-Light zeigt, wie for (int n=0; n<5; n++) { digitalWrite(ledPin[n], LOW); }delay(100);
ein passender Sketch dazu aussehen kann. Hierbei } break;
wurde zunchst auf den Einsatz von Interrupts ver-
case 3:
zichtet. Stattdessen wird am Anfang der Endlos-
{ // chaser
schleife void loop() der aktuelle Tasterstatus ber
for (int n=0; n<5; n++)
checkSwitch abgefragt (sogenanntes Polling). { digitalWrite(ledPin[n], HIGH); delay(100);
Stellt das Programm fest, dass der Taster gedrckt digitalWrite(ledPin[n], LOW);
ist, wird die Variable mode zyklisch in der Form }
0 -> 1 -> 2 -> 3 -> 0 } break;
weitergeschaltet. Entsprechend werden die Betriebs- }
modi: }
Alle LEDs aus
Alle LEDs an
Alle LEDs blinken
Lauichteffekt Abhilfe kann hier der Einsatz der Interruptfunktionalitt des Controllers
aktiviert. schaffen.
Soweit funktioniert das Fahrradrcklicht ganz zu- Der nchste Sketch zeigt, wie die Interrupttechnologie hier nutz-
friedenstellend. Allerdings stellt man bei genauerer bringend eingesetzt werden kann. ber die Programmzeile
Betrachtung fest, dass das Weiterschalten der Be- attachInterrupt(0, switch_update, RISING);
triebszustnde nicht ganz optimal abluft. Insbeson-
dere wenn der Modus Lauicht aktiv ist, kommt es wird hier wieder ein Interrupt aktiviert.
vor, dass ein Tastendruck verschluckt wird. Die Ur- Damit wird, immer wenn der Taster bettigt wird, ein Interrupt aus-
sache fr dieses Verhalten liegt darin, dass whrend gelst. In der Interruptroutine
des Ablaufs der Funktion Lauicht keine Tasterab- void switch_update() // Change mode
frage erfolgt. Erst wenn der Programmablauf wieder {
den Anfang der Hauptschleife erreicht hat, kann der mode++; if (mode > 3) mode=0;
Tastendruck erkannt werden. Ein solches Verhalten
ist in der Praxis natrlich nicht erwnscht. }

www.elvjournal.de

Arduino_Teil_10.indd 46 27.04.15 12:13


So funktionierts 47

wird unverzglich die Variable mode um eins erhht bzw. auf null
zurckgesetzt. Um das Tasterprellen zu reduzieren, wurden zustzlich
whrend des Routineablaufs neue Interrupts deaktiviert.
Zustzlich wurde in der Chaser-Schleife eine mode-Abfrage einge-
fgt. Nun reagiert das Programm wie gewnscht verzgerungsfrei auf
jeden Tastendruck. Das Verschlucken eines Tastendrucks ist jetzt aus-
geschlossen.
Falls dagegen gelegentlich ein Modus bersprungen wird, muss der
Kondensatorwert angepasst werden. Durch Verwendung der Interrupt-
technik und nach Optimierung des Entprellkondensators kann ein sehr
bedienerfreundliches Schaltverhalten erreicht werden.
Wie bereits weiter oben erwhnt, wird das Thema Entprellen und
sicheres Schalten in einem spteren Beitrag zu dieser Serie nochmals
eingehend diskutiert werden.

// Bike-Light with interrupt control

byte ledPin[5] = {8, 9, 10, 11, 12}; // LEDs on pins 8 to 12


int switchPin = 2; // switch on pin 2
volatile int mode = 1; // display mode

void switch_update() // Change mode


{ noInterrupts();
mode++; if (mode > 3) mode=0;
delay(100);
interrupts();
}
Bild 4: Arduino-basiertes Fahrradrcklicht mit verschiedenen
Betriebsmodi
void setup()
{ for (int n=0; n<5; n++) { pinMode(ledPin[n], OUTPUT); }
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // activate internal pull-up erhlt man einen przisen Timer, der den Aufbau von
attachInterrupt(0, switch_update, FALLING); hochgenauen Frequenzzhlern, Stoppuhren oder Di-
} gitalchronometern erlaubt.
Auch im nchsten Beitrag werden dazu, wie ge-
void loop() wohnt, neben den theoretischen Grundlagen wieder
{ while (mode == 1) // all LEDs on viele Praxisprojekte vorgestellt.
{ for (int n=0; n<5; n++) digitalWrite(ledPin[n], HIGH);
}

while (mode == 2) // blink


{ for (int n=0; n<5; n++) { digitalWrite(ledPin[n], HIGH); } delay(100); Weitere Infos:
for (int n=0; n<5; n++) { digitalWrite(ledPin[n], LOW); } delay(100);
} G. Spanner: Arduino Schaltungsprojekte
fr Pros, Elektor-Verlag 2012,
while (mode == 3) // chaser
Best.-Nr. J9-10 94 45, 39,80
{ for (int n=0; n<5; n++)
{ digitalWrite(ledPin[n], HIGH); delay(100);
Grundlagen zur elektronischen Schaltungs-
digitalWrite(ledPin[n], LOW); technik nden sich in der E-Book-Reihe
if (mode != 3) break; Elektronik!
} (www.amazon.de/dp/B00OXNCB02)
} Buch AVR-Mikrocontroller in C
programmieren, Franzis-Verlag 2012,
ZKLOH PRGH  DOO/('VR Best.-Nr. J9-09 73 52, 39,95
{for (int n=0; n<5; n++) digitalWrite(ledPin[n], LOW); }
}
Preisstellung April 2015 aktuelle Preise im Web-Shop

Empfohlene Produkte/
Ausblick
Bauteile: Best.-Nr. Preis
Nachdem in diesem Kapitel das Thema Interrupts und Polling ausfhr-
lich behandelt wurde, wird im nchsten Beitrag der Einsatz von Timern Arduino UNO J9-10 29 70 27,95
und Countern erlutert. Mikrocontroller Online-Kurs J9-10 20 44 99,
Diese Technologien basieren zu einem groen Teil ebenfalls auf der
Alle Arduino-Produkte wie Mikrocontroller-Platinen,
Erzeugung von Interrupts. Wird etwa ber einen controllerinternen Shields, Fachbcher und Zubehr nden Sie unter:
Hardwarezhler in regelmigen Zeitabstnden ein Interrupt ausgelst, www.arduino.elv.de

ELVjournal 3/2015

Arduino_Teil_10.indd 47 27.04.15 12:13


26 So funktionierts

Arduino verstehen
und anwenden
Teil 11: Timer und Counter

www.elvjournal.de

Arduino_Teil_11.indd 26 02.07.15 13:47


So funktionierts 27

Timer und Counter gehren zu den wichtigsten Funk- Neben ihrer eigentlichen Funktion als Timer kommen Counter auch
tionseinheiten eines Mikrocontrollers. Obwohl ihre bei der Erzeugung von Analogsignalen mithilfe der Pulsweitenmodula-
Aufgabe vergleichsweise einfach ist, erschlieen sie tion zum Einsatz. Auch hier gestatten sie eine sehr przise Einstellung
eine Flle von Anwendungen. der entsprechenden Signale, die mit anderen Mitteln nicht realisierbar
Auch die in den verschiedenen Arduino-Versionen wre. Dieses Thema wird im nchsten Artikel eingehender behandelt.
eingesetzten Controllertypen verfgen ber diese
ntzlichen Funktionseinheiten. Im Rahmen dieses Einfache Uhr mit programmgesteuerter
Beitrags werden die Counter- und Timereinheiten ge- Verzgerung
nauer unter die Lupe genommen und auch in prakti- In diesem Anwendungsbeispiel wird eine einfache Uhr programmiert.
schen Anwendungen eingesetzt. Die Ausgabe erfolgt direkt auf die serielle Schnittstelle. Die Zeitanzeige
kann also auf jedem RS232-Terminal ausgegeben werden. Natrlich ist
Funktion und Verwendung auch der serielle Monitor aus der Processing-IDE dafr einsetzbar.
Prinzipiell bestehen Counter aus einem controller-in-
ternen Zhlregister. Wird dieses Zhlregister in regel- // Simple Clock
migen Zeitabstnden um den Wert eins erhht oder
reduziert, dann entsteht ein sogenannter Timer. Die int cnt, hours = 17, mins = 30, secs = 00; // hours, minutes, seconds
Aufgabe eines Timers knnte theoretisch auch von int LED=13;
einer konventionell programmierten while-Schlei-
fe bernommen werden. Diese wrde aber den ge- void setup()
samten Programmablauf blockieren und der Arduino { Serial.begin(9600);
knnte keine weiteren Aufgaben parallel dazu aus- pinMode(LED,OUTPUT);
fhren. Das ist natrlich in den meisten Fllen nicht }
akzeptabel.
void loop()
Ein Counter dagegen verfgt ber eine eigene
{ cnt++;
Hardwareeinheit innerhalb des Controllers. Wenn er if(cnt==50)digitalWrite(LED,LOW);
einmal gestartet ist, arbeitet er vllig unabhngig if(cnt==100)
von anderen Controllereinheiten. Ein wichtiger Punkt { digitalWrite(LED,HIGH);
ist dabei, dass der Counter bei einem bestimmten Serial.print("Current Time: ");
Zhlstand einen Interrupt auslsen kann. Counter if (hours < 10) Serial.print("0"); Serial.print(hours); Serial.print(":");
knnen sowohl von externen Ereignissen, wie etwa if (mins < 10) Serial.print("0"); Serial.print(mins); Serial.print(":");
dem Pegelwechsel an einem bestimmten Prozessor- if (secs < 10) Serial.print("0"); Serial.print(secs); Serial.println();
pin als auch von internen Signalen gesteuert werden. secs++;
Wird der Counter ber das interne Taktsignal des if(secs==60)
{ secs=0; mins++;
Controllers gesteuert, entsteht ein prziser Timer.
if(mins==60)
Dieser erlaubt die sehr exakte Erzeugung von Zeit-
{ mins=0; hours++;
takten. Die Genauigkeit, mit der diese Takte zu Ver- if(hours==24) hours=0;
fgung stehen, wird letztlich nur durch den Quarzos- }
zillator des Mikrocontrollers bestimmt. }
Neben dem Hauptoszillator des Controllers ist cnt=0;
hug auch noch ein sogenannter Uhren-Oszillator }
vorhanden. Dieser kann mit sehr przise abgestimm- delay(10);
ten Uhrenquarzen angesteuert werden. Diese Quar- }
ze arbeiten meist mit einer Frequenz von 32.768 Hz
(= 215 Hz). Mithilfe dieser Quarze knnen Uhren rea-
lisiert werden, die innerhalb von vielen Monaten nur Das Prinzip dieser Uhr ist simpel: Es wird einfach kontinuierlich eine
Zeitabweichungen von wenigen Sekundenbruchteilen Endlosschleife durchlaufen. Die Durchlaufzeit dieser Schleife soll mit
aufweisen. delay(10);

ELVjournal 4/2015

Arduino_Teil_11.indd 27 02.07.15 13:47


28 So funktionierts

auf 10 ms festgelegt werden. Bei jedem Schleifendurchlauf wird eine


Zhlvariable (cnt) um eins erhht. Immer wenn diese Variable den Wert
50 erreicht hat, wird die LED ausgeschaltet. Wird der Wert 100 erreicht,
d. h. nach
100 x 10 ms = 1000 ms = 1 s
wird die LED wieder aktiviert und die Uhr um eine Sekunde weiterge-
schaltet.
Die LED blinkt also im Sekundentakt und die Uhr sollte nach jeder
abgelaufenen Sekunde um eine Sekunde weiter zhlen. Nach jeweils
60 Sekunden wird der Minutenwert um eins erhht, nach 60 Minuten
der Stundenwert und nach 24 Stunden wird der Stundenwert auf 0 zu-
rckgesetzt.
Da es blich ist, Uhrzeiten im Format hh:mm:ss anzugeben, wurde im
Programm noch fr die fhrenden Nullen gesorgt. Ansonsten wrde
die Zeit 17:30:05 im eher ungewhnlichen Format 17:3:5 angezeigt.
Wenn man die Uhr laufen lsst, kann man feststellen, dass soweit
alles bestens funktioniert. Bild 1 zeigt die zugehrige Ausgabe der Uhr-
zeit auf dem seriellen Monitor.

Die Time-Library Bild 1: Zeitausgabe im seriellen Monitor


Wie im Arduino-Umfeld blich existiert auch fr die Arbeit mit Uhrzei-
ten eine Library. Der folgende Sketch zeigt, wie diese Library eingesetzt
wird. Zeitmessung mit Timern
Wirklich przise Zeitmessungen sind am besten mit-
hilfe eines Timers umsetzbar. Wie bereits erwhnt ist
// clock using time lib
ein Timer nichts anderes als ein im Controller mit
char str[2];
separater Hardware integrierter Zhler. Die Taktfre-
quenz des Zhlers kann direkt aus dem Prozessortakt
#include <Time.h> gewonnen werden. Der Timer luft dann vllig un-
abhngig von der Programmausfhrung mit stabiler
void setup() Quarzprzision. Immer wenn der Timer abgelaufen
{ Serial.begin(9600); ist, kann ein Interrupt ausgelst werden. Dieser In-
setTime(20, 0, 0, 1, 1, 15); // set time to 20:00:00 at 1. Jan. 2015 terrupt erfolgt damit immer in przise denierten
} Zeitabstnden.
void loop()
Die zugehrige Bibliothek kann unter
{ sprintf(str,"%02d", hour()); Serial.print(str); Serial.print(":");
http://code.google.com/p/arduino-timerone/
sprintf(str,"%02d", minute()); Serial.print(str); Serial.print(":");
sprintf(str,"%02d", second()); Serial.print(str); Serial.println();
downloads/list
delay(1000); aus dem Internet geladen werden.
}
Ein Timer kann so mit zwei Befehlen festgelegt wer-
den:
Die Time-Library kann unter Timer1.initialize(i);
http://playground.arduino.cc/code/time und
kostenlos aus dem Internet geladen werden. Timer1.attachInterrupt(procedure);

Zustzlich wurde hier auch noch die Funktion sprintf verwendet. Mit Timer1.initialize(); wird der Zeitabstand de-
Diese gestattet die Formatierung von Ausgaben an die serielle Schnitt- niert, in welchem ein Interrupt ausgelst wird. Die
stelle. Hier sorgt die Angabe %02 fr das einfgen der fhrenden Variable i muss dabei in s angegeben werden. Fr
Nullen. Weitere Details dazu nden sich in [1]. einen Sekundentakt muss i = 1.000.000 s = 1000 ms
Lsst man die Arduino-Uhren eine gewisse Zeit laufen, so wird man = 1 s gewhlt werden. Dann wir die in
schnell bemerken, dass sie erheblich nachgehen. Warum? Das Problem Timer1.attachInterrupt(procedure);
liegt darin, dass auch die Anweisungen fr die Ausgabe auf die Schnitt- festgelegte procedure exakt alle 1,000000 Sekun-
stelle oder die Befehle fr die Anzeige der Sekunden und Minuten eine den aufgerufen, unabhngig von irgendwelchen an-
gewisse Zeit erfordern. deren Aktivitten des Mikrocontrollers.
Der delay-Wert im ersten Sketch msste also etwas kleiner als 10 ms
sein. Entsprechend msste der Wert im zweiten Sketch weniger als Przise Real Time Clock
1000 ms betragen. Natrlich knnte man jetzt versuchen, durch Ver- In diesem Anwendungsbeispiel soll der Timer prak-
gleich mit einer przisen Uhr die korrekten delay-Werte zu bestimmen. tisch eingesetzt werden. In der ersten Programmzei-
Dieses experimentelle Vorgehen ist allerdings recht aufwendig und le wird dazu die Funktions-Bibliothek fr TimerOne
wird auch nie zu einem przisen Ergebnis fhren, da die Durchlaufzei- eingebunden:
ten fr die verschiedenen Programmteile stark und kaum vorhersehbar #include "TimerOne.h"
schwanken. // include timer

www.elvjournal.de

Arduino_Teil_11.indd 28 02.07.15 13:47


So funktionierts 29

Nach der Initialisierung des Timerinterrupts mit Die Hauptprogramm-Schleife kann in diesem Beispiel wieder vllig leer
Timer1.initialize(1000000); bleiben.
Timer1.attachInterrupt(update_time); Wenn man nun die Ganggenauigkeit dieser Uhr mit den einfachen Uhr-
wird die update_time()-Routine immer in einem versionen mit Delay-Zeitverzgerung vergleicht, kann man schnell die
Zeitabstand von exakt 1 Sekunde aufgerufen. deutlich verbesserte Ganggenauigkeit feststellen.

// precise interrupt controlled real time clock

#include "TimerOne.h"
#include <Time.h>
char str[2];

void setup()
{ Serial.begin(9600);
setTime(15, 20, 0, 1, 1, 15);
Timer1.initialize(1000000); // timeCounter = 1000000 s = 1.000000 s
Timer1.attachInterrupt(update_time);
}

void update_time()
{ sprintf(str,"%02d", hour()); Serial.print(str); Serial.print(":");
sprintf(str,"%02d", minute()); Serial.print(str); Serial.print(":");
sprintf(str,"%02d", second()); Serial.print(str); Serial.println();
}

void loop() { /* main loop empty!*/ }

Countdown-Timer mit LEDs


Natrlich mchte man die Zeit nicht nur am PC anzeigen, hier steht ja
ohnehin meist eine integrierte Uhr zur Verfgung. In diesem Beispiel
werden deshalb sechs LEDs als Anzeigeelemente verwendet. Um einen
mglichst groen Bereich abzudecken, werden zur Anzeige nicht die
einzelnen LEDs direkt verwendet, sondern es kommt die binre Zahlen-
darstellung zum Einsatz. Damit kann man mit nur sechs LEDs immerhin
26 = 64 verschiedene Zustnde anzeigen. Einem Sekunden-Countdown
fr Zeiten bis ber eine Minute steht damit nichts mehr im Weg.
Die LEDs werden der Reihe nach an Port B angeschlossen, d. h. an
den Digitalpins 8 bis 13. Die einzelnen Pins werden hier direkt als Port
angesprochen:
// PORT B as output
DDRB = 0b1111111;
deniert alle Portpins des Ports B als Ausgnge. DDR steht dabei fr
Data DiRection. Weitere Details zur Verwendung der PORT-Anweisung
nden sich in [1].
Im Sekundentakt wird dann der Wert seconds per Timerinterrupt um
jeweils eins reduziert:
void update_time()
{ if (seconds >0) seconds--;
}
Der aktuelle Wert von seconds wird im Hauptprogramm direkt als Binr-
zahl entsprechend dem Muster in Bild 2 ausgegeben.
Aus Platzgrnden wurden hier nur die Werte von 0 bis 31 angegeben.
Wenn die Zeit abgelaufen ist, blinken alle LEDs simultan mit einer
Frequenz von 10 Hz:

if (seconds == 0)
{ PORTB = 0b111111; delay (100); PORTB = 0; delay (100);}

Durch die Verwendung der PORT-Befehle fllt das Programm sehr kom-
Bild 2: Zeitausgabe im Binrformat pakt aus:

ELVjournal 4/2015

Arduino_Teil_11.indd 29 02.07.15 13:47


30 So funktionierts

// binary LED countdown timer

#include "TimerOne.h" // include timer

double tc = 1000000; // timeCounter = 1000000 s = 1.000000 s


int seconds = 60; // start value

void setup()
{ DDRB = 0b1111111; // PORT B as output
Timer1.initialize(tc);
Timer1.attachInterrupt(update_time);
}

void update_time()
{ if (seconds >0) seconds--;
}

void loop()
{ PORTB = seconds;
if (seconds == 0)
{ PORTB = 0b111111; delay (100); PORTB = 0; delay (100);}
}

Den Aufbau zum Binrtimer zeigt Bild 3.


Bild 3: Binrer Countdowntimer
Digitaluhren mit individueller Gestaltung
Nachdem nun klar ist, wie man mithilfe von Timern przise Zeitrume
messtechnisch erfassen kann, kommt vielleicht der Wunsch auf, eine
richtige Digitaluhr mit echter Ziffernanzeige anstelle einer Binran-
zeige aufzubauen. Diese Aufgabe ist mit dem Arduino durchaus lsbar.
Allerdings muss man dafr noch das Problem der Ansteuerung von Sie-
bensegment-Displays lsen. In einem spteren Beitrag zu dieser Reihe
werden verschiedene Mglichkeiten aufgezeigt werden, wie eine solche
Ansteuerung aussehen kann.
In Kombination mit den hier vorgestellten Timerfunktionen stellt
dann aber der Bau von individuellen Digitaluhren kein Problem mehr
dar.
Natrlich kann man solche Uhren auch kuich erwerben. Der Eigen-
bau hat aber den Vorteil, dass man eigene Ideen realisieren kann. So ste-
hen inzwischen Anzeigelemente in den verschiedensten Formen, Gren
Bild 4: Individuell gestaltete Digitaluhr und Farben zur Verfgung. Bild 4 zeigt ein Beispiel fr eine Eigen-
bau-Uhr mit blauer Anzeige.

Ausblick
Eine weitere Anwendung von Timern und Countern ist die sogenannte
Weitere Infos: Pulsweitenmodulation (PWM). Sie gestattet es, quasi-analoge Spannun-
gen zu erzeugen und an einen Arduino-Pin auszugeben. Diese Technik
wird im Mittelpunkt des nchsten Beitrags zu dieser Artikelserie stehen.
[1] Mikrocontroller-Onlinekurs, Franzis-Verlag, Darber hinaus werden auch die Mglichkeiten des Einsatzes von Di-
exklusiv fr ELV, 2011, gital-Analog-Konvertern (DACs, fr engl. Digital/Analog-Converter) dis-
Best.-Nr. VA-10 20 44, 99, kutiert werden. Diese bilden das Gegenstck zu den bereits im Artikel
[2] G. Spanner: Arduino Schaltungsprojekte VI, Sensortechnik und Messwerterfassung besprochenen ADCs. Neben
fr Pros, Elektor-Verlag 2012, der przisen Steuerung von Aktoren gestatten DACs auch die Ausgabe
Best.-Nr. VA-10 94 45, 39,80 von Tnen und Musik.
[3] Grundlagen zur elektronischen Schaltungs-
technik nden sich in der E-Book-Reihe
Elektronik! Empfohlene Produkte/
(www.amazon.de/dp/B00OXNCB02) Bauteile: Best.-Nr. Preis
[4] Lernpaket AVR-Mikrocontroller in C
Arduino UNO VA-10 29 70 27,95
programmieren, Franzis-Verlag 2012,
Best.-Nr. VA-09 73 52, 39,95 Mikrocontroller-Onlinekurs VA-10 20 44 99,

Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher


Preisstellung Juni 2015 aktuelle Preise im Web-Shop und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_Teil_11.indd 30 02.07.15 13:47


18 So funktionierts

Arduino verstehen
und anwenden
Teil 12: Ausgabe von analogen Spannungen

www.elvjournal.de
So funktionierts 19

Im letzten Beitrag wurde die Anwendung von Coun- Immer wenn der Zhlerstand den Vergleichswert erreicht, wird ein
tern und Timern erlutert. Dabei wurde bereits ange- festgelegter Ausgangspin des Arduinos umgeschaltet. Bild 1 zeigt den
sprochen, dass diese universellen controllerinternen Zusammenhang zwischen dem Zhler-Vergleichswert und dem generier-
Hardware-Einheiten auch zur Erzeugung von analo- ten PWM-Signal.
gen Ausgangspannungen dienen knnen. Dabei zeigt die gestrichelte rote Linie den aktuellen Stand des
Bislang konnte ein Arduino-Pin als klassischer di- Counters an. Wird der vorgegebene Vergleichswert erreicht, ndert der
gitaler Ausgang nur die Werte 0 V (0 bzw. LOW) PWM-Ausgangspin seinen Pegel (siehe grn dargestellte Rechteck-
oder 5 V (1 bzw. HIGH) annehmen. In vielen An- che). Der Pin wird bei aufwrts zhlendem Counter auf HIGH, bei ab-
wendungen ist es aber wnschenswert oder sogar wrts zhlendem Counter auf LOW geschaltet. Es handelt sich in die-
notwendig, dass auch analoge Spannungswerte, sem Fall um eine sogenannte invertierende PWM, da der Mittelwert der
d. h. Werte zwischen 0 und 5 V ausgegeben werden Rechteckspannung mit zunehmendem Counter-Vergleichswert abnimmt.
knnen.
Anwendungsbeispiele dazu sind die Helligkeits-
steuerung von LEDs, die Drehzahlkontrolle von Mo-
toren, oder aber auch die Ansteuerung von anderen
Aktoren wie Peltierelementen oder Heizdrhten etc.
Fr die Erzeugung von Analogspannungen stehen
mehrere Methoden zur Verfgung. Die beiden wich- 100 %
tigsten sind: V e rg le ic h s -
w e rt 50 %
die Pulsweitenmodulation (PWM)
der Digital-Analog-Konverter (DAC, von engl.
Digital/Analog-Converter)
U 50 %
In diesem Artikel werden beide Verfahren vorgestellt
und Anwendungen wie t
Ausgabe von Analogwerten ber PWM
Mood-Light mit Multicolor-LED
Aufwachlicht V e rg le ic h s - 100 %
w e rt
Von digital nach analog: der DAC 90 %

Digitale Funktionsgeneratoren
beschrieben. t

Ausgabe von Analogwerten ber PWM U 10%


Bei der PWM spielen Counter eine zentrale Rolle.
Sie werden hier eingesetzt, um die Pulsbreite einer t
Rechteckspannung zu verndern.
Kurze Pulse mit langen Pausen fhren so zu einer
geringen durchschnittlichen Spannung. Lange Pulse 100 %
mit kurzen Pausen dazwischen entsprechen dagegen
einem hohen Spannungsmittelwert. Die Frequenz der V e rg le ic h s - 10 %
w e rt
Rechteckspannung bleibt dabei immer konstant.
Zur Erzeugung der unterschiedlichen Pulslngen
wird ein sogenannter Vergleichswert in ein Coun- U 90 %
ter-Register geladen. Dann wird der Counter in re-
gelmigen Zeitabstnden hochgezhlt. Der Zhler
t
ndert jeweils beim Zhlerstand Null bzw. bei seinem
Maximalwert die Zhlrichtung. Bild 1: Invertierende PWM

ELVjournal 5/2015
20 So funktionierts

Bei Verwendung von Processing ist der Einsatz der PWM sehr einfach.
Mit
analogWrite (Pin_x, value)
kann ein quasi-analoger Spannungswert der Hhe value (0255) er-
zeugt werden. Pin_x kann dabei einer der sechs PWM-Pins mit den Num-
mern 3, 5, 6, 9, 10 und 11 auf dem UNO-Board sein. Diese Pins sind mit
einer Tilde (~) gekennzeichnet.
Fr eine echte Analogspannung msste diese Rechteckschwingung
noch elektronisch geltert werden. In vielen Fllen kann aber auch auf
eine solche Filterung verzichtet werden, da die Mittelung des Signals an
anderer Stelle erfolgt.
Bei der folgenden Praxisanwendung ergibt sich die Mittelwertbildung
beispielsweise im Auge des Betrachters. Das schnelle Schalten der LED
verschwimmt dort zu einem kontinuierlichen Helligkeitseindruck.

Mood-Light mit Multicolor-LED


Eine interessante Anwendung der PWM-Steuerung stellt das sogenannte
Stimmungslicht dar, das auch als Mood-Light bekannt ist (Bild 2).
Dabei wechselt eine Multicolor-LED kontinuierlich ihre Farben. Die Far-
bbergnge sollen dabei nicht abrupt sondern mit ieendem bergang
erfolgen.
Hierzu wird jeweils eine Anode der Farb-LED ber einen Vorwider- Bild 2: Mood-Light
stand mit einem PWM-Ausgang des Arduinos verbunden.
Im Programm werden dann nacheinander die Analogausgnge ber
die PWM langsam hoch- und wieder heruntergefahren. Durch die addi-
tive Farbmischung ergeben sich die unterschiedlichsten Summenfarben,
einschlielich nahezu weier Farbtne.

// Mood lamp for RGB LED

int red, green, blue;


int RedPin = 9; int GreenPin = 10; int BluePin = 11;
int del = 10;

void setup(){}

void loop()
{ for(red = 0; red < 255; red++) {analogWrite (RedPin, red); delay(del);}
for(blue = 0; blue < 255; blue++) {analogWrite (BluePin, blue); delay(del);}
for(green = 0; green < 255; green++) {analogWrite (GreenPin, green); delay(del);}
for(blue = 255; blue > 0; blue--) {analogWrite (BluePin, blue); delay(del);}
for(red = 255; red > 0; red--) {analogWrite (RedPin, red); delay(del);}
for(green = 255; green > 0; green--) {analogWrite (GreenPin, green); delay(del);}
for(blue = 0; blue < 255; blue++) {analogWrite (BluePin, blue); delay(del);}
for(red = 0; red < 255; red++) {analogWrite (RedPin, red); delay(del);}
for(red = 255; red > 0; red--) {analogWrite (RedPin, red); delay(del);}
for(blue = 255; blue > 0; blue--) {analogWrite (BluePin, blue); delay(del);}
}

Aufwachlicht trollerausgang sollte nicht mit mehr als ca. 20 mA


Mann kann sich mit den verschiedensten Methoden, wie etwa mit Musik belastet werden. Dagegen kann selbst ein einfacher
oder mit Licht, wecken lassen. Geschieht das Wecken mit Licht, sollte Universaltransistor problemlos bis zu 100 mA ver-
dieses nicht pltzlich eingeschaltet werden. Wesentlich angenehmer kraften. Damit lassen sich bereits mehrere recht
ist es, wenn die Lichtintensitt langsam zunimmt. Dies entspricht viel leuchtstarke LEDs ansteuern.
mehr dem Helligkeitsverlauf eines natrlichen Sonnenaufgangs. In diesem Anwendungsbeispiel (Bild 3) zeigt sich
Mittels PWM ist es mglich, nahezu natrliche Helligkeitsverlufe zu auch ein weiterer Vorteil der PWM. Im Gegensatz
erzeugen. Fr ein echtes Aufwachlicht liefert eine einzelne LED natr- zu einer rein analogen Steuerung wird bei der PWM
lich eine zu geringe Helligkeit. kaum Leistung in einem Steuerelement umgesetzt.
Mithilfe eines npn-Transistors (z. B. BC547 o. .) knnen aber meh- Da der Transistor entweder sperrt (Port auf LOW)
rere LEDs simultan angesteuert werden, da der Transistor den Strom des oder voll durchgesteuert ist (PORT auf HIGH), fllt
Controller-Pins entsprechend verstrken kann. Ein einzelner Mikrocon- an ihm kaum Verlustleistung ab.

www.elvjournal.de
So funktionierts 21

// wakeup light

int LED, LEDPin = 11, del = 100;

void setup() {}

void loop()
{ for(LED = 0; LED < 255; LED++)
{analogWrite (LEDPin, LED); delay(del);}
for(LED = 255; LED > 0; LED--)
{analogWrite (LEDPin, LED); delay(del);}
analogWrite (LEDPin, 0);
delay(3000);
}

Von digital nach analog: der DAC


Die Messwerterfassung mit ADCs wurde bereits in
Teil 6 Sensortechnik und Messwerterfassung dieser
Artikelserie (ELVjournal 5/2014) ausfhrlich behan-
delt. Der umgekehrte Weg die Ausgabe von analo-
gen Spannungen ber den Arduino soll hier nher
beschrieben werden.
Da die meisten Arduino-Varianten nicht ber ei-
nen echten Digital/Analog-Converter (DAC) verf- Bild 3: Aufwachlicht
gen, muss man sich hier mit einer externen Beschal-
tung behelfen. Bild 4 zeigt eine Schaltung, die als
R-2R-Leiter bekannt ist. sind dann Funktionen wie Sinus, Rechteck oder Drei-
Die Ausgangsspannung dieser Schaltung ist: eck darstellbar. Man kann aber auch einzelne Werte
U = U(D7) / 2 + U(D6) / 4 + U(D5) / 8 + + U(D0) / 256 des Arrays manuell verndern und beliebige Werte
zwischen 0 und 255 eintragen.
Damit kann also ber einen 8-Bit-Port eine Analog- Im nachfolgenden Beispielsketch wurden in den
spannung mit einer Ausung von 5 V/256 5 20 mV vier Zellen welche die Maximal- (255) bzw. Minimal-
ausgegeben werden. werte (0) einer Sinusfunktion enthalten hatten, die
Eine praktische Anwendung dieses DAC-Prinzips Zahl 128 eingetragen.
wird im folgenden Praxisbeispiel erlutert.

Digitale Funktionsgeneratoren
In der Welt der Analogelektronik existieren soge-
2k A n a lo g
nannte Funktionsgeneratoren. Die damit erzeug- D7
O ut
baren Funktionen umfassen meist ein Sinus-, ein 1k
Rechteck- und ein Dreiecksignal. Diese Signalformen 2k
D6
sind mit analog-elektronischen Mitteln sehr leicht zu
erzeugen. Andere Signalformen dagegen sind bei sol- 1k
2k
chen Gerten kaum zu nden. D5
Mithilfe eines Arduinos kann man diese Einschrn- 1k
kung leicht umgehen. Hier knnen nahezu beliebige 2k
D4
Signalformen mit hoher Przision erzeugt werden.
1k
Die gewnschte Kurvenform kann dabei als Datense- 2k
quenz in digitaler Form im Speicher des Arduino-Con- D3
trollers abgelegt werden. Die Ausgabe erfolgt ber 1k
einen Parallelport mit angeschlossenem DAC. 2k
D2
Im zugehrigen Sketch werden die gewnschten
1k
Funktionswerte in einem eindimensionalen Array 2k
value[] abgelegt. Die Hauptschleife sorgt lediglich D1
dafr, dass die Werte nacheinander an die Pins des 1k
2k
Arduinos ausgegeben werden. Dort erfolgt mit dem D0
R2R-Netzwerk die Umwandlung in eine analoge Span- 2k
nung.
Die Werte fr das Array knnen mit einem Tabel-
lenkalkulationsprogramm wie beispielsweise EXCEL
oder LibreOfce erzeugt werden. ber Copy und Paste Bild 4: R-2R-Leiter als DAC

ELVjournal 5/2015
22 So funktionierts

Bild 5: Spezialfunktion als Excel-Graphik Bild 6: Zugehriges Oszillogramm

Dadurch entsteht die in Bild 5 gezeigte gestrte Sinusfunktion, die Ausblick


jeweils an den Scheitelwerten Aussetzer aufweist. ber die Analogausgabe lassen sich die verschie-
Damit kann man nun beispielsweise die Reaktion einer Analogschal- densten Anwendungen realisieren. Bereits in diesem
tung auf dieses fehlerhafte Sinussignal prfen. Bild 6 zeigt das so Artikel wurde das Dimmen von LEDs und die Erzeu-
erzeugte Signal auf einem Analog-Oszilloskop. Man erkennt deutlich, gung beliebiger Kurvenformen diskutiert.
dass der Funktionsgenerator die eingegebene Kurvenform inklusive der Im nchsten Artikel werden verschiedene periphe-
Glitches mit hoher Genauigkeit wiedergibt. re Gerte ber den Arduino angesteuert. Insbesonde-
re wird der Arduino dann nicht mehr nur optische Sig-
nale senden, sondern ber einen Piezo-Schallwandler
oder einen geeigneten Lautsprecher mit vorgeschal-
// arbitrary function generator
tetem Verstrker auch Tne erzeugen. Darber hinaus
#include <avr/io.h>
steht auch die Ansteuerung anderer Verbraucher, wie
int value[] = Elektromagneten oder Gleichstrommotoren, auf dem
{128,131,134,137,141,144,147,150,153,156,159,162,165,168,171,174, Programm.
177,180,183,186,189,191,194,197,199,202,205,207,209,212,214,217, Dabei knnen die in diesem Artikel erworbenen
219,221,223,225,227,229,231,233,235,236,238,240,241,243,244,245, Kenntnisse zum Thema Analogausgabe wieder nutz-
246,247,248,249,250,251,252,253,253,254,254,255,255,128,128,255, bringend eingesetzt werden.
255,255,255,255,255,254,254,254,253,253,252,251,250,249,248,247,
246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
218,215,213,211,208,206,203,201,198,195,193,190,187,184,181,179,
176,173,170,167,164,161,158,155,152,148,145,142,139,136,133,130,
126,123,120,117,114,111,108,104,101,98,95,92,89,86,83,80,
77,75,72,69,66,63,61,58,55,53,50,48,45,43,41,38,
36,34,32,30,28,26,24,22,20,19,17,16,14,13,11,10,
9,8,7,6,5,4,3,3,2,2,1,1,0,0,128,128,
0,0,0,1,1,1,2,2,3,4,4,5,6,7,8,10,
11,12,13,15,16,18,20,21,23,25,27,29,31,33,35,37,
39,42,44,47,49,51,54,57,59,62,65,67,70,73,76,79,
82,85,88,91,94,97,101,103,106,109,112,115,119,122,125
};
Weitere Infos:

int main(void)
{ DDRD = 0b11111111; [1] G. Spanner: Arduino Schaltungsprojekte
while (1) fr Pros, Elektor-Verlag 2012,
{ for (unsigned int i = 0; i<=254; i++) PORTD = value[i]; Best.-Nr. CB-10 94 45, 39,80
}
} [2] Mikrocontroller-Onlinekurs, Franzis-Verlag,
exklusiv fr ELV, 2011,
Best.-Nr. CB-10 20 44, 99,
[3] Grundlagen zur elektronischen Schaltungs-
technik nden sich in der E-Book-Reihe
Elektronik!
Empfohlene Produkte/ (www.amazon.de/dp/B00OXNCB02)
Bauteile: Best.-Nr. Preis
[4] Lernpaket AVR-Mikrocontroller in C
Arduino UNO CB-10 29 70 27,95
programmieren, Franzis-Verlag 2012,
Mikrocontroller-Onlinekurs CB-10 20 44 99, Best.-Nr. CB-09 73 52, 39,95
Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
und Zubehr nden Sie unter: www.arduino.elv.de Preisstellung August 2015 aktuelle Preise im Web-Shop

www.elvjournal.de
14 So funktionierts

Arduino verstehen
und anwenden
Teil 13: Peripheriegerte: Piezos, Taster, Motoren und Elektromagnete

www.elvjournal.de

Arduino_verstehen_Teil_13.indd 14 27.10.15 16:14


So funktionierts 15

Bislang wurden berwiegend LEDs als Ausgabemedi-


en fr den Arduino eingesetzt. Beginnend mit der
bereits auf dem Arduino vorhandenen LED 13 ber
eine einzelne externe LED bis hin zu Lauichtern mit
einer Vielzahl von Leuchtdioden konnten so viele in-
teressante Versuche aber auch ntzliche kleine Pro-
jekte umgesetzt werden.
In diesem Beitrag sollen nun weitere Ausgabe-Ein-
heiten an das Arduino-Board angeschlossen werden.
Neben Komponenten, die vom Arduino gesteuert wer-
den knnen, wie etwa Elektromotoren oder -magne-
te, wird die Verwendung von Eingabegerten wie Tas-
ter und Schalter erlutert. Sogenannte Piezokristalle
nehmen hier eine Sonderstellung ein, da sie sowohl als Bild 1: Piezoelektrische Schallwandler
Eingabe- als auch als Ausgabemedien dienen knnen.
Zusammenfassend werden diese Ein- und Ausgabe-
medien auch als Peripheriegerte oder -komponenten
bezeichnet. Sie erlauben eine gewisse Einussnah- bunden werden. Nach dem Laden des Programms ertnt die Melodie aus
me des arduino-internen Microcontrollers auf seine dem Piezo-Lautsprecher.
Umgebung. Insofern fhrt dieser Artikel auch in das
weite und beraus interessante Gebiet des Physical
// Melody
Computings ein.
int speaker=9; // select speaker channel
Arduino musikalisch int len = 300, del = 200; // tone length and delay
Im Bereich der Mikrocontrolleranwendungen mchte
man hug Daten oder Signale nicht nur visuell dar- // tone frequencies
stellen sondern auch akustisch ausgeben. Mit dem int A = 440, H = 494;
Arduino ist das problemlos mglich. int C = 523, d = 587, e = 659, f = 698;
Dazu wird lediglich ein einfacher Schallwand- int g = 784, a = 880, h = 988, c = 1047;
ler bentigt. Die einfachste Version eines solchen
Wandlers stellt eine piezoelektrische Keramik dar. void setup()
Legt man eine Wechselspannung an diese Keramik, { pinMode(speaker, OUTPUT);
}
so beginnt sie im Takt der Spannung zu schwingen
und gibt so einen hrbaren Ton ab.
void loop()
Bild 1 zeigt zwei verschiedene Versionen von { tone(speaker,C,len); delay(del); tone(speaker,d,len); delay(del);
gngigen Schallwandlern, einmal ohne Gehuse und tone(speaker,e,len); delay(del); tone(speaker,f,len); delay(del);
einmal mit einltbaren Pins und schwarzem Rundge- tone(speaker,g,len); delay(del); tone(speaker,f,len); delay(del);
huse. tone(speaker,e,len); delay(del); tone(speaker,d,len); delay(del);
Da ein piezoelektrischer Schallwandler eine ver- tone(speaker,d,len); delay(del); tone(speaker,e,len); delay(del);
gleichsweise hohe Impedanz aufweist, kann er direkt tone(speaker,C,len); delay(del); delay(3*del);
mit einem Mikrocontrollerausgang verbunden werden. }

Praxisanwendung:
Arduino als elektronische Grukarte Alarmsignale
Das folgende Programm spielt eine Melodie auf dem Das folgende Programm zeigt, wie man mit dem Arduino ein durch-
Piezo-Lautsprecher ab. Der piezoelektrische Schall- dringendes Alarmsignal erzeugen kann. Die Belegung der Anschlsse ist
wandler muss hierfr mit GND und Digital-Pin D9 ver- unverndert.

ELVjournal 6/2015

Arduino_verstehen_Teil_13.indd 15 27.10.15 16:14


16 So funktionierts

Welchen Wert zeigt die Anzeige im seriellen Monitor,


// ALARM!
wenn man den Taster beispielsweise 10-mal schnell
int Speaker=9; hintereinander bettigt? Vermutlich liegt der Anzei-
int i=0; gewert irgendwo zwischen 12 und 15!
Was ist passiert? Eigentlich sollte doch der Anzei-
void setup() gewert genau mit der Anzahl der Tastendrucke ber-
{ pinMode(Speaker, OUTPUT); einstimmen! Mit
}
{ if(!digitalRead(SW1))
void loop()
{ for(i=120;i<1600;i++)
wird gewartet, bis der Taster den Pin3 auf LOW-Signal
{ tone(Speaker,i,10);
zieht. Dann wird das Programm weiter durchlaufen,
//delay(100);
}
bis in der Zeile
}
do {} while(!digitalRead(SW1));

Diese Praxisbung demonstriert, dass die Tonausga- darauf gewartet wird, bis der Taster wieder frei gege-
be sehr exibel programmierbar ist. Es gibt keinerlei ben ist. Wie kann es also dabei zu einem mehrfachen
Beschrnkungen auf einfache Tonfolgen, mit etwas Durchlauf der Zhlschleife bei einem einzelnen Tas-
Phantasie und Geduld knnen auch sehr eindrucks- tendruck kommen?
volle Klnge erzeugt werden. Das Problem liegt im Taster selbst. Die elektri-
Umgekehrt erzeugt ein Piezo-Element eine elekt- schen Kontakte des Tasters liefern beim Bettigen
rische Spannung, wenn es mechanisch belastet wird. nicht nur einen einmaligen Kontakt, sondern federn
Wie diese Spannung als Steuersignal fr den Arduino mehrmals zurck. Das Resultat ist kein einzelner Pe-
verwendet werden kann, ist beispielsweise in [1] er- gelwechsel, sondern ein ganzer Pulszug. Bild 2 zeigt
lutert. das Oszillogramm eines Ausschaltvorgangs. Deutlich
sind mehrere spikes zu erkennen, die der Mikrocon-
Taster und Tasterprellen troller natrlich korrekterweise als separate Tasten-
Tastenabfragen durch einen C sind ein typisches drucke interpretiert. Dieses problematische Verhal-
Beispiel dafr, dass auch scheinbar einfache Schal- ten von mechanischen Tastern und Schaltern ist auch
tungen ihre Tcken haben. als Bouncing (engl. fr Prellen) bekannt.
Testen Sie das Programm der folgenden Praxis- Dieses Fehlverhalten kann auf verschiedene Wei-
bung. Schlieen Sie den Taster zwischen Digital- sen verbessert werden. Neben speziellen schaltungs-
Pin 3 und GND an. Fhren Sie dann das Programm aus technischen nderungen, wie entsprechend dimen-
und beobachten Sie dabei LED 13 und gleichzeitig sionierten RC-Gliedern, kann insbesondere auch eine
die Ausgabe auf dem seriellen Monitor. sogenannte Software-Entprellung eingesetzt werden.
Im nachfolgenden Sketch wird nach einer Warte-
zeit von 50 ms der Taster-Status erneut abgefragt.
// Bouncing Nur wenn sich zweimal der gleiche Pegel ergibt, wird
die Zhlvariable erhht. Spikes innerhalb der 50 ms
byte n=0;
haben damit keinen Einuss auf das Zhlergebnis.
int SW1=3;
int LED=13;
int Toggle=0;

void setup()
{ Serial.begin(9600);
pinMode(SW1,INPUT);
digitalWrite(SW1,HIGH);
Serial.println("Bouncing");
}

void loop()
{ if(!digitalRead(SW1))
{ n++;
Serial.print("Switch pressed ");
Serial.print(n,DEC);
Serial.println(" times");
Toggle=!Toggle;
digitalWrite(LED,Toggle);
do {} while(!digitalRead(SW1));
}
}

Bild 2: Kontaktprellen

www.elvjournal.de

Arduino_verstehen_Teil_13.indd 16 27.10.15 16:14


So funktionierts 17

// Debouncing ! Wichtiger Hinweis:


byte n=0; // counter Vorsicht! Aufgrund der im Gert frei gefhrten Netzspan-
int SW1=3; nung drfen Aufbau und Inbetriebnahme ausschlielich
von unterwiesenen Elektrofachkrften durchgefhrt wer-
int LED=13; den, die aufgrund ihrer Ausbildung dazu befugt sind. Die
int Toggle=0; einschlgigen Sicherheits- und VDE-Bestimmungen sind
unbedingt zu beachten.
byte value_1, value_2=0;

void setup()
{ Serial.begin(9600); die seit Jahrzehnten erfolgreich in der Elektrotechnik
pinMode(SW1,INPUT); eingesetzt werden, treten in der Kombination mit Mi-
digitalWrite(SW1,HIGH); krocontrollern unerwartete Probleme auf.
pinMode(LED,OUTPUT); Relais sollten aus mehreren Grnden nicht direkt
Serial.println("Debounce"); an den Port eines Mikrocontrollers angeschlossen
}
werden. Gngige Relais ziehen Strme von 100 mA
und mehr. Wie bereits aus frheren Artikeln bekannt
void loop()
{ value_1=digitalRead(SW1);
ist, sollte ein Port nicht mit mehr als 20 mA belas-
if(!value_1) tet werden. Auerdem erzeugen die in einem Relais
{ delay(50); enthaltenen Spulen starke Induktionsspitzen, wel-
value_2=digitalRead(SW1); che die interne Treiberschaltung eines Controlleraus-
if(!value_2) gangs leicht zerstren knnen.
{ n++; Beide Probleme knnen mithilfe eines einfachen
Serial.print("Switch was pessed "); Kleinleistungstransistors gelst werden. Geeignete
Serial.print(n,DEC); Typen sind hier etwa der BC547 oder der 2N2222.
Serial.println(" times"); Zum Abfangen der Induktionsspitzen ist dann noch
Toggle=!Toggle;
eine sogenannte Freilaufdiode erforderlich. Univer-
digitalWrite(LED,Toggle);
saltypen wie 1N4148 oder 1N4007 sind hier meist
do{}while(!digitalRead(SW1));
}
vollkommen ausreichend. Bild 3 zeigt die zugehrige
} Schaltung.
} An U_relais muss die fr das verwendete Relais
erforderliche Schaltspannung, meist 5 bis 12 V, an-
gelegt werden.
Der Anzeigewert und die tatschliche Anzahl von Mit diesem einfachen Aufbau knnen nun auch
Tastenaktionen sollten nun deutlich besser berein- Strme von mehreren Ampere oder Netzspannungen
stimmen. geschaltet werden. Hierbei ist natrlich immer darauf
zu achten, dass die Schaltkontakte des verwendeten
Ansteuerung von Relais und Relais fr die gewnschten Stromstrken und Span-
Elektromagneten nungen ausgelegt sein mssen. Bild 4 zeigt den zu-
hnlich wie mit Tastern verhlt es sich auch mit Re- gehrigen Aufbau mit einem klassischen einpoligen
lais. Obwohl es sich hier um Bauelemente handelt, Relais.

Bild 3: Relais am Arduino Bild 4: Relais am Arduino

ELVjournal 6/2015

Arduino_verstehen_Teil_13.indd 17 27.10.15 16:14


18 So funktionierts

Der Sketch dazu sieht so aus:

VZLWFKUHOD\YLDEXWWRQLQFOXGLQJVZLWFKRGHOD\

int button = 2, relay = 13;


int stateRelay = LOW, stateButton, previous = LOW;
long time = 0, debounce = 500;
int stayON = 5000; //stay on for 5000 ms

void setup()
{ pinMode(button, INPUT_PULLUP); pinMode(relay, OUT-
PUT);
}

void loop()
{ stateButton = digitalRead(button);

if(stateButton == LOW && previous == HIGH && millis()


- time > debounce)
{ if(stateRelay == HIGH)
{ delay(stayON); stateRelay = LOW;
}
else stateRelay = HIGH;

time = millis();
} Bild 5: Ventilatorsteuerung via Arduino
digitalWrite(relay, stateRelay);
previous = stateButton;
}

Man erkennt, dass auch hier wieder eine software-


technische Entprellung vorgenommen wurde.
Neben der einfachen Relaissteuerung enthlt der
Sketch auch eine Ausschaltverzgerung. Diese lsst
etwa das Licht in einem Treppenhaus nach den Tas-
tendruck noch einige Zeit nachleuchten.
Ist die Ausschaltverzgerung nicht erwnscht, so
kann die Programm-Zeile

delay(stayON);

einfach gelscht werden.

Neben Relais knnen so auch Elektromagneten an-


gesteuert werden. Auf diese Weise kann der Ardui-
no beispielsweise auch die Entriegelung einer Tr-
schlieanlage bettigen.

Drehzahlsteuerung von
Elektromotoren
Analog zu den Elektromagneten knnen auch Gleich-
strommotoren ber den Arduino gesteuert werden.
Motoren geringer Leistung knnen wieder ber Klein-
signaltransistoren angesteuert werden. Fr strkere
Motoren sind entsprechend ausgelegte Transistoren Bild 6: Aufbaubild zur Ventilatorsteuerung
oder FETs erforderlich.
Ein groer Vorteil bei der Ansteuerung von Gleich-
strommotoren mit dem Arduino besteht darin, dass Die Pulsweitenmodulation hat zudem den Vorteil, dass im Steuer-
die Motoren nicht nur ein- und ausgeschaltet werden transistor im Vergleich zu einer linearen Spannungssteuerung sehr we-
knnen, sondern sogar eine Drehzahlsteuerung mg- nig Leistung verloren geht. Zudem erreicht ein PWM-gesteuerter Motor
lich ist. Wird der Motor ber einen PWM-Ausgang mit auch bei geringen Drehzahlen bereits ein groes Drehmoment. So kn-
dem Arduino verbunden, kann die Motorleistung in nen Roboterfahrzeuge, Rollladensteuerungen oder Wasserpumpen sehr
weiten Grenzen eingestellt werden. feinfhlig angesteuert werden.

www.elvjournal.de

Arduino_verstehen_Teil_13.indd 18 27.10.15 16:14


So funktionierts 19

Die Ansteuerung des Motors erfolgt wieder ber einen Transistor, je


nach Stromaufnahme des Motors kann hier auch ein Leistungstransistor
wie etwa der BD135 erforderlich sein.
Als Temperatursensor wurde hier ein einfacher NTC eingesetzt. De-
tails zu diesem Sensortyp nden sich im Artikel 6: Sensortechnik und
Messwerterfassung zu dieser Serie (ELVjournal 5/2014).
Der zugehrige Sketch liest den Spannungswert am Analogeingang
A1 aus und rechnet diesen in einen Temperaturwert um. ber einen
Vergleich mit dem Schwellwert tempLimit wird dann der Ventilator
ein- bzw. ausgeschaltet. Bei Bedarf kann hier natrlich auch noch eine
gewisse Hysterese vorgesehen werden, um bermig huges Schalten
in der Nhe der Umschalttemperatur zu verhindern.
Mchte man die Motorleistung in Abhngigkeit von der Temperatur
regeln, so kann man den Steuertransistor auch an einen PWM-Ausgang
anschlieen und die Pulsweite der Spannung entsprechend der gemes-
senen Umgebungstemperatur erhhen oder reduzieren.

// fan conrol
// using P5V to 4k7 NTC temperature sensor @ ADC1, 4k7 to GND

int fanPin = 2;
LQWRVHW WHPSHUDWXUFDOLEUDWLRQRVHW
RDWFDO WHPSHUDWXUFDOLEUDWLRQVORSH
int ADC_value;
RDWWHPSWHPS/LPLW 

void setup()
{ pinMode(fanPin, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
} Empfohlenes Material Best.-Nr. Preis
Arduino UNO CD-10 29 70 27,95
void loop()
Mikrocontroller-
{ ADC_value=analogRead(1); CD-10 20 44 99,
WHPS $'&BYDOXH FDORVHW
Onlinekurs
Serial.print("Temp = "); Serial.print(temp,1); Serial.println(" ");
Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fach-
delay(1000); bcher und Zubehr nden Sie unter: www.arduino.elv.de

if (temp > tempLimit)


{ digitalWrite(13, HIGH);
digitalWrite(fanPin, HIGH);
} Weitere Infos:
else
{ digitalWrite(13, LOW);
digitalWrite(fanPin, LOW);
[1] Lernpaket AVR-Microcontroller in C
}
programmieren, Franzis-Verlag, 2012
}

Mikrocontroller-Onlinekurs, Franzis-Verlag,
exklusiv fr ELV, 2011, Best.-Nr.: CD-10 20 44

G. Spanner: Arduino Schaltungsprojekte fr


Ausblick Pros, Elektor-Verlag, 2012
Nachdem in diesem Beitrag der Anschluss von verschiedenen Periphe- Best.-Nr.: CD-10 94 45
riegerten erlutert und diskutiert wurde, stehen im nchsten Artikel
Sieben-Segment-Displays im Vordergrund. Diese weit verbreiteten An- Grundlagen zur elektronischen Schaltungs-
zeigetypen gestatten die einfache und gut lesbare Anzeige von Zahlen technik nden sich in der E-Book-Reihe
und Ziffern. Elektronik!
Aber auch auf die Steuerung weiterer peripherer Komponenten wird (http://www.amazon.de/dp/B00OXNCB02)
ein spterer Artikel nochmals genauer eingehen. Dort wird es dann auch
darum gehen, wie ein Elektromotor in beiden Drehrichtungen gesteuert G. Spanner: Coole Projekte mit dem
werden kann und wie sogenannte Schrittmotoren zur przisen Positio- Arduino Micro, Franzis-Verlag, 2014
nierung von Druckerkpfen oder Roboterarmen eingesetzt werden.

ELVjournal 6/2015

Arduino_verstehen_Teil_13.indd 19 27.10.15 16:14


66 So funktionierts

Arduino verstehen
und anwenden
Teil 14: 7-Segment-Displays am Arduino

www.elvjournal.de

Arduino_verstehen_Teil_14.indd 66 21.12.15 11:44


So funktionierts 67

Neben dem Arduino selbst sind meist nur


CA/CC
noch wenige Bauelemente erforderlich,
um ein vollstndiges Gert aufzubauen. f g ab
Wird der Controller beispielsweise mit ei-
a
ner 7-Segment-LED-Anzeige kombiniert, f b
so entsteht eine sehr universell nutzbare g

Plattform, auf der sich viele interessante e c

Projekte realisieren lassen. Einige Bei- d


DP
spiele dazu wie
eine einzelne 7-Segment-Anzeige e d c DP
ein 4-stelliges Display CA/CC
eine Digitaluhr
Bild 1: Typische Pin-Belegung
werden im folgenden Artikel ausfhrlicher einer einzelnen 7-Segment-An-
beschrieben. zeige

Einfach und preisgnstig: 7-Segment-Displays


Ziffern knnen mit sogenannten 7-Segment-Anzeigen einfach und ef-
zient dargestellt werden. Derartige Anzeigen bestehen hug aus acht
LED-Elementen (sieben Segmente plus Dezimalpunkt).
Die LED-Segmente sind in der Form einer Acht angeordnet. Durch
entsprechende Aktivierung bestimmter Elemente knnen so die Ziffern
von 0 bis 9 in gut lesbarer Form dargestellt werden.
Darber hinaus lassen sich auch noch einige Grobuchstaben anzei-
gen (z. B. A, C, E, F etc.). Mchte man weitere Buchstaben anzeigen, Bild 2: Ansteuerung einer einzelnen 7-Segment-Anzeige
msste man Sechzehn-Segment-Anzeigen einsetzen. Diese sind aber
vergleichsweise wenig verbreitet und daher teuer.
Eine andere Mglichkeit, um Buchstaben und einfache Graken anzu-
zeigen, bieten die sogenannten Punktmatrix-Displays. Diese werden in
einem spteren Artikel zu dieser Serie beschrieben.
7-Segment-Anzeigen werden in den verschiedensten Formen, Farben
und Anschlussbelegungen hergestellt. Ein weit verbreiteter Typ ist in
Bild 1 dargestellt. Die einzelnen Segmente werden blicherweise mit
den Buchstaben a bis g bezeichnet. Die Anschlsse sind entweder die
gemeinsame Anode (Common Anode: CA) oder die gemeinsame Katode
(Common Cathode, CC) der Segmente, je nach Displaytyp.
Bild 2 und 3 zeigen, wie die 7-Segment-Anzeige an einen Arduino
UNO angeschlossen werden kann. Unter Anwendung des sogenannten
Multiplex-Verfahrens kann man hier mit nur einem einzigen gemeinsa-

Bild 3: Die 7-Segment-Anzeige zeigt die Ziffer 7.


Anschluss der Display-Pins an die Arduino-Ausgnge D0 bis D7
Tabelle 1

men Vorwiderstand fr alle LED-Segmente auskom-


Arduino-Pin D0 D1 D2 D3 D4 D5 D6 D7
men.
Display-Pin a b DP c d e f g
Tabelle 1 verdeutlicht nochmals den Anschluss der
Display-Pins an die Arduino-Ausgnge D0 bis D7.

ELVjournal 1/2016

Arduino_verstehen_Teil_14.indd 67 21.12.15 11:44


68 So funktionierts

Der Sketch dazu sieht so aus: Die for-Schleife in der Loop zhlt die Ziffern 0
bis 9 ab. Die Darstellung der Ziffern erfolgt in der
Routine showDigit. Dort werden die Segmente ein-
// 7 segment LED display zeln aktiviert. Je nachdem, ob im numbers-Array
eine Null oder eine Eins steht, wird das aktuelle Seg-
// seven segment codes ment eingeschaltet oder nicht.
int numbers[10][8] =
Obwohl man bei einer Einzelziffer noch mit einer
//a b D c d e f g
statischen Ansteuerung arbeiten knnte, wurde hier
{{1,1,0,1,1,1,1,0}, // 0
{0,1,0,1,0,0,0,0}, // 1
bereits ein Multiplexverfahren implementiert.
{1,1,0,0,1,1,0,1}, // 2 Das bedeutet, dass zu einem gegebenen Zeitpunkt
{1,1,0,1,1,0,0,1}, // 3 immer nur ein Segment aktiv ist. Erst durch die ra-
{0,1,0,1,0,0,1,1}, // 4 sche Abfolge der Segmentumschaltung entsteht der
{1,0,0,1,1,0,1,1}, // 5 Eindruck einer stehenden Ziffer.
{1,0,0,1,1,1,1,1}, // 6
{1,1,0,1,0,0,0,0}, // 7 Das 4x7-Segment-LED-Display
{1,1,0,1,1,1,1,1}, // 8 Zu den Hauptvorteilen von 7-Segment-LED-Anzeigen
{1,1,0,1,1,0,1,1}, // 9 zhlt, dass sie auch aus grerer Entfernung noch
}; gut ablesbar sind. Durch die Lichtemission der LEDs
sind die Anzeigen selbst bei Dmmerung und Dun-
void showDigit(int Digit)
kelheit gut erkennbar. Ein vierstelliges Display mit
{ // clear all segments
for (int i=0; i<=7; i++) digitalWrite(i, LOW);
zustzlichen Dezimalpunkten ist dabei sehr univer-
for(int i=0; i<=7; i++) sell einsetzbar.
// select one segment after another Zum einen lassen sich damit gut Stunden und Mi-
{ if(numbers[Digit][i]==1) nuten fr eine Uhr oder Minuten und Sekunden fr
{ digitalWrite(i, HIGH); einen Timer darstellen. Andererseits ist auch eine
// segment on Anzeige mit zwei Vor- und zwei Nachkommastellen
delay(3); realisierbar. Damit lassen sich Spannungen oder
digitalWrite(i, LOW); Stromstrken gut anzeigen. Fr eine Temperaturan-
 VHJPHQWR zeige in Grad Celsius kann man sogar einen einfachen
}
Trick anwenden, um ein Grad-Zeichen darzustellen.
else delay(3);
Ein bliches 4x7-Segment-Display enthlt 32 LED-
// for time equalization
}
Elemente. 4 x 7 = 28 LEDs sind fr die Zifferndarstel-
} lung erforderlich. Dazu kommen dann noch beispiels-
weise 4 Dezimalpunkte.
void setup() Meist sind jedoch entweder alle Anoden oder alle
{ // pins 0 to 7 as outputs Katoden jeweils einer Ziffer zusammengefhrt. Dar-
for (int i=0; i<=7; i++) ber hinaus werden auch alle Anoden bzw. Katoden
pinMode(i, OUTPUT); der jeweiligen Segmente verbunden. Ein solches Dis-
} play weist dann nur 12 Pins auf:
7 Pins fr die Katoden der Displaysegmente
void loop()
a, b, c, d, e, f und g
{ for (int n=0; n<=9; n++)
1 Pin fr die Dezimalpunkte (DP)
for (int i=0; i<=30; i++) showDigit(n);
}
4 Anoden fr die Einer- (E), Zehner- (Z),
Hunderter- (H) und Tausender-Stelle (T)
Je nachdem, ob die Anoden oder Katoden zusammen-
gefasst sind, spricht man auch hier von Common-
Anode- (CA) oder Common-Cathode-Displays (CC).
Hier wird zunchst die Pin-Belegung in einem Array Neben der Einsparung von Pins hat die gemeinsa-
numbers festgelegt. me Herausfhrung von Anschlssen noch den Vorteil,
dass die betreffenden Anzeigen sehr leicht im soge-
nannten Zeitmultiplex betrieben werden knnen.
Tipp: Bild 4 zeigt wieder das Pinning einer gngigen
Angaben zur Pin-Belegung einer 7-Segment-Anzei- Displayversion, diesmal jedoch mit 4 Digits. Das
ge nden sich im Datenblatt. Unterscheidet sich Bauelement selbst ist in Bild 5 zu sehen.
die Pin-Belegung eines bestimmten Displays von Bild 6 zeigt, wie mit diesem Display-Typ Uhrzei-
der hier verwendeten Displayversion, dann kann ten bzw. Messwerte oder Temperaturen, inklusive des
entweder die Pin-Tabelle in der Software (Array Sonderzeichens , dargestellt werden knnen.
numbers) oder aber die Schaltung angepasst
werden. 4-stellige 7-Segment-Displays als
Basis fr Messgerte und Uhren
Mit einer einzelnen 7-Segment-Anzeige kann man
Im Setup werden alle erforderlichen Pins als Ausgn- bereits verschiedene Betriebszustnde, etwa einer
ge aktiviert. Wasch- oder Splmaschine, anzeigen oder lngere

www.elvjournal.de

Arduino_verstehen_Teil_14.indd 68 21.12.15 11:44


So funktionierts 69

Zahlenreihen sequenziell ausgeben. Fr die meisten


Anwendungen sind aber mehrere Ziffern erforderlich. T a f H Z b

Mit 4-stelligen Displays sind viele praxistaugliche a a a a


f f b f f b
Gerte wie Volt- und Amperemeter, Ohm-Meter oder T b
H Z b
E
auch Temperaturanzeigen realisierbar. g g g g
e c e c e c e c
d d d d
Displaytest e d DP c g E
In einem ersten Programm soll nun die Anzeige zu-
nchst getestet werden. Mit Hilfe der Include-Datei
display_driver.h fllt das Programm sehr kurz aus: Bild 4: Anschlussbelegung eines typischen 4x7-Segment-LED-
Displays

// 4x7 display test


#include display_driver.h

void setup()
{ DDRB = 0xFF; DDRD = 0x0F; // set ports B & D as output
}

void loop()
{ send_int_to_LCD(1234, 2);
}

Bild 5: 4x7-Segment-LED-Display

Es mssen lediglich die mit dem Display verbundenen


Ports als Ausgnge konguriert werden. Dies erfolgt
durch die direkten C-Anweisungen

DDRB = 0xFF; DDRD = 0x0F

da hier auch Pins genutzt werden, die nicht direkt


ber den klassischen Arduino-Befehl pinMode() er-
reichbar sind.

Dann kann ber

send_int_to_LCD(1234, 2);

eine beliebige Zahl (hier beispielsweise 1234) an


das Display gesendet werden. Das 2. Argument dieser Bild 6: Die 4x7-Segment-LED-Anzeige als Uhrendisplay oder zur
Funktion legt fest, an welcher Stelle der Dezimal- Anzeige von Temperaturen
punkt gesetzt werden soll. Dabei beginnt die Zh-
lung mit null fr die ganz linke Position.
Die Hauptarbeit wird natrlich in der Include-Da-
tei display_driver.h erledigt. Diese Datei wird im
bernchsten Abschnitt nher erlutert.
Zunchst soll hier aber noch eine praktische An-
wendung des LED-Displays in Form einer Digitaluhr
vorgestellt werden.

Digitaluhr mit LED-Display


Eine der klassischen Anwendungen von 4-stelligen
7-Segment-Anzeigen sind Digitaluhren. Der Eigenbau
einer solchen Uhr hat den groen Reiz, dass man bei
der Gestaltung vllig freie Hand hat. Bild 7 zeigt
eine Variante, die unter Verwendung eines Arduino
MICRO entstanden ist.
Auf den Boards ist die gesamte Elektronik, ein-
schlielich des Arduino MICRO, untergebracht. Hier
zeigt sich wieder der groe Vorteil der Bauform des
Arduino MICRO. Ein derartig kompakter Aufbau wre
mit einem Arduino UNO nicht mglich. Bild 7: Digitaluhr mit Arduino MICRO

ELVjournal 1/2016

Arduino_verstehen_Teil_14.indd 69 21.12.15 11:44


70 So funktionierts

Das Schaltbild zur Digitaluhr ist in Bild 8 zu sehen. Man erkennt, dass Der Display-Treiber
neben dem Arduino und dem Display selbst nur noch wenige Bauteile Der Vollstndigkeit halber wird hier noch der zugeh-
notwendig sind: rige Display-Treiber erlutert. Dieses Include-File ist
4x PNP-Universaltransistoren, z. B. BC557 auch wieder ein schnes Beispiel dafr, dass man bei
8x Widerstand 1 k1 der Programmierung des Arduino nicht ausschlielich
4x Widerstand 10 k1 mit den Befehlen der Arduino-IDE arbeiten muss. Man
Diese insgesamt 4 Transistoren und 8 Widerstnde reichen aus, um eine kann auch durchaus klassische C-Befehle einsetzen.
hochwertige Uhr aufzubauen. Im Programm werden im Array numbers zunchst
die einzelnen Ziffern gem der nachfolgenden Ta-
Wenn man die Beitrge dieser Artikel-Serie bislang aufmerksam durch- belle 2 codiert:
gearbeitet hat, bietet das Programm zur Uhr (siehe unten) keine Ver-
stndnisprobleme. Die drei Variablen sc, mn und hr sind die jeweiligen
Zhler fr Sekunden, Minuten und Stunden. Ein Zeitzhler timeCoun- Ziffer Binr a f b g c DP d e
ter wird zu jeder vollen Sekunde um den Wert eins erhht. Innerhalb 0 0b00010100 0 0 0 1 0 1 0 0
der Sekunde wird die aktuelle Uhrzeit laufend an das Display gesendet: 1 0b11010111 1 1 0 1 0 1 1 1
2 0b01001100 0 1 0 0 1 1 0 0
3 0b01000101 0 1 0 0 0 1 0 1
while (sc==tc) send_int_to_LCD(hr*100+mn, dotPos); 4 0b10000111 1 0 0 0 0 1 1 1

Tabelle 2
5 0b00100101 0 0 1 0 0 1 0 1
6 0b00100100 0 0 1 0 0 1 0 0
Erst wenn tc um eins weiterzhlt, wird der Dezimalpunkt umgeschaltet: 7 0b01010111 0 1 0 1 0 1 1 1
8 0b00000100 0 0 0 0 0 1 0 0
dotPos = 5 - dotPos; 9 0b00000101 0 0 0 0 0 1 0 1

Dabei bedeutet dotPos=1, dass der Punkt an der mittleren Position


leuchtet, whrend dotPos = 4 den Dezimalpunkt lscht, da diese Positi-
on physikalisch nicht vorhanden ist. Dann wird nur geprft, ob jeweils Soll z. B. die Ziffer 0 dargestellt werden, so mssen
60 Minuten vergangen sind und der Stundenzhler erhht werden muss alle Segmente bis auf das g-Segment leuchten. Da
bzw. ob nach 24 Stunden der Stundenzhler auf null zurckzusetzen ist. eine Anzeige mit gemeinsamer Anode gewhlt wur-
de, bedeutet dies, dass alle Ausgnge, bis auf den
am g-Segment angeschlossenen Pin, auf low liegen
mssen. Daraus ergibt sich ein Binrmuster fr die
// digital clock 0 von:
0b00010100
#include display_driver.h // include display driver entsprechend der ersten Zeile der Tabelle. Analog
#include TimerOne.h // include timer lib
knnen so auch alle anderen Ziffern codiert werden.
#dene intTime 1e6 // interrupt time = 1000000 us = 1.000 s
Auch andere Zeichen sind auf diese Weise darstellbar.
byte timeCounter = 0; // timeCounter
So kann das -Zeichen binr als
byte sc=00, mn=30, hr=17; // seconds, minutes, hours 0b00001111
byte dotPosition = 1; // position of decimal dot geschrieben und in einer Temperaturanzeige entspre-
chend eingesetzt werden.
void setup()
{ DDRB = 0xFF; DDRD = 0x0F; // set Ports B & D as output Die Routine
Timer1.initialize(intTime);
Timer1.attachInterrupt(tick); void send_int_to_LCD(int n, int dot)
}
verteilt die einzelnen Ziffern einer 4-stelligen Zahl
an die Digits des Displays. Danach werden zyklisch
die Digits 1 bis 4 fr die Einer-, Zehner-, Hunderter-
void loop()
{ sc=timeCounter;
und Tausender-Stelle aktiviert. Dabei wird ber die
if (sc= =60) Routine
{ timeCounter=0; sc=0; mn++;
if (mn= =60) void digit (unsigned int value, unsigned int pin)
{ mn=0; hr++;
if (hr= =24) hr=0; jeweils eine Ziffer dargestellt.
}
}
while (sc= =timeCounter) send_int_to_LCD(hr*100+mn, dotPosition);
dotPosition = 5 - dotPosition; // blink decimal dot @ position 1
}

void tick() {timeCounter++;}

www.elvjournal.de

Arduino_verstehen_Teil_14.indd 70 21.12.15 11:44


So funktionierts 71

Der vollstndige Treiber sieht damit so aus:

// display driver T a f H Z b
#include <avr/io.h>

const int numbers [10] =


{ 0b00010100, 0b11010111, 0b01001100, 0b01000101, 0b10000111,
e d DP c g E
0b00100101, 0b00100100, 0b01010111, 0b00000100, 0b00000101};

char DX000, D0X00, D00X0, D000X; // store single digits


char act_dig = 0; 5x 1k 3x 1k

// Write number at indicated position to display


void digit (unsigned int value, unsigned int pin) VCC
{ PORTB = numbers[value]; // send number to output
PORTD &= ~(1 << pin); // PinLow => current digit on
} 10k 10k
10k
10k
// set decimal dot, pos = 0 leftmost ... pos = 3 rightmost
// pos > 3 no dot
void set_dot (int pos)
{ if (pos < 4)
{ PORTB = 0b11111011;
PORTD &= ~(1 << pos);
}

32 4
}

U
void send_int_to_LCD(int n, int dot)
{ // distribute number to digits
DX000 = n/1000; n %= 1000;
D0X00 = n/100; n %= 100;
D00X0 = n/10; n %= 10; Bild 8: Schaltbild zur Digitaluhr
D000X = n;
// activate digits one after another
3257' E 'LJLWVR
switch(act_dig)
{ case 0: digit (D000X, 3); break;
case 1: digit (D00X0, 2); break; Weitere Infos:
case 2: digit (D0X00, 1); break;
case 3: digit (DX000, 0); break;
case 4: set_dot(dot); [1] G. Spanner: Arduino Schaltungsprojekte fr Pros,
} Elektor-Verlag 2012, Best.-Nr. CF-10 94 45, 39,80
act_dig++; if (act_dig == 5) act_dig = 0;
} [2] Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr
ELV, 2011, Best.-Nr. CF-10 20 44, 99,
[3] Grundlagen zur elektronischen Schaltungs-
technik nden sich in der E-Book-Reihe Elektronik!
(www.amazon.de/dp/B00OXNCB02)
[4] Lernpaket AVR-Mikrocontroller in C programmieren,
Franzis-Verlag 2012, Best.-Nr. CF-09 73 52, 39,95
Ausblick
Nachdem in diesem Beitrag die Anwendung und Ansteu- Preisstellung Dezember 2015 aktuelle Preise im Web-Shop
erung von ein- und mehrstelligen 7-Segment-Anzeigen
ausfhrlich diskutiert wurde, geht es im nchsten Bei-
trag um die Ansteuerung grerer LED-Displays mittels
einer exiblen Library.
Empfohlene Produkte/
Damit lassen sich auch Anzeigeeinheiten mit bis zu
12 Digits ansteuern. Neben Ziffern und Zahlen knnen Bauteile: Best.-Nr. Preis
dann auch kurze Textnachrichten ausgegeben werden. Arduino UNO CF-10 29 70 27,95
Darber hinaus stellt die Library auch Funktionen fr Arduino MICRO CF-10 97 74 24,95
die Ansteuerung von Dezimaltrennungszeichen und Dop- Mikrocontroller-Onlinekurs CF-10 20 44 99,
pelpunkten zur Verfgung. Damit lassen sich praktisch
alle gngigen Displayeinheiten efzient und komfortabel Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachb-
ansteuern. cher und Zubehr nden Sie unter: www.arduino.elv.de

ELVjournal 1/2016

Arduino_verstehen_Teil_14.indd 71 21.12.15 11:44


56 So funktionierts

Arduino verstehen
und anwenden
Teil 15: Multidigit-LED-Displays

www.elvjournal.de

Arduino_verstehen_Teil_15.indd 56 25.02.16 16:17


So funktionierts 57

Im letzten Beitrag wurden Anwendung und Funktionsweise von 7-Seg- leicht durch Ausmessen bestimmen. Hierzu benutzt
ment-Anzeigen ausfhrlich beschrieben. Durch den Einsatz der soge- man einfach eine Spannungsquelle mit geeignetem
nannten Multiplextechnik konnten Anzeigen mit bis zu 4 Digits aufge- Vorwiderstand (z. B. 1 k1) und testet die verschiede-
baut werden. Hierzu wurde ein Displaytreiber entwickelt, welcher fr nen Pins. Man muss dann nur noch notieren, wel-
die Ansteuerung der einzelnen LED-Segmente verantwortlich war. ches Segment bei einer bestimmten Kontaktierung
Wie aber aus frheren Artikeln bereits bekannt ist, stehen fr Ar- aueuchtet.
duino-Anwendungen hug umfangreiche Programmbibliotheken zur
Verfgung. Dies trifft auch auf die Ansteuerung von LED-Displays zu. Die Funktionen der Library
Fr die Displaysteuerung existieren sogar mehrere Varianten. Eine der Die SevenSeg-Library gestattet es, verschiedenste
umfangreichsten und ausgereiftesten ist die SevenSeg-Library. Wie b- Informationsformate zu benutzen. Es werden alle
lich kann diese unter http://sim.marebakken.com/SevenSeg.zip kosten- gngigen Arten von Displays untersttzt. Die Biblio-
los aus dem Internet geladen werden. Mittels dieser Bibliothek knnen thek kann fr einfache Aufgaben genutzt werden, sie
auch komplexe Displays mit bis zu 12 Digits angesteuert werden. Genau enthlt aber auch Funktionen, die den fortgeschrit-
genommen ist die Anzahl der Digits theoretisch sogar unbegrenzt, in tenen Anwender ansprechen.
der Praxis zeigt sich jedoch, dass Anzeigen mit mehr als 12 Stellen Zu den Leistungsmerkmalen der Library gehren
zu Problemen fhren. Im Rahmen dieses Artikels soll diese Bibliothek insbesondere:
etwas ausfhrlicher diskutiert werden. Natrlich werden auch wieder Untersttzung von Displays mit Dezimalpunkten,
Praxisbeispiele und Anwendungen vorgestellt, u. a. Trennungsdoppelpunkten oder Apostrophen
Ansteuerung von Anzeigeeinheiten mit bis zu 12 Digits Es sind sowohl CC- als auch CA-Displays ansprechbar
Numerische und alphanumerische
Zeichendarstellung
Digitale Counter und Frequenzzhler mit
d ig 1 d ig 2 d ig 3 d ig 4
hoher Ausung

Multiplexbetrieb grerer
Displayeinheiten
Im letzten Artikel wurde das Prinzip des
Zeitmultiplex erlutert. Dabei kam auch ein
Displaytreiber zum Einsatz, der an verschie-
dene Anzeigeeinheiten angepasst werden
konnte. A B C D E F G

Hier soll nun die Anwendung der Biblio-


theksfunktionen im Vordergrund stehen. Bild 1: Display mit gemeinsamer Anode (CA)
Zunchst kann man mehrstellige 7-Seg-
ment-Anzeigen in zwei Gruppen einteilen:
CA: Bauelemente mit gemeinsamer Anode A B C D E F G
(fr Common Anode) siehe Bild 1 (zu-
gehriges Schaltbild)
CC: Bauelemente mit gemeinsamer Kato-
de (fr Common Cathode) siehe Bild 2
(zugehriges Schaltbild)

Den internen Aufbau eines speziellen Dis-


plays kann man dem zugehrigen Daten-
blatt entnehmen. Falls zu einem bestimm- d ig 1 d ig 2 d ig 3 d ig 4

ten Display keine Informationen erhltlich


sind, kann man das Pinning aber auch sehr Bild 2: Display mit gemeinsamer Katode (CC)

ELVjournal 2/2016

Arduino_verstehen_Teil_15.indd 57 25.02.16 16:17


58 So funktionierts

Bild 3: Nahezu mathematische Genauigkeit: die ersten 12 Ziffern der Zahl Pi

Darber hinaus sind Routinen enthalten, welche die folgenden Anzeigeformate untersttzen:
Verschiedene Zahlenformate wie Ganzzahlen, Festkomma- oder Fliekommazahlen
Textausgabe
Anzeigen von Uhrzeiten im hh:mm- oder mm:ss-Format
Automatisches Multiplexing mit einstellbarer Wiederholrate
Einstellung der Displayhelligkeit ber das PWM-Taktverhltnis der Ansteuerung
Einsatz von Timer-Interrupts in der Multiplexsteuerung
Vermeidung sogenannter Schattenartefakte

Ansteuerung einer 12-stelligen Anzeige


In einem ersten Anwendungsbeispiel soll eine 12-stellige CA-Anzeige (siehe Bild 3) mittels
der Bibliothek angesteuert werden.
Die gemeinsamen Anoden knnen direkt mit den Arduino-Ports verbunden werden. Die
Segment-Pins des Displays werden ber geeignete Vorwiderstnde mit den Arduino-Aus-
gngen verbunden. Fr erste Experimente knnen hier 1-k1-Widerstnde verwendet wer-
den. Falls die Anzeige damit zu dunkel erscheint, knnen die Widerstandswerte reduziert
werden. Wenn ein Datenblatt zum Anzeigemodul vorliegt, kann man die Widerstandswerte
natrlich auch aus den erlaubten Maximalstrmen berechnen und so die optimale Hel-
ligkeit des Displays nutzen. Weitere Details zum Anschluss des Displays an den Arduino
nden sich auch im letzten Beitrag zu dieser Artikelserie.
Der Sketch dazu sieht folgendermaen aus:

// 12x7-segment LED display

#include <SevenSeg.h>

// segments a b c d e f g
SevenSeg disp (7 ,5 ,3 ,1 ,0 ,6 ,4);

const int numOfDigits=12;


// Arduino pins A4 A3 A2 A5 A0 A1 D12 D13 D8 D9 D10 D11
// digit 12 11 10 9 8 7 6 5 4 2 2 1
int digitPins [numOfDigits]={ 18, 17, 16, 19, 14, 15, 12, 13, 8, 9, 10, 11};
char str[12];

void setup ()
{ disp.setDigitPins (numOfDigits, digitPins);
}

void loop ()
{ disp.write("314159265359");
}

Die Segmente a bis g werden also der Reihe nach an die Digital-Pins D7, D5, D3, D1, D0, D6
und D4 des Arduinos angeschlossen.
Die gemeinsamen Digit-Pins 1 bis 12 des Displays werden entsprechend mit den noch
freien Arduino-Ausgngen D8 bis D12 sowie mit den Analog-Ports A0 bis A5 verbunden.
Dabei ist zu beachten, dass in diesem Fall die Analog-Pins A0 bis A5 als Digitalausgnge
D14 bis D19 geschaltet werden.

Hardware-Varianten
Eine besondere Strke der SevenSeg-Bibliothek ist die Mglichkeit zur Einstellung ver-
schiedenster Hardware-Varianten. So kann die Belegung der Digit- und Segment-Pins mit

www.elvjournal.de
www.
w.elvjournal
a .de

Arduino_verstehen_Teil_15.indd 58 25.02.16 16:17


So funktionierts 59

Bild 4: CC-Display
mit Transistor-Trei- A B C D E F G
bern

d ig 1 d ig 2 d ig 3 d ig 4

der Funktion
SevenSeg(A, B, C, D, E, F, G);
beliebig festgelegt werden. Fr A bis G sind lediglich
die Port-Pins anzugeben, an welche die Segmente A
bis G angeschlossen sind.
Entsprechend kann mit
void setDigitPins(numOfDigits, Digit-
Pins);
die Anzahl der Digits und deren Anschlussreihenfol- Bild 5: Darstellung von Informationstexten mit 7-Segment-An-
zeigen
ge festgelegt werden. Die Anzahl der anzuzeigenden
Stellen ist dabei in numOfDigits anzugeben, die Pin-
Reihenfolge wird durch das Array DigitPins deniert.
ber die Funktionen
void setCommonAnode();
void setCommonCathode(); a
wird die Topologie des Displays festgelegt. Wird kei-
f b
ne Topologie angegeben, dann wird ein CA-Display
als voreingestellter Wert angenommen. g
Die Funktion e c
void setActivePinState(segActive,
digActive); d
legt fest, ob die Segmente high- oder low-aktiv sind.
Diese Funktionen werden bentigt, wenn Treiber-
transistoren zum Einsatz kommen. Dies wird erfor- Bild 6: Darstellung des Buchstaben W in der
SevenSeg-Library
derlich, wenn ein Arduino-Pin nicht gengend Strom
fr ein komplettes Digit liefern kann.
Bild 4 zeigt, wie in diesem Fall NPN-Transistoren
eingesetzt werden knnen, um hhere Strme zu anzeigen kann man sich allerdings gut behelfen, in-
treiben. Whrend ein Arduino-Pin nur maximal mit dem man geeignete Texte whlt.
20 mA belastet werden sollte, knnen mit Klein- Damit kann man bei Messgerten auch Statusan-
signal-Transistoren (z. B. BC547 o. .) problemlos zeigen oder Systemzustnde ausgeben, ohne dass ein
100 mA oder mehr geschaltet werden. Hier msste zustzliches Display eingebaut werden muss.
dann die zugehrige Programmzeile Bild 5 zeigt ein Anwendungsbeispiel fr die Aus-
setActivePinState (HIGH,HIGH); gabe der Information System full up in einem
eingefgt werden. 7-Segment-Display.
Die SevenSeg-Library untersttzt diese Anwen-
Darstellung alphanumerischer Zeichen dung. Fr die nicht eindeutig darstellbaren Zeichen
Wie bereits im letzten Artikel erwhnt wurde, knnen werden dabei Ersatzcodes verwendet. Fr den Buch-
mit 7-Segment-Anzeigen nicht nur Ziffern, sondern staben W werden beispielsweise die Segmente B, D
auch einige Buchstaben angezeigt werden. Aller- und F aktiviert (siehe Bild 6).
dings hat dieses Verfahren den Nachteil, dass nicht
alle Buchstaben gut erkennbar dargestellt werden Digitale Frequenzzhler
knnen. So kann beispielsweise der Grobuchstabe Anwendungen, welche viele Anzeigestellen benti-
B nicht von der Ziffer 8 unterschieden werden, da gen, sind beispielsweise Frequenzzhler und Counter.
in beiden Fllen alle 7 Segmente leuchten mssen. Da Frequenzen durch Verwendung von Quarzen mit
Auch die Buchstaben K oder W lassen sich praktisch hoher Genauigkeit erfasst werden knnen, ist es sinn-
nicht in leserlicher Form erzeugen. Fr viele System- voll, auch entsprechend viele Stellen anzuzeigen. Ein

ELVjournal 2/2016

Arduino_verstehen_Teil_15.indd 59 25.02.16 16:17


60 So funktionierts

Voltmeter kommt meist mit 3 bis 4 Stellen aus, da ware-Counter des Controllers auf dem Arduino. Mit
Spannungen mit moderatem Aufwand meist nur bis Hilfe dieses Counters knnen Impulse mit hoher Pr-
auf 0,1 % genau gemessen werden knnen. Entspre- zision erfasst werden.
chendes gilt fr Strom- und Widerstandsmessungen. Weitere Informationen zu den internen Hard-
Elektronische Quarze liefern dagegen problemlos ware-Timern des Arduino-Controllers nden sich in
eine Genauigkeit im ppm-Bereich, d. h. Abweichun- [5] und im Teil 11: Timer und Counter zu dieser Ar-
gen liegen in der Grenordnung von 1:1.000.000 tikelserie (siehe ELVjournal August/September 2015)
(parts per million). Damit man diese Przision auch unter Webcode #1433.
anzeigen kann, sind Displays mit einer entsprechen- Die Impulszhlung erfolgt mit einer Torzeit von
den Stellenzahl erforderlich. 1000 ms = 1,000 s. Die Anzahl der Impulse gibt also
Die Frequenzmessung selbst wird wiederum durch direkt die an D5 angelegte Frequenz in Hz wieder. Die
eine Library vereinfacht. Unter Torzeit wird in der Programmzeile
http://interface.khm.de/index.php/ FreqCounter::start(1000) //
lab/interfaces-advanced/ angegeben.
arduino-frequency-counter-library/ Im Setup wird eine erste Dummy-Messung ausge-
kann diese wieder kostenlos aus dem Netz geladen fhrt, um Fehlmessungen aufgrund von undenierten
werden. Werten im Zhlerpuffer zu vermeiden. In der Haupt-
Die Library erfasst Frequenzimpulse ber den schleife wird dann kontinuierlich die anliegende Fre-
Arduino-Pin D5, da dieser in der Sekundrfunktion quenz gemessen und an das 7-Segment-Display aus-
als T1 dient. T1 ist der Eingang fr den 16-Bit-Hard- gegeben.

// Frequency display
// using 12x7-segment LED display
// **** for ATmega328, i. e. Arduino UNO ****
// use A0 as D14, A1 as D15, ...

#include <SevenSeg.h>
#include <FreqCounter.h>
RDWIUT

// a b c d e f g
SevenSeg disp (7 ,8 ,3 ,1 ,0 ,6 ,4);

const int numOfDigits =10;


int digitPins [numOfDigits]={ 18, 17, 16, 19, 14, 15, 12, 13, 10, 11};

char buf[14];

void setup ()
{ disp.setDigitPins (numOfDigits, digitPins);
for (int i = 0; i < 300; i++)
// dry run for settling
FreqCounter::f_comp=100; // Cal Value
FreqCounter::start(1000); // 1000 ms Gate Time
while (FreqCounter::f_ready == 0)
disp.write("counter up");
delay(10);
}

void loop ()
{ FreqCounter::f_comp=100;
FreqCounter::start(1000);
while (FreqCounter::f_ready == 0)
{ frq = FreqCounter::f_freq;
dtostrf(frq, 7, 0, buf);
disp.write(buf);
disp.write(" Hz");
}
}

www.elvjournal.de

Arduino_verstehen_Teil_15.indd 60 25.02.16 16:17


So funktionierts 61

Der Frequenzzhler in Aktion

Der Frequenz-Messwert frq wird dazu ber die Funktionen Schlielich wird noch ber
dtostrf(frq, 7, 0, buf); disp.write(" Hz");
in eine Puffer-Zeichenkette buf umgewandelt. Beim Befehl dtostrf die Einheit der Frequenzmessung (Hz fr Hertz) ein-
handelt es sich um eine Standart-C-Funktion, die eine Dezimalzahl in geblendet.
eine ASCII-Zeichenkette umwandelt. Die maximal messbare Frequenz liegt bei ca.
Die Parameter 7 und 0 steuern die Formatierung. Der neue String ent- 4 MHz; ein Wert, der fr viele Anwendungen vollkom-
hlt so mindestens 7 Zeichen und 0 Nachkommastellen. Auf diese Weise men ausreichend ist. Die Messgenauigkeit wird ledig-
wird die Frequenz rechtsbndig im LED-Display dargestellt. Fehlende lich durch den 16-MHz-Quarz des Arduino begrenzt.
Stellen werden durch Blanks aufgefllt, so dass keine unschnen fh- Sie betrgt typischerweise nur wenige ppm und ist
renden Nullen entstehen. somit fr die meisten nicht professionellen Anwen-
Weitere Details zu diesen Funktionen nden sich in [5] und [6]. dungen vollkommen ausreichend.
Durch die Kombination dieser beiden Funktionen wird erreicht, dass die
Frequenz an der korrekten Position im Display ausgegeben wird. Ausblick
Der Wert wird dann in Nachdem in diesem Beitrag die Anwendung und An-
disp.write(buf); steuerung von mehrstelligen 7-Segment-Anzeigen
angezeigt. ausfhrlich diskutiert wurde, wird im nchsten Seri-
enbeitrag die sogenannte LED-Punktmatrix-Display-
technologie im Vordergrund stehen.
Im Gegensatz zu den 7-Segment-Anzeigen erlaubt
Weitere Infos: dieser Displaytyp auch die klar lesbare Darstellung
aller Buchstaben des Alphabets.
Darber hinaus ist sogar die Anzeige einfacher
[1] G. Spanner: Arduino Schaltungsprojekte fr Pros, Graken mglich. Durch Zusammenfgen mehrerer
Elektor-Verlag 2012, Best.-Nr. CG-10 94 45, 39,80 Matrixeinheiten knnen auf diese Weise auch grere
[2] Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV, Displays aufgebaut werden, bis hin zu den bekannten
2011, Best.-Nr. CG-10 20 44, 99, Mega-Werbechen auf ffentlichen Pltzen, Flugh-
fen oder Bahnhfen.
[3] Grundlagen zur elektronischen Schaltungs-
technik nden sich in der E-Book-Reihe Elektronik!
(www.amazon.de/dp/B00OXNCB02)
[4] Lernpaket AVR-Mikrocontroller in C programmieren,
Franzis-Verlag 2012, Best.-Nr. CG-10 68 46, 129,
Empfohlene Produkte Best.-Nr. Preis
[5] G. Spanner: AVR-Mikrocontroller in C programmieren,
Franzis-Verlag 2010, Best.-Nr. CG-09 73 52, 39,95 Arduino UNO CG-10 29 70 27,95
Mikrocontroller-Onlinekurs CG-10 20 44 99,
[6] G. Spanner: AVR-XMEGA-Mikrocontroller,
Elektor-Verlag 2015, Best.-Nr. CG-12 07 62, 39,80
Alle Arduino-Produkte wie Mikrocontroller-Platinen,
Shields, Fachbcher und Zubehr nden Sie unter:
Preisstellung Februar 2016 aktuelle Preise im Web-Shop www.arduino.elv.de

ELVjournal 2/2016

Arduino_verstehen_Teil_15.indd 61 25.02.16 16:17


64 So funktionierts

Arduino verstehen
und anwenden
Teil 16: Einsatz und Anwendung von LED-Matrizen

www.elvjournal.de

Arduino_verstehen_Teil_16.indd 64 19.04.16 08:32


So funktionierts 65

Die LED-Punktmatrix als


universelle Displayeinheit
Nachdem in den beiden letzten Tei-
len dieser Artikelserie der Einsatz von
7-Segment-Anzeigen ausfhrlich darge-
stellt wurde, soll in diesem Beitrag ein
weiteres sehr populres Display im Vor-
dergrund stehen.
Im Gegensatz zu den 7-Segment-An-
zeigen knnen mit sogenannten Punkt- Bild 1: Insbesondere in asiatischen Lndern sind LED-Punkt-Matri-
matrix-Anzeigen nicht nur Ziffern, sondern auch alle zen sehr beliebt.
Buchstaben des Alphabets gut lesbar dargestellt wer-
den. Darber hinaus ist auch die Erzeugung einfacher
Symbole und Graken mglich.
LED-Punktmatrizen, oft auch als Dot-Matrix-Dis-
plays bezeichnet, sind inzwischen weit verbreitet.
Man ndet sie an ffentlichen Verkehrsmitteln ge-
nauso wie in allen Groughfen der Welt, in Brsen-
slen zeigen sie als sogenannte Live-Ticker aktuel-
le Wertpapierkurse an.
Aus naheliegenden Grnden erfreuen sich Dot-Ma-
trizen insbesondere im asiatischen Raum groer
Beliebtheit (Bild 1). Matrix-Displays sind in den
verschiedensten Bauformen erhltlich. Bild 2 zeigt
beispielsweise eine LED-Matrix mit 5 x 7 = 35 LEDs.

LED-Punktmatrix im Multiplexbetrieb
Die Ansteuerung der 5x7-Punktmatrix knnte mit Bild 2: 5x7-LED-Matrix: Die 1 links unten kennzeichnet meist Pin 1.
36 Leitungen erfolgen: z. B. mit 35 Anodenanschls-
sen und einer gemeinsamen Kathode. Wesentlich
einfacher ist es aber, die LEDs als echte Matrix an-
zusteuern. GND 5V GND GND
Hierbei werden jeweils die 5 LEDs in einer Spalte
bzw. die 7 LEDs in eine Zeile zusammengeschaltet.
Anstelle der 36 Anschlussleitungen sind nun nur
noch 5 + 7 = 12 Anschlsse zu beschalten. 5V
Das Ansteuerungsprinzip der Matrix ist in Bild 3
dargestellt. Zur Vereinfachung wurde hier eine
3x4-Matrix gewhlt. Statt der 13 Anschlsse fr eine GND
Einzelansteuerung der LEDs sind hier nur 7 Verbin-
dungen erforderlich.
5V
Um nun beispielsweise die zweite LED in der zwei-
ten Zeile zu aktivieren, mssen bis auf den zweiten
alle Zeilenanschlsse auf High gelegt werden. Der
zweite Anschluss dagegen muss GND-Potential fh-
ren. Bei den Spalten darf ausschlielich die zweite
Spalte High-Potential aufweisen. Bild 3: Prinzip der Punktmatrix-Ansteuerung

ELVjournal 3/2016

Arduino_verstehen_Teil_16.indd 65 19.04.16 08:32


66 So funktionierts

Anschluss der LED-Punktmatrix Der springende Punkt


an den Arduino Das folgende Programm aktiviert eine Matrix-LED nach der anderen.
Die Bilder 4 und 5 zeigen, wie die Matrix an den Ar- Dabei wird in der linken oberen Ecke begonnen und dann jeweils eine
duino angeschlossen werden kann. Spalte durchlaufen. Anschlieend folgt die nchste Spalte.
Beim Einbau der Matrix ist darauf zu achten, dass Auf diese Weise entsteht der Eindruck, dass ein Lichtpunkt hnlich
Pin 1 auf den nachfolgenden Aufbaubildern links un- wie ein Ball von links nach rechts durch die Anzeige springt.
ten liegt. Falls Ihr Display ein anderes Verhalten zeigt, sollten Sie nochmals die
Verbindungen zum Mikrocontroller prfen.

WICHTIG:
Sie sollten die Ansteuerschaltung mit grter // running dot on 7x5 matrix LED display
Sorgfalt aufbauen. Falls ein erforderlicher Wider-
stand fehlt oder falsch eingesetzt ist, kann das GHQHURZDQGFROXPQSLQV
zur Zerstrung einzelner Matrix-LEDs fhren! LQWFRO>@ ^` GHQLWLRQRISLQRXWURZV
LQWURZ>@ ^` GHQLWLRQRISLQRXWFROXPQV

void setup()
Am besten geht man beim Anschluss der Matrix an ^IRU LQWL LL  LQLWLDOL]HFROXPQV
den Arduino in der Reihenfolge der Controllerpins ^SLQ0RGH FRO>L@287387 
vor. Verbinden Sie also zunchst den Digital-Pin D1 GLJLWDO:ULWH FRO>L@/2: 
mit dem Dot-Matrix-Pin 4, dann den Digital-Pin D2 `
mit dem Dot-Matrix-Pin 5 usw. Nicht vergessen, die IRU LQWL LL  LQLWLDOL]HURZ
Vorwiderstnde korrekt mit einzuschleifen! ^SLQ0RGH URZ>L@287387 
GLJLWDO:ULWH URZ>L@+,*+ 
`
`

void loop()
^IRU LQW[ [[  VHOHFWFROXPQV
^GLJLWDO:ULWH FRO>[@+,*+ 
IRU LQW\ \\  FOHDUURZV
GLJLWDO:ULWH URZ>\@+,*+ 
IRU LQW\ \\  VHWGRW#URZV
^GLJLWDO:ULWH URZ>\@/2: 
GHOD\  
GLJLWDO:ULWH URZ>\@+,*+ 
`
GLJLWDO:ULWH FRO>[@/2: 
`
`

Darstellung von Ziffern und Buchstaben auf


dem LED-Display
Natrlich kann man das Matrix-Display auch sinnvoller nutzen. Eine sehr
wichtige Anwendung von Matrix-Anzeigen ist die Darstellung von alpha-
numerischen Zeichen.
Dazu mssen nur die Zahlen als grasche Muster codiert werden. Will
Bild 4: Schaltbild zum Anschluss der LED-Matrix an den Arduino
man beispielsweise eine 1 darstellen, so mssen die Spalten nacheinan-
der die folgenden Muster zeigen:
010
110
010
010
010
D. h., in die Spalten mssen die Werte 00010, 11111, 00000 geschrie-
ben werden (die Zhlung der Zeilen muss hier von unten nach oben
erfolgen, da der Nullpunkt links unten liegt).
Wandelt man die Binrcodes in Dezimalzahlen um:
00010 -> 2
11111 -> 31
00000 -> 0
ergibt sich der Code fr die 1:
Bild 5: Aufbaubild zu Bild 4 int n[][3] = { 0, 31, 2}, // 1

www.elvjournal.de

Arduino_verstehen_Teil_16.indd 66 19.04.16 08:32


So funktionierts 67

Wenn man das Programm Number Display genau


analysiert, kann man feststellen, dass das Feld n[][3]
genau diese Zahlenfolge enthlt. Im Hauptprogramm
muss dann nur noch dafr gesorgt werden, dass die
Spalten nacheinander in schneller Reihenfolge ange-
zeigt werden.
Das Verfahren, einzelne LED-Segmente (in unse-
rem Fall die Spalten des Displays) schnell nachein-
ander anzuzeigen, ist weit verbreitet und entspricht
wieder dem bekannten Zeitmultiplexing. Betrgt die
Frequenz, mit der die einzelnen LEDs angesteuert
werden, mehr als ca. 70 Hz, so kann das Auge dem
schnellen Wechsel nicht mehr folgen und es entsteht
der Eindruck einer kontinuierlichen Anzeige.
Bild 6 zeigt die Matrix-Anzeige in Aktion. Will man Bild 6: Zifferndarstellung
neben den Ziffern auch Buchstaben (Bild 7) anzei-
gen, so kann man die zugehrigen Codes analog zu
den Ziffern erzeugen.
Auf diese Weise lassen sich die Buchstaben des
Alphabets sehr viel besser darstellen als mit nur 7
Segmenten. Will man die Lesbarkeit noch weiter stei-
gern, so muss man pro Buchstabe ein volles 7x5-Ma-
trixelement verwenden. Dann knnen auch breite
Buchstaben wie M oder W problemlos angezeigt wer-
den.
Natrlich kann man auf diese Weise auch einfache
Graken wie Sternchen oder Smileys erzeugen.

Bild 7: Alphanumerische Zeichendarstellung mit einer LED-Matrix

// number display on 7x5 dot matrix YRLGVKRZ0DWUL[ LQWGLVSOD\BQXPEHU 


^WHQV GLVSOD\BQXPEHU
LQWWHQVRQHVGLJLWVRQGLVSOD\ RQHV GLVSOD\BQXPEHU
LQWGLVSOD\BQXPEHU
IRU LQW[ [ [ RQHVGLJLW
GHQHOLQHDQGFROXPQSLQV ^GLJLWDO:ULWH [+,*+ 
LQWFRO>@  ^` 3257% aQ>RQHV@>[@
LQWURZ>@  ^` GHOD\  
GLJLWDO:ULWH [/2: 
LQWQ>@>@  ^^`  `
  ^`  IRU LQW[ [ [ WHQVGLJLW
  ^`  ^GLJLWDO:ULWH [+,*+ 
  ^`  3257% aQ>WHQV@>[@
  ^`  GHOD\  
  ^`  GLJLWDO:ULWH [/2: 
  ^`  `
  ^`  `
  ^` 
  ^``  void loop()
^VKRZ0DWUL[  
void setup() `
^IRU LQWL LL 
SLQ0RGH FRO>L@287387 
IRU LQWL LL 
SLQ0RGH URZ>L@287387 
`

ELVjournal 3/2016

Arduino_verstehen_Teil_16.indd 67 19.04.16 08:32


68 So funktionierts

In den nchsten beiden Beitrgen wird dabei das


LC-Display im Vordergrund stehen. Die einfachere
Form stellen dabei alphanumerische Anzeigeeinhei-
ten dar. Sie knnen beispielsweise 2 Textzeilen zu
je 16 Zeichen darstellen. Diese knnen ber wenige
Leitungen angesteuert werden. Mit geeigneten Bib-
liotheken stellt die Ansteuerung derartiger Displays
mit dem Arduino kein Problem dar.
Aber auch grakfhige Anzeigen sind vom Arduino
aus steuerbar. Mit vergleichsweise geringem Aufwand
knnen damit sehr ansprechende Anzeigeeinheiten
realisiert werden.
Auf diese Weise lassen sich bereits professionell
Bild 8: 8x16-Matrix, angesteuert ber MAX7219-Treiber
wirkende Kleingerte fr die unterschiedlichsten An-
wendungen aufbauen. Temperaturen, Spannungen
oder andere Messwerte knnen damit genauso ein-
Verwendung von Displaytreibern fach und przise dargestellt werden wie Uhrzeiten
Ein Nachteil der direkten Ansteuerung von Punktmatrizen mit dem Ar- und kurze Textnachrichten.
duino ist, dass dafr bereits ein groer Teil der Rechenleistung des
Controllers bentigt wird. Wenn zustzlich noch andere Aufgaben wie
beispielsweise das Auslesen von Sensorwerten erledigt werden sollen,
dann stt der Arduino schnell an seine Grenzen.
Auch die Ansteuerung von greren Displays mit hundert oder mehr
LEDs bereitet schnell Probleme. Zum einen aufgrund der erforderlichen
Rechenleistung, zum anderen stellt auch die Anzahl der verfgbaren
Pins eine Limitierung dar. Weitere Infos:
Der Einsatz von kostengnstigen Displaytreibern kann hier Abhilfe
schaffen. Ein geeigneter Typ ist z. B. ein IC des Typs MAX7219. Diese
integrierte Schaltung von Maxim ist in der Lage, eine 8 x 8 = 64 Punkte
G. Spanner: Arduino Schaltungsprojekte
groe Matrix anzusteuern. Alternativ knnen auch bis zu 8 Ziffern einer
fr Pros, Elektor-Verlag 2012,
7-Segment-Anzeige angeschlossen werden. Die Treiber verfgen ber
Best.-Nr. CH-10 94 45, 39,80
eine SPI-kompatible Schnittstelle, die am Arduino lediglich 3 digitale
Ausgnge belegt. Ein umfangreiches Datenblatt zu den ICs ist auf der Mikrocontroller-Onlinekurs, Franzis-Verlag,
Homepage des Herstellers Maxim als PDF-Datei verfgbar. exklusiv fr ELV, 2011,
Eine geeignete Library zur Ansteuerung der Maxim-ICs ndet sich Best.-Nr. CH-10 20 44, 99,
unter:
Grundlagen zur elektronischen Schaltungs-
https://github.com/riyas-org/max7219/tree/master/MaxMatrix technik nden sich in der E-Book-Reihe
Passende Beispiele, etwa fr die Darstellung von Laufschriften oder Elektronik! (www.amazon.de/dp/B00OXNCB02)
Tickern, sind auf dieser Web-Page unter Example zu nden.
Lernpaket AVR-Mikrocontroller in C
Der Anschluss des Treiberbausteins ist ebenfalls sehr einfach. Ledig-
programmieren, Franzis-Verlag 2012,
lich 3 Pins sind mit dem Arduino zu verbinden:
Best.-Nr. CH-10 68 46, 129,
MAX7219_data p Arduino D12
MAX7219_load p Arduino D10 Lernpaket Physical Computing,
MAX7219_clock p Arduino D11 Franzis-Verlag, 2015,
Best.-Nr. CH-12 21 81, 99,
Die Zeilen- und Spaltenpins der Matrix werden entsprechend ihrer Po-
laritt an die Segment- bzw. Digitanschlsse geschaltet. Schlielich ist G. Spanner: AVR-XMEGA-Mikrocontroller,
am Pin I_set noch ein einzelner Widerstand von ca. 10 k1 erforderlich, Elektor-Verlag 2015,
ber welchen die LED-Strme eingestellt werden. Best.-Nr. CH-12 07 62, 39,80
Damit knnen nahezu beliebig groe Displays aufgebaut werden. Der
Arduino wird kaum mehr belastet, da nur noch einzelne Kommandos
ber den SPI-Bus gesendet werden mssen.
Zudem bleiben noch ausreichend Pins frei, um externe Sensoren oder Preisstellung April 2016 aktuelle Preise im Web-Shop
andere Peripherie zu betreiben.
Der Realisierung von grochigen Anzeigen, etwa fr Werbezwecke Empfohlene Produkte Best.-Nr. Preis
oder Sportveranstaltungen, steht nun nichts mehr im Wege (Bild 8).
Arduino UNO CH-10 29 70 27,95
Ausblick Mikrocontroller-Onlinekurs CH-10 20 44 99,
Nachdem in den letzten Beitrgen verschiedene LED-Displays in 7-Seg-
ment- bzw. Dot-Matrix-Form erlutert und angewendet wurden, wird es
Alle Arduino-Produkte wie Mikrocontroller-Platinen,
im nchsten Beitrag um den Einsatz von weiteren Displaytechnologien Shields, Fachbcher und Zubehr nden Sie unter:
gehen. www.arduino.elv.de

www.elvjournal.de

Arduino_verstehen_Teil_16.indd 68 19.04.16 08:32


54 So funktionierts

Arduino verstehen
und anwenden
Teil 17: Alphanumerische LC-Displays

www.elvjournal.de

Arduino_verstehen_Teil_17.indd 54 28.06.16 14:36


So funktionierts 55

Will man mit einem Mikrocontroller umfangreichere Das Display kann auf zwei verschiedene Arten angesteuert werden,
Informationen darstellen, sind LC-Displays das Mit- im 8-Bit- oder im 4-Bit-Mode:
tel der Wahl. Im Gegensatz zu 7-Segment-Displays Im 8-Bit-Mode werden alle acht Datenleitungen zur Ansteuerung
knnen LCD-Punktmatrix-Anzeigen neben Ziffern verwendet, somit kann immer ein komplettes Byte bertragen
auch Buchstaben und andere Zeichen gut lesbar an- werden.
zeigen. Derartige Displays sind weit verbreitet und Im 4-Bit-Mode werden nur die oberen vier Datenleitungen (D4 bis
nden sich an Kaffee- oder Fahrkartenautomaten, D7) verwendet. Fr die bertragung eines Bytes sind somit zwei Zu-
Getrnkemaschinen, Geschftstelefonen usw. Ent- griffe erforderlich. Dabei wird zunchst das hherwertige Nibble
sprechend gro ist die Vielfalt der am Markt verfg- (= 4 Bits), also Bit 4 bis Bit 7 bertragen, dann folgt das Nieder-
baren Typen. wertige, also Bit 0 bis Bit 3. Die Datenleitungen D0 bis D3 des LCDs
Ein Display mit zwei Zeilen und 16 Zeichen pro Zeile bleiben unbeschaltet.
kann bereits 32 Zeichen darstellen. Meist werden fr Der 4-Bit-Mode hat den Vorteil, dass vier IO-Pins weniger bentigt wer-
die Anzeige eines einzelnen Zeichens 5 x 8 = 40 Pixel den. Der Nachteil der etwas geringeren Schreibgeschwindigkeit spielt
verwendet. Damit verfgt bereits ein kleines, zwei- meist keine Rolle, sodass die 4-Bit-Ansteuerung sehr hug zum Einsatz
zeiliges Display ber 32 x 40 = 1280 Bildpunkte. Hier kommt.
wird sofort klar, dass diese nicht mehr alle einzeln Fr die Displaysteuerung sind neben den vier Datenleitungen (D4,
ber die Arduino-Pins angesteuert werden knnen. D5, D6 und D7) noch die Anschlsse RS, R/W und E erforderlich.
Deshalb werden im Arduino-Umfeld auch praktisch ber RS (Register Select) wird ausgewhlt, ob man einen Befehl
ausnahmslos LC-Displays mit integrierten Hard- oder ein Datenbyte an das LCD schicken mchte. Ist RS low, dann
ware-Treibern eingesetzt. wird das ankommende Byte als Befehl interpretiert, ist RS high,
dann wird das Byte direkt auf dem LCD als Zeichen angezeigt.
Der Displaytyp HD44780 R/W (Read/Write) legt fest, ob geschrieben oder gelesen werden
als Quasi-Standard soll. High Potential bedeutet lesen, bei Low knnen Daten auf die
Fr kleinere Displays mit ein bis vier Zeilen und Displayeinheit geschrieben werden. Da man in den meisten Fllen
16 Zeichen pro Zeile hat sich hierfr im Lauf der Zeit nur Daten zum LCD sendet, kann man R/W fest auf GND legen und
ein gewisser Quasi-Standard etabliert. Die meisten
LC-Displays dieser Gre verwenden den Controller-
typ HD44780. Dieser Typ wurde ursprnglich von der Pin Symbol Level Funktion
Firma Hitachi entwickelt, ist aber inzwischen von 1 VSS L Stromversorgung OV (GND)
vielen anderen Herstellern bernommen worden.
2 VDD H Stromversorgung + 5 V
Dieser Displaytyp wird ber 14 Pins angesteuert,
3 VEE analog Kontrastspannung
bei vielen Modellen sind zwei weitere Pins fr den
Anschluss einer Hintergrundbeleuchtung vorgese- 4 RS H/L Umschaltung Befehl / Daten
hen. Die Standard-Pinbelegung zeigt Tabelle 1. 5 R/W H/L H = Read, L = Write
LCD-Anzeigemodule mit Hitachi-HDD44780-kom- 6 E H Enable (fallende Flanke)
patiblen Controllern existieren in zwei unterschied- 7 DO H/L Display Data, LSB
lichen Varianten. Die eine verfgt ber 16 Pins und 8 D1 H/L Display Data
ber eine Hintergrundbeleuchtung. Die einfachere
9 D2 H/L Display Data
Version kommt ohne Beleuchtung aus und besitzt
entsprechend nur 14 Pins. 10 D3 H/L Display Data
Die 14 Pins knnen von einem Arduino wieder pro- 11 D4 (DO) H/L Display Data
blemlos angesteuert werden. Die Spannung VEE sollte 12 D5 (D1) H/L Display Data
Tabelle 1

idealerweise ber ein 10-k1-Potentiometer zwischen 13 D6 (D2) H/L Display Data


GND und 5 V geschaltet werden, dann lsst sich der 14 D7 (D3) H/L Display Data, MSB
Displaykontrast gut einstellen. Bei vielen Display-
15 frei (evtl. LED-Hintergrundbeleuchtung)
typen gengt aber auch bereits ein Widerstand von
etwa 1 k1 nach Ground fr einen guten Kontrast. 16 frei (evtl. LED-Hintergrundbeleuchtung)

ELVjournal 4/2016

Arduino_verstehen_Teil_17.indd 55 28.06.16 14:36


56 So funktionierts

Bild 1: Anschluss eines zweizeiligen LCDs an


den Arduino UNO

AR E F
G ND
1 1 1 1 9 8 7 6 5 4 3 2 1 0
3 2 1 0
DIG IT AL
US B

P WM
P WM
P WM

P WM
P WM

P WM
ARDUINO RESET

A N A L O G IN
DC in
3.3 V

G ND
G ND
9V
5V

0 1 2 3 4 5

10k

150

1 4 5 6 12 14 16 162
Vs s

V ee
V dd

RS
R /W

D4
D5
D6
D7
E
/

> Line
Line 00
00: - O
OKK-
> Line
Line 01
01: - O
OKK-

so einen weiteren IO-Pin am Controller einsparen. diese Anzeigetypen die Grenzen des Mglichen erreicht. Immer wenn es
Man sollte dann jedoch nach jedem Befehl eine erforderlich ist, kleine Datenmengen in Form von kurzen Textmitteilun-
kurze Wartepause einlegen, um dem LCD-Control- gen oder Zahlenreihen auszugeben, kommen deshalb hug LCD-Anzei-
ler Zeit zum Ausfhren des Befehls zu geben. gen zum Einsatz (Bild 2).
Der E-(Enable)-Anschluss signalisiert dem LCD, LCDs weisen in ihrem Inneren Flssigkristalle auf, die in Abhngig-
dass die Datenleitungen die korrekten Pegel keit von einer angelegten Spannung ihre Ausrichtung ndern. Dadurch
angenommen haben und die Daten bernommen wird auf das Display treffendes Licht polarisiert. Unter Verwendung ge-
werden knnen. eigneter, fest eingebauter Polarisationslter kann so erreicht werden,
Bereits in Teil 5 Nutzung und Erstellung von Pro- dass ein bestimmter Displaybereich hell oder dunkel erscheint.
grammbibliotheken im ELVjournal 04/2014 wurde Auf diese Weise kann man hnlich wie bei der LED Matrix-Displays na-
gezeigt, wie ein Arduino Micro mit einer LCD-Einheit hezu beliebiger Gre aufbauen. Solche Anzeigeelemente nutzen meist
verbunden werden kann. Bild 1 zeigt eine hug ver- aus einzelnen Punkten zusammengesetzte Matrizen. Damit lassen sich
wendete Mglichkeit zur Verbindung eines LCDs mit alle Arten von Zeichen (Ziffern, Buchstaben oder Sonderzeichen) dar-
dem Arduino UNO. stellen. Darber hinaus existieren auch Sonderformen, bei welchen die
anzuzeigenden Muster bereits fest vorgegeben sind. Diese nden u. a.
Wie arbeitet die LCD-Anzeige? in Anzeigen fr bestimmte Betriebszustnde einer Maschine, in der Un-
Im Rahmen des Beitrags zu den LED-7-Segment-An- terhaltungselektronik und in der Kfz-Technik Anwendung.
zeigen und -Punktmatrizen wurde bereits diskutiert, Bei Punktmatrix-Displays knnen durch geeignete Ansteuerung der
wie einzelne Ziffern oder auch Buchstaben angezeigt einzelnen Punkte alle alphanumerischen Zeichen, d. h. alle Buchstaben
werden knnen. Doch wenn es darum geht, das ge- und Zahlen, gut lesbar dargestellt werden. Darber hinaus knnen auch
samte Alphabet oder auch Sonderzeichen wie z. B. *, einfache Graksymbole angezeigt werden (siehe Abschnitt Erzeugung
#, % etc. auf diese Weise darzustellen, dann haben von Sonderzeichen).

www.elvjournal.de

Arduino_verstehen_Teil_17.indd 56 28.06.16 14:36


So funktionierts 57

Echte grochige Graken bleiben dagegen den sogenannten Grak-


displays vorbehalten. Diese werden ausfhrlich im nchsten Beitrag zu
dieser Artikelserie beschrieben.

Darstellung von Zeichen und Texten Bild 2: LCD-Anzeige in Aktion


Fr die Ansteuerung des LC-Displays muss die Library LiquidCrystal
eingebunden werden (siehe Teil 5 Nutzung und Erstellung von Pro-
grammbibliotheken).
Fr die Erzeugung eines LCD-Objekts mssen die folgenden Parameter
bergeben werden: /&'FRQWURO
Pin Register Select (RS) LQFOXGH/LTXLG&U\VWDOK!
Pin Enable (E)
GHQH/&'BEDFNOLJKW
Pins der Datenleitungen D4 bis D7
GHQH565HJLVWHU6HOHFW
Dies erfolgt ber die Programmzeile
GHQH((QDEOH
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
GHQH'
Die Klasse LiquidCrystal stellt dann eine Reihe von Methoden zur Verf- GHQH'
gung, die die Ausgabe von Texten ermglichen. GHQH'
Die Methode begin teilt dem LCD-Objekt die Anzahl der Spalten und GHQH'
der Zeilen des angeschlossenen Displays mit. ber GHQH&2/6
lcd.begin(COLS, ROWS); GHQH52:6
wird die Anzahl der Zeichen pro Zeile (COLS) und die Zeilenzahl berge-
ben. Fr ein 16-stelliges Display mit zwei Zeilen ist also LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
GHQH&2/6
GHQH52:6 void setup()
^SLQ0RGH /&'BEDFNOLJKW287387 
zu setzen.
DQDORJ:ULWH /&'BEDFNOLJKW 
Die Methode print teilt dem LCD-Objekt mit, welche Zeichen an das
lcd.begin(COLS, ROWS);
Display gesendet werden sollen. Sie ist vergleichbar mit der Printanwei- OFGSULQW /LQH!2. 
sung des Serial-Monitors. OFGVHW&XUVRU  JRWROLQH
Werden keine Angaben zur Position des anzuzeigenden Textes ge- OFGSULQW /LQH!2. 
macht, wird er am Anfang der ersten Zeile gestartet. }
Die Methode setCursor positioniert den Cursor an die Stelle, an der
die nachfolgende Textausgabe starten soll. Die Methode ist nullbasiert, void loop(){}
d. h., die erste Zeile bzw. Spalte ist mit dem Index 0 versehen. Um in
die zweite Zeile zu gelangen, ist daher der Wert 1 im Zeilenindex anzu-
geben:
OFGVHW&XUVRU  JRWROLQH Erzeugung von Sonderzeichen
Die LCD-Methode clear besitzt keine Parameter, lscht alle Zeichen Eine weitere interessante Methode ist
aus der Anzeige und positioniert den Cursor in der linken oberen Ecke FUHDWH&KDU
an der Koordinate 0, 0. Damit ist es mglich, eigene Zeichen zu erstellen und
Es gibt HD44780-Varianten mit integriertem Vorwiderstand fr die diese auf dem Display auszugeben.
Hintergrundbeleuchtung. Hier knnen die Versorgungspins (Pins 15 und Das Pixelmuster eines beliebigen Zeichens ist hier
16) direkt mit +5 V und GND verbunden werden. Im Allgemeinen ist al- einfach als binres Feld zu denieren, hnlich wie es
lerdings ein Vorwiderstand erforderlich. Ein Blick in das entsprechende bereits bei den LED-Punktmatrizen (siehe vorherge-
Datenblatt hilft in diesem Falle weiter. Liegt kein Datenblatt vor, so henden Artikel) zur Anwendung kam:
kann man testweise einen 1-k1-Vorwiderstand einsetzen. byte smiley[8] =
Falls die Anzeige dann noch sehr dunkel erscheint, kann der Wider- { B00000,
standswert entsprechend angepasst werden. Natrlich muss man sich B00000,
bei diesem Vorgehen bewusst sein, dass man das Display eventuell au- %
erhalb seiner Spezikationen betreibt und deshalb mit einer verkrz- B00000,
ten Lebensdauer der Hintergrundbeleuchtung rechnen muss. B00000,
Will man die Helligkeit der Displaybeleuchtung softwareseitig steu- %
ern, so kann man die Versorgungsspannung der Hintergrund-LEDs mit %
einem PWM-Pin verbinden (z. B. Pin 9). ber B00000
GHQH/&'BEDFNOLJKW };

ber
SLQ0RGH /&'BEDFNOLJKW287387  OFGFUHDWH&KDU &+$5VPLOH\ 
DQDORJ:ULWH /&'BEDFNOLJKW  wird dann der entsprechende Charakter erzeugt. Die-
kann man die Helligkeit der Hintergrundbeleuchtung softwaretechnisch ser kann dann wieder mit
steuern. Falls das verwendete Display eine sehr hohe Stromstrke be- lcd.write();
ntigt (> 20 mA), ist ein entsprechender Treibertransistor vorzusehen. auf dem Display dargestellt werden.
Das vollstndige Programm zur Ansteuerung eines zweizeiligen LCDs Der folgende Sketch gibt so eine ganze Reihe von
sieht damit so aus: Sonderzeichen aus:

ELVjournal 4/2016

Arduino_verstehen_Teil_17.indd 57 28.06.16 14:36


58 So funktionierts

Bild 4: Groer Font

GHQH/&'BEDFNOLJKW
FKDUORYH NLG GHDWK 

byte smiley[8] =
{ B00000,
B00000,
%
Mithilfe selbst denierter Fonts ist sogar die Darstellung groer Zif-
B00000, fern und Zeichen mglich (Bild 4). Hierzu mssen lediglich die erfor-
B00000, derlichen Sonderzeichen festgelegt werden. Daraus knnen dann die
% groen Schriftzeichen zusammengesetzt werden. Eine Library hierzu
% ndet sich unter [2].
B00000
}; Ausblick
Wie in diesem Artikel gezeigt wurde, eignen sich textbasierte LC-Dis-
E\WHKHDUW>@  plays nicht nur zur Anzeige von einfachen Ziffern und Zeichen, sondern
^%%%%% sie erlauben darber hinaus, wenn auch in beschrnktem Umfang, die
%%%
Darstellung einfacher Graken.
};
Will man dagegen umfangreichere grasche Darstellungen anzei-
byte cross[8] = gen, kann man ein Display des Typs KS108 einsetzen. hnlich wie das
^%%%%% HD44780 werden KS108-Typen von verschiedenen Herstellern angebo-
%%% ten und es existiert eine Vielzahl von kompatiblen Modellen. Dieser
}; Displaytyp bietet eine Grakausung von immerhin 128 x 64 Pixeln.
Der nchste Artikel wird sich eingehend mit den Mglichkeiten der
LQFOXGHWKHOLEUDU\FRGH Grakdarstellung auf diesem Displaytyp beschftigen. Es wird dann u. a.
LQFOXGH/LTXLG&U\VWDOK! eine Quasi-Analoguhr entstehen, und auf einem PC erzeugte Bitmaps
werden vom Arduino auf das Display gezaubert werden.
LQLWLDOL]HWKHOLEUDU\
ZLWKLQWHUIDFHSLQV
/LTXLG&U\VWDOOFG  

void setup() Weitere Infos:


^SLQ0RGH /&'BEDFNOLJKW287387 
DQDORJ:ULWH /&'BEDFNOLJKW 
[1] Die Geschichte des braven Iren:
OFGEHJLQ  
OFGFUHDWH&KDU NLGVPLOH\ 
OFGFUHDWH&KDU ORYHKHDUW  [2] Library fr groe Fonts:
OFGFUHDWH&KDU GHDWKFURVV  http://code.google.com/p/phi-big-font/
}
G. Spanner: Arduino Schaltungsprojekte fr Pros,
void loop() Elektor-Verlag 2012, Best.-Nr. CI-10 94 45, 39,80
{ lcd.setCursor(0, 0);
OFGSULQW 7KHEUDYHPDQ  Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV, 2011,
OFGVHW&XUVRU   Best.-Nr. CI-10 20 44, 99,
lcd.print("* ");
lcd.write(love); lcd.print(" ");
Grundlagen zur elektronischen Schaltungs-
IRU LQWL L L OFGZULWH NLG OFGSULQW  
OFGZULWH GHDWK 
technik nden sich in der E-Book-Reihe Elektronik!
} (www.amazon.de/dp/B00OXNCB02)

Lernpaket AVR-Mikrocontroller in C programmieren,


Franzis-Verlag 2012, Best.-Nr. CI-10 68 46, 129,
Aus Platzgrnden wurden hier die Bitmaps fr Heart
und Cross in komprimierter Form dargestellt. G. Spanner: Lernpaket Physical Computing, Franzis-Verlag 2015,
Best.-Nr. CI-12 21 81, 99,
Das Ergebnis auf dem Display sieht so aus wie in
Bild 3 dargestellt. Es stellt die Geschichte eines bra-
ven Iren in Kurzform dar [1]. Preisstellung Mai 2016 aktuelle Preise im Web-Shop

Empfohlene Produkte Best.-Nr. Preis


Arduino UNO CI-10 29 70 27,95
Mikrocontroller-Onlinekurs CI-10 20 44 99,
STN-LCD-Anzeigemodul, 2x 16 Zeichen CI-05 41 84 9,95

Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher


Bild 3: LCD-Anzeige mit selbst denierten Sonderzeichen und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_verstehen_Teil_17.indd 58 28.06.16 14:36


56 So funktionierts

Arduino verstehen
und anwenden
Teil 18: Grakdisplays

www.elvjournal.de

Arduino_verstehen_Teil_18.indd 56 26.08.16 16:18


So funktionierts 57

Im letzten Artikel zu dieser Serie wurde die Ansteuerung von alpha-


numerischen Displays ausfhrlich behandelt. Diese Displays sind fr die
Ausgabe von Texten, einfachen Daten und Messwerten vollkommen aus-
reichend. ber Sonderzeichen ermglichen sie sogar in sehr beschrnk-
tem Umfang grasche Darstellungen.
Mchte man allerdings echte hochausende Graken erzeugen, so
mssen entsprechend aufwendigere Displaytypen eingesetzt werden.
hnlich wie bei den zeichenorientierten Anzeigen der TYP HD44780
hat bei den graschen Displays die Controllerversion KS0108 eine Qua-
si-Standardfunktion bernommen.
Dieser Displaytyp bietet eine Ausung von 128 x 64 Pixeln. Dies mag Bild 1: Arduino-Testausgabe auf dem Grakdisplay
im Zeitalter der Megapixel-Kameras und HD-Monitore wenig erscheinen,
fr viele Mikrocontrolleranwendungen ist diese Ausung aber vollkom-
men ausreichend. Displays vom Typ KS0108 oder einer kompatible Ver- KS0108-kompatible Anzeigen eine Library verfgbar.
sion sind bereits fr deutlich unter 20 Euro erhltlich und stellen damit Die Lib kann unter [1] kostenlos aus dem Internet
eine kostengnstige Mglichkeit dar, einen Arduino zu einem grakf- geladen werden.
higen System aufzursten. Die Bibliothek enthlt mehrere Beispielprogram-
me. Um die korrekte Funktion des Displays zu testen
Anschluss des Grakdisplays an den Arduino kann der Beispielsketch
Im Vergleich zum zeichenbasierten Display sind beim Grakdisplay ks0108example.ino
deutlich mehr Verbindungsleitungen erforderlich. Zudem gibt es beim geladen werden. Er zeigt nach einem Begrungs-
KS0108 mehrere Varianten, die in der Tabelle mit Typ 1 bis Typ 3 ge- bildschirm verschiedene Fonts und schlielich eine
kennzeichnet sind. sich bewegende Grak an. Wenn das Display diese
Die Tabelle 1 zeigt, wie die Anzeigeeinheit mit dem Arduino Uno zu Ausgaben korrekt anzeigt, kann man davon ausge-
verbinden ist. Fr ein Display vom Typ 1 gilt dementsprechend z. B., hen, dass die Verbindung zwischen Displayeinheit
dass der Digital-Pin Nr. 8 des Arduinos mit dem Pin Nr. 7 des Displays und Arduino einwandfrei ist (siehe Bild 1).
verbunden werden muss usw. Die meisten KS0108-Varianten verfgen ber ein
Wenn man methodisch vorgeht, ist der Anschluss des Grakdisplays eingebautes Backlight. Dieses kann ber die Pins
trotz der 16 erforderlichen Verbindungsleitungen rasch erledigt. LED_A und LED_K versorgt werden.
Sie mssen ber einen geeigneten Vorwiderstand
Die GLCD-Library (z. B. 220 1) mit 5 V bzw. Ground des Arduinos ver-
Die Ansteuerung eines Grakdisplays ist natrlich mit erheblichem bunden werden. Die mit Pot bezeichneten Dis-
Aufwand verbunden. Wie im Arduino-Umfeld blich, ist aber auch fr play-Pins sind ber ein Potentiometer (z. B. 10 K1)

Digital-Pin
Arduino-Pin 5V Gnd Pot 8 9 10 11 4 5 6 7
Display-Typ 1 2 1 3 7 8 9 10 11 12 13 14
Display-Typ 2 1 2 3 4 5 6 7 8 9 10 11
Display-Typ 3 13 14 12 1 2 3 4 5 6 7 8

Analog-Pin Backlight-Versorgung
Tabelle 1

Arduino-Pin 0 1 2 3 4 LED_A LED_K Rst


Display-Typ 1 15 16 5 4 6 19 20 17
Display-Typ 2 12 13 15 16 17 19 20 14
Display-Typ 3 15 16 10 11 9 19 20 18

ELVjournal 5/2016

Arduino_verstehen_Teil_18.indd 57 26.08.16 16:18


58 So funktionierts

mit dem Arduino zu verbinden. Der Schleifer des Po- Die Analog-Uhr
tentiometers ist dabei an den jeweiligen Display-Pin Obwohl die Digitaltechnik in alle Lebensbereiche eingezogen ist, er-
zu legen. Die anderen beiden Anschlsse kommen an freuen sich quasi-analoge Technologien immer noch groer Beliebtheit.
die Versorgungsspannung bzw. den Ground des Ardui- Ein bekanntes Beispiel hierfr sind Analog-Uhren. Obgleich die eigent-
nos. Damit kann dann der Kontrast des Displays ma- liche Zeittaktung vollkommen digital erfolgt, ist die Anzeige der aktu-
nuell eingestellt werden. Im Zweifelsfall sollte man ellen Uhrzeit mit Zeigern auf einem Ziffernblatt immer noch aktuell.
hierzu auch das Datenblatt der Anzeigeeinheit zu Rate Auch der Arduino kann auf dem Grakdisplay eine Analog-Uhr anzeigen.
ziehen. Weitere Informationen zum Anschluss von Der Sketch dazu ndet sich ebenfalls unter den Beispielen zur
Displays mit Kontrastreglern nden sich auch im letz- GLCD-Library. Zustzlich ist hier noch die Time-Bibliothek erforderlich.
ten Arduino-Beitrag Alphanumerische LC-Displays Diese kann unter [2] als time.zip geladen werden.
(ELVjournal 4/2016). Nachdem die Bibliothek wie blich installiert wurde, kann der Analog-
Nachdem das Grakdisplay erfolgreich getestet uhr-Sketch clockFace.ino geladen werden. Bild 2 zeigt die Darstellung
wurde, knnen weitere interessante und ntzliche der Uhr auf dem Display.
Anwendungen auf den Arduino geladen werden.
Ausgabe von Bitmap-Graken
Auf dem Display knnen nicht nur Messwerte und Daten in grascher
Form ausgegeben werden, sondern auch beliebige Abbildungen in Form
von Bitmaps.
Um die Grak anzeigen zu knnen, muss zunchst eine Bitmap (z. B.
image.bmp) erzeugt werden. Hierfr knnen die bekannten Programme
wie etwa Paint verwendet werden. Dabei ist darauf zu achten, dass die
Datei bereits ein Format von 128 x 64 Pixel enthlt (siehe Bild 3).
Dann muss diese Datei in ein Include-File (*.h-Datei) umgewandelt
werden. Hierfr steht ein Programm namens glcdMakeBitmap zur Verf-
Bild 2: Analog-Uhr
gung. Das in der GLCD-Bibliothek unter
/bitmaps/utils/glcdMakeBitmap
enthaltene Programm
glcdMakeBitmap.pde
ist nicht fr die Arduino-IDE gedacht, sondern muss in Processing
gestartet werden. Dabei handelt es sich um ein leistungsfhiges Grak-
programm unter Windows. Es kann unter [3] kostenlos aus dem Internet
geladen werden.
Processing wurde bereits in Teil 6 zu dieser Artikelserie (Sensortech-
nik und Messwerterfassung) kurz vorgestellt. Es weist starke hnlich-
keiten mit der Arduino-IDE auf. Das ist kein Zufall, da die Arduino-Pro-
grammieroberche sehr eng an das ursprnglich am Massachusetts
Institute for Technology (MIT) entwickelte Processing angelehnt ist.
Nachdem das Programm glcdMakeBitmap in Processing geladen und
gestartet wurde, erscheint ein Fenster, in welches die zu konvertierende
Grak per Drag & Drop geladen werden kann (siehe Bild 4).
Auf diese Weise wird eine Datei image.h erzeugt, welche die Daten
der Bitmap in einer fr den Arduino verstndlichen Form enthlt.
Die Anweisungen
#include "image.h" und GLCD.DrawBitmap(image, x, y);
sorgen dann dafr, dass die Bitmap an der Position x, y auf dem Display
erscheint. Die Datei image.h muss dazu natrlich mit in das Verzeichnis
des aktuellen Sketches kopiert werden.
Das vollstndige Programm dazu sieht so aus:
Bild 3: Erzeugung einer Bitmap
// Arduino graphics display

#include <glcd.h>
#include "image.h"

void setup()
{ GLCD.Init(NON_INVERTED);
GLCD.ClearScreen();
GLCD.DrawBitmap(image, 0,0, BLACK);
}

void loop()
{}

Bild 4: Das Konvertierungsfenster des Processing-Programms Bild 5 zeigt das Ergebnis auf dem Display.

www.elvjournal.de

Arduino_verstehen_Teil_18.indd 58 26.08.16 16:18


So funktionierts 59

Der Thermograf Mini-Monitoren wurden die vielfltigen Mglichkei-


Moderne Heizungsanlagen verfgen ber die vielfltigsten Steuer- und ten dieses wichtigen und interessanten Gebiets vor-
Regeleinrichtungen. Neben Zeitsteuerung und Vorlauftemperatur wer- gestellt.
den auch Parameter wie Innen- und Auentemperatur bercksichtigt. Im nchsten Beitrag wird es um das Thema Mess-
Hier kann es schnell einmal vorkommen, dass ein kleiner Fehler in den technik gehen. Neben einfachen Messaufgaben wie
Einstellungsparametern der Heizanlage zu unerwnschten Raumtempe- die Erfassung von Strmen, Spannungen und Wider-
raturprolen fhrt. Dies ist natrlich neben dem mangelnden Komfort stnden werden auch komplexere Gerte wie ein ein-
auch mit erhhten Heizkosten verbunden. faches Oszilloskop und sogar ein Logic-Analyzer auf
Hier ist es deshalb sinnvoll, die Raumtemperatur unabhngig von Arduino-Basis vorgestellt.
der Heizanlage selbst zu berwachen. Dabei ist nicht nur die aktuelle
Temperatur wichtig, sondern insbesondere auch der Temperaturverlauf
ber einen lngeren Zeitraum wie etwa 24 oder 48 Stunden. Hier kommt
das Grakdisplay ins Spiel. Es erlaubt, eine Temperaturkurve (Bild 6)
automatisch ber einen lngeren Zeitraum hinweg darzustellen.
Unerwnschte Temperaturverlufe, wie etwa eine berssige ncht-
liche Heizperiode, knnen so schnell erkannt werden.
Die Programmierung einer solchen Anwendung kann mit den Kennt-
nissen aus diesem Beitrag in kurzer Zeit durchgefhrt werden.

Komplettgert mit Grakdisplay


Abschlieend zeigt Bild 7 den kompletten Aufbau eines Gerts mit Gra-
kdisplay. Links unten ist das Potentiometer fr die Einstellung des
Kontrastes zu sehen. Ein solches Gert macht durchaus einen bereits
recht professionellen Eindruck und kann etwa als Thermograph auch in
einem Wohnzimmer eingesetzt werden.

Ausblick
Mit diesem Artikel wird das umfassende Thema Displaytechnik abge-
schlossen. Beginnend mit Sieben-Segmentanzeigen ber LED-Matri-
zen und Alphanumerische LCD-Einheiten bis hin zu voll grakfhigen

Weitere Infos:

[1] http://code.google.com/p/glcd-arduino/downloads/list
[2] http://playground.arduino.cc/Code/Time
[3] http://processing.org/
Bild 5: Ausgabe einer Bitmap auf dem Grakdisplay
G. Spanner: Lernpaket Physical Computing, Franzis-Verlag,
2015, Best.-Nr. CJ-12 21 81, 99,
G. Spanner: Arduino Schaltungsprojekte fr Pros,
Elektor-Verlag, 2012, Best.-Nr. CJ-10 94 45, 39,80
Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV, 2011,
Best.-Nr. CJ-10 20 44, 99,
G. Spanner: Elektor Praxiskurs AVR-XMEGA-Mikrocontroller, 2015,
Best.-Nr. CJ-12 07 62, 39,80
Grundlagen zur elektronischen Schaltungs-
technik nden sich in der E-Book-Reihe Elektronik!
(www.amazon.de/dp/B00OXNCB02) Bild 6: Der Thermograf in Aktion

Lernpaket AVR-Mikrocontroller in C programmieren,


Franzis-Verlag 2012, Best.-Nr. CJ-10 68 46, 129,
Preisstellung August 2016 aktuelle Preise im Web-Shop

Empfohlene Produkte Best.-Nr. Preis


Arduino Uno CJ-10 29 70 27,95
Mikrocontroller-Onlinekurs CJ-10 20 44 99,

Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher


und Zubehr nden Sie unter: www.arduino.elv.de Bild 7: Komplettgert mit graschem Display

ELVjournal 5/2016

Arduino_verstehen_Teil_18.indd 59 26.08.16 16:18


16 So funktionierts

Arduino verstehen
und anwenden
Teil 19: Messtechnik von der Spannungsmessung zum Logic-Analyzer

www.elvjournal.de

Arduino_verstehen_Teil_19.indd 16 02.11.16 14:19


So funktionierts 17

Bereits in Teil 6 dieser Artikelserie (Sensortechnik und Messwert-


erfassung im ELVjournal Okt/Nov 2014) wurden einige Grundlagen der
Erfassung von messtechnischen Gren diskutiert.
In diesem Beitrag sollen nun auch komplexere Messaufgaben be-
trachtet werden. Zunchst stehen einfache Strom-, Spannungs- und
Widerstandsmessungen im Vordergrund.
Im Anschluss sollen
ein Kapazittsmessgert und
ein Halbleitertester
sowie Gerte mit zeitaufgelster Messwerterfassung wie etwa
ein Oszilloskop oder auch
ein Logic-Analyzer
diskutiert werden.

Messung von Spannungen, Strmen und Bild 1: Eingangsschaltung fr das Arduino-Voltmeter


Widerstnden mit dem Arduino
Die prinzipiell einfachste Messung ist hier die Spannungsmessung. Mit
dem Analog-digital-Wandler eines Arduinos knnen Spannungen zwi-
schen 0 und +5 V direkt gemessen werden. Der Arduino verfgt hierfr
ber eine interne Spannungsreferenz. Fr diese knnen mehrere Optio-
nen gewhlt werden:
DEFAULT: voreingestellte Analog-Referenz von 5 V (auf 5 V Arduino-
Boards) oder 3,3 V (auf 3,3 V Arduinos)
INTERNAL: interne Referenz: Mchte man Spannungen bis zu beispielsweise 20 V
1,1 V fr ATmega168 oder ATmega328 (z. B. Arduino Uno) messen, ist ein Spannungsteiler erforderlich. Bild 1
2,56 V fr den ATmega8 (ltere Arduino-Varianten) zeigt einen entsprechenden Aufbau. Aufgrund ihrer
INTERNAL1V1: 1,1 V Referenz (nur Arduino Mega) hheren Przision sollten hier Metallschicht-Wider-
INTERNAL2V56: eingebaute 2,56-V-Referenz (nur Arduino Mega) stnde ( 1 % Toleranz) eingesetzt werden. Zustz-
EXTERNAL: fr den Anschluss einer externen Referenzspannung am lich wurde noch ein 100-nF-Kondensator eingefgt,
AREF-Pin (05 V) um stabile Messwerte zu erhalten. Eine 5V1-Zener-
diode schtzt den Arduino-Eingang vor unerwnsch-
Hinweis: ten berspannungen.
An den AREF-Eingang drfen nur Spannungen zwischen 0 und 5 V
angelegt werden! Mehr als 5 V oder negative Spannungen knnen Der folgende Aufbau erlaubt mit
den Arduino zerstren. R1 = 1 M1
R2 = 50 k1
Soll eine externe Referenz zum Einsatz kommen, muss diese im Sketch die przise Messung von Spannungen zwischen 0 und
ausgewhlt werden, bevor analogRead() aufgerufen wird, sonst werden 20 V. Der Wert von 50 k1 entsteht durch Parallel-
interne und externe Referenz kurzgeschlossen, was zu einer Zerstrung schaltung von zwei 100-k1-Widerstnden.
des Arduino-internen Controllers fhren kann. Fr przise Ergebnisse mssen die Widerstands-
Alternativ kann man AREF ber einen Schutzwiderstand anschlieen, werte genau vermessen und die Ergebnisse in den
dann ist allerdings zu beachten, dass die externe Referenz mit ca. 32 k1 Sketch eingesetzt werden. Gleiches gilt fr die inter-
belastet wird. ne Referenzspannung.
Benutzt man die interne Referenz, muss man bercksichtigen, dass Eine Mittelung ber 10 Werte fhrt zu einer weite-
diese bei einem Nominalwert von 1,1 V 10 % zwischen 1,0 und 1,2 V ren Verbesserung der Przision, da sich statistische
liegt. Fr przise Messungen ist es daher erforderlich, den genauen Wert Messfehler der Einzelmessungen herausmitteln. Der
mit einem Referenzvoltmeter zu bestimmen. vollstndige Sketch sieht damit wie folgt aus:

ELVjournal 6/2016

Arduino_verstehen_Teil_19.indd 17 02.11.16 14:19


18 So funktionierts

von Netzteilen, PCs oder Audioverstrkern sind auf dieses Problem zu-
// digital voltmeter
rckzufhren.
const int analogInPin = A0; Mit dem Arduino kann die Kapazitt eines Elkos ohne zustzliche
FRQVWRDW8BUHI LQ9 Hardware mit guter Genauigkeit bestimmt werden (siehe Bild 2).
FRQVWRDW5 LQN2KP
FRQVWRDW5 LQN2KP Achtung:
FRQVWLQWDYHUDJHV  Kondensatoren sind vor dem Anschluss an den Arduino unbedingt
zu entladen, da die Digitaleingnge sonst zerstrt werden knnten!
RDWYROWDJH
LQW$'&BFRXQW Das Messprinzip ist simpel: Zunchst wird der Pluspol des Elkos auf
LOW-Potenzial gelegt. Danach wird dieser Pin als Eingang geschaltet,
YRLGVHWXS 
d. h. der Pin wird hochohmig. Wenn nun dieser Input-Pin den Befehl
^6HULDOEHJLQ  
DQDORJ5HIHUHQFH ,17(51$/ 
digitalWrite(activePin,HIGH);
} erhlt, wird dadurch der interne Pull-up-Widerstand des Arduinos akti-
viert und der Kondensator ldt sich ber diesen Widerstand auf. Dabei
YRLGORRS  wird gemessen, wie lange es dauert, bis sich der Kondensator auf etwa
^$'&BFRXQW  die halbe Versorgungsspannung aufgeladen hat. Diese Zeit ist ein direk-
IRU LQWL LDYHUDJHVL tes Ma fr die Kapazitt des Kondensators:
$'&BFRXQW DQDORJ5HDG DQDORJ,Q3LQ  T = R * Cx
R ist hier der interne Pull-up. Dieser hat einen Wert von ca. 60 k1.
9ROWDJH  Durch die Kalibrationskonstante cal wird die Ladezeit direkt in einen
 55 5 8BUHI $'&BFRXQWDYHUDJHV
Kapazittswert in nF umgerechnet. Ist der berechnete Wert grer als
1000, erfolgt die Anzeige automatisch in F. So lassen sich nicht nur
6HULDOSULQW \t voltage = 
6HULDOSULQWOQ YROWDJH 
Elkos im F-Bereich vermessen, sondern auch kleinere ungepolte Kon-
densatoren bis zu einem Minimalwert von ca. 10 nF. Bei noch kleineren
GHOD\   Kapazitten werden die Messzeiten zu kurz und das Ergebnis ungenau.
} Im Programm wird zunchst die Kalibrationskonstante cal de-
niert. Durch Vermessung genau bekannter Kapazitten kann diese Kon-
stante nachjustiert werden. In der Main-Loop wird die bereits oben
Mittels eines geeigneten Shunts knnen so auch beschriebene Messprozedur ausgefhrt. Schlielich wird der ermittelte
Stromstrken bestimmt werden. Widerstandsmessun- Messwert unter Verwendung einer Autorange-Funktion auf die serielle
gen sind ebenfalls mglich. Hierzu muss lediglich ei- Schnittstelle ausgegeben.
ner der Widerstnde im Spannungsteiler als Referenz,
der andere als Messobjekt deniert werden. Die Ein- &DSDFLW\PHWHU
gangsspannung muss in diesem Fall natrlich eben-
falls bekannt sein. Man kann hier auch auf die 3,3 V RDWFDO FDOLEUDWLRQFRQVWDQW
LQWDFWLYH3LQ 
des Arduinos zurckgreifen.
RDWFKDUJLQJ7LPH 
RDWFDSDFLW\ 
Bestimmung von Kapazitten
und Halbleiterparametern YRLGVHWXS
Bedingt durch ihren inneren Aufbau weisen Elek- ^6HULDOEHJLQ  `
trolytkondensatoren eine vergleichsweise hohe Aus-
fallwahrscheinlichkeit auf und zhlen deshalb zu den YRLGORRS
problematischsten Bauelementen der Elektronik. ^SLQ0RGH DFWLYH3LQ287387 
Meist liegt die Hauptursache fr den Ausfall im GLJLWDO:ULWH DFWLYH3LQ/2: 
Austrocknen des Elektrolyts und dem damit verbun- FKDUJLQJ7LPH 
denen erheblichen Kapazittsverlust. Viele Ausflle GHOD\  

SLQ0RGH DFWLYH3LQ,1387 
GLJLWDO:ULWH DFWLYH3LQ+,*+ 

ZKLOH GLJLWDO5HDG DFWLYH3LQ FKDUJLQJ7LPH


FDSDFLW\ FKDUJLQJ7LPH FDO

LI FDSDFLW\
^6HULDOSULQW FDSDFLW\ 6HULDOSULQWOQ Q) 
}

else
^FDSDFLW\ 
6HULDOSULQW FDSDFLW\ 6HULDOSULQWOQ X) 
}
GHOD\  
}
Bild 2: Arduino als Kapazittsmessgert

www.elvjournal.de

Arduino_verstehen_Teil_19.indd 18 02.11.16 14:19


So funktionierts 19

Aber nicht nur passive Bauelemente knnen mit einfachen Mitteln


ausgemessen werden. Auch aktive Komponenten wie Transistoren kn-
nen mit dem Arduino geprft werden. Die Schaltung nach Bild 3 misst
die wichtigsten Transistorparameter.
Die Basisspannung Ube liefert eine Aussage ber das Transistor-
grundmaterial:
Ube : 0,3 V: Germaniumtransistor
Ube : 0,7 V: Siliziumtransistor
Aus der Kollektorspannung Uce lsst sich der Kollektorstrom Ic be-
rechnen, entsprechend aus Ube der Basisstrom Ib. Damit ergibt sich
nach
B = Ic / Ib
die Gleichstromverstrkung B des Transistors. Typische Werte fr Klein-
signaltransistoren liegen im Bereich von 100 bis ca. 800.

7UDQVLVRUWHVWHU

RDW8FH8EHEHWD

YRLGVHWXS 
^6HULDOEHJLQ  
}

YRLGORRS  Bild 3: Transistortester


^8FH  DQDORJ5HDG  
8EH  DQDORJ5HDG  
EHWD  8FH  8FH8EH 

6HULDOSULQW 8EH  6HULDOSULQWOQ 8EH 


6HULDOSULQW ,E  6HULDOSULQW 8FH8EH  6HULDOSULQWOQ X$ 
6HULDOSULQW ,F  6HULDOSULQW 8FH 6HULDOSULQWOQ P$ 
6HULDOSULQW EHWD  6HULDOSULQW EHWD 6HULDOSULQWOQ # 
6HULDOSULQWOQ 

GHOD\  
}

Das Programm ermittelt die Werte fr Uce und Ube. Daraus werden die Fr den Arduino Uno existieren verschiedene Oszil-
Parameter fr Kollektor- und Basisstrom berechnet. Abschlieend wer- loskop-Emulatoren wie etwa Girino oder Arduino-
den die Ergebnisse auf die serielle Schnittstelle ausgegeben. Scope. Eine sehr gute und leistungsfhige Anwen-
Die Anwendung ist sehr praktisch, wenn man eine grere Anzahl von dung ist XOscillo. Dieses Programmpaket kann unter
Transistoren prfen will. Man erhlt hier sehr schnell nicht nur die In- http://code.google.com/p/xoscillo/
formation, ob ein spezieller Transistor funktionsfhig ist, sondern auch kostenlos aus dem Internet geladen werden. Damit
den genauen Wert der Stromverstrkung. Es ist also mit diesem Sketch werden die folgenden Leistungsmerkmale erreicht:
leicht mglich, Transistoren gleichen Typs nach ihrer Stromverstrkung Es ist keine zustzliche Hardware erforderlich
zu sortieren. So kann man etwa fr Stromspiegel oder hnliche Applika- Maximale Abtastfrequenz: 7 kHz
tionen leicht sogenannte matched pairs selektieren, d. h. Transistor- Bis zu 4 Kanle (bei entsprechend niedrigerer
prchen mit mglichst identischen Stromverstrkungen. Sample-Rate)
8 bit vertikale Ausung
Oszilloskop und Logic-Analyzer Variable Trigger-Spannung auf Kanal 0
Nach dem Multimeter ist das Oszilloskop das wichtigste Messgert im Theoretisch unbeschrnkte Anzahl von Messpunk-
Elektronik-Labor. Wenn man hug mit der Analyse digitaler Schaltun- ten
gen oder von Mikrocontroller-Projekten befasst ist, dann wei man auch
einen Logic-Analyzer zu schtzen. Damit lassen sich problemlos z. B. Sicher liegt die maximale Abtastfrequenz von
Codes von IR-Sendern, Signale auf seriellen Schnittstellen, I2C-Bussen 7 kHz im Vergleich zu einem kommerziellen Spei-
oder die bertragungsprotokolle von Funksignalen berprfen. cheroszilloskop sehr niedrig. Fr einfache Messun-
Sowohl ein Oszilloskop als auch ein Logic-Analyzer lassen sich mit ei- gen im Niederfrequenz- und Audiobereich ist die
nem Arduino aufbauen. Natrlich knnen diese Arduino-basierten Ger- XOscillo-Applikation aber durchaus ntzlich.
te nicht mit kommerziellen Gegenspielern mit Anschaffungskosten von Das XOscillo-Programmpaket besteht aus einem
10.000, und mehr mithalten. Dennoch ist es erstaunlich, was man Arduino-Sketch und einer graschen Benutzerober-
auch mit sehr einfachen Mitteln erreichen kann. Fr den Hobbybereich, che fr den PC. Nach dem Laden des Sketches auf
aber auch fr einfachere professionelle Einstze sind die erreichbaren den Arduino kann die Windows-Applikation (XOscillo.
Leistungsmerkmale dieser Arduino-basierten Messgerte hug durch- exe) gestartet werden. Danach wird im File-Men die
aus ausreichend. Option New Analog Arduino ausgewhlt.

ELVjournal 6/2016

Arduino_verstehen_Teil_19.indd 19 02.11.16 14:19


20 So funktionierts

Bild 4: Das Arduino-basierte Oszilloskop zeigt ein Rechtecksignal

Es erscheint die in Bild 4 dargestellte Oberche Zustzlich wird das Programm Logic Sniffer bentigt. Dieses ist
eines Digitalen Speicheroszilloskops (DSO). Mit CH0 Java-basiert und kann also sowohl unter Windows als auch unter
(rot) und CH1 (blau) knnen bis zu zwei analoge Ka- Linux verwendet werden. Fr die Verwendung unter Windows muss
nle ausgewhlt werden. natrlich Java installiert sein. Unter
Die Zeitbasis kann zwischen 1 s/div und 500 s/div https://www.lxtreme.nl/ols/#download
eingestellt werden. Die Aufzeichnungszeit ist frei in kann die jeweils neueste Version heruntergeladen werden. Jetzt
Millisekunden whlbar. muss nur noch die Datei
XOscillo verfgt zwar auch ber die Mglichkeit ols.prole-agla.cfg
zur Aufzeichnung mehrerer Digitalkanle, jedoch aus dem Download-Paket in den Ordner plugins kopiert werden.
steht fr die Logic-Analyse eine noch etwas professi- Dann sollte nach dem Start des Programms die Benutzeroberche
onellere Anwendung zur Verfgung. Diese kann unter des Logic-Analyzers erscheinen.
https://github.com/gillham/logic_analyzer Der Analyzer basiert auf dem SUMP-Software-Modul, welches ver-
geladen werden. Das Programmpaket enthlt wieder schiedene Hardware-Frontends, unter anderem eben auch den Ardui-
Arduino-Sketche und Windows-Programme. no, untersttzt. Bild 5 zeigt die Oberche des Analyzers.

Bild 5: Arduino als 5-Kanal-Logic-Analyzer

www.elvjournal.de

Arduino_verstehen_Teil_19.indd 20 02.11.16 14:19


So funktionierts 21

Bild 6: Triggermen Logic-Analyzer

Mit dem Arduino knnen bis zu 6 Kanle parallel Dort soll es nmlich um die Audiotechnik, die Ton- und Klangerzeu-
dargestellt werden. Die Pins D7 bis D13 sind als Ein- gung sowie um die digitale Synthesizertechnik gehen. Darber hinaus
gnge voreingestellt. Natrlich knnen durch ent- wird im Rahmen dieser Beitrge das Abspielen von Audiodateien auch in
sprechende nderungen im Sketch auch andere Pins einem frei programmierbaren, im Eigenbau erstellten MP3-Spieler the-
verwendet werden. matisiert.
Kanal 0 zeigt hier ein Clock-Signal das jeweils mit
einem Flip-Flop in der Frequenz herunter geteilt wird.
Die Signale der Kanle 1 bis 4 weisen daher jeweils
die halbe Frequenz auf. In Kanal 5 wird schlielich Weitere Infos:
das invertierte Clock-Signal dargestellt.
Bild 6 zeigt als Beispiel fr den umfangreichen
Funktionsumfang des SUMP-kompatiblen Analyzers [1] Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV,
das Triggermen. Hier lassen sich nicht nur Pre-Trig- 2011, Best.-Nr. CK-10 20 44
geroptionen einstellen, sondern auch bestimmte
[2] G. Spanner: Arduino Schaltungsprojekte fr Pros,
Bitmasken whlen, bei welchen dann die Triggerung
Elektor-Verlag, 2012, Best.-Nr. CK-10 94 45
ausgelst werden soll. hnlich umfangreich sind
auch die Optionen und Mglichkeiten in den anderen [3] Grundlagen zur elektronischen Schaltungstechnik nden sich
Untermens. Der Logic-Analyzer lsst sich so sehr in der E-Book-Reihe Elektronik!
vielseitig auch fr professionelle Messaufgaben ein- (http://www.amazon.de/dp/B00OXNCB02)
setzten.
[4] Lernpaket AVR-Microcontroller in C programmieren,
Franzis-Verlag, 2012, Best.-Nr. CK-10 68 46
Ausblick
Die Beispiele in diesem Beitrag zeigen, wie vielseitig [5] Lernpaket Physical Computing, Franzis-Verlag, 2015,
Mikrocontroller und damit auch Arduino-Boards ein- Best.-Nr. CK-12 21 81
setzbar sind. Von der einfachen Spannungsmessung
bis hin zu Logic-Analyzern mit nahezu professionel- Preisstellung Oktober 2016 aktuelle Preise im Web-Shop
len Leistungsmerkmalen knnen viele Messaufgaben
abgedeckt werden. Empfohlene Produkte Best.-Nr. Preis
Nachdem in diesem Beitrag ntzliche Anwendun- Arduino Uno CK-10 29 70 27,95
gen und Gerte fr das Elektronik-Labor im Vorder- Mikrocontroller-Onlinekurs CK-10 20 44 99,
grund standen, werden sich die nchsten beiden
Themen wieder eher um allgemein einsetzbare Tech- Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
nikanwendungen drehen. und Zubehr nden Sie unter: www.arduino.elv.de

ELVjournal 6/2016

Arduino_verstehen_Teil_19.indd 21 02.11.16 14:19


36 So funktionierts

Arduino verstehen
und anwenden
Teil 20: Digitale Soundeffekte und Synthesizer

www.elvjournal.de

Arduino_verstehen_Teil_20.indd 36 16.12.16 17:16


So funktionierts 37

Dass der Arduino in der Lage ist, auch Tne und Signale wiederzugeben,
wurde bereits in Teil 13 Peripheriegerte dieser Artikelserie erlutert.
Dort wurden ber die Tone-Funktion einfache Signale und Tne erzeugt
und ber einen Piezo-Lautsprecher ausgegeben. Der Arduino ist aller-
dings in der Lage, auch komplexe Tonfolgen und Klnge zu synthetisie-
ren. Erfolgt die Tonausgabe ber ein hochwertiges Audiosystem, knnen
uerst eindrucksvolle Klangwolken erzeugt werden, die einem pro-
fessionellen Synthesizer durchaus das Wasser reichen knnen.
Darber hinaus ist die Rechenleistung eines Arduinos sogar ausrei-
chend, um synthetische Sprache zu erzeugen. Dazu ist nicht einmal
zustzliche Hardware, etwa in Form eines speziellen Shields, erforder-
lich. Auch der Arduino allein ist in der Lage, nicht nur verstndliche
Sprache zu erzeugen, sondern sogar ein Lied zu singen. Den Abschluss
dieses Artikels bildet ein kurzer Abriss zum Thema Text-to-Speech, also
die automatische Umsetzung von geschriebenem Text in verstndliche
Bild 1: Einfacher Audioverstrker
Sprache.
In diesem Beitrag werden so die folgenden Themen und Praxisbei-
spiele erlutert:
Einfache Tne und Klnge
Digitale Soundeffekte
Synthesizertechnik
Der singende Arduino
Text-to-Speech

Audio-Wiedergabe
Eine der einfachsten Mglichkeiten, elektrische Signale hrbar zu ma-
chen, besteht in der Verwendung eines sogenannten piezoelektrischen
Schallwandlers. Dieser kann direkt an einen Arduino-Pin angeschlossen
werden. Weitere Details dazu nden sich in Teil 13 zu dieser Reihe. Al-
lerdings kann ein solcher Schallwandler nur eine sehr geringe Lautstrke
liefern und auch die Tonqualitt lsst sehr zu wnschen brig.
Deutlich bessere Ergebnisse lassen sich mit einem sogenannten dy-
namischen Lautsprecher erzielen. Dieser hat jedoch einen erheblich h-
heren Leistungsbedarf, sodass hier ein Audioverstrker erforderlich ist.
Dieser kann jedoch mit geringem Aufwand im Eigenbau erstellt wer-
den. Der integrierte Verstrker-Baustein LM 386 ist fr wenige Eurocent
erhltlich und leistet hervorragende Dienste. Bild 1 zeigt, wie ein sol-
cher einfacher Verstrker aufgebaut und an den Arduino angeschlossen
werden kann.
Als Lautsprecher ist praktisch jeder dynamische Schallwandler mit
8 1 Impedanz und einer Leistung von mindestens 300 mW geeignet.
Bild 2 zeigt ein Gesamtsystem. Der Lautsprecher wurde hier in ein ein-
faches Gehuse eingebaut. Dieses Gehuse dient nicht nur dem Schutz
der Lautsprechermembran, sondern es fhrt auch zu einer wesentlichen
Klangverbesserung, da es akustische Kurzschlsse zwischen der Vor-
der- und Rckseite der Lautsprechermembran verhindert. Bild 2: Audiosystem fr den Arduino

ELVjournal 1/2017

Arduino_verstehen_Teil_20.indd 37 16.12.16 17:16


38 So funktionierts

Alternativ knnen auch Aktivboxen eingesetzt


werden. Hier ist allerdings zu beachten, dass diese
Systeme nicht mit zu groen Eingangsspannungspe-
geln belastet werden drfen.
Ein Spannungspegel mit einer Amplitude von ma-
ximal 0,5 V sollte bei den meisten Aktivboxen nicht
berschritten werden. Im Zweifelsfall muss im Da-
tenblatt des Systems nachgeschlagen werden. Will
man also einen Arduino anschlieen, so muss man Bild 3: Anschluss an Aktivboxen
einen geeigneten Spannungsteiler von etwa 1:10 vor-
schalten. Zustzlich empehlt es sich, einen Tiefpass
zu integrieren, um aus dem PWM-Signal einen nahezu
analogen Spannungsverlauf zu erzeugen. Bild 3 zeigt
einen entsprechenden Schaltungsvorschlag.
// Bell
Einfache Tne und Klnge
int audioPin = 3;
Wie einfache Signaltne mit dem Befehl tone() er-
zeugt werden knnen, wurde bereits in frheren
void analogOut(byte val) { OCR1A = (val);}
Beitrgen erlutert. ber die PWM-Ausgnge kn-
nen jedoch auch komplexere Signalmuster ausgege- byte value[] =
ben werden. So kann man beispielsweise ber eine { 128,131,134,137,141,144,147,150,153,156,159,162,165,168,171,174,
Sinustabelle auch weich und harmonisch klingende 177,180,183,186,189,191,194,197,199,202,205,207,209,212,214,217,
Tne erzeugen. 219,221,223,225,227,229,231,233,235,236,238,240,241,243,244,245,
Wenn diese Tne noch mit einer sogenannten Hll- 246,247,248,249,250,251,252,253,253,254,254,255,255,255,255,255,
kurve versehen werden, ist es mglich, eine Vielzahl 255,255,255,255,255,254,254,254,253,253,252,251,250,249,248,247,
von Klngen zu erzeugen. 246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
Bild 4 zeigt den Signalverlauf, wie er fr einen 218,215,213,211,208,206,203,201,198,195,193,190,187,184,181,179,
176,173,170,167,164,161,158,155,152,148,145,142,139,136,133,130,
glockenhnlichen Klang typisch ist.
126,123,120,117,114,111,108,104,101,98,95,92,89,86,83,80,
Entsprechende Klangmuster sind heute allgegen-
77,75,72,69,66,63,61,58,55,53,50,48,45,43,41,38,
wrtig. Neben den Klingeltnen bei Mobiltelefonen 36,34,32,30,28,26,24,22,20,19,17,16,14,13,11,10,
weisen sie auch auf sich schlieende Tren an Liftan- 9,8,7,6,5,4,3,3,2,2,1,1,0,0,0,0,
lagen oder Schienenfahrzeugen hin oder warnen den 0,0,0,1,1,1,2,2,3,4,4,5,6,7,8,10,
Autofahrer bei nicht angelegten Sicherheitsgurten. 11,12,13,15,16,18,20,21,23,25,27,29,31,33,35,37,
Der folgende Sketch liefert ein Beispiel fr die Er- 39,42,44,47,49,51,54,57,59,62,65,67,70,73,76,79,
zeugung eines Zweiklangs. Fr die Wiedergabe sind 82,85,88,91,94,97,101,103,106,109,112,115,119,122,125,
entweder der Verstrker nach Bild 1 oder Aktivboxen };
wie in Bild 3 an Pin D3 anzuschlieen
void setup()
{ pinMode(audioPin, OUTPUT);
TCCR1A = 0b10000001;
TCCR1B = 0b00001001;
}

void loop()
{ for (int ampl = 10; ampl >=0 ; ampl--)
{ for (unsigned int d = 0; d < 40; d++)
{ for (unsigned int j = 0; j < 256; j++)
{ analogOut(value[j]/10*ampl);
delayMicroseconds(5);
}
}
}
delay(100);

for (int ampl = 10; ampl >=0 ; ampl--)


{ for (unsigned int d = 0; d < 20; d++)
{ for (unsigned int j = 0; j < 256; j++)
{ analogOut(value[j]/10*ampl);
delayMicroseconds(10);
}
}
}
delay(300);
}

Bild 4: Glockenhnlicher Klang

www.elvjournal.de

Arduino_verstehen_Teil_20.indd 38 16.12.16 17:16


So funktionierts 39

Digitale Soundeffekte
Die Weiterentwicklung dieser Technik fhrt zu den sogenannten digi-
talen Soundeffekten. Diese ermglichen die Erzeugung hochkomplexer
Klangstrukturen. Hierzu werden verschiedene Komponenten wie etwa
Oszillatoren
Hllkurvengeneratoren
Taktgeneratoren
auf rein digitalem Wege implementiert.
Auf diese Weise ist es mglich, das gesamte Spektrum eines klassi-
schen Analogsynthesizers in einen einzigen Mikrocontroller zu imple-
mentieren.
Darber hinaus knnen Effekte wie Nachhall oder Echo digital we-
sentlich einfacher umgesetzt werden, als dies allein mit analogen Kom-
ponenten wie Transistoren oder Operationsverstrkern mglich wre.

Synthesizertechnik
Um sich mit den Mglichkeiten der Synthesizertechnik vertraut zu ma-
chen, kann man ein recht eindrucksvolles Programm auf den Arduino
laden. Dieses ist unter
http://code.google.com/p/tinkerit/downloads/
detail?name=auduino_v5.pde
kostenlos downloadbar.
Wie Bild 5 zeigt, mssen nur noch fnf Potentiometer an den Ardui-
no angeschlossen werden, und der Erzeugung von eigenen Klangwolken
steht nichts mehr im Weg. Bild 5: Schaltbild zum Synthesizer

Hinweis: Bekanntermaen sind die Arduino-Entwicklungsumgebungen


(IDEs) hug nicht abwrtskompatibel. Das heit, ltere Sketche kn-
nen nicht auf den aktuellen IDEs kompiliert werden. Prinzipiell sollte Der singende Arduino
es zwar immer mglich sein, alte Sketche auf die neuesten IDEs zu por- Eine erstaunliche und zugleich sehr interessante An-
tieren, jedoch ist dies hug mit erheblichem Aufwand verbunden, der wendung moderner Klangerzeugungstechnik ist die
oft nicht gerechtfertigt ist, wenn man einen alten Sketch einfach nur Sprachsynthese. Dabei ist der Arduino nicht nur in
testen will. der Lage zu sprechen, sondern sogar zu singen. Ein
In diesem Fall ist es wesentlich einfacher, die ltere IDE aus dem entsprechendes Programmbeispiel ist unter
Internet zu laden und mit dieser zu arbeiten. Die Sketche in diesem https://code.google.com/p/tinkerit/wiki/Cantarino
Beitrag arbeiten beispielsweise alle problemlos mit der IDE-Version 1.0. zu nden.
Falls man den ein oder anderen Sketch nach eingehenden Tests doch Wird dieses Programm auf den Arduino geladen
weiterverwenden mchte, kann man ihn dann immer noch auf die je- und das Wiedergabesystem nach Bild 1 an Pin D3 an-
weils aktuelle IDE-Version portieren. geschlossen, gibt der Arduino das Lied Daisy Bell
Wenn man fr die Potentiometer Schieberegler einsetzt, lsst sich wieder. Wer den Text nicht ganz versteht, kann den
der Synthesizer besonders gut bedienen bzw. spielen, da die Linear- Wortlaut dazu z. B. unter [1] nachlesen.
regler mit nur einem Finger verstellt werden knnen. Dadurch lassen Dieses Lied war eines der ersten, das durch auto-
sich alle Regler elegant simultan variieren, und es entsteht ein ssiges matische Sprachsynthese auf einem IBM-7094-Com-
Spiel. Einen entsprechenden Aufbauvorschlag zeigt Bild 6. Die Tonaus- puter im Jahre 1961 wiedergegeben wurde [2]. Spter
gabe erfolgt wieder ber den PWM-fhigen Digital-Pin D3. fand es auch eine entsprechende Wrdigung im Kino-
Die Klnge dieser Synthesizervariante werden durch ein breitbandi- klassiker 2001: A Space Odyssey [3].
ges Rauschspektrum erzeugt. Dieses Rauschen wird in schneller Abfol- Wohlgemerkt hier handelt es sich nicht um die
ge moduliert. Bei analogen Synthesizern knnen hnliche Klnge mit Wiedergabe einer menschlichen Stimmenaufzeich-
resonanten Bandpassltern erzeugt werden. Das Rauschen selbst wird nung, sondern um eine vollstndige Klangsynthese
aus zwei kontinuierlichen Signalen abgeleitet, welche zustzlich mit auf Basis rein digital erzeugter Lautsequenzen!
unterschiedlichen Abklingraten und Hllkurven versehen sind.
ber die fnf Potentiometer knnen die folgenden Klangparameter Text-to-Speech
variiert werden: Noch einen Schritt weiter gehen sogenannte Text-
P1: Rauschspektrum 1 to-Speech-Anwendungen. Hier mssen gesprochene
P2: Abklingrate 1 Worte nicht mehr durch einzelne Laute zusammen-
P3: Rauschspektrum 2 gesetzt werden, sondern ein geschriebener Text wird
P4: Abklingrate 2 vollautomatisch vorgelesen. Auch hierfr ist die
P5: Wiederholfrequenz des Rauschspektrums Rechenleistung des Arduino UNO vollkommen aus-
reichend.
Mit diesen fnf Reglern kann bereits eine erstaunliche Klangflle erzielt Eine Library ermglicht die Umsetzung dieses Ver-
werden. Natrlich ist der Synthesizer nahezu beliebig erweiterbar. So ist fahrens ohne groen Aufwand. Sie kann unter
es mglich, die Grundparameter zu ndern, um so vllig andere Tonlagen https://github.com/jscrane/TTS
zu erzeugen. kostenlos aus dem Internet geladen werden.

ELVjournal 1/2017

Arduino_verstehen_Teil_20.indd 39 16.12.16 17:16


40 So funktionierts

Bild 6: Arduino als Synthesizer

Nach der Installation der Library gibt der folgende den Arduino sind so individuelle Gerte realisierbar, wie beispielsweise
Beispielsketch eine kurze Begrung aus. ein MP3-Wecker mit Wochentagfunktion oder ein programmgesteuertes
Hi-Fi-Stereo-Mediacenter.

// text to speech greeting


#include <TTS.h>
TTS text2speech(3);
Weitere Infos:
void setup() {}

void loop()
[1] Songtext Daisy Bell: www.metrolyrics.com/
{ text2speech.setPitch(5); daisy-bell-bicycle-built-for-two-lyrics-tyler-the-creator.html
text2speech.sayText("Good morning, doctor Einstein"); [2] IBM 7094 singt Daisy Bell:
delay(500); www.youtube.com/watch?v=41U78QP8nBk
} [3] HAL singt Daisy Bell:
www.youtube.com/watch?v=XiIFeru-ufQ
Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV, 2011,
Das Programm ist in der Lage, englischsprachige Tex-
Best.-Nr. CL-10 20 44
te in relativ guter Sprachqualitt wiederzugeben.
Auch Ziffern werden korrekt gesprochen. G. Spanner: Arduino Schaltungsprojekte fr Pros,
Hieraus ergibt sich eine Flle von Anwendungs- Elektor-Verlag, 2012, Best.-Nr. CL-10 94 45
mglichkeiten. So kann man etwa Messwerte oder Grundlagen zur elektronischen Schaltungstechnik nden sich
Systemzustnde akustisch ausgeben. Ein sprechen- in der E-Book-Reihe Elektronik!
des Voltmeter oder Thermometer kann so problemlos (www.amazon.de/dp/B00OXNCB02)
realisiert werden. Lernpaket AVR-Mikrocontroller in C programmieren,
Franzis-Verlag, 2012, Best.-Nr. CL-10 68 46
Ausblick Eine Einfhrung in die Audiotechnik ndet sich im E-Book
Nachdem in diesem Beitrag die Grundlagen der
Audiotechnik I (www.amazon.de/dp/B013NSPPY6)
Klang- und Sprachsynthese erlutert wurden, soll im
nchsten Beitrag die Wiedergabe von aufgezeichne-
Preisstellung November 2016 aktuelle Preise im Web-Shop
ten Klngen und von Musik im Vordergrund stehen.
Neben der Verwendung des Arduinos als Wiederga-
begert soll insbesondere auch ein MP3-Shield vor- Empfohlene Produkte Best.-Nr. Preis
gestellt werden. Dieses Shield ermglicht die Wie- Arduino UNO CL-10 29 70 27,95
dergabe von Musik in Hi-Fi-Qualitt. Im Gegensatz Mikrocontroller-Onlinekurs CL-10 20 44 99,
zu den teilweise etwas schwer verstndlichen Sprach-
ausgaben kann mit dem MP3-Shield Tonwiedergabe in Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
hchster Qualitt erfolgen. Durch die Steuerung ber und Zubehr nden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_verstehen_Teil_20.indd 40 16.12.16 17:16


2 So funktionierts

Arduino verstehen
und anwenden
Teil 21: Audiotechnik und Sound-Wiedergabe

www.elvjournal.de

Arduino_verstehen_Teil_21.indd 2 14.02.17 15:51


So funktionierts 3

Im letzten Artikel zu dieser Serie wurden dem Arduino verschiedene


Tne und Klnge entlockt. Bis hin zu einer synthetischen Spracherzeu-
gung reichen die Mglichkeiten, die bereits ein einfacher AVR-Mikrocon-
troller auf dem Arduino bietet.
Dabei wurden die Audioausgaben jedoch immer direkt vom Prozessor
erzeugt. In diesem Artikel soll es dagegen um die Wiedergabe von auf-
gezeichneten Tnen gehen. In einem ersten Schritt wird dazu gezeigt,
wie man den Arduino als Mini-Soundkarte einsetzen kann. Dazu werden
Daten ber die serielle Schnittstelle an den Arduino gesendet. Dort
werden sie in analoge Signale umgewandelt. Diese knnen dann ber
einen Lautsprecher wiedergegeben werden. Natrlich darf man bei die-
ser einfachen Anwendung keine Hi-Fi-Ergebnisse erwarten. Fr eine ein-
fache Ausgabe von WAV-Dateien ist die Methode aber durchaus brauch-
bar.
In einem zweiten Schritt sollen dann sogar MP3-Dateien abgespielt
werden. Dazu reicht die Rechenleistung des Arduinos selbst nicht mehr
aus. Deshalb wird hierfr ein Shield verwendet. Dieses verfgt ber
einen speziellen Decoder, der die im MP3-Format codierten Daten in
analoge Tonsignale umwandelt. Zustzlich enthlt das Shield auch noch
einen Audioverstrker, sodass man direkt Kopfhrer oder sogar kleine
Lautsprecher anschlieen kann. Damit lsst sich eine hervorragende
Klangqualitt erzielen, die fr die meisten praktischen Anwendungen Bild 1: Einfache Audioausgabe mit dem Arduino
ausreichend sein sollte.

Der Arduino als Mini-Soundkarte WAV-Dateien konvertieren


Im ersten Projekt wird gezeigt, wie mit geringem Hardware-Aufwand Um die WAV-Dateien auf dem Arduino abspielen zu
eine auf einem PC oder Laptop gespeicherte WAV-Datei mit einem knnen, mssen diese ein spezielles Format aufwei-
Arduino abgespielt werden kann. Im einfachsten Fall bentigt man hier- sen. Die Daten sollten im RIFF-WAVE-Format/PCM mit
fr neben dem Arduino nur drei weitere Bauteile: den folgenden Parametern vorliegen:
1x 100 F-Kondensator 8-bit
1x Widerstand oder Trimmer (ca. 100 ) mono
1x Lautsprecher (832 ) 11,025 kHz Samplingrate

Bild1 zeigt den zugehrigen Schaltplan. Die gesamte Schaltung kann Wenn die abzuspielende Datei noch nicht in diesem
leicht auf einem kleinen Breadboard aufgebaut werden. Format vorliegt, kann sie beispielsweise mit Auda-
Um mit einer minimalen Anzahl von Bauelementen auszukommen, city konvertiert werden. Dieses uerst ntzliche
wurde auf einen Tiefpass am PWM-Ausgang des Arduinos verzichtet. Programm kann unter [1] kostenlos aus dem Internet
Mchte man die Tonqualitt verbessern, empfiehlt es sich ohnehin, geladen werden.
einen kleinen Audioverstrker einzusetzen. Ein passender Schaltungs- Die Datei wird in Audacity geffnet und unten
vorschlag findet sich im letzten Artikel dieser Serie (Teil 20: Digitale links unter Projektrate dann 11.025 Hz ausgewhlt.
Soundeffekte und Synthesizer, ELV Journal Feb./Mrz). Um bei Stereoformat auf Mono zu wechseln, klickt
Hier wird stattdessen ein kleiner Lautsprecher direkt ber einen Elko man im Kstchen mit dem Dateinamen auf den klei-
und einen Vorwiderstand angeschlossen. Zu beachten ist, dass an die- nen Pfeil und whlt Stereotonspur aufteilen.
sen einfachen Audioausgang kein kommerzieller Verstrker und keine Anschlieend kann man z.B. den rechten Tonka-
Aktivboxen angeschlossen werden drfen. Die im Signal vorhandenen nal durch Klick auf das X lschen und beim linken
hochfrequenten Strungen aus der Pulsweitenmodulation des Arduinos Tonkanal durch erneuten Klick auf den kleinen Pfeil
knnten diese Audiogerte beschdigen. Mono auswhlen. Das Speichern der Datei erfolgt

ELV Journal 2/2017

Arduino_verstehen_Teil_21.indd 3 14.02.17 15:51


4 So funktionierts

Nun kann durch Klick auf den Button Send file die gewnschte
WAV-Datei ausgewhlt und dann durch Aktivieren von Start bertragen
werden (Bild4). Aus dem Lautsprecher sollte nun die WAV-Datei zu h-
ren sein. Je nach Auslastung des PCs kann es z.B. beim Verschieben von
Fenstern zu Lcken im Datenstrom und damit zu hrbaren Aussetzern
kommen. Der Sketch dazu sieht so aus:

// wavPlayer.ino
Bild 2: Exportieren der WAV-Datei
void setup()
{ Serial.begin(115200);
pinMode(6, OUTPUT);
unter ExportAudio. Die Datei muss im unkomprimier-
TCCR0A=0x83; TCCR0B=0x01;
ten Exportformat TCNT0=0x00;
WAV OCR0A=0x00; OCR0B=0x00;
8-bit PCM }
gespeichert werden (siehe Bild 2).
Die Datei sollte jetzt im korrekten Format vorliegen. void loop()
{ for(int i = 0; i < 44; i++)
Ein Sketch verwandelt den Arduino in { // skip 44 bytes header
eine Soundkarte while(Serial.available() == 0);
Die WAV-Dateien mssen binr als kontinuierlicher Serial.read();
}
Datenstrom, also ohne Pausen zwischen den Daten-
bytes, an den Arduino bertragen werden. Da beim
while(1)
Arduino ein virtueller COM-Port via USB geffnet { while(Serial.available() == 0);
wird, ist es wichtig, dass das Sendetool die Daten OCR0A = (unsigned char)Serial.read();
nicht in einzelnen Bytes, sondern blockweise an den }
COM-Port-Softwaretreiber bergibt, da es sonst zu }
Lcken in der Wiedergabe kommen kann.
Hierfr kann z.B. das Freewaretool HTerm [2]
verwendet werden. Zunchst wird in HTerm in der Das zu diesem Artikel verfgbare Download-Paket (siehe Download-Pa-
Auswahlbox Port der entsprechende COM-Port des ket zum Artikel am Ende des Beitrags) enthlt zwei Probedateien im
Arduinos ausgewhlt. Die serielle Schnittstelle muss korrekten Format. Damit kann der Sketch getestet werden.
dann auf
115.200 Baud, So funktionierts
8 Datenbits, In der Funktion setup wird die serielle Schnittstelle auf 115.200Baud
1 Stoppbit, konfiguriert. Bei 16-MHz-Quarztakt ergibt sich bei dieser Baudrate zwar
keine Paritt, ein relativ groer Fehler, dieser wirkt sich jedoch kaum noch auf die
keine Flusskontrolle Datenbertragung aus. Der Digitalpin6 wird als PWM-Ausgang ver-
eingestellt werden (siehe Bild 3). wendet. Anschlieend wird der Timer0 des Arduinos fr 8-bit-Aufl-
Durch einen Klick auf den Button Connect wird die sung konfiguriert. So ergibt sich ein PWM-Signal mit einer Frequenz
Schnittstelle geffnet. von 16MHz/256=62,5kHz. Der Wert von OCR0A bestimmt das Puls-/

Bild 3: Die Einstel-


lungen im Terminal-
programm

www.elvjournal.de

Arduino_verstehen_Teil_21.indd 4 14.02.17 15:51


So funktionierts 5

Pausenverhltnis. Weitere Details zu Konfiguration von Timern finden


sich in [3 oder 4].
In der Main-Loop wird zunchst mittels einer for-Schleife gewartet,
bis 44Bytes ber die serielle Schnittstelle empfangen wurden, da eine
WAV-Datei einen 44Bytes groen Header mit Dateiinfos aufweist. Wr-
den diese Bytes auf den PWM-Ausgang bertragen, knnte dies Strge-
rusche im Lautsprecher verursachen.
Anschlieend wird in einer while(1)-Endlosschleife jedes ber die
serielle Schnittstelle empfangene Datenbyte in ein Timer-Register ge-
schrieben und so auf den PWM-Ausgang ausgegeben. Wenn ein kon-
tinuierlicher Datenstrom mit 115.200Baud empfangen wird, werden
bei 10Bit (1Startbit, 8Datenbits, 1Stoppbit) also 11.520Bytes pro
Sekunde ausgegeben, was in etwa 11kHz, also der WAV-Datenrate, ent-
spricht. Der Lautsprecher selbst wirkt wie ein Tiefpass und filtert den
grten Teil der PWM-Frequenz von 62,5kHz heraus.
Bild 4: HTerm sendet Audiodaten
Wiedergabe von Sound-Dateien
Die Wiedergabe von Klangdateien ber den PWM-Ausgang des Arduinos
stellt natrlich nur eine sehr einfache Mglichkeit dar, den Arduino als Diese Library enthlt bereits einige einfache Bei-
Tonwiedergabemedium einzusetzen. Neben der bertragung ber die spiele, welche die Funktionen des Audio-Shields er-
serielle Schnittstelle knnten die Tondaten auch im Flash des Arduinos lutern. Die wichtigste Funktion ist das Abspielen
gespeichert werden. Mit 16Kilobyte kann man auf diese Weise aller- einer MP3-Datei von einer SD-Karte. Der Decoder wird
dings gerade mal drei bis vier Sekunden lange Audiodateien speichern. entsprechend ber die Library VS10xx angesprochen,
Zwar knnte man die Speicherkapazitt mit einer externen SD-Karte dabei muss diese am Anfang mit VS1011.begin()
erheblich erweitern, wenn man aber schon zustzliche Hardware ein- initialisiert werden. ber VS1011.Reset() wird der
setzt, kann auch ein wesentlich effizienteres Tonwiedergabeverfahren MP3-Decoder zurckgesetzt, dann knnen die Daten
verwendet werden. in 32-Byte-Paketen bertragen werden.
Genau hier kommt das MP3-Verfahren zum Zug, welches die verlust- Um die Audiosignale hrbar zu machen, muss ent-
behaftete Kompression digital gespeicherter Tondaten erlaubt. MP3 sprechend die Mute-Schaltung deaktiviert werden.
verwendet dafr verschiedene Methoden der Psychoakustik. So sollen Damit wird auch gleichzeitig der Verstrker aktiviert.
nur die relevanten, also fr den Menschen wahrnehmbaren Signalanteile Die Library des Audio-Shields stellt fr die Ansteu-
abgespeichert werden. So wird bei kaum verringerter Audioqualitt eine erung des MP3-Decoders das Objekt VS1011 bereit,
starke Reduktion des Datenumfangs ermglicht. welches die folgenden Funktionen enthlt. Dabei
Eine hufig verwendete Datenrate ist 192Kilobit/Sekunde. Damit sind den Funktionen die Objektnamen mit einem
kann bereits eine hohe Wiedergabequalitt erreicht werden. Die Da- Punkt voranzustellen, beispielsweise zur Initialisie-
tenkompression einer MP3-Audiodatei betrgt dabei bereits etwa 85% rung der Library:
gegenber einer konventionellen Audio-CD. MP3 ist mittlerweile das am VS1011.begin();
weitesten verbreitete Verfahren zur Speicherung und bertragung von Der auf dem Shield integrierte Verstrker kann ber
Musik auf Computern, Smartphones und im Internet. Entwickelt wurde eine Mute-Funktion gesteuert werden. ber
das Format ab 1982 am Fraunhofer-Institut fr Integrierte Schaltun- void UnsetMute( void );
gen in Zusammenarbeit mit der Friedrich-Alexander-Universitt Erlan- wird der Verstrker aktiviert, ber
gen-Nrnberg, den AT&T Bell Labs und der Firma Thomson. void SetMute( void );
Bereits Mitte der 1990er-Jahre waren Abspielgerte und Software fr kann er deaktiviert werden.
PCs im Umlauf, die es ermglichten, komprimierte MP3-Dateien zu spei-
chern und abzuspielen. Auch der Austausch solcher Dateien ber das
Internet vereinfachte sich. Selbst bei einfacher ISDN-Geschwindigkeit
bentigte man fr die bertragung lediglich das Zwei- bis Dreifache
der Abspielzeit. Mit DSL-Leitungen liegt die bertragungsdauer sogar
weit unterhalb der Spieldauer. Ab 1998 erschienen im Handel die ersten
tragbaren MP3-Player.
Mit einem Audio-Shield steht seit einiger Zeit auch eine Mglich-
keit zur Verfgung, MP3-Dateien Arduino-gesteuert wiederzugeben. Der
besondere Reiz dieser Mglichkeit besteht darin, dass man nun in der
Lage ist, MP3-Spieler nach eigenen Vorstellungen aufzubauen. Am Ende
dieses Artikels wird dazu ein spezieller MP3-Wecker vorgestellt, der in
weitem Rahmen individuell gestaltet und variiert werden kann.

Die Funktionen des Audio-Shields


Zunchst sollen hier aber die wesentlichen Funktionen des Shields (sie-
he Bild5) vorgestellt werden.
Wie bei Arduino-Anwendungen blich, wird zum Audio-Shield eine Li-
brary zur Verfgung gestellt. Diese kann von der Website des ELV Shops
geladen werden [6]. Bild 5: Shield und LC-Display am Arduino

ELV Journal 2/2017

Arduino_verstehen_Teil_21.indd 5 14.02.17 15:51


6 So funktionierts

Die eigentliche Initialisierung des Audio-Shields er- nischen Artikel in einer frheren Ausgabe des ELV Journals entnommen
folgt ber werden [6]. Weitere Detailinformationen sind auch dem im Datenblatt
void begin( void ); des auf dem Shield verwendeten Bausteins VS1011 der Firma VLSI Solu-
des MP3-Decoders. Zwischen zwei Audiodateien soll- tion zu finden.
te jeweils ein Software-Reset ausgefhrt werden: Zudem befinden sich auf dem Shield noch mehrere LEDs, die soft-
void SoftReset( void ); waregesteuert ein- oder ausgeschaltet werden knnen. Fr den Betrieb
Ein besondere Vorzug des Shields ist, dass die Laut- der LEDs sind verschiedene Wischverbinder auf dem Shield zu schlieen.
strke ber die Funktion Allerdings sind die LEDs nicht sichtbar, sobald der Aufbau in ein Gehu-
void SetVolume( unsigned char leftchannel, unsi- se eingebaut wird. Deshalb wird die Verwendung dieser LEDs hier nicht
gned char rightchannel ); weiter betrachtet. Bei entsprechendem Interesse knnen Details dazu
programmgesteuert einstellbar ist. Zu beachten ist wiederum in [6] nachgelesen werden.
allerdings, dass die maximale Lautstrke beim Ein- Nachdem eine MP3-Datei auf die SD-Karte kopiert wurde und die
stellwert 0, die minimale Lautstrke bei 254 erreicht Karte in den Slot des Shields eingesteckt ist, steht einem ersten Test
wird. ber den Wert 255 kann die Ausgangsstufe nichts mehr im Weg. Man muss lediglich noch zwei Lautsprecher an die
vollstndig deaktiviert werden. So kann man etwa Schraubklemmen anschlieen und nach dem Laden des Sketches wird
ber zwei Taster die Lautstrke einstellbar machen. die Datei abgespielt.
Ein analoges Potentiometer ist dann nicht mehr er-
forderlich.
Aber auch bei einem Wecker kann man so zunchst Tipp:
mit geringer Lautstrke beginnen und diese dann Die Verwendung des Audio Shields sollte mit einer externen Strom-
langsam steigern. Mit der Anweisung versorgung am Arduino erfolgen, da es sonst bei greren Laut-
unsigned char* Send32( unsigned char* pBuffer ); strken zu Problemen mit der USB-Stromversorgung kommen kann.
wird ein 32-Byte-Datenblock an den MP3-Decoder
bertragen. Der Puffer des MP3-Decoders kann ber
void Send2048Zeros( void ); Anschluss von Aktivboxen
geleert werden. Auf dem MP3-Shield ist zwar ein Audioverstrker vorhanden, dieser lie-
Um die SD-Karte nutzen zu knnen, muss die fert jedoch nur eine relativ geringe Ausgangsleistung. Fr Kopfhrer-
SD-Library des Arduinos hinzugefgt werden, dabei betrieb ist diese durchaus ausreichend. Will man jedoch Lautsprecher
ist zu beachten, dass der ChipSelect der SD-Karte anschlieen, bietet sich der Einsatz von Aktivboxen an. Diese knnen
beim Audio-Shield von der SD-Library abweicht und direkt mit den Schraubklemmen verbunden werden. Fr eine optimale
deshalb beim Initialisieren diese als Parameter zu Klangqualitt ist in diesem Falle der Lautstrkepegel entsprechend an-
bergeben ist: zupassen, sodass es nicht zu bersteuerungen kommt. Natrlich kann
SD.begin( SD_CS ); man sich geeignete Verstrker auch selbst bauen. Hinweise zum Aufbau
Damit ergibt sich das folgende Minimalprogramm eines einfachen Stereoverstrkers finden sich z. B. in [7].
zum Abspielen der Datei 001.mp3:
Musikwecker
// play "001.mp3" from SD-card Lsst man sich von einem gewhnlichen Radiowecker aus dem Schlaf
holen, hat das verschiedene Nachteile. Hufig wird man dann nicht von
#include <SD.h> angenehmer Musik geweckt, sondern von nervigen Werbeeinblendun-
#include <SPI.h> gen, die sich im Halbschlaf ja besonders gut einprgen sollen.
#include <AudioShield.h>
Auerdem verfgen kommerzielle Radiowecker meist nur ber eine
einzige Weckzeit. Deutlich komfortabler wre es doch, wenn man fr
void setup()
{ SD.begin(SD_CS); jeden Tag eine andere Zeit einprogrammieren knnte. So wre fr Wo-
VS1011.begin(); chentage beispielsweise 7:00Uhr angemessen, whrend man am Sams-
VS1011.SetVolume(0,0); tag oder Sonntag erst um 9:00Uhr geweckt werden will.
} Hier kommen die Vorteile eines Eigenbaus zum Tragen. Mit dem MP3-
Shield und einem Arduino kann man sich alle oben genannten Wnsche
void loop() problemlos erfllen. Man muss sich nur seine Lieblingssongs auf die
{ unsigned char buffer[32]; SD-Karte kopieren und kann sich dann ganz individuell mit seinen Lieb-
if( File SoundFile = SD.open("001.mp3", FILE_READ)) lingsliedern wecken lassen.
{ VS1011.UnsetMute();
while(SoundFile.available())
Fr vollen Komfort:
{ SoundFile.read(buffer, sizeof(buffer));
VS1011.Send32(buffer);
Display fr Uhr- und Weckzeit
} Natrlich gehrt zu einem ordentlichen Wecker auch die Anzeige der
VS1011.Send2048Zeros(); Uhr- und Weckzeit. Hierfr kann ein Display mit dem Arduino verbunden
VS1011.SetMute(); werden. Da das MP3-Shield allerdings bereits eine Vielzahl von Pins
SoundFile.close(); belegt, ist der Anschluss eines klassischen HD44780-Displays, wie es
} in Artikel Alphanumerische LC-Displays im ELVJournal 4/2016 vorge-
} stellt wurde, mit erheblichen Problem verbunden. Eine Lsung bietet die
Verwendung eines I2C-Displays, das mit nur zwei aktiven Pins gesteu-
ert werden kann. Zudem bleiben auch bei aktivem Shield die beiden Pins
Wie die Register des MP3-Decoders im Einzelnen aus- fr den I2C-Bus frei, sodass dieser Displaytyp hier ohne Zusatzaufwand
gelesen oder beschrieben werden, kann einem tech- verwendet werden kann. Bild6 zeigt den zugehrigen Aufbau.

www.elvjournal.de

Arduino_verstehen_Teil_21.indd 6 14.02.17 15:51


So funktionierts 7

Der Sketch dazu sieht so aus:

// MP3Clock.ino

#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <SPI.h>
#include <AudioShield.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int startHour = 7;
int startMinute = 15;
Bild 6: Aufbau mit MP3-Shield, LC-Display
und Arduino
void printDigits(int digits)
{ // print leading zeros
if(digits < 10) lcd.print('0');
lcd.print(digits);
}

void setup()
{ lcd.begin(); lcd.backlight();
lcd.setCursor(0, 1); lcd.print(" Wake at: ");
printDigits(startHour); lcd.print(":"); printDigits(startMinute);
// 07:14:45 am 1. Januar 2017.
setTime(07, 14, 45, 01, 01, 2017);
// setup MP3 shield
if( SD.begin( SD_CS ) == false )
{ return; }
VS1011.begin();
}

void loop()
{ // show current time
lcd.setCursor(4, 0); printDigits(hour()); lcd.print(":");
printDigits(minute()); lcd.print(":"); printDigits(second());

if ((hour() == startHour && minute() == startMinute)) // Start MP3


{ lcd.setCursor(0, 0); lcd.print(" Playing MP3 ");
unsigned char buffer[32]; // generate buffer
if( File SoundFile = SD.open( "001.mp3", FILE_READ ) )
{ VS1011.UnsetMute(); // power up amplifier
while( SoundFile.available() )
{ SoundFile.read( buffer, sizeof(buffer) );
VS1011.Send32( buffer );
}
VS1011.Send2048Zeros(); // fill buffer
VS1011.SetMute(); // amplifier off
SoundFile.close();
}
lcd.setCursor(0, 0); lcd.print(" ");
}
}

ELV Journal 2/2017

Arduino_verstehen_Teil_21.indd 7 14.02.17 15:51


8 So funktionierts

Bild 7: Das Display zeigt die aktuelle Zeit


und den Systemstatus.

Bild 8: Der MP3-Wecker mit Display und Aktivboxen

Zustzlich zu den bereits genannten Bibliotheken


sind noch die folgenden Libs erforderlich: Download-Paket zum Artikel:
Time-Library Die Sketche und Beispieldateien zu diesem Artikel knnen unter
Wire.h-Library www.elv.de: Webcode #10071 heruntergeladen werden.
LiquidCrystal_I2C-Library
Die Bibliotheken knnen wie blich kostenfrei aus
dem Internet geladen werden. Informationen zu den
jeweiligen Links finden sich am Ende des Artikels.
Wenn man den Arduino samt dem aufgesteckten MP3-
Shield in ein formschnes Gehuse einbaut, dann
steht dem morgendlichen Musikgenuss nichts mehr
im Weg. Die Bilder7 und 8 zeigen einen entsprechen-
den Aufbauvorschlag dazu. Weitere Infos:
Ausblick
Mit diesem Artikel ist der Ausflug in die Klangerzeu- [1] Audacity findet sich unter:
gung und Musikwiedergabe mit dem Arduino been- http://www.audacityteam.org/download/
det. Mit dem Anschluss des I2C-Displays wurde je- [2] Das Terminalprogramm kann aus dem Internet geladen wer-
doch bereits das nchste Thema gestreift. Wie man den unter: http://www.der-hammer.info/terminal/
bereits erkennen konnte, kann man durch den Ein- [3] Mikrocontroller-Onlinekurs, Franzis-Verlag, exklusiv fr ELV,
satz von Bussen Pins und andere Ressourcen in einem 2011, Best.-Nr. CM-10 20 44
Mikrocontrollersystem einsparen. [4] Elektor Praxiskurs AVR-XMEGA-Mikrocontroller
So ist es mglich, die Funktionalitt des Arduinos Best.-Nr. CM-12 07 62
oder von Mikrocontrollersystemen allgemein durch [5] G. Spanner: Arduino Schaltungsprojekte fr Profis,
Bussysteme wie I2C oder SPI ganz erheblich zu er- Elektor-Verlag, 2012
weitern. Auch der SPI-Bus kam ja bereits bei der An- [6] Artikel Audio Shield for Arduino im ELV Journal 1/2013
steuerung der SD-Karte im Hintergrund zum Einsatz. [7] Im E-Book Audiotechnik
Aus diesem Grunde werden sich die nchsten Arti- (siehe https://www.amazon.de/dp/B013NSPPY6)
kel genauer mit den bei Mikrocontrolleranwendungen finden sich Grundlagen zum Bau von Audioverstrkern
so beliebten Bussystemen wie
I2C
Preisstellung Februar 2017 aktuelle Preise im Web-Shop
SPI
One-Wire
befassen. Empfohlene Produkte Best.-Nr. Preis
Wie immer werden dabei neben den theoretischen Arduino UNO CM-10 29 70 27,95
Hintergrnden auch praktische Anwendungen vorge- Audio Shield CM-11 06 48 9,95
stellt. Insbesondere die Anbindung von Sensoren und
Aktoren an die verschiedenen Busse wird dabei eine Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
zentrale Rolle spielen. und Zubehr finden Sie unter: www.arduino.elv.de

www.elvjournal.de

Arduino_verstehen_Teil_21.indd 8 14.02.17 15:51


2 So funktionierts

Arduino verstehen
und anwenden
Teil 22: IC der Inter-IC-Bus Grundlagen und Anwendungen

www.elvjournal.de
So funktionierts 3

Bild 1: Prinzipieller Aufbau des IC-Busses

Der Arduino verfgt zwar ber 14 digitale I/O-Pins und diese sind fr Inzwischen ist der IC-Bus nicht mehr auf einzel-
viele kleinere Projekte durchaus ausreichend. Bei greren Praxisan- ne Platinen beschrnkt. Vielmehr kommt er auch in
wendungen stt man jedoch schnell an Grenzen. Insbesondere wenn greren Systemen mit mehreren Boards zum Ein-
Shields, wie etwa das im letzten Beitrag vorgestellte MP3-Shield, be- satz. Die einfache Steuersoftware macht den Bus
nutzt werden, sind oft nur noch wenige Pins frei verfgbar, da die sehr flexibel. Da keine festen Taktzeiten eingehalten
Shields selbst bereits viele Pins belegen. werden mssen, knnen sowohl langsame als auch
Eine Lsung wre, eine grere Arduino-Version einzusetzen, etwa sehr schnelle Busteilnehmer simultan betrieben wer-
den Arduino Mega oder den Due. Dies ist allerdings mit erheblichen den. Auf der Softwareseite ist so auch der Einsatz
Kosten verbunden und in vielen Fllen auch gar nicht notwendig. langsamerer Programmiersprachen wie etwa Python
Sogenannte Bus-Systeme bieten die Mglichkeit, umfangreiche Funk- mglich.
tionen mit nur wenigen Pins zu steuern. Ein klassisches Beispiel ist die
Verwendung eines IC-Displays. Dieses bentigt nur zwei I/O-Pins im Elektrischer Anschluss und Takt
Gegensatz zu den sechs Pins, die ein klassisches HD44780-LCD belegt. IC ist als Master-Slave-Bus konzipiert. Ein Daten-
In diesem Beitrag soll daher der IC-Bus im Vordergrund stehen. Wei- transfer wird immer durch einen Master gestartet.
tere hufig verwendete Bus-Systeme wie etwa SPI oder One-Wire werden Anschlieend reagiert der ber seine Adresse ange-
in spteren Beitrgen behandelt. sprochene Slave auf die Anfrage. Im sogenannten
Multimaster-Mode knnen aber auch mehrere Master
Der IC-Bus an einem Bus betrieben werden. Hier knnen dann
Der IC-Bus (Inter Integrated Circuit, meist als I-squared-C-Bus oder auch zwei Master direkt miteinander kommunizieren,
deutsch I-Quadrat-C-Bus ausgesprochen) ist ein serieller Zweidraht- indem ein Gert kurzzeitig als Slave arbeitet. Die Zu-
Bus, der vor ber 30 Jahren in der Entwicklungsabteilung der Firma griffsregelung auf den Bus ist ber eine entsprechen-
Philips, heute NXP, entstand. Rasch entwickelte sich das System zum de Spezifikation detailliert geregelt.
Industriestandard fr Steuerungs-, Diagnose- und berwachungslsun- Bild1 zeigt, wie die einzelnen Buskomponenten
gen in unzhligen Embedded-Applikationen. hardwaremig miteinander verbunden werden.
Durch die einfache Implementierung, niedrige Kosten und eine ber- Beide Busleitungen (Takt und Daten) liegen mit den
tragungsrate von bis zu 3,4 MBit/s hat der Bus bis heute nichts von Pull-up-Widerstnden (typischerweise 4,7 bis 10k)
seiner Aktualitt verloren. an der Versorgungsspannung Vdd, die blicherweise
Ursprnglich sollte ein Bus-System entstehen, ber das mehrere ICs 5V betrgt. Smtliche daran angeschlossene Ger-
auf einer Leiterplatte mit geringem Aufwand miteinander kommunizie- te haben Open-Collector-Ausgnge. Zusammen mit
ren sollten. Daher wurde eine serielle Struktur bevorzugt, um mit weni- den Pull-up-Widerstnden ergibt sich so eine Wi-
gen Leiterbahnen auszukommen. red-AND-Schaltung. Der High-Pegel der Bussignale
So entstand ein bidirektionaler Zweidraht-Bus in Master/Slave-Archi- sollte mindestens 0,7Vdd betragen, der Low-Pegel
tektur mit integriertem bertragungsprotokoll und Software-Adressie- soll hchstens bei 0,3Vdd liegen. Falls es zu ber-
rung, der nur zwei Verbindungsleitungen erfordert: tragungsfehlern kommt, ist es immer eine gute Idee,
die Taktleitung SCL (Serial Clock), wenn man diese Spannungen mit einem Oszilloskop
die Datenleitung SDA (Serial Data). nachmisst und eventuell die Pull-up-Widerstnde an-
Ein Mikrocontroller kann so ein ganzes Netzwerk von Komponenten passt. Einige Controller haben auch bereits interne
mit nur zwei I/O-Pins ansteuern. Bevorzugte Anwendungen finden sich Pull-ups eingebaut, sodass die externen Widerstnde
insbesondere im Bereich der Unterhaltungselektronik, z.B. in der Ab- entfallen knnen. Im Zweifelsfall hilft hier ein Blick
stimmung von Autoradios oder TV-Gerten oder bei vollelektronischen ins Datenblatt weiter.
Lautstrkereglern. Der IC-Bus arbeitet mit positiver Logik. Das be-
Zunchst gengte hierfr eine bertragungsrate von lediglich deutet, dass ein High-Pegel auf der Datenleitung
100kBit/s. Aufgrund zunehmender Leistungsanforderungen wurde die einer logischen Eins, der Low-Pegel einer Null
bertragungsrate dann aber immer weiter angehoben. Ein groer Vorteil entspricht.
des IC-Busses besteht darin, dass auch langsamere Komponenten am Der Bustakt wird immer vom Master ausgegeben.
Bus betrieben werden knnen. Hierfr kann das sogenannte Clock-Stret- Fr die verschiedenen Modi ist jeweils ein maximal
ching eingesetzt werden (s. u.). erlaubter Bustakt vorgegeben. In der Regel knnen

ELV Journal 3/2017


4 So funktionierts

Bild 2: Aufbau eines IC-Telegramms

Gerte
Adresse R/W Daten
Subadresse

Start 0 1 0 0 x x x 1 ACK x x x x x x x x Stopp

Bild 3: IC-Timing

aber auch beliebig langsamere Taktraten verwendet sind, knnen so bis zu 112 Teilnehmer an einem Bus betrieben werden.
werden, falls diese vom Master-Interface untersttzt Dazu hat jedes IC-fhige IC eine vom Hersteller festgelegte Adresse,
werden. Einige ICs (z.B. Analog-digital-Umsetzer) von der hufig drei Bits, die sogenannte Subadresse, ber drei Steu-
bentigen jedoch eine bestimmte minimale Takt- erpins individuell festgelegt werden knnen (siehe Bild 2 und 3). In
frequenz, um ordnungsgem zu funktionieren. Die diesem Fall knnen bis zu acht ICs des gleichen Typs an einem IC-Bus
folgende Tabelle listet die gngigsten Taktraten auf: betrieben werden. Im Praxisteil wird dies anhand eines Temperatursen-
sors vom Typ LM75 genauer erlutert.
100-kHz-Takt Standard-Mode Fr Hobbyanwendungen sind 112 Teilnehmer sicherlich in den meis-
400-kHz-Takt Fast-Mode ten Fllen ausreichend. Bei groen, professionellen Systemen da-
1,0-MHz-Takt Fast-Mode-Plus gegen kann es durchaus zu Adressknappheit kommen. Deshalb wurde
3,4-MHz-Takt High-Speed-Mode eine 10-Bit-Adressierung eingefhrt. Sie ist abwrtskompatibel zum
7-Bit-Standard durch Nutzung von 4 der 16 reservierten Adressen. Bei-
Wenn der Slave mehr Zeit bentigt, als durch den de Adressierungsarten sind gleichzeitig verwendbar, sodass nun bis zu
Takt des Masters vorgegeben ist, kann er zwischen 1136 Komponenten auf einem Bus erlaubt sind.
der bertragung einzelner Bytes die Taktleitung auf Die bertragung beginnt mit einem Startsignal des Masters. Dann
low halten. ber dieses im letzten Abschnitt be- folgt die Adresse. Diese wird durch das ACK-Bit des angesprochenen
reits erwhnte Clock-Stretching kann der Mastertakt Slaves besttigt. Abhngig vom R/W-Bit werden nun Daten bytewei-
reduziert werden, falls dies erforderlich sein sollte. se geschrieben oder gelesen. Beim Schreiben wird das ACK vom Slave
In einem IC-System sind Daten nur gltig, wenn gesendet, beim Lesen vom Master. Eine bertragung wird durch das
sich ihr logischer Pegel whrend einer Clock-High- Stoppsignal beendet.
Phase nicht ndert. Ausnahmen von dieser Regel Die Datenbertragung startet mit dem hchstwertigen Bit (MSB
sind das Start- und Stoppsignal. Das Startsignal wird first). Fr den High-Speed-Mode wird zuerst im Fast- oder Standard-Mo-
durch eine fallende Flanke auf SDA gekennzeichnet, de ein Master-Code geschickt, bevor auf die erhhte Frequenz umge-
whrend SCL high ist. Das Stoppsignal dagegen schaltet wird.
wird durch eine steigende Flanke auf SDA signali-
siert, die SCL-Leitung bleibt dabei auf High-Pegel. Anwendungen
Eine Dateneinheit besteht aus 8Datenbits und Einer der wichtigsten Vorteile von Bus-Systemen wie IC ist, dass ein
wird hufig auch als Oktett bezeichnet. Ein Oktett Mikrocontroller ein ganzes Netzwerk an integrierten Schaltungen mit
kann entweder als Wert oder als Adresse interpre- nur zwei I/O-Pins und einfacher Software ansteuern kann.
tiert werden. Dazu kommt noch ein ACK-Bit als Be- Systeme mit einer mglichst geringen Anzahl von erforderlichen I/O-
sttigung (von engl. Acknowledge). Dieses wird vom Pins sind deshalb so vorteilhaft, da ein erheblicher Teil der Kosten einer
Slave durch einen Low-Pegel auf der Datenleitung integrierten Schaltung und der verwendeten Leiterplatte von der Gr-
erzeugt. e des IC-Gehuses und der Anzahl der Pins abhngt. Ein groer Chip
mit vielen Pins bentigt mehr Platz auf der Leiterplatte. Zudem stellen
Protokoll und Adressierung zustzliche Verbindungen immer ein Ausfallrisiko dar und erfordern so
Eine Standard-IC-Adresse ist das erste vom Mas- einen erhhten Prfaufwand. All das steigert die Entwicklungs-, Pro-
ter gesendete Byte, wobei die ersten sieben Bit die duktions- und Testkosten.
eigentliche Adresse darstellen und das achte Bit Obwohl das System langsamer ist als neuere Busse, ist die IC-Schnitt-
(R/W-Bit) dem Slave mitteilt, ob er Daten vom Mas- stelle wegen des geringen Aufwands vorteilhaft fr Peripheriegerte,
ter empfangen soll (LOW) oder Daten an den Master die keine hohen Datenraten erfordern. Hufig wird sie fr die bertra-
zu bertragen hat (HIGH). In IC-Systemen ist daher gung von Steuer- und Konfigurationsdaten verwendet. Beispiele sind
ein Adressraum von 7Bit verfgbar. Da 16 der 27 = Lautstrkeregler, Analog-digital- oder Digital-analog-Wandler mit nied-
128 mglichen Adressen fr Sonderzwecke reserviert riger Abtastrate, Echtzeituhren, kleine, nichtflchtige Speicher oder

www.elvjournal.de
So funktionierts 5

bidirektionale Schalter und Multiplexer. Auch elektronische Sensoren


haben oft einen Analog-digital-Wandler mit IC-Schnittstelle integriert.
In der folgenden Tabelle sind einige der am meisten verwendeten
IC-fhigen Chips zusammengefasst.
IC / Komponente Funktion
LM75 Temperatursensor
BMP180 Barometrischer Luftdrucksensor
DS1307 Echtzeituhr mit Batteriepufferung
MAX127 A/D-Wandler
PCF8574 Portexpander
PCF8583 Echtzeituhr
LC-I2C 4x14-Segment-LC-Display
AZDelivery-Display OLED-Graphik-Display 0,96
AT24C256 EEPROM

Natrlich ist diese Tabelle bei Weitem nicht vollstndig, sie liefert je-
doch einen guten berblick ber die wichtigsten und am hufigsten
verwendeten IC-Bausteine.
Ein weiterer Vorteil des Busses ist, dass Bauelemente whrend des
Betriebs zum Bus hinzugefgt oder entfernt werden knnen (sog.
Hot-Plug-Fhigkeit). Allerdings muss diese Eigenschaft durch besondere
Vorkehrungen in der Programmierung bercksichtigt werden. Ansonsten
kann es auch zu unerwnschten Programmabbrchen kommen, wenn
Elemente vom Bus getrennt werden.
Eine gewisse Bedeutung hat das IC-Protokoll auch im Chipkartenbe-
reich. So wurde das System fr Krankenversichertenkarten eingesetzt.
Unter den Kontaktflchen der Chipkarte befand sich ein einfaches Bild 4: Sensoren und Display via IC-Bus am Arduino
IC-EEPROM, das vom Kartenleser ausgelesen und beschrieben werden
konnte. Allerdings werden hier zunehmend auch andere Technologien
eingesetzt. bungstemperatur direkt in ein IC-Signal um. Damit
wird es auch sehr einfach mglich, mehrere Sensoren
Sensoren am IC-Bus mit einem einzigen Controller auszuwerten. Auf die-
Zu den wichtigsten Anwendungen des IC-Busses zhlt die Erfassung se Weise kann man auch eine Vielzahl von Sensoren
von Sensorwerten. Hierfr steht eine fast unberschaubare Vielfalt von an einen Arduino anschlieen, ohne dass die Analog-
Komponenten zur Verfgung. So lassen sich praktisch alle physikali- eingnge belegt werden. Diese bleiben so fr andere
schen Gren mit IC-Sensoren erfassen. Im nichtprofessionellen Be- Anwendungen frei.
reich haben sich allerdings einige Bauelemente besonders etabliert. Die Bild4 zeigt, wie zwei LM75-Sensoren parallel am
wichtigsten davon sollen als Anwendungsbeispiele fr das Bus-System IC-Bus eines Arduinos betrieben werden knnen.
im Folgenden vorgestellt werden. Zustzlich ist hier bereits auch noch ein IC-fhiges
LCD-Modul und ein Drucksensor eingezeichnet. Diese
Przise Temperaturmessung beiden Komponenten werden weiter unten genauer
Eine der einfachsten Mglichkeiten, Temperaturen zu erfassen, ist die erlutert.
Verwendung von NTC-Sensoren (Negative Temperature Coefficient). Die- Die beiden Temperatursensoren mssen auf unter-
se Methode ist allerdings mit mehreren Nachteilen verbunden. schiedliche Adressen konfiguriert werden. Dazu wer-
Zunchst sind diese einfachen Bauelemente herstellungsbedingt mit den die Adresspins A0 bis A2 in geeigneter Weise mit
groen Toleranzen behaftet. Deshalb muss man jeden Sensor individuell Vcc oder GND verbunden. Bild 5 zeigt ein Beispiel.
kalibrieren, wenn eine gewisse Genauigkeit erreicht werden soll. Was
im Hobbybereich durchaus noch mglich ist, wre bei professionellen
Anwendungen viel zu aufwendig.
Ein weiterer Nachteil ist, dass die Messungen sehr ungenau werden
knnen, sobald zwischen dem Sensor und dem Controller bzw. dem Ar-
duino grere Distanzen liegen. Eine Ferntemperaturerfassung wird mit
einfachen analogen Sensoren sehr unzuverlssig.
Thermospannungen, Leitungswiderstnde oder elektromagnetische
Einstreuungen fhren zu erheblichen Messfehlern. Digitale Sensoren
sind hier deutlich weniger stranfllig. Der Messwert wird damit direkt
am Ort der Messung in ein digitales Signal umgewandelt. Dieses ist
gegenber den oben genannten Einflssen wesentlich unempfindlicher.
Auf diese Weise kann man auch grere Distanzen zwischen dem Sensor
und einer zentralen Messstation berbrcken.
Ein weit verbreiteter Sensortyp mit integrierter A/D-Wandlung ist
der LM75. Dieses Bauelement wandelt die aktuell gemessene Umge- Bild 5: Einstellung von IC-Adressen am LM75

ELV Journal 3/2017


6 So funktionierts

Daraus ergeben sich die folgenden Adressen fr kommen ausreichend. Die Platine ist unter anderem auch direkt als Ar-
die beiden Bausteine: duino-Shield einsetzbar.
LM75 1: Der Anschluss des Displays ist ebenfalls aus Bild 4 ersichtlich.
A2 = 0, A1 = 0, A0 = 0 Die IC-Adresse des ELV Displays ist auf
LM75 2: 0111011 = 3B hex
A2 = 0, A1 = 1, A0 = 1 eingestellt und kann ebenfalls nicht verndert werden.
Da der fest eingestellte Teil der Adresse 1001 lautet,
ergeben sich die vollstndigen Adressen zu: Test des Bus-Systems
LM75 1: Insbesondere wenn eine Vielzahl von Komponenten an einem Bus ange-
1001000 = 48 hex schlossen sind, ist es empfehlenswert, das Gesamtsystem vor der Inbe-
LM75 2: triebnahme zu testen.
1001011 = 4B hex Die folgende Tabelle fasst alle im System vorhandenen Adressen zu-
Sollen weitere Sensoren angeschlossen werden, ms- sammen:
sen fr diese natrlich andere Adressen gewhlt wer-
den. binr hex
LM75 1 0b1001000 0x48
IC-fhiger Luftdrucksensor LM75 2 0b1001011 0x4B
Wie bereits aus der oben stehenden Tabelle ersicht- BMP180 0b1110111 0x77
lich ist, steht mit dem BMP180 auch fr die Messung IC-Display 0b0111011 0x3B
des Luftdrucks ein IC-fhiger Baustein zur Verf-
gung. Dieser kann problemlos gemeinsam mit den Alle am Bus vorhandenen Sensoren knnen also aufgrund ihrer individu-
beiden LM75-Sensoren am Arduino betrieben werden, ell verschiedenen Adressen problemlos angesprochen werden.
da seine Adresse fest auf den Wert Um die Funktion des Busses zu testen, kann ein sogenannter IC-Scan-
1110111 = 77 hex ner verwendet werden.
eingestellt ist. Fr den Arduino existiert dazu ein spezielles Programm, das unter [1]
Zustzlich zum Luftdruck liefert dieser Sensor auch aus dem Internet geladen werden kann. Sind die Komponenten korrekt
noch einen przisen Temperaturmesswert. Zusammen angeschlossen, zeigt der Scanner die jeweiligen Bus-Adressen im seriel-
mit den beiden LM75-ICs stnden damit dann bereits len Monitor an (Bild 6).
drei Temperatursensoren zur Verfgung, mit denen
Messwerte an verschiedenen Orten erfasst werden Klimastation mit IC-Komponenten
knnten. Beispielsweise ist es so mglich, die Tem- Die hier vorgestellten Komponenten ermglichen den Aufbau einer pr-
peratur in einem Wohnraum, im Keller und im Auen- zisen und flexibel einsetzbaren Klimastation. Sind alle Komponenten
bereich zu erfassen. erst einmal mit dem Arduino verbunden, fehlt nur noch ein passendes
Auswertungsprogramm.
Einfacher Anschluss von Das ELV IC-Displaymodul verfgt neben der LCD-Anzeige auch noch
Displaymodulen ber vier LEDs. Durch eine entsprechende Zuordnung und Beschriftung
Auch Displaymodule verfgen hufig ber einen kann man damit jeden aktuell dargestellten Messwert kennzeichnen. Fr
IC-Anschluss. So kann beispielsweise ein alphanu- die Anwendung als Klimastation wurde folgende Zuordnung gewhlt:
merisches LC-Display ber lediglich zwei aktive Pins LED 1: aktueller Luftdruck (P)
gesteuert werden. Ein solches Display wurde bereits LED 2: Innentemperatur 1 (T1)
im letzten Beitrag zu dieser Artikelserie eingesetzt. LED 3: Innentemperatur 2 (T2)
Beim Audio-Player waren nur noch wenige freie Pins LED 4: Auentemperatur (T3)
verfgbar, sodass der IC-Bus dort seine Vorteile voll Da die LEDs ebenfalls ber den IC-Bus angesteuert werden knnen,
ausspielen konnte. werden keine zustzlichen Arduino-Pins belegt.
Natrlich knnte ein derartiges Display auch Um das Display anzusteuern, ist wieder eine passende Library erforder-
hier zum Einsatz kommen, allerdings soll an die- lich. Diese kann unter [2] von der ELV Produktseite des Moduls geladen
ser Stelle eine andere Version vorgestellt werden. werden. Das Programm dazu ist im folgenden Listing in verkrzter Form
Das ELVIC-Displaymodul bietet eine vierstellige dargestellt. Der vollstndige Code kann dem Download-Paket (siehe
14-Segmentanzeige, die bestens zur Darstellung von Download-Paket zum Artikel am Ende des Beitrags) entnommen wer-
Messwerten geeignet ist. Mchte man lediglich Zah- den.
lenwerte ausgeben, ist ein derartiges Display voll- Zunchst werden im Sketch alle erforderlichen Bibliotheken einge-
bunden. Dann erfolgt die Deklaration der Variablen:
P: Luftdruck in mbar
T1: z. B. Innentemperatur 1
T2: z. B. Innentemperatur 2
T3: z. B. Auentemperatur
Im Set-up werden die einzelnen Module (Wire, LCD und Serial) gestar-
tet. In der Hauptschleife werden dann die Werte aus den jeweiligen
Modulen der Reihe nach ausgelesen und sowohl an das Displaymodul
als auch an die serielle Schnittstelle ausgegeben. Weitere Details dazu
knnen bei Bedarf in [3] nachgelesen werden.
Wenn die Klimastation ohne Verbindung zu einem PC laufen soll,
Bild 6: Der IC-Scanner findet vier Komponenten am Bus kann auf die Ausgabe zur seriellen Schnittstelle verzichtet werden und

www.elvjournal.de
So funktionierts 7

die entsprechenden Programmzeilen knnen entfal-


len. Die Leuchtdioden des Displays werden dabei so
angesteuert, dass fr jeden Ausgabewert eine ein-
zelne LED aufleuchtet. Zusammen mit einer entspre-
chenden Frontplattenbeschriftung kann man so die
angezeigten Werte den jeweiligen Sensoren leicht
zuordnen.

// I2C_climate_station.ino

#include "TwoWireLCD.h"
#include <Wire.h> Bild 7: Eine Klima-Messstation mit IC-Sensoren im Eigenbau
#include <Adafruit_BMP085.h>
#define LM75_1 0b1001000 // LM75 #I 7-bit adresse
#define LM75_2 0b1001011 // LM75 #II 7-bit adresse
Adafruit_BMP085 bmp; noch ber die USB-Schnittstelle und den seriellen Monitor aufzeichnen.
float P, T1, T2, T3; Man erhlt so einen recht komfortablen Temperatur- und Luftdruck
logger fr kontinuierliche Wetterbeobachtungen.
void setup()
{ // Initialize I2C and I2C-LCD-Moduls Ausblick
Wire.begin(); LCD.begin(); Serial.begin(115200); Nachdem in diesem Beitrag Grundlagen und erste Anwendungen des
while (!Serial) {} IC-Busses vorgestellt wurden, folgen im nchsten Artikel weitere
Serial.println(F("Init I2C")); Praxisanwendungen. Dabei soll insbesondere der Einsatz von Portexpan-
// Initialisierung des Sensors dern im Vordergrund stehen. Diese ntzlichen Bauelemente gestatten
if (!bmp.begin())
es, die I/O-Ports eines Mikrocontrollersystems zu erweitern. So knnen
{ Serial.println("No BMP085 sensor found!");
alleine mit den beiden seriellen Signalen SCL und SDA nahezu beliebig
while (1) {}
} viele weitere Portpins angesprochen werden. Damit ist es dann sogar
} mglich, ein alphanumerisches, HD44780-kompatibles Flssigkristall-
Display mit kostengnstigen Bausteinen an den IC-Bus anzuschlieen
void loop() und so mit lediglich zwei Pins das gesamte Display zu steuern.
{ byte msb_1,lsb_1=0, msb_2,lsb_2=0;
float Degrees_1=0, Degrees_2=0;
// read LM75_1
Wire.beginTransmission(LM75_1); Weitere Infos:
Wire.write((byte)0x00);
Wire.endTransmission();
[1] http://playground.arduino.cc/Main/I2cScanner
Wire.requestFrom(LM75_1, 2); [2] https://www.elv.de: Webcode #10094
while(Wire.available() < 2); [3] Grundlagen zur elektronischen Schaltungstechnik finden sich
msb_1 = Wire.read(); in der E-Book-Reihe Elektronik!
lsb_1 = Wire.read(); (www.amazon.de/dp/B00OXNCB02)

FRANZIS AVR-Mikrocontroller in C Programmieren,
// read LM75_2
Best.-Nr. CN-09 73 52

Elektor-Praxiskurs AVR-XMEGA-Mikrocontroller,
P = bmp.readPressure(); Best.-Nr. CN-12 07 62
T1 = bmp.readTemperature(); FRANZIS Arduino-Projects-Lernpaket, Best.-Nr. CN-11 51 22
T2 = Degrees_1; FRANZIS Physical Computing, Best.-Nr. CN-12 21 81
T3 = Degrees_2; FRANZIS Lernpaket Motoren & Sensoren mit Arduino,
Best.-Nr. CN-12 74 74
Serial.println(P); Serial.println(T1);
Serial.println(T2); Serial.println(T3); Preisstellung April 2017 aktuelle Preise im ELV Shop

// show pressure P in display


Empfohlene Produkte Best.-Nr. Preis

// show temperature T1 in display Arduino UNO CN-10 29 70 27,95
Komplettbausatz
// show temperature T2 in display; ELV IC-Bus-Displaymodul IC-LCD CN-09 92 53 13,95

// show temperature T3 in display
} Alle Arduino-Produkte wie Mikrocontroller-Platinen, Shields, Fachbcher
und Zubehr finden Sie unter: www.arduino.elv.de

Wenn man den Aufbau in ein geeignetes Gehuse ein- Download-Paket zum Artikel:
baut, hat man eine praxistaugliche Klimastation vor
sich. Bild7 zeigt einen Vorschlag dazu. Neben der Die Sketche und Beispieldateien zu diesem Artikel knnen unter
Anzeige der Werte im Display kann man diese auch www.elv.de: Webcode #10095 heruntergeladen werden.

ELV Journal 3/2017

Das könnte Ihnen auch gefallen