Lektion 4 PWM und For

Lektion 4 PWM und For  Titelbild

PWM - PulsWeitenModulation

Bis jetzt haben wir unsere LED mit digitalWrite(pin, HIGH/LOW); geschaltet. Das war alles simpel und einfach. Mit HIGH haben wir den Strom zum Fließen und die LED zum Leuchten gebracht und mit LOW das genaue Gegenteil erreicht.

Jetzt gibt es aber Momente im Leben in denen An oder Aus einfach nicht mehr reicht! Und genau für diese Momente gibt es auch die digitalen Pins mit der ~ daneben. Konkret handelt es sich um die Pins: 2,5,6,9,10 und 11. Das Zauberwort ist dabei die PulsWeitenModulation. Normalerweise können wir uns den Stromfluss wie zwei Linien vorstellen. Wenn er fließt, ist die Linie hoch, wenn der Strom nicht fließt ist die Linie niedrig. Durch die PWM können wir nicht "halb so viel" Strom schicken, aber wir können kleine Pausen einfügen. Der Arduino ist sehr schnell und kann deswegen innerhalb von Millisekunden den Strom an- und wieder ausschalten. So wird ein Stromfluss erzeugt, der nicht HIGH oder LOW ist, sondern etwas dazwischen. Dazu gibt es folgende Funktion:

analogWrite(pin, Wert);

Der ersten Parameter wird für den Pin übergeben, der zweite ist der Wert. Dieser kann zwischen 0 und 255 liegen und kann so zum Beispiel die Helligkeit einer LED kontrollieren.














Herzlichen Glückwunsch

Dein erster Mini Einstieg in den ist geschafft. Den restlichen Teil der Anleitung findest du online auf cw42.de/arduinoMini

Weitere inspiration, Anleitungen und spannende Projekte dazu findest du auf CodingWorld.io

Wir hoffen, dass dir dieses Jugend Programmiert Kit gefallen hat.
Für Fragen, Tipps, Tricks und Feedback besuche uns auf CodingWorld.io

























343.png

Da das Beispiel so passend ist, probieren wir das gleichmal aus!

340.png
Anschlüsse am Arduino Anschlüsse an der LED
GND Kurzes Bein der LED
11 Langes Bein der LED
int led = 11;   

void setup()  { 
} 

void loop()  { 
  analogWrite(led, 128);         
  delay(30);
}

Der größte Unterschied, der dir vermutlich auffällt, ist, dass in der setup()-Funktion kein pinMode für die LED definiert werden muss. Das ist eine weitere Besonderheit. Ansonsten rufen wir in Zeile 7 die analogWrite(led, 128);-Funktion auf. Mit dem ersten Parameter übergeben wir den angeschlossenen Pin und der zweite Parameter legt fest, wie hell die LED sein darf. Da 128 so ziemlich 50% von dem Maximum 255 entspricht, sollte diese ungefähr nur halb so hell leuchten. Mit der PWM Funktion können wir also ziemlich gut die Helligkeit der LED kontrollieren, aber auch später gibt es weitere Komponenten, die sich darüber steuern lassen.

Jetzt bist du dran: Teste die unterschiedlichen Werte durch und tausche dich aus, wie stark die einzelnen Unterschiede sind.

For Schleife

Schleifen sind nicht etwas wirklich Neues für uns. Die void loop(){}-Schleife haben wir bisher in jedem Programm benutzt. Der gesamte Programmcode zwischen den geschweiften Klammern {} wird solange wiederholt, wie der Arduino läuft. Bei den meisten anderen Schleifen gibt es eine feste Bedingung, die erfüllt werden muss und nur solange diese Bedingung erfüllt ist, wird die Schleife wiederholt.

341.png

Hier sehen wir ein Beispiel der for()-Schleife. Diese Schleife braucht immer drei Werte und wird vor allem eingesetzt, um eine klar definierte Anzahl von Aufgaben zu erledigen wie I/O Pins durchgehen. Diese einzelnen Angaben werden nicht wie bei einer normalen Funktion von einem , Komma, sondern von einem Semikolon ; getrennt. Der erste Wert ist der Startwert. Wenn wir eine Variable benutzen, die vorher noch nicht definiert ist, müssen wir da auch den Typ übergeben. Es muss dabei auch nicht bei 0 angefangen werden. Der zweite Wert ist die Bedingung, nachdem der Inhalt der Schleife ausgeführt wurde. In diesem Fall: Führe diese Schleife so lange fort, wie i kleiner als 10 ist. Doch auch eine for()-Schleife braucht ein Ende. Deswegen wird dem 3. Wert die Veränderung der Variablen übergeben. Mit i++; erhöhst du die Variable um 1. Denn i++; ist die Kurzform für: i = i + 1. Das ganze können wir uns einfach mit i++; sparen. Wir könnten aber zum Beispiel auch i = i + 10; schreiben, und damit i jedesmal um 10 erhöhen. Dann würde diese Schleife aber nur einmal durchlaufen, denn beim 2. Durchlauf wäre die Variable i schon größer als 10. Nach so viel Theorie aber ein kleines Beispiel! Mit dem folgenden Programm kannst du einfach alle Zahlen zwischen 0 und 255 aufzählen. Dafür müssen wir noch nicht mal etwas auf dem Breadboard anschließen!

void setup(){
  Serial.begin(9600);
}

void loop(){
  for(int i = 0; i <= 255; i++){
    Serial.println(i);
    delay(30);
  }
  Serial.println("UND NOCHMAL");
  delay(1000);
}

Wenn du jetzt den Seriellen Monitor öffnest, kannst du dem Arduino beim Rechnen zusehen! Aber was sagt das Programm Schritt für Schritt? In Zeile 2 starten wir in der setup()-Funktion die Serielle Kommunikation. In Zeile 6 startet dann die for()-Schleife. Der erste Wert legt fest, dass wir eine Variable mit dem Namen i haben, die den Wert 0 hat. Der zweite Wert legt fest, dass die Schleife solange laufen soll, wie Variable i kleiner oder gleich 255 ist. Der dritte Wert sagt einfach, dass bei jedem Durchgang die Variable i um eins erhöht werden soll. In Zeile 7 und 8 geben wir nur die Variable aus und warten ein wenig, damit wir dem Arduino auch wirklich beim Zählen zusehen können. In Zeile 9 geben wir dann eine kleine Botschaft aus, damit der Benutzer auch weiß, dass die loop()-Schleife wieder von Vorne anfängt und damit natürlich auch der Arduino wieder die for()-Schleife ausführt.

Schleifen können am Anfang ein wenig verwirrend sein, aber sie sind super praktisch!

Ist dir bei dem vorherigen Beispiel vielleicht etwas aufgefallen? Wenn wir sehr simpel von 0 bis 255 zählen und die Helligkeit der LED mit einem PWM Pin, sehr einfach von 0 bis 255 verändert werden kann, können wir die LED sehr angenehm zum Leuchten bringen. Du musst die LED mit dem Langen bein an Pin 6 verbinden und das Kurze Bein an GND anschließen.

int led = 6;
void setup(){
  Serial.begin(9600);
}

void loop(){
  for(int i = 0; i <= 255; i++){
    analogWrite(led, i);
    delay(10);
  }
  for(int i = 255; i >= 0; i--){
    analogWrite(led, i);
    delay(10);
  }
}

Du musst dafür die LED wie in dem vorherigen Beispiel angeschlossen haben.

Wenn du das Programm ausführst, sollte die LED jetzt langsam heller werden und dann langsam wieder dunkler werden. Dafür haben wir nicht nur eine for()-Schleife, sondern auch noch eine zweite in Zeile 11, die wieder nach unten zählt. Dazu müssen wir die Werte umdrehen. Heißt: Unser Anfangswert liegt bei 255 und die Schleife läuft solange, wie die Variable i höher als 255 ist. Mit i-- wird der Wert der Variable um einen dekrementiert. Jetzt bist du dran: Was passiert, wenn du die Pausenzeiten und die Schritte erhöhst?

Aufgaben Lektion 4

  1. Erkläre mit deinen eigenen Worten die PulsWeitenModulation.
  2. Wie viele PWM Pins hat der Arduino?
  3. Wie würde eine for()-Schleife aussehen, die von 100 bis 550 zählt, in 15er Schritten?
  4. Schaffst du es, 2 LEDs nacheinander zum Aufleuchten zu bringen?
  5. Baue ein Programm, mit einer LED und einem Button. Jedesmal, wenn der Button gedrückt wird, wird der Wert für analogWrite() um 10 erhöht. Wenn der Wert über 255 geht, fängt das ganze wieder von Vorne an.
  6. Schließe 8 LEDs an. Die LEDs sollen in der Reihenfolge ihrer Pins immer für eine Sekunde aufleuchten. Danach dann in der umgekehrten Reihenfolge der Pins.

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!