In diesem Beitrag möchte ich dir zeigen, wie du ganz einfach Zufallszahlen am Arduino mit Basisfunktionen der Arduino IDE generieren kannst. Du benötigst also keine zusätzliche Bibliothek dafür! Die generierten Zahlen kannst du dann zum Beispiel für Sound und Lichteffekte verwenden.
Inhaltsverzeichnis
- Wie werden Zufallszahlen am Computer erstellt?
- Wie erstellt man Zufallszahlen am Arduino?
- Verwenden von Sensoren für die Generierung von Zufallszahlen am Arduino
- Ein Beispiel wie man Zufallszahlen am Arduino generiert
Wie werden Zufallszahlen am Computer erstellt?
Zufallszahlen am Computer werden eigentlich nicht wirklich “zufällig” generiert. Stattdessen verwendet der Computer spezielle mathematische Tricks, um Zahlen zu erzeugen, die wie Zufallszahlen aussehen. Es beginnt mit einer Startzahl (wie eine geheime Zahl), und dann führt der Computer bestimmte Rechenoperationen aus, um die nächste Zahl zu erstellen. Das geschieht so schnell, dass es wie Zufallszahlen aussieht. Aber wenn wir denselben Startwert verwenden, bekommen wir die gleiche Zahlenfolge – das ist der Grund, warum sie “Pseudozufallszahlen” heißen. Es ist wie Magie, aber eigentlich steckt Mathematik dahinter!
Wie erstellt man Zufallszahlen am Arduino?
Am Arduino werden Zufallszahlen auf ähnliche Weise wie am Computer erzeugt, mit dem Unterschied, dass der Arduino aufgrund seiner begrenzten Ressourcen Pseudozufallszahlen verwendet. Hier ist eine vereinfachte Erklärung:
Der Arduino verwendet einen Startwert (genannt “Seed”), um eine Zahlenfolge zu generieren. Diese Zahlenfolge sieht zufällig aus, obwohl sie es nicht wirklich ist. Der Arduino verwendet einen speziellen mathematischen Trick, um die nächste Zufallszahl in der Folge zu berechnen. Dieser Trick basiert auf einfachen Rechenoperationen wie Multiplikation und Addition.
Der Startwert ist entscheidend, weil er die gesamte Zahlenfolge bestimmt. Wenn du denselben Startwert verwendest, erhältst du die gleiche Zahlenfolge. Das bedeutet, dass die erzeugten Zufallszahlen vorhersehbar sind, solange du denselben Startwert verwendest.
Der Arduino ermöglicht es dir auch, den Startwert mithilfe von Sensoren oder Eingabewerten zu ändern, um die Zufallszahlen unvorhersehbarer zu gestalten.
Insgesamt verwendet der Arduino also auch Pseudozufallszahlen, die auf Mathematik basieren, um den Eindruck von Zufälligkeit zu erzeugen, während sie in Wirklichkeit deterministisch sind.
Verwenden von Sensoren für die Generierung von Zufallszahlen am Arduino
Im letzten Absatz habe ich dir erläutert, wie man die Zufallszahlen am Arduino generieren kann, hier wurde ebenso erwähnt, dass man analoge Sensoren dafür einsetzen kann. Eigentlich benötigt man keinen speziellen analogen Sensor, wir werden hier lediglich den Umstand nutzen, dass die analogen Sensoren nicht so Werte stabil sind und daher eine Schwankung im Bereich von 0 bis 1023 vorkommt.
Wir könnten ebenso auch einen unbestückten analogen Pin verwenden und somit ebenso diesen für die Generierung von Zufallszahlen verwenden.
Ein Beispiel wie man Zufallszahlen am Arduino generiert
Im Nachfolgenden verwende ich den Arduino UNO R4 Minima, du kannst aber auch den Vorgänger UNO R3 verwenden.
Code zum Generieren einer Zufallszahl in der Arduino IDE
Nachfolgend der Code zum Generieren einer Zufallszahl in der Arduino IDE:
void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); } void loop() { //erzeugen einer Startzahl aus dem aktuellen Wert, //des analogen Pins A0 int analogValue = analogRead(A0); randomSeed(analogValue); //erzeugen einer Zufallszahl von 0 bis 5 int zufallszahl = random(6); //ausgeben der generierten Zufallszahl auf //der seriellen Schnittstelle Serial.print("Zufallszahl: "); Serial.print(zufallszahl); Serial.print("[analogValue: "); Serial.print(analogValue); Serial.print("]"); Serial.println(); //einlegen einer Pause von 1500 Millisekunden (1,5 Sekunden) delay(1500); }
Der obige Code gibt im Intervall von 1,5 Sekunden eine neue Zufallszahl auf der seriellen Schnittstelle aus.
Zusätzlich wird auch der ermittelte Wert vom analogen Pin ausgegeben, dieser Wert wird genutzt, um einen Startwert für die Ermittlung einer Zufallszahl zu haben. Du siehst in der Grafik, dass wenn der Startwert gleich ist, ist auch die Zufallszahl gleich.
Erzeugen einer Zufallszahl per Tastendruck und darstellen auf LEDs
Für die Generierung der Zufallszahlen verwende ich einen Taster und zur Darstellung LEDs. Mit diesen LEDs kann ich die Zahlen von 1 bis 6 darstellen.
Wenn man jedoch zum binären System wechselt, kann man sogar noch größere Zahlen darstellen. Jedoch würde dieses hier zu weit gehen.
#include <Bounce2.h> int taster = 7; const int NUM_LEDS = 6; int leds[6] = { 13, 12, 11, 10, 9, 8 }; Bounce2::Button button = Bounce2::Button(); void setup() { Serial.begin(9600); for (int led = 0; led < NUM_LEDS; led++) { pinMode(leds[led], OUTPUT); } button.attach(taster, INPUT_PULLUP); // USE EXTERNAL PULL-UP button.interval(5); button.setPressedState(LOW); } void resetLEDs() { for (int led = 0; led < NUM_LEDS; led++) { digitalWrite(leds[led], LOW); } } void loop() { button.update(); if (button.pressed()) { randomSeed(analogRead(A0)); int zufallszahl = random(6); Serial.println(zufallszahl); resetLEDs(); digitalWrite(leds[zufallszahl], HIGH); delay(125); } }
Wenn man nun den Code auf dem Arduino ausführt, dann kann man per Tastendruck eine Zufallszahl generieren, welche dann über die LEDs visualisiert wird.
Diese Werte könnte man jetzt nutzen um die Augen eines Würfels (1 bis 6) darzustellen, natürlich sollte man dann auch die LEDs dementsprechend anordnen.
Wie du einen Würfel mit Zufallszahlen programmierst, habe ich dir im Beitrag Arduino Workshop #1 2019: LED Würfel gezeigt.