Material |
|
Aufgabe |
|
Schaltskizze und Schaltungsaufbau
In dieser Übung haben wir gesehen, dass sich eine LED durch unterschiedliches Verkabeln ein- und ausschalten lässt. Dazu musste die Verbindung zwischen LED und der Spannungsversorgung jeweils neu gesteckt werden.
In der folgenden Schaltung übergeben wir das mechanische Umstecken des Drahtes an den Arduino. Er soll elektronisch dafür sorgen, dass die LED ein- und ausgeschaltet wird und uns entlasten, jedesmal einen oder mehrere Drähte umstecken zu müssen. Wie das geht, zeigt die folgende Schaltung.
Etwas Hintergrundwissen zu Leuchtdioden findest du im Register BASIC Stamp (BS) im Kapitel über Leuchtdioden und im Register Propeller Kontroller im Kapitel Blinklichter.
Material |
|
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Programm LED_Blinker_01.ino
#define LED_Pin D13
int LED_Status = LOW;
void setup() {
pinMode(LED_Pin, OUTPUT);
}
void loop() {
if (LED_Status == LOW) {
LED_Status = HIGH;
} else {
LED_Status = LOW;
}
digitalWrite(LED_Pin, LED_Status);
delay(500);
}
Wie arbeitet Programm LED1.ino?
In der Methode setup() werden die Ein- und Ausgänge definiert; LED_Pin wird als Ausgang definiert.
LED_Pin entspricht in diesem Beispiel D13 (siehe erste Programmzeile), der die LED mit dem Arduino verbindet. Die define-Direktive mit vorangestelltem Hashtag (#) ended immer ohne Semikolon!
Die Methode loop() startet mit einer WENN-DANN-Schleife:
Ist der abgefragte LED_Status LOW, wird er auf HIGH gesetzt und umgekehrt. Der Befehl
digitalWrite(LED_Pin,LED_Status);
zieht Pin D13 entsprechend auf HIGH oder LOW und die angeschlossene LED leuchtet auf oder geht aus.
delay(500)
lässt den Arduino für 500ms verschnaufen, um anschließend die loop-Schleife erneut zu durchlaufen.
HIGH oder 1 und LOW oder 0
Statt HIGH im Argument des Befehls digitalWrite erkennt der Compiler auch das Schlüsselwort 1; statt LOW entsprechend 0. Probiere es aus.
Programm oder Sketch?
Beim Arduino werden Programme als Sketche bezeichnet. Ich schließe mich dieser Bezeichnung nicht an, um nicht neue Begriffe für Altbekanntes einzuführen. Das belastet nur unnötig.
Nach der Pinbelegung der fest verdrahteten LED (siehe dazu im Datenblatt des verwendeten Controllers) kann statt
in der Programmzeile 1 stehen.
// =========================================
// Benutzte Hardware: Arduino NANO ESP32
// =========================================
const int LED_Pin_1 = LED_BUILTIN;
const int LED_Pin_2 = D5;
int LED_Status_y = LOW;
int LED_Status_g = LOW;
unsigned long millis_alt_y = 0;
unsigned long millis_g_alt = 0;
const long delta_T_y = 500;
const long delta_T_g = 250;
void setup() {
pinMode(LED_Pin_1, OUTPUT);
pinMode(LED_Pin_2, OUTPUT);
}
void loop() {
unsigned long millis_y_neu = millis();
unsigned long millis_g_neu = millis();
if (millis_y_neu - millis_y_alt >= delta_T_y) {
millis_y_alt = millis_y_neu;
if (LED_Status_y == LOW) {
LED_Status_y = HIGH;
} else {
LED_Status_y = LOW;
}
digitalWrite(LED_Pin_1, LED_Status_y);
}
if (millis_g_neu - millis_g_alt >= delta_T_g) {
millis_g_alt = millis_g_neu;
if (LED_Status_g == LOW) {
LED_Status_g = HIGH;
} else {
LED_Status_g = LOW;
}
digitalWrite(LED_Pin_2, LED_Status_g);
}
}
Abb. 3c - Programm LED_Blinker_02.ino
Sollen zwei LEDs unterschiedlich schnell aufleuchten und in einem bestimmten Zeitverhältnis zueinander stehen, hilft die Funktion delay() nicht mehr weiter. Es gibt mindestens zwei Möglichkeiten, das Problem zu lösen.
Wie die Funktion millis() arbeitet und wie man sie einsetzt, erfährst du hier.
Material |
|
Aufgaben |
|
Pseudocode
Lege alle Ein- und Ausgabeports in der Methode setup() fest.
Alle Wiederholungsvorgänge platziere in der Methode loop().
Setze Pin 10 der LED auf 0
Setze Pin 11 der LED auf 1 (Durchlassrichtung für rote LED)
Pause von 2 Sekunden
Setze Pin 10 der LED auf 1
Setze Pin 11 der LED auf 0 (Durchlassrichtung für grüne LED)
Pause von 5 Sekunden
Setze Pin 10 der LED auf 0 (beide LED in Sperrichtung)
Material |
|
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Pseudocode
Bei der Programmentwicklung soll dir der Pseudocode eine Hilfe sein.
Lege alle Ein- und Ausgabeports in der Methode setup() fest.
Alle Wiederholungsvorgänge platziere in der Methode loop().
Setze Pin 10 der DUO-LED auf 0
Setze Pin 11 der DUO-LED auf 1
Pause von 3 Sekunden
Setze Pin 10 der DUO-LED auf 1
Setze Pin 11 der DUO-LED auf 0
Wiederhole 10 mal
Setze Pin 12 der LED gelb auf 1
Pause von 0,5 Sekunden
Setze Pin 12 der LED gelb auf 0
Pause von 0,5 Sekunden
Eine mögliche Programmumsetzung siehst du im folgenden Bild. Sie kann von deinem Programm abweichen. Hauptsache, die LEDs machen das, was von ihnen in der Aufgabenstellung verlangt wurde.
In den vorherigen Übungen waren die Ein- und Auszeiten der LED ziemlich lang und ihre jeweiligen Zeitanteile gleich lang.
Was passiert eigentlich, wenn Ein- und Ausschaltzeiten einer LED deutlich voneinander abweichen und diese Wechsel sehr schnell erfolgen? Das werden wir jetzt untersuchen. Bevor das geschieht, hast du vielleicht schon eine Vermutung?
In den beiden folgenden Darstellungen sind die Ein- und Ausschaltzeiten für zwei LEDs dargestellt. Die obere Darstellung zeigt deutlich, dass die LED fast dreimal so lange eingeschaltet ist wie die in der unteren Darstellung.
Das Zahlenverhältnis aus tein zur Periodenzeit T wird auch Tastverhältnis genannt. Es ist ein reiner Zahlenwert der zwischen 0 und 1 liegt. Wir werden gleich bei der Beschreibung des Befehls analogWrite sehen, dass das Tastverhältnis auch mit einem Zahlenbereich zwischen 0 und 255 angegeben werden kann.
Die Veränderung von ON und OFF Zeiten bei konstanter Periodendauer wird auch als Puls-Weiten-Modulation (PWM) bezeichnet. In den Abschnitten BASIC Stamp (BS) - Standardservo und Propeller Kontroller - Servos erfährst du mehr darüber.
Wir wissen jetzt, was Puls-Weiten-Modulation bedeutet und werden diese auf eine LED anwenden. Dazu stellt die Sprache Arduino-C den Befehl analogWrite bereit.
analogWrite()
Syntax
analogWrite(pin, wert)
Parameter
pin: PWM Output-Pin am Arduino wert: int wert des Tastverhältnisses liegt zwischen 0 (immer ON) bis 255 (immer OFF)
Bemerkung
Das PWM Signal hat eine Frequenz von
Die Funktion kann nur über die Pin eingesetzt werden, die mit einer Tilde (~) gekennzeichnet sind. Bei einem UNO sind das P3, 5, 6, 9, 10 und 11.
Aufgabe |
|
Das Programm LED_PWM_UNO_WiFi_R2_v2.ino
Wie arbeitet das Programm LED_PWM_UNO_WiFi_R2_v2.ino?
Im fixen Teil des Programms wird der Variablen ledPin der Wert 10 zugewiesen; die benutzte LED ist an D10~ angeschlossen.
Im Methodenblock setup wird D10~ auf OUTPUT gesetzt und anschließend die Methode loop aufgerufen.
Die for...- Schleife ist neu. Eine Kurzbeschreibung findest du unter Mikrocontroller - Arduino UNO.
In einer kurzen Filmsequenz wird hier das Verhalten der LED an D10 gezeigt und gleichzeitig das Oszillogramm vom Ausgang D10.