Kitabı oku: «Mit Arduino die elektronische Welt entdecken», sayfa 7

Yazı tipi:

Fußgesteuerte Schleife‌

Die fußgesteuerte Schleife wird so genannt, weil die Kontrollinstanz im Schleifenfuß untergebracht ist.


Abb. 9: Grundsätzlicher Aufbau einer fußgesteuerten Schleife

Hierbei handelt es sich um eine do...while-Schleife‌. Da die Auswertung der Bedingung erst am Ende der Schleife stattfindet, können wir zunächst festhalten, dass sie mindestens einmal ausgeführt wird.


Abb. 10: Das Flussdiagramm einer do-while-Schleife

Diese Schleife wird recht selten Verwendung finden, doch der Vollständigkeit halber möchte ich sie dir nicht vorenthalten. Die Syntax gleicht der einer while-Schleife, wobei du erkennen kannst, dass die Kontrollinstanz am Fuß der Schleife untergebracht ist:

do { Serial.println(i); i = i - 1; } while(i > 1); // Kontrollinstanz

Diese unterschiedlichen Schleifenformen wirst du zukünftig verwenden, wenn du deine Sketche schreibst.

Sei kommunikativ und sprich darüber

Wenn man sich als Programmierer eines Problems annimmt und codiert, ist es sinnvoll, sich hier und da Notizen zu machen. Manchmal hat man einen Geistesblitz oder eine geniale Idee und ein paar Tage später – mir geht es jedenfalls öfter so – fällt es dann schwer, sich an die einzelnen Gedankengänge detailliert zu erinnern. Was habe ich da bloß programmiert und warum habe ich es so und nicht anders gemacht? Natürlich kann jeder Programmierer eigene Strategien für das Ablegen geeigneter Notizen entwickeln: Collegeblock, Rückseite von Werbeprospekten, Word-Dokumente und so weiter. Alle diese Methoden haben jedoch entscheidende Nachteile:

 Wo habe ich nur meine Notizen hingelegt?

 Sind sie auch auf dem neuesten und aktuellsten Stand?

 Jetzt kann ich nicht mal meine eigene Schrift lesen!

 Wie kann ich meine Notizen meinem Freund geben, der auch an meiner Programmierung interessiert ist?

Das Problem ist die Trennung von Programmiercode und Notizen, die dann keine Einheit bilden. Wenn die Notizen verloren gehen, wird es für dich unter Umständen schwierig, alles noch einmal zu rekonstruieren. Und jetzt stell dir deinen Freund vor, der absolut keine Ahnung hat, was du mit deinem Code erreichen wolltest. Da muss eine andere Lösung her: Du kannst innerhalb deines Codes Anmerkungen beziehungsweise Hinweise hinterlegen, und das genau an der Stelle, für die sie gerade relevant sind. So hast du alle Informationen genau da, wo sie benötigt werden.

Einzeiliger Kommentar‌

Schau dir das folgende Beispiel aus einem Programm an:

int ledPinRotAuto = 7; // Pin 7 steuert rote LED (Autoampel) int ledPinGelbAuto = 6; // Pin 6 steuert gelbe LED (Autoampel) int ledPinGruenAuto = 5; // Pin 5 steuert grüne LED (Autoampel) ...

Hier werden Variablen deklariert und mit einem Wert initialisiert. Zwar sind recht aussagekräftige Namen ausgewählt, doch ich denke, es ist sinnvoll, noch einige kurze ergänzende Anmerkungen anzuführen. Hinter der eigentlichen Befehlszeile wird ein Kommentar eingefügt, der durch zwei Schrägstriche‌ (Slashes) eingeleitet wird. Warum ist das notwendig? Ganz einfach: Der Compiler versucht, alle Befehle zu interpretieren und auszuführen. Nehmen wir einmal den ersten Kommentar:

Pin 7 steuert rote LED (Autoampel)

Es handelt sich um einzelne Elemente eines Satzes, die der Compiler jedoch nicht versteht, da es sich nicht um Anweisungen handelt. Es kommt bei dieser Schreibweise zu einem Fehler beim Kompilieren des Codes. Die beiden //‌ maskieren jetzt aber diese Zeile und teilen dem Compiler mit: Hey, Compiler, alles, was nach den beiden Schrägstrichen folgt, ist nicht für dich relevant, du kannst es getrost ignorieren. Es handelt sich um eine Gedankenstütze des Programmierers, der sich die einfachsten Sachen nicht über einen längeren Zeitraum (> 10 Minuten) merken kann. Sei etwas nachsichtig mit ihm! Mittels dieser Schreibweise wird ein einzeiliger Kommentar eingefügt.

Mehrzeiliger Kommentar‌

Wenn du über mehrere Zeilen etwas schreiben möchtest, beispielsweise etwas, das deinen Sketch in groben Zügen beschreibt, kann es lästig sein, vor jede Zeile zwei Schrägstriche zu positionieren. Aus diesem Grund gibt es die mehrzeilige Variante, die folgendermaßen aussieht:

/* Autor: Erik Bartmann Scope: Ampelsteuerung Datum: 10.12.2020 HP: https://erik-bartmann.de/ */

Dieser Kommentar hat eine einleitende Zeichenkombination /* und eine abschließende Zeichenkombination */. Alles, was sich zwischen diesen beiden Tags (ein Tag‌ ist eine Markierung, die zur Kennzeichnung von Daten benutzt wird, die eine spezielle Bedeutung haben) befindet, wird als Kommentar angesehen und vom Compiler ignoriert. Alle Kommentare werden von der Arduino-Entwicklungsumgebung mit der Farbe Grau versehen, um sie sofort kenntlich zu machen.

So, das also ist die Klaviatur, auf der zu zukünftig zu spielen hast, wenn du Sketche schreiben möchtest. In diesem Kapitel habe ich dir zugegebenermaßen ziemlich abstrakt vermittelt, welche Methoden zum Einsatz kommen, um einer Maschine eindeutig zu sagen, was sie tun soll. Du wirst das Gelesene nun in den Bastelprojekten anwenden. Dabei wächst dein Wissen durch den praktischen Einsatz dieser Methoden. Ich rate dir, ab und zu in diesem Kapitel noch einmal nachzuschlagen, um dein Wissen zu verinnerlichen.

Kapitel 4:
Das Arduino-Discoveryboard

Im vorherigen Kapitel hast du einiges nützliches grundlegendes Wissen über das Programmieren erfahren, die dir später beim Umsetzen deiner Ideen sicherlich helfen wird. In diesem Kapitel möchte ich dir eine praktische Möglichkeit vorstellen, immer wieder benötigte elektrische wie elektronische Bauteile auf einer Platine unterzubringen, die du später für deine Bastelprojekte und Arduino-Projekte gut gebrauchen kannst. Diese Platine ist kein Muss, stellt jedoch in bestimmten Situationen eine Erleichterung für den Aufbau elektronischer Schaltungen dar.

Solltest du bisher noch nicht viel Erfahrung mit dem Löten haben, dann empfehle ich dir, zunächst mit einfachen Bastelprojekten aus diesem Buch zu starten, dort einige Erfahrungen beim Löten und beim Zusammenbauen elektrischer und elektronischer Bauteile zu sammeln und dann später das Arduino-Discoveryboard zu bauen. Es bedeutet zunächst einige Arbeit, erspart dir später aber viele Stunden, weil du nicht immer wieder neu Bauteile zusammenbauen musst.

Das Arduino-Discoveryboard

In der folgenden Abbildung zeige ich dir schon einmal die fertige Platine, die ich dir in diesem Kapitel vorstellen möchte und deren Bau ich ausführlich beschreiben werde. Sie zeigt mehrere Komponenten, die auf einer Lochrasterplatine‌ verlötet wurden, um schnellstmöglich und sicher verschiedene Bauteile verfügbar zu haben. Ich habe diese Platine Arduino-Discoveryboard‌ getauft.


Abb. 1: Das Arduino-Discoveryboard

Die Idee hatte ich, als ich zum x-ten Male mehrere Potentiometer zur Ansteuerung der analogen Eingänge des Arduino benötigte, um damit den Analog-Monitor zu realisieren. Jedes Mal musste ich für diverse Bastelprojekte die erforderlichen Potentiometer aus meiner Grabbelkiste suchen, sie an die Spannungsversorgung anschließen und die Schleiferkontakte dann endgültig mit den analogen Eingängen A0 bis A5 verbinden. Das stellt eigentlich kein größeres Problem dar, doch wenn man die ganze Sache zum wiederholten Male machen muss, ist das lästig. Wenn dann noch Taster oder Schalter hinzukommen, ist es komfortabel, alles an einem Platz zur Verfügung zu haben. Alles, was du dazu benötigest, sind eine ruhige Hand und die Bauteile, die ich gleich aufliste. Versuch nicht allzu verbissen, genau das Discoveryboard zu bauen, das ich hier vorstelle. Nimm es als Anregung, dein eigenes Discoveryboard zu entwerfen, eigene Anordnungen oder andere Bauteile auf einer Platine unterzubringen.

Was wir brauchen

Für das Arduino-Discoveryboard benötigen wir die folgenden Bauteile:


Tabelle 1: Bauteilliste
Bauteil Bild
Mikrotaster 3x (mit farbiger Kappe)
Widerstand 10KΩ 6x
Widerstand 330Ω 14x
Potentiometer 10KΩ 3x
LC-Display-I²C 1x
Bargraph z.B. Kingbright DC-10EWA 1x
2,4 cm (0,96 Zoll) OLED-Display, 128 x 64 Pixel, LCD-Treiber 1x
Buchsenleisten 64-polig (RM: 2.54) 3x
4-stellige Siebensegmentanzeige z.B. CL5641BH 1x
Breadboard-Mini 1x
Lochrasterplatine 160 x 100 (RM: 2.54) 1x
Gummifüße 4x

Der Schaltplan

Der Schaltplan ist wirklich eine einfache Sache und leicht zu verstehen.


Abb. 2: Der Discoveryboard-Schaltplan

Beim Verlöten auf der Platinenrückseite musst du eine sehr ruhige Hand haben, doch wenn ich das hinbekommen habe, schaffst du das auch. Da die Lötpunkte sehr dicht beieinanderliegen, ist es ratsam, eine Lötpumpe griffbereit zu haben. Es passiert sehr schnell, dass zwei benachbarte Punkte einen Schluss bekommen, wenn zu viel Lötzinn verwendet wird. Kein Drama, aber nervig. Es ist mir recht oft passiert.

Die Siebensegmentanzeige

Für die Anzeige wurde eine vierstellige Siebensegmentanzeige mit gemeinsamer Anode verwendet, die vom Typ CL5641BH ist, wobei natürlich auch andere Bauteile mit ähnlichen Spezifikationen verwendet werden können. Die Pinbelegung der Anzeige schaut wie folgt aus.

Wie diese Siebensegmentanzeige anzusteuern ist, wird in einem eigenen Bastelprojekt 17 natürlich genau beschrieben. Es ist im Schaltplan zu erkennen, dass alle Segmente der einzelnen Stellen zusammengeschaltet sind. Das würde natürlich bedeuten, dass alle Segmente auf allen Stellen gleichzeitig leuchten würden, was natürlich keinen Sinn macht. Der Knackpunkt ist die gezielte beziehungsweise intelligente Ansteuerung der einzelnen Anoden der Stellen Dig1 bis Dig 4. Diese Anode sind alle miteinander verbunden, was gemeinsame Anode genannt wird. Um nun aber jede einzelne Stelle separat mit unterschiedlichen Stellenwerten anzusteuern, kommt ein bestimmtes Verfahren zur Anwendung. Es wird also spannend!


Abb. 3: Die Pinbelegung der Anzeige CL5641BH

Besuch bitte regelmäßig meine Webseite. Ich stelle dort im Downloadbereich gelegentlich weitere Updates zum Arduino Discoveryboard rein.

Bastelprojekt 1:
Hallo Welt – das Blinken einer LED

In den meisten Büchern zum Erlernen einer Programmiersprache wird zu Anfang ein sogenanntes Hallo-Welt-Programm‌ präsentiert. Es soll einen Einblick in die Syntax der Programmiersprache bieten, indem es etwas recht Simples tut, und zwar nur den Text Hallo Welt auf dem Bildschirm ausgibt. Auf diese Weise kann ein Programmierer einen zeitsparenden Eindruck von der Programmiersprache und seiner Syntax gewinnen.

»Hallo Welt« wird geblinkt

Wie sieht ein Hallo-Welt-Programm bei dem Arduino aus? Der Arduino hat ja in seinem Urzustand kein Display, also kein Anzeigegerät, um sich dir mitzuteilen. Was also tun? Wenn eine Kommunikation nicht in schriftlicher Form möglich ist, dann vielleicht mittels optischer oder akustischer Signale. Wir entscheiden uns für die optische Variante, denn einen Signalgeber wie eine Leuchtdiode, auch LED genannt, können wir ohne allzu große Probleme an einen der digitalen Ausgänge klemmen und er erregt bestimmt Aufmerksamkeit. Ich war jedenfalls sehr beeindruckt, als es bei mir auf Anhieb funktioniert hat. Schauen wir uns zuerst die Bauteilliste an.

Was wir brauchen

Für dieses Bastelprojekt wird nicht viel benötigt und im Grunde genommen könnten wir auch ohne zusätzliche Bauteile auskommen, denn auf dem Arduino-Board befindet sich eine LED‌ mit der Bezeichnung L. Dennoch möchte ich dieses Bastelprojekt mit ein paar Komponenten anreichern, die auch in weiteren Projekten Verwendung finden.


Tabelle 1: Bauteilliste
Bauteil Bild
LED rot 1x
Widerstand 220Ω 1x

Bevor wir jedoch einen Blick auf das Arduino-Programm – oder auch Sketch genannt – werfen, sehen wir uns den Schaltplan‌ an. Ein Schaltplan ist übrigens eine grafische Darstellung einer elektronischen Schaltung, manche nennen das auch Schaltbild.

Der Schaltplan‌

Unsere Schaltung weist lediglich eine LED mit passendem Widerstand auf.

Die Anode der LED (das längere Beinchen) wird über den Widerstand mit 220Ω an Pin 13 verbunden und das andere Ende, bei dem es sich um die Kathode handelt (das kürzere Beinchen), mit der Masse (GND) des Arduino-Boards. Beim folgenden Schaltungsaufbau verwende ich erstmalig die Kombination aus Arduino-Board und Breadboard, die ich bereits in den Einführungskapiteln erwähnt habe (Kapitel 2). In späteren Bastelprojekten werde ich das Arduino Discoveryboard einsetzen, aber du kannst selbstverständlich alle Bastelprojekte auch auf einem ganz normalen Breadboard realisieren.


Abb. 1: Der Schaltplan

Der Schaltungsaufbau

Der Schaltungsaufbau auf einem Breadboard ist leicht nachvollziehbar und übersichtlich. Nachfolgend ist der Arduino Uno mit dem Breadboard zu sehen. Beide sind über Steckbrücken verbunden. An dem Breadboard habe ich die LED und den Widerstand platziert.


Abb. 2: Der Schaltungsaufbau auf einem kleinen Arduino-Combi-Board

Was ist bei der LED-Polung zu beachten?


Achte auf die korrekte Polung der LED‌, denn andernfalls können wir lediglich eine dunkle LED bewundern. Man läuft zwar mit einer falsch gepolten LED nicht Gefahr, etwas zu beschädigen, doch es sollte schon richtig gemacht werden.

Der Arduino-Sketch

Der Programmcode für unseren ersten Sketch bewirkt, dass er eine über einen Widerstand angeschlossene LED im Sekundentakt blinken lässt. Das Programm dafür sieht folgendermaßen aus:

int ledPin = 13; // Variable mit Pin 13 deklarieren + initialisieren void setup() { pinMode(ledPin, OUTPUT); // Digitaler Pin 13 als Ausgang } void loop() { digitalWrite(ledPin, HIGH); // LED auf High-Pegel (5V) delay(1000); // Eine Sekunde warten (1000ms) digitalWrite(ledPin, LOW); // LED auf LOW-Pegel (0V) delay(1000); // Eine Sekunde warten (1000ms) }

Ich empfehle dringend, den Code selbst abzutippen. Aus meiner Sicht hat das einen hohen Lerneffekt. So lernst du beispielsweise, immer ein Semikolon am Ende einer Befehlszeile zu setzen. Du bekommst ein besseres Gefühl für die Feinheiten der Programmierung, wenn du selbst die Codezeilen eingibst. Das gilt besonders für den Code in den ersten Bastelprojekten. Bei späteren Projekten wird der Code manchmal so umfangreich, dass eine Eingabe per Hand zu aufwändig wäre.

Der im Buch verwendete Code steht hier zum Download zur Verfügung:


https://erik-bartmann.de/?Downloads___Arduino

Der grundlegende Aufbau eines Arduino-Sketches


Jeder Arduino-Sketch hat den gleichen Aufbau. In der folgenden Abbildung 3 wird dieser Aufbau klar:


Abb. 3: Die grundlegende Struktur eines Sketches

Das ganze Programm ist – nach dem Start des Sketches – in drei Blöcke unterteilt, die du oben erkennen kannst. Die einzelnen Blöcke haben eine klar definierte Aufgabe in einem Sketch.

Grüner Block: Die Deklarierung und Initialisierung

In diesem ersten Block werden beispielsweise – falls notwendig – externe Bibliotheken über die #include-Anweisung eingebunden. Wie das funktioniert, wirst du in späteren Bastelprojekten erfahren. Des Weiteren ist hier der geeignete Platz zur Deklaration globaler Variablen, die innerhalb des kompletten Sketches sichtbar sind und verwendet werden können. Bei der Deklaration‌ wird festgelegt, welchem Datentyp die Variable zugeordnet sein soll. Bei der Initialisierung‌ hingegen wird die Variable mit einem Wert versehen.

Blauer Block: Die setup-Funktion

In der setup-Funktion werden meistens die einzelnen Pins des Mikrocontrollers programmiert. Es wird also festgelegt, welche der Pins als Ein- und Ausgänge arbeiten sollen. An manchen werden womöglich Sensoren wie Taster oder temperaturempfindliche Widerstände angeschlossen, die Signale von außen an einen entsprechenden Eingang leiten. Andere wiederum leiten Signale an Ausgänge weiter, um zum Beispiel einen Motor oder eine Leuchtdiode anzusteuern.

Oranger Block 3: Die loop-Funktion

Die loop-Funktion bildet eine Endlosschleife. In ihr ist die Logik untergebracht, beispielsweise werden kontinuierlich Sensoren abgefragt oder Motoren angesteuert. Beide Funktionen, also die setup- und die loop-Funktion, bilden zusammen einen Ausführungsblock, der im Code durch die geschweiften Klammerpaare {} gekennzeichnet wird. Sie dienen als Begrenzungselemente, damit erkennbar ist, wo die Funktionsdefinition beginnt und wo sie aufhört.

Die beiden Funktionen setup und loop müssen genau so heißen, denn beim Start des Sketches wird nach ihnen gesucht, weil sie als Einstiegspunkte dienen, um einen definierten Start zu gewährleisten. Woher sollte der Compiler wissen, welche Funktion nur einmal ausgeführt werden soll und welche kontinuierlich in einer Endlosschleife? Diese Namen sind also unerlässlich für jeden Sketch. Ihnen wird jeweils noch das Schlüsselwort void vorangestellt. Es zeigt an, dass die Funktion voraussichtlich keine Informationen an die Funktion zurückgibt, von der sie aufgerufen wurde.

Den Code verstehen

Zu Beginn deklarieren und initialisieren wir eine globale Variable namens ledPin, ihr weisen wir den Wert 13 zu. Mit dem Befehl int (int = Integer) bestimmen wir, dass es ein ganzzahliger Datentyp ist. Somit ist sie in allen Funktionen sichtbar und es kann darauf zugegriffen werden. Die Initialisierung ist gleichbedeutend mit einer Wertzuweisung‌ über den Zuweisungsoperator‌ =.‌ Die Deklaration und Initialisierung erfolgt hier in einer einzigen Zeile.


Die setup-Funktion wird einmalig zu Beginn des Sketch-Starts aufgerufen und der digitale Pin 13 als Ausgang programmiert. Sehen wir uns dazu noch einmal den Befehl pinMode‌ an.


Er nimmt zwei numerische Argumente auf, wobei der erste für den zu konfigurierenden Pin steht und der zweite bestimmt, ob sich der Pin wie ein Eingang oder Ausgang verhalten soll. Wir wollen ja eine LED anschließen, und deswegen benötigen wir einen Pin, der als Ausgang arbeitet. Die Datenflussrichtung des zweiten Argumentes wird über eine vordefinierte Konstante festgelegt. Hinter OUTPUT verbirgt sich der Wert 1.

Ebenso verhält es sich mit dem Befehl digitalWrite, der ebenfalls zwei Argumente entgegennimmt.


Hier haben wir ebenfalls eine Konstante mit dem Namen HIGH‌, die als Argument bewirken soll, dass ein HIGH-Pegel an Pin 13 anliegt. Dahinter verbirgt sich der numerische Wert 1. In der folgenden Tabelle findest du die entsprechenden Werte:


Tabelle 2: Konstanten und ihre Werte
Konstante Wert Erklärung
INPUT‌ 0 Konstante für den Befehl pinMode (programmiert Pin als Eingang)
OUTPUT‌ 1 Konstante für den Befehl pinMode (programmiert Pin als Ausgang)
LOW‌ 0 Konstante für den Befehl digitalWrite (setzt Pin auf LOW-Level)
HIGH‌ 1 Konstante für den Befehl digitalWrite (setzt Pin auf HIGH-Level)

Der Befehl delay‌ im Sketch ist für die Zeitverzögerung‌ zuständig. Er unterbricht die Sketch-Ausführung für einen entsprechenden Zeitraum, wobei der übergebene Wert diese Zeitdauer in Millisekunden (ms) angibt.


Der Wert 1000 besagt, dass genau 1000ms, also eine Sekunde, gewartet wird, bis es schließlich weitergeht.

Die einzelnen Arbeitsschritte der Endlosschleife, die durch den void loop-Befehl ausgelöst wurde, sind:

1 LED an Pin 13 anschalten,

2 Warte 1 Sekunde,

3 LED an Pin 13 ausschalten,

4 Warte 1 Sekunde,

5 Geh wieder zu Punkt 1.

₺1.422,67

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
1504 s. 1241 illüstrasyon
ISBN:
9783946496298
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi: