1.4.22: Einstieg Mikrocontroller mit Arduino
29.4.22: Einstieg Arduino 1, Portausgaben
6.5.22: Einstieg Arduino 2, Digitale Eingänge
13.5.22: Einstieg Arduino 3, Analoge Messungen
20.5.22: Einstieg Arduino 4, Programmschleifen
28.5.22: Einstieg Arduino 5, Übungen
10.6.22: Einstieg Arduino 6, Sesoren
21.6.22: Einstieg Arduino 7, Ampelsteuerung
24.6.22: Einstieg Arduino 8, Zufall und Spiele
Sechs LEDs sollen an D2 bis D7 angeschlossen werden und
ein Schalter an D8. Das erste Programm erzeugt ein zufälliges Blinken an allen
LEDs. Das letzte Blinkmuster kann mit einem Druck auf den Taster festgehalten
werden. Wer schafft es, genau dann auf den Knopf zu drücken, wenn gerade alle
LEDs an sind?
//Zufall1
void setup() {
DDRD = 255;
pinMode(8,INPUT_PULLUP);
}
void loop() {
PORTD = random(256);
delay(400);
while (digitalRead(8)==0);
}
Die Funktion random(256) liefert zufällige Zahlen im
Bereich 0 bis 255, also gerade ein Byte. Damit werden alle acht Ausgänge am
Port D angesteuert, das sind die Anschlüsse TXD bis D7. Und tatsächlich blinken
nicht nur die sechs eingesteckten LEDs, sondern auch die kleinen LEDs TX und RX
auf der Platine. Wenn man auf die Taste drückt, bildet while
(digitalRead(8)==0); eine Endlosschleife, die den weiteren Ablauf anhält, bis
die Taste wieder losgelassen wird.
//Zufall2
int d;
void setup() {
DDRD = 255;
pinMode(8,INPUT_PULLUP);
d = random(255);
}
void loop() {
int b= random(8);
d=d ^ (1 << b); //Mit XOR
eine Stelle umschalten
PORTD = d;
delay(300);
while (digitalRead(8)==0);
}
Das zweite Zufallsprogramm arbeitet etwas anders. Jetzt
wird zu einer Zeit immer nur eine LED umgeschaltet. Mit b=random(8) erhält man diesmal
eine zufällige Zahl zwischen 0 und 7. Sie soll bestimmen, welche LED
umgeschaltet wird. Das entsprechende Bit in d wird umgeschaltet. Dazu dient die
XOR-Verknüfpung: d ^ 1 bewirkt zum Beispiel, dass das Bit mit der Wertigkeit 1 von
1 auf 0 wechselt oder von 0 auf 1. Wenn aber für b gerade 3 gewürfelt wurde,
verschiebt sich die 1 um drei Stellen nach links. Aus der Binärzahl 00000001
wird 00001000, also dezimal 8. Damit wird diesmal D3 umgeschaltet. Das Spiel
ist nun viel einfacher. Wenn man erkennt, dass gerade fünf LEDs an sind, passt
man genau auf, ob auch noch die sechste eingeschaltet wird.
In alten Filmen sieht man manchmal große Computer mit vielen Lämpchen, die sich scheinbar zufällig ändern, genau wie in diesem Versuch. Solche Computer gab es tatsächlich vor 1960. Die Lämpchen zeigten, welche Zahlen der Computer gerade berechnete. Später hat man das aufgegeben, weil die Computer so schnell wurden, dass sowieso keiner mehr etwas erkennen konnte. In den alten Filmen mit James Bond und Co. wurden wahrscheinlich keine echten Computer verwendet. Den Arduino gab es auch noch lange nicht. Vermutlich haben sich da irgendwelche Rollen und Walzen mit Kontakten bewegt, um die Lämpchen umzuschalten. Wir haben es jetzt viel leichter.
Der Würfel
//Zufall3 Ein Würfel
void setup() {
DDRD = 255;
pinMode(8,INPUT_PULLUP);
}
void loop() {
int b= random(1,7);
PORTD = (63 << b)>>4;
while (digitalRead(8)==1);
delay (50);
while (digitalRead(8)==0);
delay (50);
PORTD = 0;
delay (1000);
}
Nun wird ein Würfel programmiert. Die Anordnung der
Punkte ist gegenüber einem normalen Würfel vereinfacht und besteht nur aus der Reihe
von sechs LEDs. Wenn gerade eine Zwei gewürfelt wurde, leuchten die beiden
rechten LEDs. Die Abfrage der Taste wurde verändert. Zuerst wird gewartet, bis jemand
auf die Taste drückt, dann wird gewartet, bis die Taste wieder losgelassen
wird. Die kurzen Wartezeiten sind eingefügt, weil die Tasten manchmal „prellen“,
also mehrmals schnell öffnen und schließen. Nach dem Loslassen werden alle LEDs
für eine Sekunde abgeschaltet. Das soll die Illusion erzeugen, der Arduino
hätte schwer zu arbeiten, um den Würfel rollen zu lassen.
Die eigentliche Zahl wird mit b= random(1,7) gewürfelt,
was ein Ergebnis zwischen 1 und 6 erzeugt. Dann wird die Zahl 63 (binär
00111111) um b Stellen nach links und um 4 Stellen nach rechts verschoben. Wenn
gerade eine 6 gewürfelt wurde, verschieben sich die Einsen um 6-4=2 Stellen nach
links. Damit sind dann gerade alle sechs eingesteckten LEDs an.
Zufällige Helligkeiten
//Zufall4
void setup() {
DDRD = 255;
pinMode(8,INPUT_PULLUP);
}
void loop() {
analogWrite(3,random(256));
analogWrite(5,random(256));
analogWrite(6,random(256));
delay(400);
while (digitalRead(8)==0);
}
Während digitalWrite nur ganz ein oder ausschalten kann, stellt
analogWrite eine Helligkeit zwischen 0 und 255 (=100%) ein. Genaueres erfährt
man hier: https://www.arduino.cc/reference/de/language/functions/analog-io/analogwrite/
Die „analoge“ Ausgabe ist tatsächlich eine digitale PWM-Ausgabe, die eine LED immer wieder für mehr oder weniger kurze Momente einschaltet. Nicht jeder Pin kann dafür verwendet werden. Die möglichen PWM-Ausgänge sind 3, 5, 6, 9, 10 und 11. Unter den bereits eingebauten LEDs sind also nur drei dafür nutzbar.
//Welle
int sinus[255];
int t;
unsigned int d;
void setup() {
//DDRD = 255;
Serial.begin(9600);
pinMode(8,INPUT_PULLUP);
for (t=0;t<255;t++){
d= 127+ 120* sin(2 * 3.1415 / 256.0 * (float)t);
Serial.println(d);
sinus[t]= (d*d)>>8;
}
}
void loop() {
t++;
analogWrite(3,sinus[(t+0)&255]);
analogWrite(5,sinus[(t+50)&255]);
analogWrite(6,sinus[(t+100)&255]);
analogWrite(9,sinus[(t+150)&255]);
analogWrite(10,sinus[(t+200)&255]);
analogWrite(11,sinus[(t+250)&255]);
delay(5);
while (digitalRead(8)==0);
}
Das letzte Programm erzeugt eine laufende Welle über
sechs LEDs. Hier wird ein Array (eine Tabelle) int sinus[255] gebildet und mit quadrierten
Sinuswerten gefüllt. Die Quadratfunktion wird eingesetzt, um das nichtlineare
Empfinden des Auges auszugleichen. Das Programm verwendet einen Zeitzähler t,
der schnell hochgezählt wird. Er bestimmt die Position in der Tabelle, von der
eine Helligkeit ausgegeben wird. Alle Ausgänge verwenden gegeneinander
verschobene Positionen, sodass am Ende eine Welle durch die Anzeige läuft.
Damit man alle sechs Positionen sieht, müssen drei LED
nach links an die Stellen D9, D10 und D11 verschoben werden. So sieht man die
vollständige laufende Welle. Das Programm kann als Entspannungslicht eingesetzt
werden. Wer mal zu viel programmiert hat, kann es zur Erholung einsetzen. Aber bitte
nicht länger als zehn Minuten verwenden, danach schläft man vor lauter
Entspannung ein.
Download: Arduino8.zip
Zurück: ArduinoKurs7.htm