- -
- 100%
- +

Abb. 13: Die Update-Schaltfläche erscheint
Die Bibliothekenverwaltung kann aber auch über den Menüpunkt Werkzeuge | Bibliotheken verwalten... erreicht werden, sodass sich das schon gezeigte Fenster öffnet.

Abb. 14: Der Aufruf der Bibliothekenverwaltung
Die Boardverwaltung
Die Arduino-Entwicklungsumgebung kann nicht nur Arduino-Boards programmieren und kontrollieren, sondern auch Boards von anderen Herstellern, wie zum Beispiel die sehr bekannten und beliebten ESP32 oder ESP8266. Um derartige Boards in die Entwicklungsumgebung zu integrieren, muss der Boardverwalter bemüht werden, der unter dem Menüpunkt Werkzeuge | Board | Boardverwalter... zu erreichen ist:

Abb. 15: Der Aufruf der Boardverwaltung
Möchte ich zum Beispiel die Unterstützung für das megaAVR-Board meiner Arduino-Entwicklungsumgebung hinzufügen, tippe ich rechts oben den Suchbegriff megaAVR ein und das entsprechende Installationspaket wird angezeigt. Es kann dann installiert werden:

Abb. 16: Das Hinzufügen eines neuen Boards
Diese Suche kann natürlich auch bei der Bibliothekenverwaltung angewendet werden. Vielleicht bist du am ESP32 und ESP8266 interessiert und hast ESP32 in das Suchfenster eingegeben. Doch leider liefert dieser Suchbegriff kein Ergebnis und die Liste bleibt leer. Keine Panik! Das hat folgenden Hintergrund: Zahlreiche Boards von Drittherstellern liefern Informationen und Installationsdateien auf einem hauseigenen Verzeichnis. Doch wie kannst du der Arduino-Entwicklungsumgebung diese Pfade mitteilen? Ganz einfach! Ruf über den Menüpunkt Datei | Voreinstellungen das entsprechende Dialogfenster auf. Das sieht dann wie folgt aus, wobei ich den benötigten Pfad zur ESP32-Unterstützung schon eingetragen und markiert habe:

Abb. 17: Die Arduino-Voreinstellungen
Der dort einzusetzende Pfad lautet für die ESP32-Unterstützung:

https://dl.espressif.com/dl/package_esp32_index.json
Für eine kombinierte beziehungsweise zusätzliche Unterstützung des ESP8266-Boards ist der folgende Eintrag dem ersten – getrennt durch ein Komma – hinzuzufügen:

http://arduino.esp8266.com/stable/package_esp8266com_index.json
Im Anschluss sind beide Boards zur Installation in die Arduino-Entwicklungsumgebung bereit. Es existiert eine Quelle an inoffiziellen Erweiterungen für sogenannte 3rd-Party-Boards, die unter der folgenden Adresse zu finden ist:

https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls
Dort sind sehr viele Boards aufgeführt, die mit der Arduino-IDE programmiert werden können. Kopiere die auf dieser Seite angebotenen Pfade in die Arduino-Voreinstellungen in der bereits gezeigten Zeile ein und schon kann es losgehen.
Der Sketch-Code in der Entwicklungsumgebung
Zwar kann ich hier keinen Grundkurs in C/C++-Programmierung geben, doch möchte ich ein paar grundlegende Dinge zu dieser Sprache sagen, die in der Arduino-Entwicklungsumgebung eingesetzt wird. Die Programmiersprache C/C++ ist case-sensitive, was bedeutet, dass zwischen Groß- und Kleinschreibung unterschieden wird. Es ist also genau darauf zu achten, wie die Befehle geschrieben werden. Sehen wir uns dazu den Befehl digitalWrite an. Er setzt sich aus zwei Wörtern (digital und Write) zusammen. In der Programmierung wird das Zusammensetzen von Wortbedeutungen mit der Großschreibung des ersten Buchstaben (bis auf das erste Wort) camel-casing genannt. Somit würde die folgende Codierung auf jeden Fall fehlschlagen:
digitalwrite
Derartige Fehler werden aber von der Arduino-Entwicklungsumgebung erkannt und optisch dargestellt. Ein Wort, das Bestandteil eines Befehlssatzes ist, wird in der Regel farblich hervorgehoben. Wird das Wort beziehungsweise der Befehl falsch geschrieben, erfolgt keine farbliche Abhebung vom Rest des Codes, der schwarz gehalten ist. Sehen wir uns das in der Entwicklungsumgebung an:

Es ist zu erkennen, dass der Befehl in Zeile 8 korrekt geschrieben wurde und mit einer entsprechenden Zeichenfarbe versehen wurde. Aufgrund der falschen Schreibweise des Befehls in Zeile 9 wurde dieser nicht erkannt und demnach schwarz dargestellt.
Troubleshooting
Es kann immer wieder hier und da zu Problemen kommen, das passiert mir auch gelegentlich. Aus meinen eigenen Erfahrungen weiß ich, dass es einige typische Fehlerquellen gibt.
Ist das Board mit Spannung versorgt?
Aufgrund eines defekten USB-Kabels kann es sein, dass das Board nicht mit Spannung versorgt wird. Dann leuchtet die LED mit der Bezeichnung ON auf dem Board natürlich nicht. Das hat auch zur Folge, dass das Board vom System nicht erkannt und auch nicht als weiterer COM-Port angezeigt wird.
Stimmt die Auswahl von Board und COM-Port?
Wurde nicht das korrekte Board oder der korrekte COM-Port ausgewählt, dauert das vermeintliche Hochladen schon sehr lange, bis dann letztendlich die folgende Fehlermeldung in roter Schrift im unteren Teil der Entwicklungsumgebung erscheint:

Abb. 18: Die Arduino-Fehlermeldung
Der Zugriff auf den zuvor eingestellten COM5-Port ist nicht zu erreichen. Für weiterreichende Fehler gibt es von Arduino eine Troubleshooting-Seite, die unter der folgenden Internetadresse zu finden ist:

http://arduino.cc/en/pmwiki.php?n=Guide/Troubleshooting#toc1
Der richtige COM-Port

Wenn es Probleme mit der Auswahl des richtigen COM-Ports geben sollte, kannst du dir sehr einfach behelfen. Schau dir die Liste der angebotenen COM-Ports über den Menüpunkt Werkzeuge | Port an. Entferne nun das USB-Kabel vom Arduino-Board und sieh nach, welcher Port nicht mehr in der Liste vorhanden ist beziehungsweise stelle die Verbindung wieder her und achte darauf, welcher Port hinzugekommen ist. Die Arduino-Entwicklungsumgebung zeigt alle zur Verfügung stehenden Ports fast unmittelbar nach der erfolgten Änderung an.
Das sollte in deiner Arduino-Bastelwerkstatt vorhanden sein

Kommen wir zur Hardware, die durchgehend in allen Projekten meines Buches Verwendung findet. Damit die elektronischen Bauteile in geeigneter und beständiger Form mit dem Arduino-Board verbunden werden können, schlage ich zwei Dinge vor. Da ist zum einen das Breadboard – auch Steckbrett genannt –, auf das die Bauteile gesteckt werden. Des Weiteren benötigen wir natürlich zahlreiche Verbindungskabel, die für die elektrischen Verbindungen zwischen den einzelnen Komponenten notwendig sind. Dafür verwenden wir jedoch keine starren Kabel, sondern flexible Steckbrücken, die ohne große Mühe sowohl auf dem Breadboard als auch auf dem Arduino-Board platziert werden können:

Abb. 19: Verschiedene Breadboards und flexible Steckbrücken
Auf Abbildung 19 sehen wir zwei handliche Breadboards, die es in unterschiedlichen Größen, Formen und Farben gibt. Ich empfehle, ein oder mehrere Breadboards in unterschiedlichen Größen zu kaufen, denn sie sind wirklich erschwinglich. Gib im Zweifelsfall lieber etwas mehr Geld für ein Breadboard aus, es lohnt sich. Die flexiblen Steckbrücken – auch Patchkabel genannt – kosten ebenfalls nicht die Welt. Es gibt auch sehr schöne Varianten mit der Kombination eines Arduino-Boards und einem Breadboard auf einer festen Unterlage als Kombination wie auf Abbildung 20. Dadurch sind das Arduino-Board und das Breadboard immer an einem Ort vorhanden, das stellt eine gewisse Erleichterung des Schaltungsaufbaus dar. Übrigens: Auf Abbildung 20 ist ein Arduino Uno zu sehen, der als Klon angeboten wird und um einiges günstiger ist als das originale Board. Klone sind Nachbauten von anderen Firmen. Und da der Arduino Uno unter einer Open-Source-Hardwarelizenz veröffentlicht wurde, steht es jedem frei, das Board nachzubauen und zu verändern. Es muss nicht immer original sein, denn Open Source ermöglicht auch derartige Boards.

Abb. 20: Arduino-Board und Breadboard als Kombination
Eine sehr elegante Lösung stellt die Verwendung eines selbst hergestellten Boards dar, das ich Arduino Discoveryboard genannt habe. Ich stelle das Board ausführlicher in Kapitel 4 vor und zeige, wie du es selbst bauen kannst. Das Arduino Discoveryboard erspart dir viel Arbeit, die ansonsten für den Aufbau der Bastelprojekte drauf geht. Aber wie gesagt: Kannst du so machen, musst du aber nicht.
Zusätzlich ist ein Vielfachmessgerät – auch kurz Multimeter – sehr sinnvoll, denn es können damit Spannungen, Strom, Widerstände oder einfach nur elektrische Verbindungen gemessen und überprüft werden.
Es gibt natürlich noch weitere sehr interessante Messgeräte, auf die ich in den Bastelprojekten noch eingehen werde. Das bisher Gezeigte stellt ein Muss an Gerätschaften und Materialien dar, was wirklich nicht viel ist und was jeder Bastler immer parat haben sollte. Das Multimeter ist ein Instrument, das bei der Fehlersuche ein nicht mehr wegzudenkendes Hilfsmittel darstellt. Sei es beim Messen von Spannungen beziehungsweise Strömen, als Durchgangsprüfer oder zur Ermittlung eines Widerstandes: Das Multimeter sollte immer in Reichweite liegen.

Abb. 21: Ein Vielfachmessgerät – Multimeter
Wie deine Idee in den Mikrocontroller kommt
Wir haben in diesem Kapitel gesehen, wie die Software für die Entwicklung eines Programms installiert wurde und wie ein sogenannter Sketch dann nach der Eingabe in die Arduino-Entwicklungsumgebung zum Mikrocontroller übertragen wird. Hinter dieser Prozedur steckt jedoch ein bisschen mehr, als man vielleicht auf den ersten Blick vermuten wird. Sehen wir uns die einzelnen Schritte im Detail an.

Abb. 22: Der Weg von der Idee zur Umsetzung
Zu Beginn steht natürlich immer eine Idee, die in deinem Gehirn entstanden und gereift ist. Natürlich kann der Mikrocontroller keine Gedanken lesen, so dass wir uns einiger Hilfsmittel bedienen müssen. In einem Texteditor, der Bestandteil der Arduino-Entwicklungsumgebung ist, werden unsere Gedanken hinsichtlich der auszuführenden Aktionen mithilfe von Befehlen aus einem Sprachvorrat definiert. Dieser Sprachvorrat enthält Elemente der Programmiersprache C++. Diese werden über einen Compiler (AVR-GCC), der eine Übersetzungsinstanz darstellt, in eine für den Mikrocontroller verständliche Sprache, Maschinensprache genannt, überführt. Die Übertragung dieser Maschinensprache wird von einem Programm mit dem Namen Avrdude übernommen. Dieses Kommandozeilen-Tool dient der Übertragung von Code auf den ATmega328-Mikrocontroller, der auf dem Arudino-Board verbaut wurde.
In diesem Kapitel hast du die Softwarewerkzeuge kennengelernt, die du beherrschen musst, um das Arduino-Board programmieren zu können, entweder webbasiert über den Browser oder als Standalone-Anwendung auf deinem Computer zu Hause. Ich habe gezeigt, wie du das Board an den Computer anschließt und wie sofort ein vorinstallierter Sketch eine eingebaute LED zum Blinken bringt. Mit Änderungen am Code kannst du den Blinkrhythmus nach deinen Wünschen ändern. Für den Fall, dass etwas mit dem Verbinden von Computer und Arduino nicht klappen sollte, habe ich einige typische Fehlerquellen aufgeführt.
Im folgenden Kapitel 3 geht es wieder sehr in die Tiefe: Du erfährst Grundlegendes über die Programmierung.
Kapitel 3:
Keine Angst vorm Programmieren – Coding Basics
Im vorherigen Kapitel 2 über die Arduino-Software hast du schon einiges über die Programmierung erfahren. Ich habe dir das erste Programm gezeigt, das im Arduino-Umfeld Sketch genannt wird. Doch was Programmieren wirklich bedeutet, habe ich noch nicht vertiefend dargestellt. Deshalb mache ich dich in diesem Kapitel mit Grundbegriffen der Programmierung vertraut: Algorithmus, Variablen, Konstanten und verschiedene Datentypen. Und als würde das nicht ausreichen, schiebe ich noch Erläuterungen nach über Kontrollstrukturen und Funktionen. Am Ende dieses Kapitels solltest du eine Ahnung davon haben, auf welcher Klaviatur eigentlich gespielt wird, wenn man ein Computerprogramm schreiben möchte.
Dieses Kapitel führt dich in die Programmiersprache C++ ein, allerdings nur in die Basics. C++ ist die Programmiersprache, in der die Arduino-Sketche erstellt werden. Wenn du Lust hast, dich in diese Sprache zu vertiefen oder später mal etwas nachschlagen möchtest, dann habe ich hier drei gute Online-Tutorials für dich:

https://www.c-howto.de/
http://www.c-programmieren.com/C-Lernen.html
https://www.tutorialspoint.com/cprogramming/
Klar ist, dass für die Programmierung eine Maschine benötigt wird, sei es ein PC oder ein Mikrocontroller wie das Arduino-Board. Klar sollte auch sein, dass ein derartiges Gerät keine eigene Intelligenz besitzt. Es ist ohne Befehle durch ein Programm nichts weiter als ein Stück nutzloser Hardware, das höchstens Strom verbraucht. Hardware und Software leben somit in einer Symbiose, denn keiner kann ohne den anderen auskommen. Erst die Programme »sagen« der Hardware, was sie tun soll. Und der Programmierer sagt der Software, was sie der Hardware sagen soll.
Was ist ein Programm beziehungsweise ein Sketch?
Bei der Programmierung haben wir es in der Regel mit zwei Bausteinen zu tun.
Programmierbaustein 1: Der Algorithmus
Der Sketch soll eigenständig eine bestimmte Aufgabe erledigen. Aus diesem Grund wird ein sogenannter Algorithmus erstellt, der eine Sammlung von Einzelschritten beinhaltet, die für ein erfolgreiches Ergebnis erforderlich sind.
Was ist ein Algorithmus?

Ein Algorithmus ist eine Handlungsvorschrift zur Lösung eines Problems und besteht aus endlich vielen Einzelschritten, die in einer gewissen Reihenfolge abgearbeitet werden.
Ein Algorithmus ist eine Rechenvorschrift, die wie ein Checkliste abgearbeitet wird. Stell dir vor, du möchtest eine kleine Holzkiste bauen, um dein Arduino-Board darin unterzubringen, damit alles etwas schöner und aufgeräumter aussieht und es auch deinen Freunden gefällt. Du kaufst dann ja auch nicht einfach Holz und baust drauf los in der Hoffnung, dass alles nachher auch irgendwie zusammenpasst. Es muss also ein Plan her, der zum Beispiel folgende Punkte beinhaltet:
Was sind die Maße der Kiste?
Welche Farbe soll sie haben?
An welchen Stellen müssen Öffnungen gebohrt werden, damit zum Beispiel Schalter oder Lampen platziert werden können?
Wenn du das Material besorgt hast, folgt die eigentliche Arbeit, die in einer ganz bestimmten Reihenfolge erledigt wird:
Holzplatten fixieren.
Holzplatten auf entsprechende Maße zuschneiden.
Kanten mit Schmirgelpapier bearbeiten.
Einige Holzplatten mit Löchern versehen, damit die Anschlüsse angebracht werden können.
Holzplatten zusammenschrauben.
Kiste lackieren.
Arduino-Board einbauen und mit Schalter bzw. Lampe verkabeln.
Es sind viele Einzelschritte nötig, um das gewünschte Ergebnis zu erreichen. Genauso verhält es sich beim Algorithmus.
Programmierbaustein 2: Die Daten
Sicherlich hast du die Maße der Kiste sorgfältig auf dem Plan vermerkt, damit du während des Baus immer mal wieder einen Blick darauf werfen kannst. Es soll ja später alles gut zusammenpassen. Diese Maße sind vergleichbar mit den Daten eines Sketches. Der Algorithmus nutzt zur Abarbeitung seiner Einzelschritte temporäre Werte, die ihm für seine Arbeit hilfreich sind. Dazu verwendet er eine Technik, die es ihm ermöglicht, Werte abzuspeichern und später wieder abzurufen. Die Daten werden in sogenannten Variablen oder Konstanten im Speicher abgelegt und sind dort jederzeit verfügbar. Doch dazu später mehr.
Was sind Daten?

Im Allgemeinen werden erfasste Informationen oder gemessene Werte als Daten bezeichnet. Diese können in Textform oder als numerische Werte vorliegen.
Was bedeutet Datenverarbeitung?
Unter Datenverarbeitung versteht man das Anwenden eines Algorithmus, der unter Zuhilfenahme von Daten diese abruft, über unterschiedliche Berechnungen verändert und später wieder ausgibt. Dieses Prinzip wird EVA genannt.
Eingabe
Verarbeitung
Ausgabe

Abb. 1: Das EVA-Prinzip
Was sind Variablen?
Ich hatte schon kurz erwähnt, dass Daten in Variablen abgespeichert werden. Sie spielen in der Programmierung eine zentrale Rolle und werden in der Datenverarbeitung genutzt, um Informationen jeglicher Art zu speichern.
Was ist eine Variable?

In der Programmierung ist eine Variable ein Platzhalter für eine Größe, auf die im Verlauf eines Rechenprozesses zugegriffen werden kann und die im Speicher vorgehalten wird.
Eine Variable belegt innerhalb des Speichers einen bestimmten Platz und hält ihn frei. Der Computer oder Mikrocontroller verwaltet diesen (Arbeits-)Speicher mit seinen eigenen Methoden. All dies erfolgt mittels kryptischer Bezeichnungen, die man sich als Mensch schlecht merken kann. Aus diesem Grund kannst du Variablen mit aussagekräftigen Namen versehen, die intern auf die eigentlichen Speicheradressen verweisen.
In Abbildung 2 siehst du, dass die Variable mit dem Namen ledPin auf eine Startadresse im Arbeitsspeicher zeigt. Du kannst sie auch als eine Art Referenz betrachten, die auf etwas Bestimmtes verweist. In Kapitel 2 habe ich einen kurzen Sketch präsentiert, der unter anderem die folgende Codezeile beinhaltet:
int ledPin = 13; // Variable mit Pin 13 deklarieren + initialisieren
Hier siehst du die Verwendung einer Variablen mit dem Namen ledPin, der der numerische Wert 13 zugewiesen wurde. Später im Sketch wird diese Variable ausgewertet und weiter verwendet. Das Wörtchen int ist eine Abkürzung für das Wort Integer. Integer ist ein Datentyp und wird in der Datenverarbeitung dazu verwendet, um Ganzzahlen zu kennzeichnen, womit wir schon beim nächsten Thema wären.

Abb. 2: Die Variable ledPin zeigt auf einen Speicherbereich im Arbeitsspeicher.
Was sind Konstanten?
Irgendwo im Internet habe ich mal gelesen, dass eine konstante Variable eine Variable ist, deren Wert nach der Initialisierung nicht mehr geändert werden kann. Lies diesen Satz zweimal und bedenke, dass Folgendes gilt:
konstant: nicht veränderlich, beständig gleichbleibend.
variabel: veränderbar, nicht auf eine Möglichkeit beschränkt.
Deswegen stellt der erste Satz einen Widerspruch in sich dar. Wer denkt sich so etwas aus? Jedenfalls stimmt der zweite Teil, dass eine Konstante nach der Initialisierung zur Laufzeit des Programms nicht mehr geändert werden kann. Eine Konstante wird mit dem Schlüsselwort const für konstant gekennzeichnet.
const int a = 17;
Folgende Codezeilen wären demnach nicht zulässig und führen zu einer Fehlermeldung, da der Inhalt einer Konstante nicht mehr geändert werden darf:
const int a = 17; // Konstante void setup() { a = 18; // Nicht zulässig! } ...
Die Datentypen
Wir sollten uns nun ein wenig mit den unterschiedlichen Datentypen und der Frage, was ein Datentyp überhaupt ist und warum es so viele unterschiedliche davon gibt, beschäftigen. Der Mikrocontroller verwaltet seine Sketche und Daten in seinem Speicher. Dieser Speicher ist ein strukturierter Bereich, der über Adressen verwaltet wird und Informationen aufnimmt oder abgibt, wobei Informationen in Form von Einsen und Nullen gespeichert werden.
Was ist ein Datentyp?

Ein Datentyp beschreibt eine bestimmte Menge von Datenobjekten (Variablen), die allesamt die gleiche Struktur haben. Jede Variable muss dabei einen bestimmten Datentyp haben.