Wir probieren das aus. Dazu erzeugen wir einen neuen Sketch mit dem Namen first und kopieren den Code des Blink-Beispiels hinein (File | Examples | 01.Basics | Blink). Jetzt versuchen wir den Sketch hochzuladen und bekommen eine Fehlermeldung. Falls im hier beschriebenen Fall keine Fehlermeldung auftaucht, haben die Entwickler des Boardmanagers vielleicht das Problem mittlerweile gelöst. Dann können Sie die im nächsten Absatz noch folgenden Anweisungen überspringen.
Andernfalls versetzen Sie jetzt den Raspberry Pico in den Hochladen-Modus (Taster drücken und den Pico kurz vom USB-Anschluss trennen). Im Dateisystem Ihres Rechners wechseln Sie jetzt in das Verzeichnis /tmp/arduino/sketches/LangeZahl/. Hier finden Sie die Datei first.ino.uf2, die Sie jetzt nur noch auf den Pico kopieren müssen. Kurz darauf fängt die LED des Mikrocontrollers an zu blinken, und Mbed OS ist installiert. Ab jetzt dürfen Sie wie gewohnt in der Arduino IDE die Programme mit dem Hochladen-Button auf den Pico schieben.
Programmaufbau
Die Vorarbeiten sind damit abgeschlossen, nun geht es an das Würfel-Programm. Die Idee dahinter: Das Programm “würfelt”, solange man den Button drückt. Dabei sind die Zahlen von 1 bis 6 in schneller Folge zu sehen, und es ergibt sich nebenbei ein einfacher animierter Effekt. Beim Loslassen des Buttons bleibt der Würfel auf dem aktuellen Wert stehen. Das entspricht zwar keinem echten Zufallsalgorithmus, aber das Ergebnis ist noch zufällig genug. Ein Programmdurchlauf übertrifft die menschliche Reaktionszeit etwa um den Faktor 10. Es wäre überraschend, gelänge es einem Menschen bei dieser Geschwindigkeit, eine bestimmte Zahl auszuwählen.
Kommen wir jetzt zum Programm (Listing 1). Zuerst definieren wir ein zweidimensionales Array, in dem die Muster für die Anzeige des Würfels liegen (Zeilen 1 bis 9). Die erste Dimension gibt an, welche Zahl angezeigt werden soll. Hierbei gilt es zu beachten, dass es auch eine 0 und eine 7 gibt. Diese beiden Werte dienen zu Testzwecken. In der zweiten Dimension befinden sich die Bitmuster, die vorgeben, welche LEDs bei welcher Zahl leuchten. Die GPIOs sind so gewählt, dass sie aufeinanderfolgende Nummern aufweisen (GP01 bis GP07).
Die Variable count (Zeile 10) enthält einen Integer-Wert, der hochzählt, solange der Button gedrückt bleibt. Die Funktion setup() (ab Zeile 12) initialisiert lediglich die GPIOs. Für die Outputs funktioniert das mit einer Schleife, weil sie wie erwähnt aufeinanderfolgende Nummern aufweisen. Falls Sie sich wundern, warum hinter dem for() keine geschweifte Klammer aufgeht: Auf ein for() muss ein Block ({}) oder ein Kommando folgen. Daher geht diese Schreibweise in Ordnung. Beim Input (GP21, Zeile 14) lässt sich erkennen, dass der interne Pulldown-Widerstand aktiviert ist.
Die Funktion show() (ab Zeile 17) erhält als Übergabewert die Zahl, die der Würfel anzeigen soll. Mithilfe des Arrays pattern steuert das Programm die der Zahl entsprechenden LEDs an. Die +1 beim digitalWrite ist nötig, weil das Array bei 0 beginnt, die GPIOs aber bei 1.
Zu guter Letzt betrachten wir die loop()-Funktion ab Zeile 21. Bei gedrücktem Button zeigt der Würfel Werte an. Dabei kommt es auf den Ausdruck (count++%6)+1 an (Zeile 23). Der Modulo-Operator % gibt den Rest einer Division zurück. Mit %6 bekommen wir also immer Zahlen zwischen 0 und 5 zurück, egal, was vor dem % steht. Das entspricht fast schon dem gewünschten Ergebnis. Wir benötigen Zahlen von 1 bis 6, daher steht am Ende des Ausdrucks die +1. Die Variable count erhöht sich einfach bei jedem Durchlauf um eins. So generiert dieser Ausdruck fortlaufend Zahlen von 1 bis 6, ohne dass wir mit einem if die Zähler-Variable zurücksetzen müssten.
Mehr gibt es zum Testprogramm nicht zu sagen. Falls Sie befürchten, dass die Werte nicht zufällig genug ausfallen, verkürzen Sie einfach die Wartezeit (Zeile 24). Alternativ ließe sich ein echter Zufallsgenerator einbauen.
Listing 1
Quellcode für den Würfel
int pattern[8][7] = {
{0,0,0,0,0,0,0},
{0,0,0,1,0,0,0},
{0,0,1,0,1,0,0},
{0,0,1,1,1,0,0},
{1,0,1,0,1,0,1},
{1,0,1,1,1,0,1},
{1,1,1,0,1,1,1},
{1,1,1,1,1,1,1} };
int count=0;
void setup() {
for(int i=1;i<8;i++) pinMode(i, OUTPUT);
pinMode(21, INPUT_PULLDOWN);
}
void show(int number) {
for (int i = 0;i<8;i++) digitalWrite(i+1, pattern[number][i]);
}
void loop() {
if(digitalRead(21)){
show((count++%6)+1);
delay(20);
}
}
Fazit
Für Einsteiger in die Mikrocontrollerprogrammierung folgt nach dem Blink-Beispiel als nächster Schritt oft ein Lauflicht oder eben der hier gezeigte Würfel. Der vorliegende Beispielcode ist recht kompakt und beinhaltet einige Tricks. Ein Anfänger würde sicher eine andere Lösung mit mehr Code produzieren. Das spielt aber letztlich keine Rolle: Alles, was ein Problem löst, darf als Lösung gelten – über deren Qualität kann man später diskutieren. (uba)
Der Autor
Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.
Infos
- 3D-Modell: https://cad.onshape.com/documents/868fbfbf94de78db46f8097d/w/73ad0f3b047d7625b8e8eb00/e/ff71596b5fc9de931f1f6e41
- Datenblatt Leuchtdiode: https://www.we-online.com/components/products/datasheet/151053BS04500.pdf
- Widerstands Reihen: https://de.wikipedia.org/wiki/E-Reihe
- Fädeltechnik: https://www.reichelt.de/reicheltpedia/index.php/F%C3%A4delstift
- MME-Leiterplatten: https://www.mme-pcb.com/
- Pinout Raspberry Pi Pico: https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf
- Mbed OS: https://os.mbed.com/mbed-os/
- Arduino IDE herunterladen: https://www.arduino.cc/en/software





