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