Von außen betrachtet verhält sich der Mikrocontroller wie eine Burg mit zahlreichen Türen. Jede Tür kann grundsätzlich als Eingang oder als Ausgang dienen. Zur optimalen Verkehrssteuerung ist es sinnvoll, Ein- und Ausgänge zu trennen. Bei den alten Burgen war das vielleicht noch nicht üblich, bei den Mikroprozessoren schon: ein Ausgang kann nicht als Eingang benutzt werden – und umgekehrt.
🖳µC.1 Türen und Tore.
Die seitlichen Türen dienen entweder als Ein- oder als Ausgang. Das Hauptportal dient zur Versorgung, vergleichbar mit der Spannungsversorgung beim Arduino.
Welche Tür Ein- oder Ausgang ist, wird in dem Sketch genannten Programm bestimmt. In der Welt der Mikrocontroller ist nicht nur alles streng geregelt, sondern auch in Sein oder Nichtsein unterteilt. Entweder du bist oder du bist nicht. Die Lampe leuchtet oder nicht. Das sind alles die gleichen Aussagen: ein Mikrocontroller (wie ein Computer) kann nur zwischen 0 und 1 unterscheiden. Diese beiden Zustände werden durch eine elektrische Spannung ausgedrückt:
Ein Ausgang stellt eine Spannung von ca. 5 V oder 0 V zur Verfügung, je nach Sketch. Ein Eingang erwartet eine Spannung von 5 V oder 0 V, ebenfalls abhängig von dem Sketch. Ein Strom fließt jeweils, wenn der Stromkreis geschlossen ist.
In der realen Welt ist nicht alles 0 und 1, aber fast alles kann in Nullen und Einsen ausgedrückt werden. Dazu sind entsprechend viele davon erforderlich, die zu Gruppen (z. B. 8 Stück nebeneinander) zusammengefasst werden. Wenn etwas nur den Zustand 0 oder 1 annehmen kann, wird es als Bit bezeichnet. 8 Bit als Gruppe ergibt ein Byte. Unsere alphanumerischen Zeichen (Buchstaben a-z, Sonderzeichen und Ziffern) werden jeweils durch ein Byte ausgedrückt. Das Byte 0000 0101 entspricht der Ziffer 5 in unserem Dezimalzahlensystem. Wenn du alle möglichen Kombinationen von 0-en und 1-en in einem Byte erstellst, erhältst du 256. Platz genug für unsere überschaubare Anzahl an Zeichen.
Ein Computer verarbeitet nicht nur alphanumerischen Zeichen, sondern allgemein Daten. Schneller ist besser. Deswegen benötigt ein Computer viele Türen, die aktuellen Modelle haben 64 davon. Ein Mikrocontroller ist die Sparversion des Computers, er hat weniger Türen. Das Prinzip ist das gleiche. Die Türen des Mikrocontrollers werden als Ports bezeichnet.
Der Arduino Uno kann die ↷ Ports D0 bis D13 entweder als digitalen Ein- oder Ausgang verwenden. Die Definition der Ports erfolgt in dem verwendeten Sketch.
In dem Sketch Ausgaenge.ino dienen D0 und D13 als Ausgänge.
Der Schaltplan zeigt eine reduzierte Darstellung dessen, was wir gerade benötigen. Es geht an dieser Stelle nicht darum, den Mikrocontroller detailgetreu abzubilden, sondern nur um Funktionsweisen. Also wer macht was?
🖳AU.4 Digitale Ports.
D0 bis D13 sind mögliche digitale Ausgänge, also insgesamt 14.
Bauteile:
Die Spannungsversorgung des Arduino stammt aus dem USB-Anschluss. Ohne USB-Verbindung ist für den Betrieb des Arduino eine externe Gleichspannung erforderlich, z. B. in Form eines 9 V Steckernetzteils.
Ausgaenge.ino
int iPin1 = 13; // Pin definieren void setup() { // Initialisierung pinMode(iPin1, OUTPUT); // Pin als Ausgang } void loop() { // Endlosschleife digitalWrite(iPin1, HIGH); // Pegel auf 1 setzen delay(2000); // Zeitverzögerung 2 Sekunden = 2000 ms digitalWrite(iPin1, LOW); // Pegel auf 0 setzen delay(3000); // Zeitverzögerung 3 Sekunden = 3000 ms }
Funktionsweise
Programm, Sketch und Code sind verschiedene Worte für die gleiche Sache. ↷ Sketch ist der von den Arduino Schöpfern gewählte Begriff für ein Programm.
Der Sketch ist in ↷ Anweisungen und ↷ Kommentare unterteilt.
Der dreiteilige Programmaufbau ist typisch für die Arduino-Familie: Definition (Wer ist dabei?), Initialisierung (Was macht wer?) und Ausführung (Wie wird es gemacht?). Das Programm läuft nach dem Start vom Anfang bis zum Ende und dann wieder von vorne, also in einer Schleife. Wie jede gesprochene Sprache kennt eine Programmiersprache eine Anzahl an Wörtern mit fester Bedeutung sowie Regeln für den Satzaufbau. In einer Programmiersprache werden Wörter als ↷ Schlüsselwörter und Sätze als ↷ Anweisungen bezeichnet. Jede Anweisung wird mit einem Semikolon abgeschlossen.
int iPin1 = 13;
definiert den verwendeten Port. Darin ist int
das dafür vorgesehene Schlüsselwort, iPin1
ein frei wählbarer Name und 13
(ohne D) der zugewiesene Port.
void
und der ↷ Funktion² setup()
void setup() {}
sowie der zweiten Anweisung
pinMode(iPin1, OUTPUT);
zwischen den geschweiften Klammern {}
, die D13 als Ausgang bestimmt.
void
und der Funktion² loop()
void loop() {}
in einer Endlosschleife, ebenfalls mit den Anweisungen zwischen den geschweiften Klammern {}
.
digitalWrite(iPin1, HIGH);
setzt den Pegel von D13 auf HIGH. Dann liegen an diesem Ausgang knapp 5 V an, aber nur für 2 Sekunden.
delay(2000);
ist eine Zeitverzögerung, ausgedrückt in Millisekunden.
digitalWrite(iPin1, LOW);
setzt den Pegel auf LOW, also auf 0 V, aber nur für 3 Sekunden.
delay(3000);
Nach dieser Zeitverzögerung ist das Programm durchlaufen und startet von vorne.
Ändere in dem Sketch den Ausgang von 13
auf 0
.
Führe den Download auf deinen Arduino aus.
Die interne LED des Mikrocontrollers leuchtet ohne Unterbrechung.
Überprüfe mit einem Spannungsmessgerät den Pegel am Ausgang D0.
Die Spannung am Ausgang D0 beträgt ca. 4,7 V bei HIGH und 0 V bei LOW.
Programmcode zu lesen und zu verstehen ist gewöhnungsbedürftig. Ein gut strukturierter Code mit einem Namensschema für alle Programmteile erleichtert den Umgang und reduziert die Hemmschwelle, sich mit dem Code zu befassen.
Was für die redaktionellen Inhalte die Konventionen von tolaris sind, sind für die Codebeispiele die Programmierkonventionen.
Weiter ist unter den Profis ein Schema für die Abgrenzung von Codeteilen mit Einrückungen ungeschriebenes Gesetz, wie in dem Sketch Ausgaenge.ino verwendet.