Arduino® » Funktionen erstellen und programmieren
Veröffentlicht: 22.11.2021 | Lesedauer: 10 Minuten
In unserem Ratgeber zum Thema Arduino® haben wir bereits umfangreiche Informationen zu den vielseitig einsetzbaren Mikrocontrollern zusammengestellt. Um dabei auch die grundsätzliche Funktion der Arduino Controller, die erforderliche Außenbeschaltung und natürlich auch die Programmierung zu erklären, wurde ein einfaches Lauflicht mit 10 LEDs aufgebaut.
Wir haben dabei bewusst die Anzahl der Bauteile so gering wie nötig und den Programmcode (Sketch) bzw. die Programmierung so einfach wie möglich gehalten. Deshalb wurden im gezeigten Beispiel lediglich die erforderlichen Ausgänge beschaltet. Die Beeinflussung der Lauflichtgeschwindigkeit erfolgte durch die Delay-Einträge im Sketch. Um aber auch den einen oder anderen Eingang nutzen zu können, haben wir uns entschlossen, die Funktion der Lauflichtschaltung als auch den Programmiercode bzw. Code etwas auszubauen. Dabei werden wir weitere nützliche Funktionen der Arduino Controller und der Steuersoftware anzusprechen, die wir bis jetzt noch nicht erwähnt haben.
Der große Vorteil bei den Arduino-Controllern ist ja, dass sich die Ausgänge durch die Eingänge beeinflussen lassen. Deshalb möchten wir zeigen, wie ein 10 Kanal-Lauflicht mit weiteren Bedienelementen gesteuert werden kann. Den nachfolgend gezeigten Schaltungsaufbau mit den LEDs an den Ausgängen, als auch die Codes im Sketch haben wir in unserem Arduino-Ratgeber bereits ausführlich erklärt.
Nach dem Einschalten der Betriebsspannung startet das Lauflicht selbsttätig und läuft so lange, bis die Spannung wieder abgeschaltet wird.
Schaltungsaufbau und Sketch für das 10 Kanal Lauflicht
Geplant war, die Funktion des Lauflichtes so zu ändern, dass die Lauflichtgeschwindigkeit per Drehregler eingestellt werden kann. Zudem soll das Lauflicht erst auf Tastendruck gestartet werden. Dazu sind die Codes im Sketch entsprechend anzupassen. Doch bevor das geschieht, muss zunächst die Hardware für die neuen Funktionen erweitert werden.
Um die Geschwindigkeit des Lauflichtes zu verändern, wird ein einstellbarer Drehwiderstand mit 50 kΩ benötigt. Drehwiderstände werden auch als Potentiometer oder kurz Poti (P) bezeichnet. Einer der beiden äußeren Anschlüsse des Potis wird mit der Betriebsspannung (rote Leitung mit +5 V) und der andere mit GND (blaue Leitung) verbunden.
Der Schleifer des Potis wird danach mit einem analogen Eingang verbunden. Im gezeigten Beispiel haben wir den Eingang A1 verwendet.
Es kann aber jeder andere analoge Eingang genutzt werden, der dann als Code im Sketch eingetragen werden muss. Je nach Stellung des Potis hat die Spannung am Eingang A1 dann einen Wert zwischen 0 und 5 V. Da der analoge Eingang eine 10-Bit Auflösung aufweist, wird die Spannung später in 1024 Schritte (0 – 1023) mit je 4,88 mV unterteilt.
Zusätzlich soll das Lauflicht noch durch einen Taster (T) beeinflussbar sein. Dazu wird ein Widerstand (R) mit 10 kΩ mit der Betriebsspannung verbunden. Die andere Seite des Widerstandes wird mit einem Taster mit Schließfunktion gegen Masse (GND) geschaltet. Zwischen dem Widerstand und dem Taster wird eine Leitung angeschlossen und ebenfalls zu einem analogen Eingang geführt. Für den Taster in unserem Beispiel haben wir den Eingang A2 gewählt.
Wird der Taster nicht betätigt, liegt am Eingang A2 die Betriebsspannung in Höhe von 5 V an. Bei der späteren Programmierung entspricht das dem Pegel „HIGH“. Wird der Taster betätigt, springt die Spannung auf 0 V, was dem "Pegel LOW" entspricht. Die Erweiterung der Hardware wäre mit diesem Ausbau soweit abgeschlossen. Damit aber die beiden analogen Eingänge A1 und A2 das Lauflicht beeinflussen können, müssen auch die Codes im Steuerprogramm entsprechend angepasst werden.
Die Montage der zusätzlichen Bauteile kann, ebenso wie bei den LEDs, auf einer Steckplatine erfolgen.
Ebenso wie in der ersten Zeile des Sketches Ausgänge für die LEDs definiert wurden, muss auch der Eingang für das Poti festgelegt werden. Dies geschieht über die Eingabe
int Poti = A1;
int steht dabei für den Datentyp Integer, der ganzzahlige Werte verarbeitet. In der
zweiten Zeile wird mit der Anweisung
int Potiwert = 0;
ein fiktiver Potiwert mit Null vorgegeben, damit bereits ein Wert vorhanden ist, noch bevor in der Loop-Schleife die momentane Stellung des Potis ausgelesen wird.
In der Loop Schleife wird mit der Eingabe:
Potiwert=analogRead(Poti);
die momentane Stellung des Potis abgefragt und gespeichert. Das Lauflicht startet nun und die erste Leuchtdiode wird eingeschaltet. Durch die Anweisung
delay(Potiwert);
wird die Leuchtdauer aller 10 LEDs beim Hinlauf durch den abgefragten und gespeicherten Potiwert bestimmt.
Wenn nach dem Ausschalten einer LED gleich die nächste LED leuchten soll, kann bei der Delay-Einstellung für die ausgeschaltete LED der Wert Null vorgegeben werden. Dieser Loop Eintrag ist ganz oben im Sketch zum Lauflicht ohne Erweiterung noch zu finden. Allerdings ist dieser Eintrag nicht zwingend erforderlich und diente lediglich zum besseren Verständnis der Lauflichtschleife. Die Code-Zeile kann deshalb im Loop ersatzlos weggelassen werden.
Für den Rücklauf, also den zweiten Teil des Loops, kann so wie beim Hinlauf der der Potiwert eingetragen oder ein fester Wert vorgegeben werden. Wird im Sketch beim Loop für den Rücklauf ein Delay-Wert eingestellt, ergibt sich die Möglichkeit, den Hinlauf langsam und den Rücklauf schneller oder auch umgekehrt zu gestalten.
Wichtig:
Die aktuelle Stellung des Potis wird durch den Anweisung
Potiwert=analogRead(Poti);
ausgelesen. Eine Verstellung während eines langsamen Hinlaufes wirkt sich demzufolge erst dann aus, wenn der Hin- und Rücklauf abgeschlossen sind und die Loop Schleife erneut beginnt. Erst dann wird der Analogwert am Eingang A1 ausgelesen und berücksichtigt.
Für manche Anwendungen oder Funktionen kann es erforderlich werden, elektrische Werte auszulesen und anzuzeigen. Dafür bietet die IDE-Software einen seriellen Monitor mit Print- und Plotter-Funktion. So können aktuelle Werte ausgelesen und auf unterschiedliche Weise angezeigt werden. Sollte der Arduino zum Beispiel zusammen mit einem geeigneten Temperatursensor die Funktion eines Thermometers übernehmen, können mit Hilfe der Codes im Sketch die Temperaturen direkt angezeigt werden. Bei unserem Lauflicht können wir die Stellung bzw. den Wert des Poti-Schleifers am Eingang A1 auslesen und anzeigen lassen.
Die serielle Kommunikation wird im Setup-Bereich mit der Funktion
Serial.beginn(115200);
gestartet. Mit dem Parameter 115200 wurde die Übertragungsgeschwindigkeit (Boud-Rate) definiert.
Bevor das Lauflicht startet, wird in der Loop Schleife zunächst mit dem Befehl
Serial.print(Potiwert);
die momentane Stellung des Potis ausgelesen.
Die nachfolgende Zeile
Serial.println();
dient einfach nur dazu, dass jeder gelesene Wert in eine neue Zeile eingetragen wird.
Beide Zeilen könnten im Code zu
Serial.println(Potiwert);
zusammengefasst werden.
Der Serial Monitor und der Serial Plotter sind unter dem Menüpunkt "Werkzeuge" in der IDE-Software zu finden. Wenn diese Funktionen aufgerufen werden, zeigt der Serial Monitor die Stellung des Potis mit Zahlen zwischen 0 und 1023 an. Je geringer die Spannung am Eingang A1 ist, desto schneller ist das Lauflicht und desto kleiner ist die Zahl im Serial Monitor. Wird anstelle des seriellen Monitors der Plotter aufgerufen, wird eine Kennlinie geschrieben. Die Skalierung erfolgt automatisch.
Hinweis:
Jedes Mal, wenn die Daten des Potis ausgelesen und zum Computer übertragen werden, leuchtet kurz die LED TX am Arduino-Bord. Die Übertragung funktioniert aber nicht nur in einer Richtung. Bei Bedarf können auch Daten oder Texte vom Serial Monitor zum Arduino bzw. an ein am Arduino angeschlossenes Display gesendet werden.
Im nächsten Schritt sollte die regelbare Lauflichtfunktion erweitert werden. Geplant war, im Sketch eine Blinkfunktion vor das Lauflicht einzufügen und dort die Tasterfunktion zu integrieren.
In diesem Zusammenhang bietet es sich an, eine do…while-Schleife vor dem eigentlichen Lauflicht Loop einzubauen. Der Code in den geschweiften Klammern der do…while-Schleife wird mindestens einmal ausgeführt, da die Bedingung für eine Wiederholung oder Beendigung erst am Ende der Schleife in der Zeile "while" abgefragt wird.
In unserem Beispiel sollen die beiden äußeren LEDs des Lauflichtes blinken, solange der Taster nicht gedrückt wird. Erst wenn der Taster gedrückt wird, soll das Lauflicht einen Durchlauf starten.
Wie beim Poti muss auch für den Taster der analoge Eingang zugewiesen werden. Dies geschieht mit der Eingabe:
int Taster = A2
Die im Sketch dem Lauflicht vorgeschaltete do…while-Schleife sieht dann wie folgt aus:
do {
digitalWrite(LEDPins[0], HIGH);
digitalWrite(LEDPins[9], HIGH);
delay(50);
digitalWrite(LEDPins[0], LOW);
digitalWrite(LEDPins[9], LOW);
delay(1000);
} while (digitalRead(Taster) == HIGH);
Die Anweisungen in den geschweiften Klammern zwischen „do“ und „while“ werden dann ständig wiederholt, solange die Bedingung in der Zeile „while“ erfüllt ist.
Neben den LEDs (0 – 9) kann mit den Delay-Werten der Blinkrhythmus individuell eingestellt werden. In unserem Beispiel haben wir uns für kurze Blinkimpulse mit 50 Millisekunden Einschaltdauer und 1 Sekunde Pause entschieden.
Hinweis:
Der aktuelle Schaltzustand des Tastes wird erst am Ende der do…while-Schleife (Blink Loop) gelesen, wenn die beiden Blink-LEDs eine Sekunde lang ausgeschaltet waren. Demzufolge reicht eine kurze Tasterbetätigung unter Umständen nicht aus, um die Funktion des Blink-Loops zu beenden und das Lauflicht zu starten.
Überprüfen der Taster Funktion
Bei korrektem Code werden nach der Übertragung des Sketches zum Arduino Board nur die beiden äußeren LEDs blinken.
Wenn der Taster gedrückt wird, bevor die beiden Leds wieder kurz leuchten, beginnt ein Durchlauf des Lauflichtes mit einem Hin- und einem Rücklauf.
Anschließend blinken die äußeren LEDs wieder so lange, bis der Taster erneut betätigt oder die Betriebsspannung abgeschaltet wird.
Lauflicht mit manueller Beendigung
Wenn mehrere Durchläufe des Lauflichtes gewünscht werden, kann der Code für die Lauflichtfunktion ebenfalls in eine do…while-Schleife integriert werden.
Im gezeigten Beispiel wurde der Programmcode im Sketch so gewählt, dass zur Beendigung der Lauflicht Schleife ebenfalls die Betätigung des Tasters erforderlich wird.
Wenn der Rücklauf des Lauflichtes beendet ist und der Taster nicht gedrückt wurde, startet die Lauflicht Schleife erneut.
Die ständige Wiederholung der Lauflicht Schleife wird erst dann beendet, wenn am Ende Rücklaufes der Taster gedrückt ist.
Entsprechend dem Programmiercode wird im Sketch dann wieder nach oben in den Blink Loop gesprungen.
Die beiden äußeren LEDs blinken jetzt wieder so lange, bis der Taster erneut gedrückt wird.
Lauflicht mit automatischer Beendigung
Alternativ zur manuellen Beendigung des Lauflicht Loops besteht auch die Möglichkeit, für das Lauflicht eine frei wählbare Anzahl an Durchläufen (X) vorzugeben. Dazu muss zunächst der Integer für den X-Wert
int x = 0;
vorgegeben und dann bei jedem Lauflicht Loop um 1 erhöht
x = x + 1;
werden. In der Abbruchbedingung des Lauflicht Loops kann dann die gewünschte Zahl der Durchgänge
while (x < 4);
definiert werden.
In unserem Beispiel haben wir uns für vier Durchläufe entschieden. Es kann aber jede andere beliebige Zahl genutzt werden. Beim vierten Durchlauf hat X den Wert 4 erreicht und ist damit nicht mehr kleiner als 4.
Somit ist die Bedingung für den Abbruch des Lauflicht Loops erfüllt und der Programmcode spring wieder nach oben zum Blink Loop.
Im Blink Loop wird der Parameter X auf 0 gesetzt, damit, falls der Taster gedrückt wird, das Lauflicht die vorgegebene Anzahl an Durchläufen absolvieren kann.
Da nun der Sketch immer umfangreicher wird, ist es sinnvoll komplette Loops oder auch einzelene Zeilen des Codes zu beschriften. Dazu können nach zwei Schrägstrichen die erforderlichen Infos in den Sketch geschrieben werden (siehe blaue Markierungen). In unserem Beispiel wurden die Funktionen der beiden Loop Schleifen beschriftet. Dadurch wird der Sketch übersichtlicher und auch später sieht man sofort, welche Funktionen bzw. Anweisungen oder Parameter für den Arduino Mikrocontroller an welcher Stelle gespeichert sind.
Mit einem Arduino Mikrocontroller lassen sich die vielfältigsten Aufgaben und Funktionen durchführen. Dabei haben wir mit unserem Beispiel gerade einmal ein wenig an der Oberfläche der Möglichkeiten gekratzt. Wer tiefer in die Materie einsteigen möchte, findet im Internet viele weitere Beispiele mit allen dazugehörigen Codes, Sketches und Funktionen. Aber auch die Außenbeschaltung der Mikrocontroller ist meist sehr genau erklärt. Wer dann die ersten eigenen Funktionen geplant und den erforderlichen Sketch geschrieben hat, wird sehr schnell Freude am Programmieren finden. Und sollte es einmal irgendwo klemmen, finden sich in den unterschiedlichsten Foren viele gleichgesinnte Technikfans, die gerne weiterhelfen.