Beruflich Dokumente
Kultur Dokumente
Arduino
Teil 1
www.elvjournal.de
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
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
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].
www.elvjournal.de
ELVjournal 5/2013
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.
www.elvjournal.de
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:
ELVjournal 5/2013
Arduino verstehen
und anwenden
Teil 2: Die Programmierumgebung
www.elvjournal.de
ELVjournal 1/2014
Zur Info:
Anwendungsprogramme werden im Arduino-Umfeld auch als
Sketch bezeichnet.
www.elvjournal.de
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].
ELVjournal 1/2014
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.
www.elvjournal.de
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);
ELVjournal 1/2014
Arduino verstehen
und anwenden
Teil 3: Einfhrung in die Programmierung
www.elvjournal.de
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.
ELVjournal 2/2014
www.elvjournal.de
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
ELVjournal 2/2014
Arduino verstehen
und anwenden
Teil 4: Programmierpraxis: Befehle, Variablen und Funktionen
www.elvjournal.de
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
ELVjournal 3/2014
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
// 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
www.elvjournal.de
Arduino verstehen
und anwenden
Teil 5: Nutzung und Erstellung von Programmbibliotheken
www.elvjournal.de
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.
ELVjournal 4/2014
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
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"
ELVjournal 4/2014
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
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 verstehen
und anwenden
Teil 6: Sensortechnik und Messwerterfassung
www.elvjournal.de
sample
werterfassung zum Thema.
ELVjournal 5/2014
ADC-Wandlerverfahren
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
RDWRYHUWHPS
LQWRYHUWHPS/('
void setup()
{ Serial.begin(9600);
pinMode(overtempLED,OUTPUT);
}
void loop()
{ ADC_value=analogRead(ADC0);
WHPS $'&BYDOXHRVHWFDO
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
www.elvjournal.de
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
ELVjournal 5/2014
Arduino verstehen
und anwenden
Teil 7: Schnittstellenpraxis Kommunikation mit Laptop und PC
www.elvjournal.de
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
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.
www.elvjournal.de
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
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 verstehen
und anwenden
Teil 8: Arduino im Heimnetzwerk
www.elvjournal.de
ELVjournal 1/2015
www.elvjournal.de
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
#include <SPI.h>
#include <Ethernet.h>
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>");
www.elvjournal.de
ELVjournal 1/2015
#include <SPI.h>
#include <Ethernet.h>
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.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.
www.elvjournal.de
Arduino verstehen
und anwenden
Teil 9: WLAN und Micro-Server-Technik
www.elvjournal.de
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.
ELVjournal 2/2015
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
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
ELVjournal 2/2015
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)LVKLHOGQRWSUHVHQWZKLOHWUXH`
Will man auch sinnvollere Daten ZKLOHVWDWXV :/B&211(&7('
als elektromagnetische Strungen ^6HULDOSULQW$WWHPSWLQJWRFRQQHFWWR66,'
empfangen, dann kann man den 6HULDOSULQWOQVVLG
Arduino mit WLAN-Shield zu ei- VWDWXV :L)LEHJLQVVLGSDVVGHOD\
nem Server fr Umweltmessdaten, `
VHUYHUEHJLQSULQW: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- LIFOLHQW
werterfassung bekannt. Will man ^6HULDOSULQWOQQHZFOLHQW
beispielsweise Umgebungs- oder ERROHDQFXUUHQW/LQH,V%ODQN WUXH
Raumtemperaturen messen und ZKLOHFOLHQWFRQQHFWHG
via WLAN bertragen, kann man ^LIFOLHQWDYDLODEOH
dazu einen NTC-Temperatursensor ^FKDUF FOLHQWUHDG
einsetzen. Bild 5 zeigt eine Schal- 6HULDOZULWHF
LIF
?Q
FXUUHQW/LQH,V%ODQN
tung dazu.
^FOLHQWSULQWOQ+7732.FOLHQWSULQWOQ&RQWHQW7\SHWH[WKWPO
Zustzlich kann man nun den
FOLHQWSULQWOQ&RQQQHFWLRQFORVHFOLHQWSULQWOQ
Arduino mit einem Akku betreiben. FOLHQWSULQWOQ'2&7<3(+70/!FOLHQWSULQWOQKWPO!
Da der Arduino UNO bereits einen FOLHQWSULQWOQPHWDKWWSHTXLY ?UHIUHVK?FRQWHQW ??!
Spannungsregler an Board hat, $'&BYDOXH DQDORJ5HDG$'&
kann man den Akku direkt an die FOLHQWSULQW7HPSHUDWXUH#VHUYHUVLWHWHPS $'&BYDOXHRVHWFDO
Hohlbuchse des Controllerboards FOLHQWSULQWWHPS FOLHQWSULQW & FOLHQWSULQWOQEU !
anschlieen (Bild 6). Man erhlt FOLHQWSULQWOQKWPO!
so einen vollkommen autarken EUHDN
Micro-Server, da nunmehr weder `
Daten noch Stromversorgungslei- LIF
?Q
^FXUUHQW/LQH,V%ODQN WUXH`
HOVHLIF
?U
^FXUUHQW/LQH,V%ODQN IDOVH `
tungen erforderlich sind. Fr die
`
`
GHOD\FOLHQWVWRS6HULDOSULQWOQFOLHQWGLVFRQQHFWHG
`
`
NT C 4k7
5 V
YRLGSULQW:L6WDWXV
A0 ^6HULDOSULQW66,'6HULDOSULQWOQ:L)L66,'
4k7 ,3$GGUHVVLS :L)LORFDO,36HULDOSULQW,3$GGUHVV6HULDOSULQWOQLS
G ND ORQJUVVL :L)L566,
6HULDOSULQWVLJQDOVWUHQJWK566,6HULDOSULQWUVVL6HULDOSULQWOQG%P
`
Bild 5: Schaltung fr einen NTC-Temperatur-
sensor am Wi-Fi-Shield
www.elvjournal.de
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.
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,
ELVjournal 2/2015
Arduino verstehen
und anwenden
Teil 10: Richtig auf unerwartete Ereignisse reagieren Interrupts und Polling
www.elvjournal.de
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!
ELVjournal 3/2015
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.
www.elvjournal.de
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:ULWHOHGSLQ/2:/('R
delay(100);
}
ELVjournal 3/2015
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
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.
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 verstehen
und anwenden
Teil 11: Timer und Counter
www.elvjournal.de
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
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
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.
#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();
}
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
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);}
}
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,
www.elvjournal.de
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
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.
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);}
}
www.elvjournal.de
So funktionierts 21
// wakeup light
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);
}
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
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
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
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
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.
ELVjournal 6/2015
VZLWFKUHOD\YLDEXWWRQLQFOXGLQJVZLWFKRGHOD\
void setup()
{ pinMode(button, INPUT_PULLUP); pinMode(relay, OUT-
PUT);
}
void loop()
{ stateButton = digitalRead(button);
time = millis();
} Bild 5: Ventilatorsteuerung via Arduino
digitalWrite(relay, stateRelay);
previous = stateButton;
}
delay(stayON);
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
// 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
Mikrocontroller-Onlinekurs, Franzis-Verlag,
exklusiv fr ELV, 2011, Best.-Nr.: CD-10 20 44
ELVjournal 6/2015
Arduino verstehen
und anwenden
Teil 14: 7-Segment-Displays am Arduino
www.elvjournal.de
ELVjournal 1/2016
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
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
send_int_to_LCD(1234, 2);
ELVjournal 1/2016
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
www.elvjournal.de
// display driver T a f H Z b
#include <avr/io.h>
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
und anwenden
Teil 15: Multidigit-LED-Displays
www.elvjournal.de
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
ELVjournal 2/2016
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
#include <SevenSeg.h>
// segments a b c d e f g
SevenSeg disp (7 ,5 ,3 ,1 ,0 ,6 ,4);
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
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
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);
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
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
und anwenden
Teil 16: Einsatz und Anwendung von LED-Matrizen
www.elvjournal.de
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
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 ^IRULQWL LL LQLWLDOL]HFROXPQV
den Arduino in der Reihenfolge der Controllerpins ^SLQ0RGHFRO>L@287387
vor. Verbinden Sie also zunchst den Digital-Pin D1 GLJLWDO:ULWHFRO>L@/2:
mit dem Dot-Matrix-Pin 4, dann den Digital-Pin D2 `
mit dem Dot-Matrix-Pin 5 usw. Nicht vergessen, die IRULQWL LL LQLWLDOL]HURZ
Vorwiderstnde korrekt mit einzuschleifen! ^SLQ0RGHURZ>L@287387
GLJLWDO:ULWHURZ>L@+,*+
`
`
void loop()
^IRULQW[ [[ VHOHFWFROXPQV
^GLJLWDO:ULWHFRO>[@+,*+
IRULQW\ \\ FOHDUURZV
GLJLWDO:ULWHURZ>\@+,*+
IRULQW\ \\ VHWGRW#URZV
^GLJLWDO:ULWHURZ>\@/2:
GHOD\
GLJLWDO:ULWHURZ>\@+,*+
`
GLJLWDO:ULWHFRO>[@/2:
`
`
www.elvjournal.de
ELVjournal 3/2016
www.elvjournal.de
Arduino verstehen
und anwenden
Teil 17: Alphanumerische LC-Displays
www.elvjournal.de
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
ELVjournal 4/2016
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
ELVjournal 4/2016
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
www.elvjournal.de
Arduino verstehen
und anwenden
Teil 18: Grakdisplays
www.elvjournal.de
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
ELVjournal 5/2016
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
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
ELVjournal 5/2016
Arduino verstehen
und anwenden
Teil 19: Messtechnik von der Spannungsmessung zum Logic-Analyzer
www.elvjournal.de
ELVjournal 6/2016
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-
IRULQWL LDYHUDJHVL tes Ma fr die Kapazitt des Kondensators:
$'&BFRXQW DQDORJ5HDGDQDORJ,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
555
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 =
6HULDOSULQWOQYROWDJH
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. ^SLQ0RGHDFWLYH3LQ287387
Meist liegt die Hauptursache fr den Ausfall im GLJLWDO:ULWHDFWLYH3LQ/2:
Austrocknen des Elektrolyts und dem damit verbun- FKDUJLQJ7LPH
denen erheblichen Kapazittsverlust. Viele Ausflle GHOD\
SLQ0RGHDFWLYH3LQ,1387
GLJLWDO:ULWHDFWLYH3LQ+,*+
LIFDSDFLW\
^6HULDOSULQWFDSDFLW\6HULDOSULQWOQQ)
}
else
^FDSDFLW\
6HULDOSULQWFDSDFLW\6HULDOSULQWOQX)
}
GHOD\
}
Bild 2: Arduino als Kapazittsmessgert
www.elvjournal.de
7UDQVLVRUWHVWHU
RDW8FH8EHEHWD
YRLGVHWXS
^6HULDOEHJLQ
}
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
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.
www.elvjournal.de
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
und anwenden
Teil 20: Digitale Soundeffekte und Synthesizer
www.elvjournal.de
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
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);
www.elvjournal.de
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
ELVjournal 1/2017
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.
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
und anwenden
Teil 21: Audiotechnik und Sound-Wiedergabe
www.elvjournal.de
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
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-/
www.elvjournal.de
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
// MP3Clock.ino
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <SPI.h>
#include <AudioShield.h>
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());
www.elvjournal.de
Arduino verstehen
und anwenden
Teil 22: IC der Inter-IC-Bus Grundlagen und Anwendungen
www.elvjournal.de
So funktionierts 3
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
Gerte
Adresse R/W Daten
Subadresse
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
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
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
// 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
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.