Leseprobe

Werbung
Kapitel 1
Don’t panic! – Einleitung
»Als der Pflug erfunden wurde, haben einige gesagt, das ist schlecht. Dasselbe war
der Fall beim Buch, beim Telefon, beim Auto, beim Fernsehen und bei fast jeder neuen
Technologie. Das war immer so und wird immer so sein. Die nächste Generation hat
die neue Technologie dann aber jedes Mal fast schon als völlig selbstverständlich
betrachtet.« – Bill Gates
Sie haben sich also entschlossen, einen Arduino-Roboter zu bauen. Das ist gut. Denn Sie
folgen damit nicht nur einem aktuellen Trend. Die Robotik wird uns in Zukunft immer
mehr im Alltag begleiten. Denken Sie nur einmal daran, wie preiswert Staubsaugroboter
bereits zu kaufen sind oder wie viele Firmen bereits an selbstfahrenden Autos arbeiten.
Einen eigenen Roboter von Grund auf zu bauen geht weit darüber hinaus, sich einfach
»nur« mit Elektronik und Modellbau zu beschäftigen. Aber das soll Sie nicht abschrecken. Denn in diesem Buch wird Ihnen auf leicht verständliche Art und Weise erklärt,
wie Sie einen autonomen Roboter bauen können, der mit der berühmten Arduino-Elektronikplattform vollautomatisch angesteuert wird. Und ganz nebenbei können Sie die
Arduino-Elektronik für praktisch unendlich viele weitere Bastelprojekte verwenden.
Und wer weiß? Vielleicht legt dieses Buch den Grundstein für eine große Bastler- oder
sogar Entwicklerkarriere? Aus welchem Grund auch immer Sie sich dafür entschieden
haben: Ich verspreche Ihnen, dass dies kein langweiliges Fachbuch ist, gespickt mit Hunderten Formeln und langatmigen theoretischen Abhandlungen! Ich werde Sie stattdessen in kleinen, einfachen und vor allem unterhaltsamen Schritten an den Bau Ihres
persönlichen Arduino-Roboters heranführen. Sie finden hier zahlreiche praktische
Experimente zum Nachbauen und Ausprobieren und einfache Programme, die alle
genau erklärt werden. Natürlich gibt es auch ein wenig Theorie. Aber eben nur so viel,
wie nötig ist. Und: Keine Panik, es ist wirklich simpel, einen Roboter zu bauen. Sie werden erstaunt sein! Aber nun genug der einleitenden Worte. Viel Spaß beim Lesen, Ausprobieren und Basteln!
15
1
1.3
Don’t panic! – Einleitung
1.1 Für wen ist dieses Buch geeignet?
Dieses Buch ist für jeden geeignet, der auf einfache und anschauliche Art lernen möchte,
einen Arduino-gesteuerten Roboter selbst zu bauen.
1.1.1 Programmierkenntnisse?
Sie benötigen für das Buch keine Programmierkenntnisse, denn alle Beispielprogramme werden fertig mitgeliefert und Sie werden Schritt für Schritt an alle Befehle
herangeführt. Wenn Sie bereits Programmiererfahrung mit C oder C++ haben, wird es
Ihnen umso leichter fallen – es ist aber keine Bedingung.
1.1.2 Altersklassen
Dieses Buch ist für nahezu alle Altersklassen geeignet. Vielleicht sind Sie bereits im
Ruhestand und möchten ein neues Hobby beginnen. Dieses Buch macht es möglich.
Oder Sie sind noch Schüler und wollen sich mit der Robotik beschäftigen. Dieses Buch
erspart Ihnen das mühsame Sammeln von Informationen aus dem Internet, da Sie alles,
was Sie wissen müssen, strukturiert und übersichtlich zusammengefasst in diesem
Buch finden.
Sicherheit
An verschiedenen Stellen in diesem Buch könnte es für sehr junge Leser notwendig
sein, dass die Eltern oder ältere Freunde ein wenig beim Aufbau helfen. Das ist aber nur
vereinzelt der Fall und beschränkt sich nur auf Dinge, die Kinder nicht allein machen
sollten, wie zum Beispiel einen heißen Lötkolben benutzen. Ich werde Sie in den jeweiligen Kapiteln deutlich darauf hinweisen.
Eine Sicherheitsbrille für wenige Euro ist immer hilfreich, wenn Sie zum Beispiel ein
Drahtende mit einem Werkzeug abkneifen – so kann im wahrsten Sinne des Wortes
nichts ins Auge gehen. Aber auch das wird Ihnen in Kapitel 5, »Die kleine Werkstatt«,
genau gezeigt und auch, worauf Sie dabei achten sollen.
Ich kann Ihnen außerdem versichern, dass alle Experimente und Beispiele in diesem
Buch mit einem absoluten Bastel- und Robotikanfänger getestet wurden. Er hat alle
Experimente mit Leichtigkeit umgesetzt, und es hat ihm auch noch viel Spaß gemacht.
Und um den Spaß soll es doch in diesem Buch auch gehen!
Das Roboterkit zum Buch
1.1.3 Handwerkliches Geschick und Elektronikwissen?
Sie benötigen für dieses Buch kein besonderes handwerkliches Können. Die meisten
Schritte bestehen aus einfachem Stecken von Kabeln oder aus dem Umgang mit einem
Schraubendreher oder einer Schere. Das an wenigen Stellen erforderliche Verlöten von
Kabeln wird Ihnen im jeweiligen Kapitel ausreichend erläutert. Auch spezielles Wissen
über elektronische Bauteile ist nicht notwendig. Alle Teile, die Sie für Ihren Roboter
benötigen, werden genau erklärt, und Sie lernen ihre Funktion in praktischen Beispielen kennen.
1.2 Wie sollte das Buch gelesen werden?
Im Idealfall lesen Sie dieses Buch von Anfang an und der Reihe nach durch, da die Gliederung der einzelnen Kapitel aufeinander aufbaut. So lernen Sie beispielsweise erst,
welche Arten von Motoren es gibt, danach, wie Sie einen Motor ansteuern, und später,
wie Sie die Motoren für Ihren Roboter nutzen. Es hilft Ihnen als Einsteiger also sehr,
wenn Sie erst ein wenig Theorie lernen und später das Erlernte ausprobieren. Vielleicht
wissen Sie aber auch bereits das eine oder andere über Roboter oder kennen bestimmte
elektronische Bauteile. Oder Sie haben manchmal keine Lust, alles im Detail zu verstehen, und wollen sofort mit dem Basteln loslegen. All das geht mit diesem Buch.
Mir geht es oft auch so, dass ich Sachen lieber gleich »in die Hand« nehmen und alles
zusammenbauen will. Wenn aber dann nicht alles auf Anhieb funktioniert, ersparen Sie
sich viel Zeit bei der Fehlersuche, wenn Sie vorher etwas Theorie »gebüffelt« haben. Ich
kann daher aus eigener Erfahrung sagen, dass es Ihnen wahrscheinlich mehr Freude
bereiten wird, wenn Sie erst verstehen, wie etwas funktioniert, und es danach erfolgreich in die Praxis umsetzen.
Wie gesagt, Sie können im Buch gerne zwischen den Kapiteln hin- und herspringen. Es
wird Ihnen aber am Ende leichter fallen, es der Reihe nach durchzulesen.
1.3 Das Roboterkit zum Buch
Bestimmt sind Sie schon neugierig, was Sie so alles für den Bau Ihres Arduino-Roboters
benötigen. Nun, ich will Sie nicht länger auf die Folter spannen. Der Roboter, den Sie in
diesem Buch bauen werden, entstand ursprünglich durch die Online-Community Let’s
Make Robots1. Dies ist eine Internetplattform, auf der sich Robotik-Interessierte austau1 http://letsmakerobots.com
16
17
1
1.5
Don’t panic! – Einleitung
schen und ihre selbst gebastelten Roboter mit Bildern vorstellen können. Die Bauanleitung in diesem Buch basiert auf dem dort vorgestellten Roboter.
Danksagung
1.4 Die Webseite zum Buch
Alle Programme in diesem Buch sind Open Source und daher frei verfügbar. Sie finden
sie auf meiner Webseite zum Download:
1.3.1 Welche Teile benötige ich zum Bau des Roboters?
Sie können sich alle Teile, die Sie zum Bau Ihres Arduino-Roboters benötigen, selbst
zusammenstellen. Die Liste der verwendeten Bauteile finden Sie in Abschnitt 4.2.4,
»Treiberinstallation«. Alternativ können Sie den in diesem Buch beschriebenen Roboter vollständig als Bausatz bei watterott electronic2 bestellen.
Sonstige elektronische Bauteile
Neben den Teilen für den Roboter sind für einige Lernbeispiele noch einige weitere elektronische Bauteile notwendig. Dies sind zum Beispiel ein Taster, ein Schalter, eine LED
und ein Widerstand. Sie benötigen diese nicht zwingend, aber sie helfen Ihnen, die
Funktionsweise Ihres Roboters später besser zu verstehen. Die Teile werden jeweils vor
jedem Experiment benannt und sind hier gesammelt für Sie aufgeführt:
http://robotiklabor.de/literatur
1.4.1 Robotiklabor – der Podcast rund um Robotikthemen
Wenn Sie sich auch sonst für Robotik im weitesten Sinne interessieren, möchte ich
Ihnen meine monatlich erscheinende Sendung Robotiklabor – Deutschlands größter
Podcast rund um Robotikthemen4 ausdrücklich ans Herz legen. Dieser Podcast informiert in lockerer Unterhaltungsrunde über aktuelle Themen rund um die Robotik und
um das Elektronikbasteln – gratis, monatlich und mit viel Spaß. Wir greifen hier Themen aller Art für Einsteiger und Profis auf und senden zudem live mit Chat sowie als
Aufzeichnung zum Download. Das Schöne an einem Audio-Podcast ist ja, dass Sie ihn
wann und wo Sie wollen hören oder auch mal unterbrechen können – wie dieses Buch.
1.5 Danksagung
Checkliste
D ein Widerstand, 10 kȍ, 5 %
D ein Potenziometer (z.B. 10 kȍ)
D ein beliebiger Schalter
D ein beliebiger Taster (Schließer)
D ein einfacher Piezo-Summer
D ein paar dünne Leitungen oder Drähte (»Jumper Wire«)
D eine Steckplatine (auch Steckbrett, Steckboard oder Protoboard
genannt)
Als Erstes möchte ich an dieser Stelle meinem Lektor Sebastian Kestel danken, der mich
motivierte, dieses Buch zu schreiben. Mein Dank geht in gleicher Weise an das gesamte
Team vom Rheinwerk Verlag. Ebenfalls möchte ich mich bei meinem Arbeitgeber
bedanken, der mir die nebenberufliche Tätigkeit ermöglichte. Auch meiner Familie gilt
an dieser Stelle großer Dank: Während der Zeit des Schreibens haben wir uns leider viele
Monate nicht sehen können. Ganz besonders danke ich meinen Freunden Alexander
Moser, Berit Behnke und Oliver Bock. Ihr habt mich so vielfältig und auf so großartige
Weise unterstützt, dass ich bis jetzt nicht weiß, wie ich euch etwas in angemessener Art
zurückgeben kann. Der größte Dank allerdings geht an meine wunderbare Frau Stephanie. Ohne deine unglaubliche Geduld, deine einmalige Unterstützung und dein immerwährendes Verständnis würde es dieses Buch nicht geben.
In Kapitel 10, »Pimp My Robot! – Mögliche Erweiterungen«, können Sie den Roboter um
ein Display mit Tasten erweitern. Es handelt sich hierbei um
왘 ein Adafruit RGB LCD Shield mit Keypad3.
2 http://www.watterott.com/de/StarterKit-Roboter
3 https://learn.adafruit.com/rgb-lcd-shield/overview
18
4 http://robotiklabor.de
19
Kapitel 7
Los geht’s! – Erste Praxis
Sie haben bis zu diesem Kapitel durchgehalten. Das ist ein gutes Zeichen. Denn Sie
haben es trotz viel Theorie bis hierher geschafft, und nun soll es endlich mit praktischen Experimenten losgehen.
Sie werden gleich Ihr erstes Programm für den Arduino erstellen und das Ergebnis auf
dem Board sehen können.
7.1 Der erste Kontakt mit der Hardware
Das erste Experiment wird ganz einfach daraus bestehen, die orange LED auf Ihrem
Arduino-Board zum Blinken zu bringen. Traditionell wird das erste eigene Programm,
das eine LED zum Blinken bringt, Blinky genannt. Das ist vielleicht nicht sehr einfallsreich, aber dafür einprägsam.
7.1.1 »Blinky« – Ansteuerung einer LED
Für Ihr erstes Experiment benötigen Sie folgende Teile:
Checkliste
D ein Arduino-Board
D ein passendes USB-Kabel
Schließen Sie das Arduino-Board mit einem USB-Kabel an Ihren Computer an. Das passende USB-Kabel hat auf der »Computerseite« einen USB-A-Stecker und auf der
»Arduino-Seite« einen USB-B-Stecker und ist in Abbildung 7.1 dargestellt.
179
7
7.1
Los geht’s! – Erste Praxis
Der erste Kontakt mit der Hardware
das vollständige Programm dazu. Sie finden die Datei Blinky.ino wie immer zum Download unter http://robotiklabor.de/literatur/.
// An Pin 13 ist auf den meisten Arduino-Boards
// eine LED angeschlossen.
//
// Definieren der Variable 'led'
// und Setzen auf den Wert 13 (Pin 13)
int led = 13;
Abbildung 7.1 USB-B-Stecker (links) und USB-A-Stecker (rechts)
Wenn Sie den Arduino so, wie er »ab Werk« geliefert wird, mit Ihrem Computer verbinden, blinkt normalerweise die orange LED auf der Platine im Sekundenrhythmus. Sie
finden die LED links oben auf der Platine. Sie ist mit dem Buchstaben »L« beschriftet
(siehe Abbildung 7.2).
// Die setup-Funktion läuft einmal zu Beginn.
void setup()
{
// Den digitalen PIN zur Ausgabe (Output) festlegen.
pinMode(led, OUTPUT);
}
// Die loop-Routine läuft immer wieder - unendlich:
void loop()
{
// schalte die LED an (HIGH)
digitalWrite(led, HIGH);
// warte eine halbe Sekunde
delay(500);
// schalte die LED aus (LOW)
digitalWrite(led, LOW);
// warte eine halbe Sekunde
delay(500);
}
Listing 7.1 Ihr erstes Arduino-Programm: »Blinky«
Abbildung 7.2 Die orange leuchtende LED »L«
Sollte auf Ihrer Platine nur die grüne ON-LED leuchten, die orange LED aber nicht,
machen Sie sich keine Sorgen. Denn Sie erstellen jetzt ja Ihr erstes Programm, das die
LED zum Blinken bringen wird. Sollte die LED bei Ihnen bereits blinken, so ist wahrscheinlich bereits ein Programm ab Werk auf dem Arduino. Das macht nichts, denn Sie
lernen dann jetzt, wie Sie den Blinkrhythmus verändern können. In Listing 7.1 sehen Sie
180
Wie Sie sehen, besteht das Programm aus nur wenigen Zeilen, wovon die meisten nur
aus Kommentaren bestehen. Zur Erinnerung: Kommentare, die sich auf eine Zeile
beschränken, beginnen jeweils mit zwei Schrägstrichen. Dabei ist es unerheblich, ob sie
am Anfang oder Ende einer Zeile stehen:
// Dies ist ein Kommentar.
x = 1; // Das ist noch ein Kommentar.
181
7
7.1
Los geht’s! – Erste Praxis
Nun aber zur Erklärung der Software im Detail. Variablen haben Sie bereits in Abschnitt
6.1, »Stil«, kennengelernt. Die erste Anweisung im Listing definiert die Variable led und
gibt ihr den Wert 13:
int led = 13;
Auf den meisten Arduino-Platinen ist Pin 13 des Steckers intern mit einer LED und
einem Widerstand verdrahtet. Das ist sehr praktisch, denn die LED kann so leicht zu
Kontrollzwecken verwendet werden oder um einen bestimmten Status zu signalisieren.
Warum eine LED einen Widerstand benötigt, erkläre ich Ihnen später in Abschnitt 7.1.4,
»Herr Ohm und sein Gesetz«, denn nun soll zunächst die Praxis im Vordergrund stehen. Darum gehen wir jetzt schnell zu den weiteren Programmanweisungen im Code:
void setup()
{
// Den digitalen PIN als Ausgabe (Output) festlegen.
pinMode(led, OUTPUT);
}
Immer, wenn Sie den Arduino einschalten, werden die Zeilen der setup-Funktion einmalig ausgeführt. Dies kann durch Anschluss an einen Computer per USB-Kabel oder
über die Stromversorgungsbuchse oder nach Drücken des Tasters Reset geschehen. Wie
bereits in Abschnitt 4.2.1 erläutert, können die Pins des Arduino-Boards als Eingang
(INPUT) oder Ausgang (OUTPUT) betrieben werden. Das heißt, es wird entweder eine
Spannung erwartet (Eingang) oder eine Spannung am Pin ausgegeben (Ausgang). Da Sie
in diesem Fall eine LED einschalten wollen, benötigt diese eine Spannung. Dementsprechend wird der Pin des Arduino als Ausgang geschaltet (OUTPUT), um eine Spannung
per HIGH auszugeben. Nun zum »Hauptprogramm«:
void loop()
{
// schalte die LED an (HIGH)
digitalWrite(led, HIGH);
Der erste Kontakt mit der Hardware
Zur Erinnerung: Die loop-Funktion wird automatisch abgearbeitet, nachdem das setup
beendet ist. Zum Schalten einer Spannung auf einen der Ausgänge dient der Befehl1 digitalWrite. Wie Sie sehen, wird die LED als Erstes mit HIGH eingeschaltet. Danach wartet der
Arduino für eine halbe Sekunde, bevor er den nächsten Befehl ausführt. Dazu dient die
Anweisung delay(500). Denn der Wert für delay wird in Millisekunden angegeben, und
500 Millisekunden entsprechen 0,5 Sekunden. Nachdem der Arduino gewartet hat, wird
die LED mit LOW ausgeschaltet. Und wieder wartet das Board danach für 500 Millisekunden durch den zweiten delay(500)-Befehl. Wenn das Ende der loop-Funktion bei der
schließenden geschweiften Klammer } erreicht ist, beginnt die Schleife von vorne und
schaltet die LED mit HIGH wieder an. Und so weiter. Ganz einfach, oder? Jetzt, wo Sie wissen, wie das Programm funktioniert, wollen Sie es natürlich endlich in Aktion sehen.
7.1.2 Übertragen der Software auf das Arduino-Board
Das Übertragen der Software auf das Arduino-Board wird übrigens auch flashen
genannt, weil hier ein sogenannter Flash-Speicher mit Daten beschrieben wird.
Experten-Wissen zum Angeben
Die Software, die Sie auf das Arduino-Board übertragen, wird auch Firmware genannt.
Sie haben davon vielleicht schon einmal gehört. Eine Firmware besteht aus dem Programmcode und allen darin gespeicherten Daten und bleibt beim Ausschalten des
Gerätes dauerhaft bestehen. »Dauerhaft« deshalb, weil sie nicht so einfach gelöscht
werden kann – außer eben mit einem Computer und der passenden Software (hier der
Arduino-Software). Alle Geräte, die einen Mikrocontroller enthalten, haben auch eine
Firmware im Speicher, die beim Einschalten ausgeführt wird – zum Beispiel Ihre Waschmaschine, die verschiedene Waschprogramme ausführen kann, eine Verkehrsampel,
die ein Tages- oder Nachtprogramm ausführen kann, oder vielleicht Ihr Anzeigeinstrument im Auto, das live den Benzinverbrauch ausrechnen und anzeigen kann.
Öffnen der Datei
// warte eine halbe Sekunde
delay(500);
// schalte die LED aus (LOW)
digitalWrite(led, LOW);
// warte eine halbe Sekunde
delay(500);
Um die Software nun endlich zu übertragen, laden Sie die Datei Blinky.ino herunter und
starten die Arduino-Software. Öffnen Sie die heruntergeladene Datei Blinky.ino im
Menü über Datei 폷 Öffnen (siehe Abbildung 7.3).
1 Genau genommen ist es kein Befehl, sondern eine Funktion. Umgangssprachlich sprechen aber die
meisten von einem Befehl oder einer Anweisung – auch wenn es nicht ganz korrekt ist.
}
182
183
7
7.1
Los geht’s! – Erste Praxis
Der erste Kontakt mit der Hardware
Auswahl des Arduino-Boards
Damit die Arduino-Software weiß, auf welchen Typ Arduino-Board das Programm übertragen werden soll, wählen Sie einmalig im Menü Werkzeuge 폷 Board den Punkt
Arduino/Genuino Uno aus (siehe Abbildung 7.5).
Abbildung 7.3 Öffnen einer vorhandenen Datei in der Arduino-Software
Ihre Arduino-Software sollte jetzt so wie in Abbildung 7.4 aussehen.
Abbildung 7.5 Auswahl des passenden Arduino-Boards
Auswahl des USB-Anschlusses
Abbildung 7.4 Das geladene Programm »Blinky« in der GUI
184
Nun müssen Sie noch den passenden USB-Anschluss Ihres Computers auswählen. Dies
geschieht wieder unter dem Menüpunkt Werkzeuge und dann durch den Unterpunkt
Port. Unter macOS heißen die USB-Ports in der Arduino-GUI /dev/cu.usbmodemxxxx.
Je nach Board ist der letzte Teil des Namens mit »xxxx« immer unterschiedlich und
könnte zum Beispiel /dev/cu.usbmodem1411 oder auch /dev/cu.usbmodem1421 lauten.
Wenn Sie sich bei der Auswahl des richtigen Anschlusses nicht sicher sind, beenden Sie
die Arduino-Software, ziehen alle nicht benötigten USB-Geräte von Ihrem Computer ab
und lassen nur das Arduino-Board verbunden. Dann starten Sie die Arduino-Software
erneut und schauen, was an Anschlüssen zur Auswahl steht. Unter Windows heißen die
Anschlüsse für das Arduino-Board zum Beispiel COM2 oder COM3, wobei hier die Ziffer
im Namen variiert. Solange Sie das gleiche Board immer am gleichen USB-Anschluss
Ihres Computers verwenden, müssen Sie diese Einstellung nur einmal durchführen. Ihr
185
7
7.1
Los geht’s! – Erste Praxis
Der erste Kontakt mit der Hardware
Arduino-Board wird dann automatisch erkannt. Seit einiger Zeit versucht die ArduinoSoftware sogar, das angeschlossene Board selbstständig zu erkennen. So steht dann im
Menü zum Beispiel Werkzeuge 폷 Port 폷 /dev/cu.usbmodem1411 (Arduino/Genuino Uno), wenn ein Arduino/Genuino Uno erkannt wurde.
Lösungen werden Ihnen helfen, die meisten Probleme zu beseitigen. Alternativ kopieren Sie einfach die erste Fehlermeldung aus der Arduino-Software in die Suchmaschine
Ihrer Wahl. Sie können davon ausgehen, dass bereits vor Ihnen jemand dieses Problem
hatte und eine Lösung im Internet zu finden ist.
Übertragen der Software
Übung macht den Meister
Der einfachste Teil ist nun das Übertragen der Software auf das Board. Klicken Sie hierzu
einfach auf die Upload-Schaltfläche in der Arduino-Software. Der Rest geht automatisch: Die Software prüft den geschriebenen Programmcode vor dem Übertragen noch
einmal auf Fehler, wandelt ihn in ein für den Mikrocontroller verständliches Format um
(kompiliert und linkt) und überträgt das Ergebnis auf das Arduino-Board (flasht). Abbildung 7.6 zeigt die GUI, wenn der Vorgang erfolgreich abgeschlossen wurde: In der Statuszeile unten steht dann »Upload abgeschlossen.«.
Experimentieren Sie mit dem Programm Blinky ruhig noch etwas herum. Lassen Sie die
LED zum Beispiel ganz schnell blinken oder nur alle zwei Sekunden. Oder lassen Sie die
LED nur ganz kurz blinken und dann eine lange Pause einlegen. Übertragen Sie jedes
Mal den geänderten Code auf das Arduino-Board, und schauen Sie sich die Auswirkungen sofort an. Sie bekommen so ein Gefühl dafür, wie leicht es ist, Änderungen vorzunehmen und diese per Upload zu übertragen.
7.1.4 Herr Ohm und sein Gesetz
Wie ich bereits in Abschnitt 7.1.1 erwähnt habe, hat die orange LED an Pin 13 des ArduinoBoards einen Vorwiderstand. Was hat es nun mit dem Widerstand auf sich? Vielleicht
haben Sie ja im Zusammenhang mit Widerständen schon einmal vom ohmschen
Gesetz3 gehört.
Das ohmsche Gesetz
Das ohmsche Gesetz beschreibt, wie sich der durch ein Objekt fließende Strom in seiner
Stärke verändert, wenn eine elektrische Spannung an ein Objekt anlegt und diese Spannung verändert wird.
Abbildung 7.6 Das Übertragen der Arduino-Software (Upload) ist beendet.
Hat alles funktioniert, blinkt die LED auf dem Arduino-Board nun in einem Rhythmus
von 0,5 Sekunden. Herzlichen Glückwunsch! Sie haben gerade das erste Mal Ihren
Arduino erfolgreich programmiert und damit die Grundlage für alle weiteren Schritte
auf dem Weg zu Ihrem eigenen Roboter gelegt! Weiter geht’s.
Anders formuliert: Die Stärke des elektrischen Stroms, der durch ein Objekt fließt, verändert sich im gleichen Verhältnis (proportional) wie die elektrische Spannung am
Objekt. Das bedeutet automatisch, dass der Widerstand des Objekts gleich bleibt (konstant), egal wie sich Spannung und Strom ändern. Dieser Zusammenhang kann in einer
einfachen Formel beschrieben werden. Wird die Stromstärke mit I, die Spannung mit U
und der Widerstand mit R bezeichnet, lautet sie:
R=U/I
bzw.:
U=R×I
7.1.3 Fehlersuche
bzw.:
Falls Sie eine Fehlermeldung erhalten haben, schauen Sie auf die Arduino-Projektseite.
Dort gibt es einen ausführlichen Troubleshooting-Bereich2. Die dort beschriebenen
I=U/R
2 http://arduino.cc/en/Guide/Troubleshooting
186
3 Benannt nach Georg Simon Ohm
187
7
7.1
Los geht’s! – Erste Praxis
Praktische Anwendung des ohmschen Gesetzes
Und wozu brauchen Sie das nun? Ganz einfach. Eine LED zum Beispiel ist ein verhältnismäßig empfindliches Bauteil (auch wenn LEDs heutzutage an jeder Stelle eingesetzt
werden). Denn eine LED verträgt nur eine geringe maximale elektrische Spannung U
und eine maximale Stromstärke I.
Vorsicht!
Fließt ein zu hoher Strom durch eine LED, geht sie sehr schnell kaputt. Sie kann dabei
sogar explodieren. Und wenn dabei die Kunststoffummantelung in mehrere Teile zerplatzt, kann das im wahrsten Sinne des Wortes schnell ins Auge gehen. Seien Sie also
bitte sehr vorsichtig, und schauen Sie in das Datenblatt des Herstellers der LED, welche
Spannungen und Ströme die LED maximal verträgt!
Der erste Kontakt mit der Hardware
Eingefügt in die Formel des ohmschen Gesetzes, sieht das so aus:
R = U / I = 2,8 V / 0,02 A = 140 Ω
Sie benötigen somit einen Widerstand von mindestens 140 Ohm (140 Ω), damit die LED
beim Anschluss an eine Spannung von 5 V – sprich: an einem der Ausgänge des
Arduino-Boards – nicht zerstört wird. Da Widerstände nicht mit allen Werten produziert werden, sondern nur in bestimmten Reihen5 erhältlich sind, ist der nächsthöhere
Wert hier 150 Ω. In der Praxis macht das für die Helligkeit der LED keinen Unterschied.
Wichtig!
Bitte denken Sie immer daran, dass jede LED andere Spannungen und Ströme verträgt.
Hier hilft Ihnen das Datenblatt des Herstellers weiter, das Sie in der Regel online finden,
oft auch dort, wo Sie die LEDs gekauft haben. Die LED-Spannung wird übrigens meist
mit Uf angegeben (Uf = forward voltage).
Vorwiderstände
Um den Strom zu begrenzen, der durch eine LED fließt, wird ein Widerstand R benötigt,
der vor die LED geschaltet wird (Vorwiderstand). Und um die Höhe des Widerstandes zu
berechnen, wird – Überraschung! – das ohmsche Gesetz mit obigen Formeln benutzt.
Die Einheit des Widerstandes lautet übrigens Ohm (Ω). Wie praktisch, was?
Eine orange Standard-LED wird typischerweise mit einer Spannung von 2,2 Volt (V) und
einem Strom von 0,02 Ampere (A) betrieben. 0,02 A entsprechen 20 Milliampere bzw.
20 mA. Wollen Sie so eine LED also an einen Ausgang des Arduino anschließen, der ja 5 V
Spannung liefert (siehe Abschnitt 4.2.1), benötigen Sie einen Widerstand, um den Strom
und die Spannung an der LED zu begrenzen. Welchen Widerstandswert muss der Widerstand haben? Nun, wenn am Ausgang des Arduino 5 V »herauskommen«, die LED aber
nur 2,2 V als Spannung benötigt, bleibt ein Unterschied von 5 V – 2,2 V = 2,8 V übrig, der
am Widerstand R verbraucht4 werden muss. Da Sie jetzt wissen, dass durch die LED nur
20 mA an Strom I fließen dürfen, haben Sie alle Werte zusammen, die Sie zur Berechnung des benötigten Widerstandes brauchen:
Widerstandsberechnung für LEDs vollautomatisch
Falls Sie sich nicht die Mühe machen möchten, LED-Vorwiderstände jedes Mal »von
Hand« zu berechnen, so finden Sie im Internet passende Seiten6, die Ihnen die Berechnung abnehmen.
Anschluss weiterer LEDs
Möchten Sie auf dem Arduino-Board eine weitere LED an einen anderen der Pins
anschließen, sähe das auf einer Steckplatine so wie in Abbildung 7.7 aus.
Widerstände und ihre Farbcodierung
Der Wert von Widerständen ist nicht als Zahlenwert auf sie aufgedruckt, sondern
anhand von farbigen Ringen kodiert. Eine Erläuterung dazu finden Sie im Internet.7 Für
den Aufbau des Roboters ist das in diesem Buch nicht relevant.
U = 2,8 V
I = 0,02 A
R=?Ω
4 Tatsächlich wird Strom nicht »verbraucht«, denn jede Art von Energie geht nie verloren. Sie wird nur
in eine andere Form umgewandelt. In unserem Beispiel findet eine Umwandlung in Wärme statt, die
jedoch so gering ist, dass sie nicht spürbar ist. Umgangssprachlich spricht dennoch jeder vom »Energieverbrauch«.
188
5 https://de.wikipedia.org/wiki/Widerstandsreihe
6 Zum Beispiel http://www.leds.de/Widerstandsrechner
7 http://de.wikipedia.org/wiki/Widerstand_(Bauelement)#Farbkodierung_auf_Widerst.C3.A4nden
189
7.1
30
30
0
)
RX0
25
2
3
4
(PWM=
1
5
20
6
7
8
9
15
10
11
12
DIGITAL
ICSP2
TX0
RESET
13
AREF
GND
10
A B C D E
F G H
I
J
25
20
15
10
5
5
A B C D E
F G H
I
J
1
Los geht’s! – Erste Praxis
1
Der erste Kontakt mit der Hardware
Sie die Taschenlampe nun, so schnell Sie können, hintereinander ein- und wieder ausschalten, so werden Sie feststellen, dass es aussieht, was wäre sie gedimmt. Offenbar
erhellt sie den Raum nur noch halb so stark, als wenn sie die ganze Zeit leuchtet. Das
liegt daran, dass das menschliche Auge nur sehr träge auf die schnellen Helligkeitsänderungen reagieren kann. Es nimmt daher insgesamt nur eine »halbe Helligkeit« wahr.
Das können Sie übrigens leicht selbst mit einer Taschenlampe ausprobieren. Zur besseren Veranschaulichung, was Pulsweitenmodulation ist, schauen Sie sich einmal Abbildung 7.8 genauer an.
L
TX
RX
ON
TM
100 %
Arduino
ICSP
1
t/s
0%
1
2
3
4
5
6
7
8
t1
A5
A4
A3
A2
A1
ANALOG IN
A0
GND
POWER
VIN
GND
5V
3V3
RESET
0
IOREF
7
T
Abbildung 7.8 Pulsweitenmodulation
Abbildung 7.7 Eine weitere LED mit Widerstand am Arduino-Board
7.1.5 Wie dimme ich eine LED?
In diesem Abschnitt lernen Sie, wie Sie eine LED dimmen können und warum das wichtig für die Ansteuerung Ihres Roboters sein wird. Generell kennt ein digitaler ArduinoAusgang nur zwei Zustände: HIGH (5 V) und LOW (0 V). Damit könnte eine LED nur einoder ausgeschaltet sein. Was also tun Sie, wenn Sie die LED in der Helligkeit regeln wollen? Könnten Sie nicht einfach eine geringere Spannung anlegen, damit die LED dunkler
leuchtet? Nein. Denn anders als bei Glühlampen ist der Spannungsbereich, in dem eine
LED arbeitet (leuchtet), sehr eng begrenzt. Die LED benötigt je nach Typ eine sogenannte
Durchflussspannung (engl. forward voltage), ab der sie überhaupt erst anfängt zu leuchten. Ein typischer Spannungsbereich für eine LED liegt bei 2 bis 2,4 V, und in diesem
Bereich leuchtet sie dann in voller Stärke. Aber es gibt einen Trick: Pulsweitenmodulation. Und die kann Ihr Arduino auch!
Pulsweitenmodulation
Stellen Sie sich vor, Sie sind in einem ziemlich dunklen Raum und Sie haben eine
Taschenlampe. Wenn Sie die Taschenlampe nun einschalten, ist es vollständig hell
(HIGH), und wenn sie ausgeschaltet ist, ist es dunkel (LOW). Und nun der Trick: Wenn
190
In dem Diagramm ist die Taschenlampe innerhalb einer Zeitdauer t von insgesamt acht
Sekunden viermal für eine Sekunde ausgeschaltet und viermal für eine Sekunde eingeschaltet. In der Dauer von acht Sekunden war sie also 50 % der Zeit an- und 50 % ausgeschaltet. Natürlich würde das Auge einen so langsamen Wechsel deutlich wahrnehmen.
Das Beispiel in Abbildung 7.8 dient nur zur einfacheren Berechnung der 50 % – sprich
der halben Helligkeit.
Der Name »Pulsweitenmodulation« (PWM) kommt daher, dass die Länge der Impulse,
also die Weite im Diagramm, verändert (moduliert) wird.8 Es muss ja kompliziert klingen, denn Sie sind nun schon fast ein Arduino-Fachmann, und da brauchen Sie auch ein
paar Fachausdrücke zum Angeben.
Ganz formell
In einer Formel würde die Berechnung der Helligkeit aus dem Diagramm oben so aussehen:
t1 / T = 1s / 2s = 0,50 = 50 %
8 Die Pulsweitenmodulation (PWM) wird übrigens auch Pulsdauermodulation (PDM) genannt.
191
7
7.1
Los geht’s! – Erste Praxis
Man spricht hierbei auch von einem duty cycle von 50 %. Duty cycle bedeutet so viel wie
Einschaltdauer oder Tastverhältnis.
Wenn die Lampe innerhalb einer Sekunde nur 0,1 Sekunden lang an wäre, ergäbe das
einen Helligkeitswert (duty cycle) von 10 %:
Der erste Kontakt mit der Hardware
PWM für Profis: »analogWrite«
Praktischerweise haben die Entwickler auch hier vorgesorgt und PWM gleich »mitgeliefert«. Anstatt mittels delay einen Pin in einem bestimmten Rhythmus zwischen HIGH
und LOW wechseln zu lassen, gibt es den Befehl analogWrite(Pin, Wert).
Der Befehl benötigt zwei Parameter: Der erste ist der anzusteuernde Pin, der zweite eine
Zahl von 0 (= »immer aus«) bis 255 (= »immer an«).
t1 / T = 0,1s / 1s = 0,10 = 10 %
Beispiel:
Pulsweitenmodulation nachgebildet
Um die Pulsweitenmodulation auf dem Arduino nachzubilden, benötigen Sie wieder
den Code Blinky.ino aus Listing 7.1. Tragen Sie für die delay-Anweisungen folgende neue
Werte in die Klammern ein:
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(900);
//
//
//
//
schalte die LED an (HIGH)
warte 0,1 Sekunden
schalte die LED aus (LOW)
warte 0,9 Sekunden
Wenn Sie nun den geänderten Code auf Ihren Arduino hochladen, werden Sie sehen, dass
die LED nur halb so hell erscheint – wie in dem Beispiel mit der Taschenlampe. Sie haben
nämlich die LED nur noch für 100 Millisekunden an- und dann für 900 Millisekunden
wieder ausgeschaltet. Dieses schnelle Flackern wird von Ihrem Auge so wahrgenommen,
als wäre die LED viel dunkler geworden. Spielen Sie ruhig mit den zwei Werten für die
delay-Anweisung, und versuchen Sie, weitere Helligkeitsstufen zu bilden.
Der Befehl analogWrite(5, 128) schaltet den Pin 5 auf 50 % des maximalen Wertes von
5 V, also 2,5 V (255 = 100 % = 5 V, 128 = 50 % = 2,5 V). Natürlich liegen für einen Teil der Zeit
immer noch 5 V am Ausgang des Ports an, denn dieser wechselt ja wie beim Taschenlampenlicht immer noch sehr schnell zwischen 0 und 5 V. Wenn Sie aber mit einem trägen Messgerät die Spannung am Pin überprüfen, so werden Sie effektiv nur 2,5 V
messen (Mittelwert).
Und wenn Sie nun mittels analogWrite(5, 64) effektiv nur ca. 1,25 V messen würden,
warum leuchtet die LED dann immer noch, obwohl sie ja, wie in Abschnitt 7.1.4 beschrieben, eine Spannung größer als 2 V benötigt, um zu leuchten? Ganz einfach: Die einfachen Messgeräte sind zu träge, um die schnellen Wechsel in der Gleichspannung
messen zu können. An einem sehr präzisen und vor allem schnellen Oszilloskop sind
die Wechsel zwischen 0 und 5 V gut zu sehen. In Abbildung 7.9 sehen Sie so eine Messung mit dem Oszilloskop. Hier ist deutlich der gemessene Mittelwert Mean mit 1,28 V
zu erkennen, aber eben auch der Maximalwert Maximum mit 5,28 V.10
Da unsere LED die bei 5,28 V entstehenden höheren Ströme nicht dauerhaft verträgt, muss
eben auch bei den effektiv gemessenen 1,28 V ein Vorwiderstand verwendet werden.
Einmal »delay«, immer »delay«?
Der Befehl delay ist die simpelste Methode, um mit dem Arduino-Board PWM nachzubilden. Jedoch hat diese Methode auch Nachteile. So kann der Befehl delay als kleinsten
Wert nur 1 übernehmen, also eine Millisekunde. Sollten Sie also eine später eine feinere
Auflösung benötigen, ginge das mit delay nicht. Der wesentliche Nachteil von delay ist
jedoch, dass während der Ausführung dieses Befehls der Arduino nichts anderes im
Hintergrund abarbeiten kann! Außerdem ist es nicht sehr einfach, mittels delay die Einschaltdauer exakt zu definieren. Weitere Details dazu finden Sie im Internet im Artikel
»The secrets of Arduino PWM«.9
9 http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
192
Wichtig!
Der Arduino Uno kann nicht auf jedem Pin ein PWM-Signal ausgeben! Es sind genau
sechs Pins, die diese Funktion nutzen können. Damit Sie sich diese nicht merken müssen, sind sie auf der Platine mit einer Tilde (~) vor der jeweiligen Pin-Nummer gekennzeichnet.
10 Eigentlich sollten das hier genau 5,0 V sein. Aber so spielt das Leben: Offenbar lagen zum Zeitpunkt
des Experiments an meinem Board 5,28 V an.
193
7
7.1
Los geht’s! – Erste Praxis
Der erste Kontakt mit der Hardware
Warum ist PWM so wichtig?
Die Pulsweitenmodulation ist nicht nur praktisch, um LEDs zu dimmen. Wenn Sie später in Abschnitt 7.5, »Ich muss hier weg! – Ansteuerung von Motoren«, die Motoren
Ihres Roboters ansteuern, werden Sie PWM verwenden, um den Motor nicht nur mit
maximaler Geschwindigkeit (100 % = HIGH), sondern auch langsamer (zum Beispiel mit
25 %) drehen zu lassen.
Übrigens: HIGH ist nicht gleich HIGH – oder: 3,3 V vs. 5 V
Viele neue Bauteile nutzen als HIGH-Zustand statt 5 V oft nur noch 3,3 V, weil damit insgesamt in einer Schaltung Energie gespart wird. Um eine andere Schaltung mit 3,3-VLogik am Arduino Uno anzuschließen, werden spezielle Wandler benötigt, die die Spannungen automatisch von 3,3 nach 5 V und umgekehrt wandeln. Im Internet finden Sie
diese zum Beispiel unter der englischen Bezeichnung Voltage Level Translator. Sie kosten nur wenige Euro.
Abbildung 7.9 Schneller Wechsel der Pegel zwischen 0 und 5 V
In Abbildung 7.10 sehen Sie die markierten PWM-fähigen Pins 3, 5, 6, 9, 10 und 11 des
Arduino Uno.
Übung
Erstellen Sie jetzt bitte ein Programm, das eine LED auf 25 % Helligkeit herunterregelt
(dimmt). Schließen Sie dazu eine LED mit Vorwiderstand an Pin 5 an. Wenn Sie sich
nicht mehr sicher sind, wie die LED angeschlossen wird, blättern Sie dazu kurz zu Abbildung 7.7 zurück. Das Programm besteht aus sehr wenigen Zeilen und sollte am Ende so
wie PWM_LED.ino in Listing 7.2 aussehen:
// An Pin 5 ist eine LED mit Widerstand angeschlossen.
int led = 5;
Abbildung 7.10 Die PWM-Pins sind mit einer Tilde (~) gekennzeichnet.
void setup()
{
// Den Pin zur Ausgabe festlegen.
pinMode(led, OUTPUT);
}
void loop()
{
// 64 entspricht ca. 25 % von 255.
Abbildung 7.11 Auf einigen Arduino-Boards sind die Buchsen bedruckt.
194
195
7.2
Los geht’s! – Erste Praxis
2
0
)
RX0
3
(PWM=
1
4
5
6
7
8
9
10
11
12
DIGITAL
ICSP2
TX0
RESET
L
TX
RX
ON
TM
Arduino
30
A B C D E
F G H
I
J
30
A5
A4
A3
25
25
A2
A1
A0
20
20
VIN
15
15
GND
10
10
GND
5
5
Das einfachste Element, das Sie an einem Arduino-Pin »einlesen« können, ist ein simpler Schalter. Diese Teile benötigen Sie für den nachfolgenden Aufbau:
A B C D E
7.2.1 Schalter abfragen
F G H
I
J
In Abschnitt 7.1.1 haben Sie gelernt, wie Sie mit dem Arduino-Board mittels LED etwas
signalisieren können. Was tun Sie aber, wenn Ihr Arduino-Board etwas von der Außenwelt mitbekommen soll? Das zeige ich Ihnen in den folgenden Abschnitten. Und es wird
viel einfacher als das PWM-Thema aus Abschnitt 7.1.5.
ANALOG IN
POWER
1
IOREF
7.2 Ist da jemand? – Kontakt mit der Außenwelt
5V
ICSP
1
3V3
Der erste Praxisteil ist geschafft, und ich hoffe, es hat Ihnen bis hierher Spaß gemacht.
Sie haben erfolgreich die Grundlagen für die nachfolgenden Kapitel auf dem Weg zu
Ihrem eigenen Arduino-Roboter gelernt. Als Erstes haben Sie die orange LED zum Blinken gebracht, indem Sie zum ersten Mal Software auf Ihr Arduino-Board übertragen
haben. Nach etwas Theorie über das ohmsche Gesetz lernten Sie im Anschluss, warum
LEDs immer Vorwiderstände benötigen. Als Letztes haben Sie anhand einer Taschenlampe gelernt, was Pulsweitenmodulation (PWM) ist und dass Sie diese später zur
Motorsteuerung auf Ihrem Roboter benötigen werden.
13
7.1.6 Zwischenfazit
RESET
Listing 7.2 Das Programm »PWM_LED.ino« dimmt eine LED auf 25 %.
GND
}
Ist da jemand? – Kontakt mit der Außenwelt
Um einen Arduino-Pin einzulesen, muss natürlich ein Signal auf den Pin gegeben werden, das der Arduino »versteht«. Wie Sie sich bestimmt schon gedacht haben, ist das
einfachste Signal ein HIGH oder LOW. Dazu wird gleich ein Pin des Arduino-Boards mit
der Masse (GND = LOW-Signal) und mit 5 V (HIGH-Signal) verbunden. Wenn Sie nämlich
den Wert eines Arduino-Eingangs einfach einlesen würden, ohne dass etwas mit dem
Pin verbunden ist – dieser also quasi »in der Luft hängt« –, dann bekommen Sie jedes
Mal ein nicht vorhersagbares Ergebnis. Bauen Sie nun das Experiment mit dem Schalter
so wie in Abbildung 7.12 dargestellt auf.
AREF
// Die LED leuchtet nun mit 25 % Helligkeit.
analogWrite(led, 64);
1
7
Checkliste
D einen Schalter
D einen Widerstand, 10 kȍ
D ein paar Leitungen (Jumper Wires)
D eine Steckplatine
D den Arduino Uno
196
Abbildung 7.12 Eine einfache Schaltung mit Schalter
Wie Sie sehen, ist Pin 5 des Arduino über die gelbe Leitung mit einem Widerstand von
10 kΩ und mit einem Kontakt des Schalters verbunden. Das andere Ende des Widerstandes R1 ist über die schwarze Leitung mit der Masse (GND) verbunden. Der mittlere Kontakt des Schalters S1 ist über die rote Leitung mit 5 V verbunden. Zur Verdeutlichung
zeigt Abbildung 7.13 den dazu passenden Schaltplan.
197
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
Der Befehl zum Einlesen eines digitalen Arduino-Pins lautet:
5V
VIN
digitalRead(Pin);
3V3
RESET
D0/RX
RESET2
D1/TX
AREF
D2
ioref
D3 PWM
3
D4
A0
A1
A2
Arduino
Uno
(Rev3)
A3
D5 PWM
2
1
D6 PWM
S1
D7
D8
A4/SDA
A5/SCL
D10 PWM/SS
D12/MISO
D13/SCK
R1
10kΩ
2
N/C
1
D11 PWM/MOSI
Abbildung 7.13 Der Schaltplan zu Abbildung 7.12
Warum ist eine so umständliche Verkabelung mit einem extra Widerstand notwendig,
wenn Sie doch nur einen simplen Schalter einlesen wollen? Noch einmal: Würde der
Widerstand weggelassen werden und wäre der Schalter geöffnet bzw. in die eine Richtung geschoben, so würden Sie beim Einlesen des Arduino-Pins einen willkürlichen
Wert als Ergebnis zurückbekommen, weil der Pin »in der Luft« hängen würde und
dadurch keinen definierten Zustand wie HIGH oder LOW hat. Wenn aber ein Widerstand gegen die Masse (GND) geschaltet wird, so wird der Pin »auf Masse gezogen«. Ein
Auslesen des Pins ergibt somit den definierten Wert LOW. Schieben Sie den Schalter in
die andere Richtung, liegen am Pin des Arduino 5 V an. Sie haben also ein definiertes
HIGH-Signal.
Expertenwissen zum Angeben
Ein Widerstand, der einen Pin wie beschrieben »herunter auf Masse zieht«, wird übrigens Pull-down-Widerstand genannt. Das Gleiche gibt es auch Richtung HIGH: Ein
Widerstand vom Pin zur positiven Versorgungsspannung heißt Pull-up-Widerstand.
198
Der Befehl benötigt beim Aufruf nur den Parameter Pin, also die Nummer des digitalen
Pins, der eingelesen werden soll. Als Ergebnis liefert der Befehl den »Wert« HIGH oder
LOW zurück. Aber am einfachsten verdeutlicht dies das kleine Programm Schalter_einlesen.ino in Listing 7.3, das Sie bitte auf Ihr Arduino-Board übertragen und mit der Schaltung aus Abbildung 7.12 ausprobieren.
int ledPin = 13; // LED verbunden mit Digital-Pin 13
int inPin = 7;
// Schalter verbunden mit Digital-Pin 7
int zustand = LOW; // Diese Variable speichert den Schalterzustand
D9 PWM
GND
7
void setup()
{
pinMode(ledPin, OUTPUT); // Digital-Pin 13 als Ausgang definieren
pinMode(inPin, INPUT);
// Digital-Pin 7 als Eingang definieren
}
void loop()
{
zustand = digitalRead(inPin);
digitalWrite(ledPin, zustand);
}
// Schalterzustand (Pin) einlesen
// LED gemäß Schalterzustand schalten
Listing 7.3 Einlesen eines Schalters und Ausgabe mittels LED
Wie erwartet, sollte nun der Schalter die LED auf dem Arduino-Board ein- und ausschalten.
Warum einfach, wenn es auch umständlich geht?
Haben Sie sich beim Lesen des Programmcodes gefragt, warum es so viele Zeilen sind
bzw., genauer gesagt, warum eine Variable verwendet wird? Natürlich hätte der Code
auch wie in Listing 7.4 wesentlich kürzer geschrieben werden können.
void setup()
{
// Digital-Pin 13 als Ausgang definieren
pinMode(13, OUTPUT);
// Digital-Pin 7 als Eingang definieren
199
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
pinMode(7, INPUT);
}
void loop()
{
// Schalter einlesen und LED sofort ein-/ausschalten
digitalWrite(13, digitalRead(7));
}
Listing 7.4 Einlesen eines Schalters – kurz, aber unvorteilhaft
Auf den ersten Blick erscheint Ihnen das Programm sicher einfacher und übersichtlicher. Schauen Sie sich die Unterschiede in Ruhe an. Sie werden feststellen, dass in Listing 7.4 vollständig auf die Verwendung von Variablen verzichtet und der Code dadurch
sehr schlank wird. Das kann natürlich so gemacht werden – insbesondere dann, wenn es
sich um ein so einfaches Programm handelt. Stellen Sie sich aber nun vor, Sie bauen die
Schaltung einmal um und schließen den Schalter statt an Pin 7 an Pin 11 an. Vielleicht
Checkliste
D einen Taster
D einen Widerstand, 10 kȍ
D ein paar Leitungen (Jumper Wire)
D eine Steckplatine
D den Arduino Uno
Im Unterschied zu einem Schalter, der seine Position dauerhaft beibehält, verbindet ein
Taster seine Kontakte nur, solange er gedrückt wird – zumindest bei einem Taster, der
die Kontakte beim Betätigen schließt. Es gibt nämlich auch Taster, die beim Betätigen
die Kontakte öffnen. Der Aufbau der Schaltung ist genau der gleiche wie beim Schalter,
wie Sie anhand Abbildung 7.14 leicht feststellen werden.
2
0
RX0
3
4
)
L
TX
RX
Verwenden Sie stattdessen den Code mit den Variablen, müssten Sie lediglich die zwei
(PWM=
1
5
6
7
8
9
10
11
12
DIGITAL
ICSP2
TX0
RESET
jeder Stelle müssten Sie für den Schalter die 7 auf 11 ändern und für die LED die 13 auf 10.
13
AREF
Pin 10 stecken. Was müssten Sie dazu nun im Programmcode verändern? Richtig: An
GND
schließen Sie auch noch eine grüne LED statt der eingebauten an und wollen diese an
ON
TM
Arduino
1
ICSP
Zeilen mit ledPin und inPin aktualisieren.
A5
A4
A3
A2
A0
ANALOG IN
A1
VIN
POWER
GND
GND
3V3
aktualisieren müssten, sollten Sie später einmal ein Programm mit hundert Zeilen
5V
IOREF
lich leichter zu warten. Denken Sie nur daran, an wie vielen Stellen Sie Pin-Nummern
RESET
Die lange Codevariante ist auf den ersten Blick vielleicht umständlicher, aber wesent-
haben. Nicht zuletzt wäre dieses Vorgehen auch noch deutlich fehleranfälliger.
Was mit einem Schalter geht, geht mit einem Taster genauso einfach. Und das testen Sie
jetzt. Sie benötigen für den nachfolgenden Aufbau:
15
20
25
30
15
20
25
30
A B C D E
F G H
I
J
10
10
I
J
5
7.2.2 Taster abfragen
5
wie möglich zu schreiben.
F G H
warum es sich meistens lohnt, Variablen in Programmen zu verwenden, statt sie so kurz
A B C D E
sen und warum hierzu ein Widerstand notwendig ist. Des Weiteren haben Sie erfahren,
1
In diesem Abschnitt haben Sie gelernt, wie Sie einen Schalter anschließen, diesen ausle-
1
7
Abbildung 7.14 Schaltung zum Auslesen eines Tasters
Den dazugehörigen Schaltplan sehen Sie in Abbildung 7.15: Nur das Symbol für den Taster S2 hat sich verändert.
200
201
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
D10 PWM/SS
A5
)
A5/SCL
A4
ICSP
1
D9 PWM
A3
ON
A4/SDA
20
25
30
20
25
30
J
15
7
6
I
F G H
A B C D E
(PWM=
D8
ANALOG IN
A3
15
8
5
A1
A2
10
9
A0
D7
10
VIN
J
10
GND
D6 PWM
5
2
2
D5 PWM
DIGITAL
A2
GND
TM
A1
Arduino
Uno
(Rev3)
5V
POWER
A0
11
Arduino
D4
5
12
3V3
1
13
RESET
I
1
GND
IOREF
F G H
D3 PWM
AREF
A B C D E
ioref
S2
1
D2
1
5V
D1/TX
AREF
L
D0/RX
RESET2
TX
RX
RESET
ICSP2
VIN
RESET
3V3
4
3
2
TX0
1
RX0
0
D11 PWM/MOSI
D13/SCK
R1
10kΩ
2
N/C
Abbildung 7.16 Versuch mit Taster und internem Pull-up-Widerstand
1
D12/MISO
GND
7
Abbildung 7.15 Schaltplan zu Abbildung 7.14
Vorwiderstand ohne Widerstand – oder: Der interne Pull-up-Widerstand
Sie können den Aufbau aus Abbildung 7.14 durch Aktivieren einer besonderen Funktion
Ihres Arduino auch ohne extra Widerstand aufbauen. Dazu nutzen Sie den internen
Pull-up-Widerstand. Intern? Richtig. Der auf Ihrem Arduino-Board verbaute Mikrocontroller besitzt an seinen digitalen Pins interne Pull-up-Widerstände, die Sie per Software
aktivieren können. Dies geschieht mit folgendem Befehl:
pinMode(Pin, INPUT_PULLUP);
Damit ersparen Sie sich einen separaten Widerstand beim Abfragen von Tastern oder
Schaltern. Beachten Sie aber, dass sich die Logik beim Auslesen des Pins »umkehrt«.
Denn der Pin wird standardmäßig immer Richtung +5 V »gezogen«. Das bedeutet:
Wenn der Taster in Abbildung 7.16 nicht gedrückt ist, ist der Pin HIGH. Wird der Taster
gedrückt, wird der Pin mit GND verbunden und ist damit LOW. Aber dafür sparen Sie sich
ein extra Bauteil.
Prellende Taster und Schalter
Taster und Schalter haben eine Eigenschaft, die Prellen (engl. bounce) genannt wird. Das
bedeutet: Wenn ein Schalter oder Taster betätigt wird, werden die Kontakte in der Regel
nicht einfach geschlossen, sondern im winzigen Millimeterbereich mehrfach hintereinander kurz geschlossen und wieder geöffnet. Das kann man sich wie einen Handball
vorstellen, der auf den Boden fällt und dabei ein paarmal springt, bis er endgültig liegen
bleibt. Dieses Verhalten ist technisch bedingt und unerwünscht. Beim Schalten einer
LED ist dieses Prellen nicht weiter tragisch und auch nicht wahrnehmbar. Wenn Sie aber
zum Beispiel jede Betätigung eines Tasters zählen wollen, so nimmt der Arduino diese
Mehrfachbetätigungen durch das Prellen aufgrund mehrerer schneller Messungen
während des Tastendrucks wahr. Ein scheinbar einmaliger Druck auf den Taster wird
dann zum Beispiel als »fünfmal betätigt« gezählt. Das kann dann bei Auswertungen in
einer Software zu einem Problem werden. In Abbildung 7.17 sehen Sie, wie ein Taster
mehrfach zwischen AUS und EIN wechselt, bis er am Ende eingeschaltet bleibt.
Wie kann dieses Prellproblem gelöst werden? Zum einen gibt es spezielle sogenannte
entprellte Taster. Diese sind mechanisch so konstruiert, dass sie nicht prellen können.
Zum anderen ist das aber auch per Software lösbar. Es gibt eine fertige Lösung, da sich
bereits andere ausgiebig zu diesem Problem Gedanken gemacht haben: die sogenannte
Bounce-Bibliothek11.
11 http://playground.arduino.cc/code/bounce
202
203
7
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
entpreller.interval(5);
// LED-Pin als Ausgang definieren
pinMode(LED_PIN,OUTPUT);
}
void loop()
{
// Entpreller (entpreller) aktualisieren
entpreller.update();
// "Korrigierten" Wert des Tasters lesen
int wert = entpreller.read();
// LED ein- oder ausschalten
// (LOW = EIN, weil Pull-up-Widerstand!)
if (wert == LOW)
{
// LED an
digitalWrite(LED_PIN, HIGH);
}
else
{
// LED aus
digitalWrite(LED_PIN, LOW);
}
Abbildung 7.17 Ein prellender Schalter beim Einschalten
Die Bounce-Bibliothek sorgt dafür, dass ein prellender Schalter oder Taster wie gewünscht abgefragt werden kann, und filtert die Störungen automatisch für Sie heraus.
Ein Beispiel dazu sehen Sie in Listing 7.5. Den Code zum Download finden Sie in der Datei
Taster_entprellt.ino. Der Aufbau der Testschaltung dazu ist in Abbildung 7.16 dargestellt.
Denken Sie daran, dass Sie für die Verwendung der Bibliothek diese erst in Ihre ArduinoSoftware importieren müssen (siehe Abschnitt 6.15, »Bibliotheken (Libraries)«).
#include <Bounce2.h>
#define TASTER_PIN 2 // Pin für den Taster (gegen GND)
#define LED_PIN
13 // Die übliche Arduino-LED
}
Listing 7.5 Taster einlesen und automatisch entprellen
// Erstelle ein Bounce-Objekt, das das Entprellen regelt.
Bounce entpreller = Bounce();
void setup()
{
// Taster-Pin als Eingang definieren
pinMode(TASTER_PIN, INPUT);
// Internen Pull-up-Widerstand aktivieren
pinMode(TASTER_PIN, INPUT_PULLUP);
// Entprellfunktion aktivieren
entpreller.attach(TASTER_PIN);
204
Die meisten Zeilen dürften für Sie nicht mehr neu sein. Spannend ist lediglich die Zeile
zu Beginn:
Bounce entpreller = Bounce();
Hier wird ein Objekt namens entpreller erstellt, das die ganze Magie für Sie regelt.
Beachten Sie weiterhin die in der setup-Funktion enthaltene Anweisung pinMode(TASTER_PIN, INPUT_PULLUP), die den internen Pull-up-Widerstand im Arduino für den Taster-Pin aktiviert (siehe Abschnitt 7.1.4). Wie die Entprellfunktion intern genau arbeitet,
können Sie auf der Website des Entwicklers nachlesen.12
12 https://github.com/thomasfredericks/Bounce-Arduino-Wiring/wiki
205
7
7.2
Los geht’s! – Erste Praxis
Wichtig sind an dieser Stelle zum einen die folgenden Zeilen in der setup-Funktion:
// Entprellfunktion aktivieren
entpreller.attach(TASTER_PIN);
entpreller.interval(5);
sowie die folgenden Zeilen später in der loop-Funktion:
Ist da jemand? – Kontakt mit der Außenwelt
Natürlich hat Ihr Fernseher oder das entsprechende empfangende Gerät auch einen Infrarotsensor, um dieses Licht zu erkennen und mittels weiterer Elektronik zu dekodieren. Dekodieren bedeutet in diesem Fall, die übertragenen Signale zu entschlüsseln.
Schließlich wäre es ziemlich hilfreich, wenn beim Drücken der Taste 4 auf der Fernbedienung eine andere Information als bei Taste 2 an das zu steuernde Gerät übertragen
wird. In Abbildung 7.19 sehen Sie einen Infrarotsensor (IR-Sensor).
// Entpreller (entpreller) aktualisieren
entpreller.update();
// "Korrigierten" Wert des Tasters lesen
int wert = entpreller.read();
Das ist auch schon alles, was Sie dazu wissen müssen. Wahrscheinlich werden Sie die
Bounce-Bibliothek in der Praxis nicht sehr oft benötigen. Aber falls einmal die exakte
Auswertung von Tastern oder Schaltern notwendig ist, kennen Sie nun diese hilfreiche
Bibliothek.
Abbildung 7.18 Infrarotlicht, mit einer Webcam sichtbar gemacht
7.2.3 Sensoren
Aber nun zu etwas Spannenderem als simplen Tastern und Schaltern: Sensoren. Ein Sensor ist so etwas wie ein »Fühler«, der bestimmte Eigenschaften seiner Umgebung erkennen kann. Er nimmt Messungen vor und stellt die Ergebnisse an seinen Anschlüssen
zum Auslesen an elektrischen Schaltungen, wie dem Arduino, zur Verfügung. In diesem
Kapitel will ich Ihnen drei Sensoren vorstellen, die in der Robotik häufig Anwendung
finden. Einen davon werden Sie selbst später an Ihrem Arduino-Roboter nutzen.
7.2.4 Infrarotsensor
Es gibt verschiedenste Sensoren, die sich mit der Messung von Infrarotlicht beschäftigen. Infrarotlicht ist Licht im für den Menschen unsichtbaren Bereich. Dabei sind wir
ständig davon umgeben, sogar in unserem Wohnzimmer – zumindest, wenn Sie einen
Fernseher oder eine Stereoanlage mit Fernbedienung besitzen, denn die gängigen Fernbedienungen haben alle eine Infrarot-LED (IR-LED), die Signale an das zu steuernde
Gerät überträgt. Mit vielen Digitalkameras oder Webcams können Sie die Infrarotstrahlung sogar sichtbar machen: Halten Sie doch einmal in sehr dunkler Umgebung Ihre
Fernseherfernbedienung vor eine Kamera, betätigen Sie eine der Tasten, und schauen
Sie auf das Bild. Es dürfte ungefähr wie in Abbildung 7.18 aussehen. Der nun sichtbar
leuchtende Punkt ist die Infrarot-LED.
206
Abbildung 7.19 Der Infrarotsensor (IR-Sensor) TSOP38238
Der Vorteil der Infrarotsensoren ist, dass sie relativ günstig sind. Sie haben aber auch
einen Nachteil: Da die Sonne ebenfalls einen sehr hohen Anteil an Infrarotlicht aussendet, funktionieren viele IR-Sensoren im Außenbereich nicht sehr zuverlässig. Denn
neben dem Infrarotlicht der Fernbedienung empfangen sie zusätzlich das IR-Licht der
Sonne und können das Signal somit nicht immer eindeutig erkennen. Für Innenbereiche können sie also gut eingesetzt werden, während draußen andere Sensoren besser
geeignet sind.
Der Infrarotsensor Ihres Roboters
Der Infrarotsensor, der später auf Ihrem Arduino-Roboter zum Einsatz kommen wird,
ist eine Kombination aus Infrarotsender und -empfänger: der Sharp-Infrarotdistanz-
207
7.2
Los geht’s! – Erste Praxis
messer mit dem kurzen und leicht zu merkenden Namen GP2Y0A21YK0F. Dieser Sensor,
den Sie in Abbildung 7.20 sehen, enthält eine Infrarotdiode (IR-Diode) und einen IREmpfänger. Die IR-Diode sendet Infrarotlicht aus, das von einem Objekt reflektiert und
vom IR-Empfänger wieder eingelesen wird. In Abhängigkeit von der Entfernung des
Objekts gibt dieser Sensor an einem seiner Pins eine Spannung aus. Diese Spannung
können Sie mit dem Arduino einlesen.
Ist da jemand? – Kontakt mit der Außenwelt
Vorsicht, empfindliche Buchse am Sensor!
Beachten Sie, dass der weiße Stecker nur in eine Richtung auf den Sensor gesteckt werden kann. Bitte schauen Sie sich den Stecker in Abbildung 7.21 genau an: Er hat einen
kleinen Steg in der Mitte, der in die passende Führung des Sensors gesteckt werden
muss. Sollten Sie den Stecker falsch herum stecken und den Sensor anschließen, wird
mindestens der Sensor dauerhaft Schaden nehmen!
Abbildung 7.21 Der Stecker des Sensors hat einen Steg in der Mitte.
Weiß
1
0
2
RX0
3
4
5
6
7
8
9
ICSP
A5
A4
A3
A2
A1
ANALOG IN
A0
VIN
POWER
GND
GND
Masse (GND)
5V
Schwarz
1
3V3
+5 V
ON
TM
RESET
Rot
)
Arduino
IOREF
Belegung
(PWM=
L
TX
RX
Farbe
10
11
12
DIGITAL
ICSP2
TX0
RESET
13
Der Sensor ist denkbar einfach an einem Arduino-Board anzuschließen, denn er hat
lediglich drei Leitungen an seinem Anschlusskabel:
GND
Abbildung 7.20 Der Sharp-Infrarotdistanzmesser »GP2Y0A21YK0F«
AREF
7
Signal
Für das nachfolgende Experiment benötigen Sie folgende Teile:
Checkliste
D einen Infrarotdistanzsensor
D den Arduino Uno
Stecken Sie das Anschlusskabel an den Sensor, und schließen Sie dann den Sensor wie in
Abbildung 7.22 an Ihren Arduino an. Das weiße Sensorkabel entspricht in der Abbildung
der gelben Leitung.
208
Abbildung 7.22 Der Infrarotdistanzsensor, angeschlossen am Arduino
Dieser Sharp-Sensor kann Distanzen zu einem Objekt in ca. 10 bis 80 cm Entfernung
messen und gibt entsprechend zu den Entfernungen einen analogen Spannungswert
auf der weißen Signalleitung aus. Beispielsweise:
왘 ca. 2,3 V bei 10 cm Entfernung
왘 ca. 1,0 V bei 29 cm Entfernung
왘 ca. 0,4 V bei 80 cm Entfernung
209
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
In Abbildung 7.23 sehen Sie ein Diagramm aus dem Datenblatt des Sensors, das die
jeweilige Spannung in Abhängigkeit zur Entfernung eines Objekts vom Sensor zeigt.
pinMode(ledPin, OUTPUT); // LED-Pin ist ein Ausgang
pinMode(IRpin, INPUT);
// IR-Pin als Eingang definieren
Wie Sie sehen, handelt es sich um eine analoge Spannung, die alle Werte zwischen 0 bis
ungefähr 3,1 V annehmen kann. Daraus folgt das nächste Experiment mit dem Arduino
und einer neuen Funktion: das Einlesen einer analogen Spannung mit diesem Befehl:
// Serielle Ausgabe auf dem Bildschirm starten
Serial.begin(9600);
analogRead(pin);
}
void loop()
{
// Sensor (Pin) einlesen
float spannungswert = analogRead(IRpin);
3,5
// umrechnen in cm
float entfernung = (6787 / (spannungswert - 3)) - 4;
3,0
Spannung (in V)
7
// Solange Distanz <= 80 cm
if (entfernung <= 80)
{
// Distanz ausgeben
Serial.print("Messwert: ");
Serial.print(spannungswert);
Serial.print(" / Entfernung: ");
Serial.print(entfernung);
Serial.print("cm");
}
else
{
Serial.print("> 80 cm");
}
2,5
2,0
1,5
1,0
0,5
0,0
0
10
20
30
40
50
60
70
80
Abstand zum reflektierenden Objekt (in cm)
Serial.println();
delay(500);
Abbildung 7.23 Die Ausgangsspannung in Abhängigkeit zur Entfernung
}
Anzeigen der Entfernung auf dem Bildschirm
Laden Sie nun bitte das Programm IR_Distanz_SerialOut (siehe Listing 7.6) herunter,
und übertragen Sie es mit der aufgebauten Schaltung auf Ihr Arduino-Board:
int ledPin = 13; // Der übliche LED-Pin
int IRpin = A0; // Der Pin für den Infrarotsensorausgang
void setup()
{
210
Listing 7.6 »IR_Distanz_SerialOut.ino« zum Anzeigen der Entfernung
Nach dem Übertragen der Software aktivieren Sie den in Abschnitt 6.14.2, »Der serielle
Port – Ausgabe von Text«, beschriebenen Seriellen Monitor in der Arduino-Software
über die Menüpunkte Werkzeuge 폷 Serieller Monitor. Halten Sie nun die Hand vor
den Sensor, und verändern Sie dabei die Entfernung. Die Ausgabe auf dem Bildschirm
zeigt die ungefähre Entfernung der Hand vom Sensor an. In Abbildung 7.24 sehen Sie
ein Beispiel.
211
7
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
// umrechnen in cm
float entfernung = (6787 / (spannungswert - 3)) - 4;
Die Entfernung mittels LED signalisieren
Schauen Sie sich nun Listing 7.7 an, und übertragen Sie die Datei IR_Distanz_LED.ino auf
den Arduino. Nach dem Übertragen des Codes sollte die orange LED auf dem ArduinoBoard langsam im Sekundentakt blinken.
int ledPin = 13; // Der übliche LED-Pin
int IRpin = A0; // Der Pin für den Infrarotsensorausgang
void setup()
{
pinMode(ledPin, OUTPUT); // LED-Pin als Ausgang definieren
pinMode(IRpin, INPUT); // IR-Pin als Eingang definieren
}
void loop()
{
// Sensor (Pin) einlesen
float spannungswert = analogRead(IRpin);
// Umrechnen in cm
float entfernung = (6787 / (spannungswert - 3)) - 4;
Abbildung 7.24 Ausgabe der Entfernung auf dem Bildschirm
Wenn Sie den Code näher betrachten, werden Sie feststellen, dass die ganze Magie auf
zwei Zeilen beschränkt ist. Erst wird die analoge Spannung vom Sensor am Arduino-Pin
mittels analogRead eingelesen und gleichzeitig in der Variable entfernung gespeichert:
// Sensor (Pin) einlesen
float spannungswert = analogRead(IRpin);
Gleich danach wird der eingelesene Spannungswert in die Entfernung in Zentimeter
umgerechnet. Die spezielle Formel13 ist hier an den verwendeten Sensor angepasst. Bei
einem anderen Sensor müssten Sie hier eine Anpassung vornehmen:
13 Siehe auch http://www.acroname.com/articles/linearizing-sharp-ranger.html.
212
// delay-Wert begrenzen
if (entfernung > 80)
entfernung = 80;
if (entfernung < 10)
entfernung = 10;
// Entfernung für delay umrechnen
int zeit = 0;
zeit = map(entfernung, 10, 80, 100, 1000);
// LED blinkt
digitalWrite(ledPin, HIGH);
delay(zeit);
213
7
7.2
Los geht’s! – Erste Praxis
digitalWrite(ledPin, LOW);
delay(zeit);
}
Listing 7.7 Blinkende LED in Abhängigkeit zur Entfernung der Hand
Je näher Sie nun die Hand in Richtung Sensor bewegen, desto schneller blinkt die LED.
Hilfreich – die Funktion »map«
Ein paar Worte zu der hier verwendeten map-Funktion: Diese ist äußerst hilfreich, um
Werte eines bestimmten Bereichs auf einen anderen abzubilden (zu »mappen«). Um es
etwas anschaulicher zu sagen: Wenn Sie zum Beispiel einen Temperatursensor haben,
der von –100 bis +100 Grad Celsius misst, und Sie die Helligkeit einer LED von 0 bis 255
in Abhängigkeit zur Temperatur einstellen wollen, dann geht das mit der map-Funktion
wie folgt:
Ist da jemand? – Kontakt mit der Außenwelt
7.2.5 Ultraschallsensoren
Gegenüber den in Abschnitt 7.2.4 vorgestellten Infrarotsensoren haben Ultraschallsensoren den Vorteil, dass sie gegen Sonnenlicht unempfindlich sind. Das heißt, wenn Sie
Ihren Roboter einmal im Garten fahren lassen wollen, eignen sich Ultraschallsensoren
besser – auch wenn diese draußen ebenfalls vor Nässe geschützt werden müssen. Ein
weiterer wesentlicher Vorteil ist die maximal messbare Entfernung: Die in Abbildung
7.25 gezeigten Sensoren SRF04/05 von Devantech können eine Entfernung bis sechs
Meter messen. Der Nachteil der Sensoren liegt in Ihrem Preis: Verglichen mit IR-Sensoren sind sie fast doppelt so teuer in der Anschaffung.
helligkeitLED = map(temperatur, -100, 100, 0, 255);
Einfach, aber genial, oder? Sie finden die komplette (englische) Referenz zum map-Befehl
wie immer im Internet.14
Abbildung 7.25 Der Ultraschallsensor »SRF04/05« von Devantech
Und wozu das Ganze?
Wie Sie sich bestimmt vorstellen können, sind die vorangegangenen Beispiele hilfreich,
wenn Sie später den Infrarotsensor auf Ihrem Roboter einsetzen werden. Denn schließlich soll der Roboter ja rechtzeitig vor einem Hindernis ausweichen und nicht dumm
vor eine Wand fahren. Das bedeutet: Wenn in diesem Beispiel eine LED sehr schnell
blinkt, ein Hindernis also sehr nah ist, werden Sie den Roboter in Abschnitt 9.2, »Hindernisvermeidung«, dazu bringen, nach links oder rechts auszuweichen.
Übung
Experimentieren Sie wieder etwas mit dem Code. Ändern Sie das Programm IR_Distanz_LED so, dass es die Helligkeit einer externen LED in Abhängigkeit von der Entfernung der Hand zum Sensor ändert. Tipp: Schauen Sie sich dazu vielleicht noch einmal
Abschnitt 7.1.5 an. Übung macht den Meister!15
14 http://arduino.cc/en/Reference/Map
15 Ich will Ihnen die Lösung nicht vorenthalten: Sie finden sie als Download mit dem Dateinamen IR_
Distanz_LED_Helligkeit.ino.
214
Auch die Ansteuerung der Ultraschallsensoren ist komplexer: Dem Sensor muss erst
ein Start-Impuls gegeben werden, damit er eine Messung startet. Danach »antwortet« er
mit einem Impuls, dessen Länge der gemessenen Distanz entspricht.
Immer noch nicht genug? Arduino-Shields!
Das Arduino-Board wäre sicher nicht so erfolgreich, wenn es zum einen nicht so einfach
zu programmieren und zum anderen nicht so leicht erweiterbar wäre. Natürlich haben
sich die Entwickler etwas dabei gedacht, solche Buchsen auf die Oberseite zu montieren.
Denn sie ermöglichen es nicht nur, ein paar Drähte oder Bauteile (wie Widerstände)
»mal eben schnell« zu stecken. Sie ermöglichen auch die Erweiterung des ArduinoBoards durch sogenannte Arduino-Shields. Diese werden einfach »huckepack« auf den
Arduino gesteckt und sind ohne Löten oder Schrauben sofort einsatzbereit. Es gibt wirklich unzählige Shields und damit Erweiterungsmöglichkeiten. Um sich einen kleinen
Überblick über die Vielfalt an Arduino-Shields zu verschaffen, schauen Sie sich die nachfolgenden Abbildungen an. Wenn Sie damit noch immer nicht genug Anregungen für
spätere Projekte erhalten, suchen Sie im Internet nach »Arduino Shield«. Sie werden
zahlreiche Ergebnisse für Inspirationen erhalten.
215
7
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
Sie wollen eine SD-Karte für Ihren Arduino nutzen, um dort zum Beispiel Daten zu protokollieren (siehe Abbildung 7.26)? Kein Problem: Das Adafruit Data Logging Shield aus
Abbildung 7.27 ist das Shield Ihrer Wahl. Insgesamt hat die Firma Adafruit16 eine großartige Auswahl an Produkten, die stetig mit dazugehöriger Software und Dokumentation
weiterentwickelt werden und zudem in Deutschland gut verfügbar sind.
Wenn Sie Ihren Arduino Daten anzeigen lassen und ihn per Touchscreen steuern wollen, dann sollten Sie sich näher mit dem TFT Touch Shield aus Abbildung 7.28 beschäftigen.
Abbildung 7.26 Das »Arduino Motor Shield«
Das Arduino Motor Shield aus Abbildung 7.26 dient zum leichten Anschluss und Betrieb
von Motoren und Servos am Arduino-Board. Dieses Shield werden Sie auf Ihrem Roboter nutzen, und ich zeige Ihnen in Abschnitt 7.4, »Der Diener – Ansteuerung von Servos«,
bzw. Abschnitt 7.5, »Ich muss hier weg! – Ansteuerung von Motoren«, wie das funktioniert.
Abbildung 7.28 Das »TFT Touch Shield«17
Verbinden Sie Ihr Arduino-Projekt doch später einmal mit Ihrem heimischen Netzwerk
– per WLAN mit dem WIFI Shield aus Abbildung 7.29. Sie könnten zum Beispiel Ihr Projekt aus dem heimischen Netz twittern lassen oder vom Internet aus auf Ihr ArduinoBoard zugreifen. Und einen SD-Kartenleser hat dieses Shield auch noch mit dabei.
Abbildung 7.27 Das »Adafruit Data Logging Shield«
216
16 https://www.adafruit.com
17 Bild: http://www.adafruit.com/products/1651
217
7
7.2
Los geht’s! – Erste Praxis
Ist da jemand? – Kontakt mit der Außenwelt
Wenn Sie mal einen Roboter bauen wollen, der fast überall erreichbar ist, dann sollten
Sie sich mit dem GSM Shield aus Abbildung 7.30 vertraut machen. Es enthält alles, was
Sie zur Kommunikation über das Handynetz benötigen. Wenn Sie sich später noch
näher mit dem Thema GSM beschäftigen wollen, sollten Sie sich auch das Adafruit FONA
einmal näher anschauen.20
Abbildung 7.29 Das »Arduino WIFI Shield«18
Abbildung 7.31 Das »Arduino Proto Shield«21
Immer noch nicht genug? Dann entwickeln Sie doch Ihr eigenes Arduino-Shield. Mit
dem Arduino Proto Shield aus Abbildung 7.31 haben Sie Platz für eigene Lötarbeiten oder
zur Entwicklung eines Prototyps für Ihr eigenes Shield.
7.2.6 Zwischenfazit
Abbildung 7.30 »Arduino GSM Shield« auf einem Arduino Uno19
18 Bild: http://arduino.cc, CC BY-SA 3.0
19 Bild: http://arduino.cc, CC BY-SA 3.0
218
Wie Sie sehen, gibt es wirklich jede Menge Möglichkeiten, um Ihr kleines, aber feines
Arduino-Board zu erweitern oder mit dem Rest der Welt zu verbinden. Sie haben in diesem Kapitel als Erstes gelernt, wie Sie Schalter und Taster abfragen können. Danach habe
ich Ihnen erläutert, was Prellen in diesem Zusammenhang bedeutet. Anschließend haben
Sie einen Infrarotdistanzsensor ausgelesen und in Abhängigkeit von der Distanz zum
Sensor eine LED zum Blinken gebracht. Nach ein paar weiteren Übungen damit erhielten
Sie zum Schluss einen Einblick in die weite Welt der zahlreichen Arduino-Shields.
20 http://www.adafruit.com/product/1963
21 Bild: http://arduino.cc, CC BY-SA 3.0
219
Herunterladen