Einstieg Mikrocontroller mit dem Arduino         

8 Zufall und Spiele         


Elektronik-Labor   Projekte   AVR 


  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


Elektronik-Labor   Projekte   AVR