In diesem kleinen Beitrag möchte ich dir zeigen, wie du das Spiel Stein – Schere – Papier am Arduino mit Servomotoren programmiert.
Wie du einen Servomotor am Arduino UNO programmierst und steuerst, habe ich dir bereits im Beitrag Arduino, Lektion 16: Servo ansteuern gezeigt. In diesem kleinen Spiel nutzen wir zusätzlich noch 5 LEDs, welche den Countdown darstellen.
Spielablauf Stein – Schere – Papier
Das Spiel ist im Grunde recht einfach, es gibt eine Anzahl Spieler x welche die Wahl zwischen Stein (eine Faust), Schere (zwei Finger) sowie Papier (flache Hand) haben. Es wird gleichzeitig aufgedeckt und ermittelt, welcher Spieler gewonnen hat.
Gewinner ermitteln
Der Gewinner wird durch nachfolgende Matrix ermittelt:
- Stein schlägt Schere,
- Schere schlägt Papier, und
- Papier schlägt Stein
Benötigte Ressourcen für dieses Spiel
Wenn du dieses kleine Spiel nachbauen möchtest, dann benötigst du:
- einen Arduino UNO*, Arduino Nano* oder ähnlichen Mikrocontroller,
- ein passendes USB-Datenkabel*,
- drei Servomotoren* inkl. Ruderhörner,
- fünf 5 mm LEDs*,
- 3 grüne LEDs,
- 1 gelbe LED,
- 1 rote LED,
- fünf 220 Ohm Vorwiderstände*,
- einen Taster*,
- diverse Breadboardkabel*, männlich – männlich, 10 cm
- ein 400 Pin Breadboard*,
- etwas Pappe, einen Stift, eine Schere
- Heißklebepistole inkl. Klebestick
Wenn du als Mikrocontroller den Keyestudio UNO R3* verwendest, dann kannst du die Servomotoren direkt an den Mikrocontroller stecken und sparst dir somit zumindest die Verkabelung von diesen.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Stromversorgung für die Servomotoren
Die Servomotoren vom Typ SG90 werden mit 5 V betrieben, was es eigentlich ermöglicht diese direkt mit dem Mikrocontroller zu verbinden. Jedoch gibt es manchmal Probleme, wenn diese kleinen Servos mehr Last ziehen.
Hier hilft ein weiteres kleines 400 Pin Breadboard mit einem Power Supply Modul dieses liefert durch eine 9V Blockbatterie genug Leistung für diese Servos.
Für das Power Supply Modul kannst du einfache 9V Block Batterien nutzen oder auch Akkus welche über eine USB-Schnittstelle zum Laden verfügen. Die Akkus verwende ich, da ich des Öfteren diese benötige und somit immer welche auf Lager habe. Diese sind zwar deutlich teurer, aber das rentiert sich schon nach einer Zeit.
Aufbau der Schaltung
Die Schaltung am normalen Arduino UNO ist recht einfach, denn wir steuern lediglich 3 Servomotoren über jeweils 3 digitale Pins und die LEDs. Der Buzzer dient zusätzlich zur akustischen Untermalung, dass eine neue Runde gestartet ist.
Zum Starten des Spieles nutzen wir einen Taster, welcher ebenso über einen digitalen Pin angesteuert wird.

Umgang mit der Heißklebepistole
In diesem Projekt verwende ich eine Heißklebepistole, wie der Name es erahnen lässt wird diese sehr heiß und der Kleber ebenso. Aus diesem genannten Grund empfehle ich dir einen vorsichtigen Umgang mit dieser.
Solltest du einmal etwas Heißkleber auf die Finger bekommen, so hilft zunächst kühlen unter kaltem Wasser. Dabei sollte sich in der Regel der Heißkleber bereits selber von der Haut lösen.
Anders verhält es sich an Kleidung, hier ist dieser Kleber recht robust und lässt sich auch nur sehr schwer rauswaschen.
Schilder für die Servomotoren
Die Schilder für die Servomotoren basteln wir aus Pappe und etwas Papier.
Wenn deine Zeichenkünste genauso wie meine sehr beschränkt sind, dann findest du hier eine kleine ZIP-Datei mit Bildern.
Diese kleinen Bilder drucke ich aus und klebe diese auf Pappe um dann mit Heißkleber diese auf ca. 10 cm lange Pappstreifen zu kleben.
Halterung für die Servomotoren aus Pappe
Die Halterung für die Servomotoren bauen wir ebenso aus Pappe. Hierzu bauen wir eine Röhre, welche wir mit Heißkleber fixieren. Auf diese Röhre kleben wir dann ebenso mit Heißkleber die Servomotoren.
Programmieren in der Arduino IDE
Das Programm schreiben wir wieder in der Arduino IDE, diese hat den Vorteil, dass diese alles mitbringt, um das Programm zu schreiben (du benötigst keine zusätzlichen Bibliotheken oder ähnliches).
Ausrichten der Servomotoren
Bevor wir die Servomotoren verbauen müssen diese ausgerichtet werden, dazu kannst du nachfolgendes kleines Programm nutzen.
Die Servomotoren werden dazu initial auf die 0-Stellung gesetzt, hier musst du nun die Ruderhörner der Servos ausrichten. Danach änderst du die Werte im Funktionsaufruf von „servoX.write(0);“ von 0 auf 90 und prüfst, wie dieser dreht.
#include <Servo.h> #define servoPin1 3 #define servoPin2 6 #define servoPin3 9 Servo servo1; Servo servo2; Servo servo3; void setup() { servo1.attach(servoPin1); servo2.attach(servoPin2); servo3.attach(servoPin3); servo1.write(0); servo2.write(0); servo3.write(0); } void loop() { // bleibt leer }
Schritt 1 – anlegen der Felder mit den Pins
Zunächst legen wir die Felder mit den Pins der verbauten Bauteile an. Als Namen verwende ich den Bauteilnamen und einen Index.
#define ledPin1 2 #define ledPin2 4 #define ledPin3 5 #define ledPin4 7 #define ledPin5 8 #define buzzerPin 11 #define tasterPin 10 #define servoPin1 3 #define servoPin2 6 #define servoPin3 9
Schritt 2 – definieren der Pins
Im nächsten Schnitt müssen wir nun definieren, wie diese Pin am Mikrocontroller funktionieren sollen, d.h. ob diese als Ausgang oder Eingang dienen soll. Beim Taster verwenden wir zusätzlich die Bezeichnung INPUT_PULLUP, denn dieser soll über den internen 10 kOhm PullUp Widerstand angebunden werden.
Servomotoren einbinden
Für die Servomotoren benötigen wir eine externe Bibliothek, welche wir über Sketch > Include Library > Servo einbinden. Danach erzeugen wir für jeden Servomotor ein Objekt vom Typ Servo.
#include <Servo.h> Servo servo1; Servo servo2; Servo servo3;
Funktion setup
void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); pinMode(buzzerPin, OUTPUT); pinMode(taster, INPUT_PULLUP); servo1.attach(servoPin1); servo2.attach(servoPin2); servo3.attach(servoPin3); }
Funktion loop
In der Funktion loop prüfen wir lediglich, ob die Taste betätigt wurde. Wenn dieses so ist dann wird ein Reset durchgeführt und die Variable „runGame“ auf true gesetzt.
Danach prüfen wir, ob die variable „runGame“ auf true ist, wenn dieses so ist, soll die Funktion „runTimer“ ausgeführt werden. Damit halten wir die Funktion loop klein und lagern die Logik für das Spiel in die Funktion „runTimer“ aus.
void loop() { if (digitalRead(tasterPin) == LOW) { reset(); runGame = true; } if (runGame) { runTimer(); } }
Schritt 3 – Aktion bei Tastendruck
Wenn der Taster betätigt wird, soll ein neues Spiel starten, dazu sollen zunächst alle LEDs aktiviert, die Servomotoren auf die 0-Stellung und der Index wieder auf 0 gesetzt werden.
void reset() { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); servo1.write(0); servo2.write(0); servo3.write(0); index = 0; }
Im Anschluss soll eine Timer-Funktion gestartet werden, in welcher zunächst geprüft wird, ob seit der letzten Ausführung eine Sekunde vergangen ist.
Dazu legen wir zwei zusätzliche Felder an. Die Variable „lastAction“ dient zum Speichern des Zeitpunkts der letzten Ausführung. Die Konstante SECOND soll lediglich dazu dienen, die 1000 Millisekunden mit einem sprechenden Namen im Code zu haben.
const int SECOND = 1000; long lastAction = -1;
Zusätzlich legen wir die Pins der LEDs in einem Array ab, damit können wir dann einen Index mitlaufen lassen und aus diesem die LED recht einfach deaktivieren.
int index = 0; int leds[] = { ledPin1, ledPin2, ledPin3, ledPin4, ledPin5};
Wenn die Zeit abgelaufen ist, ermitteln wir eine Zufallszahl, dazu müssen wir zunächst in der Setup-Funktion mit der Funktion „randomSeed“ und einem nicht belegten analogen Pin eine Zahl ermitteln, aus welcher die Zufallszahl ermittelt wird.
void setup() { ... randomSeed(analogRead(0)); }
Die gesamte Funktion:
void runTimer() { if (millis() > lastAction + SECOND) { lastAction = millis(); digitalWrite(leds[index], LOW); index++; if (index == 5) { tone(buzzerPin, 950, 125); delay(250); tone(buzzerPin, 950, 125); delay(250); tone(buzzerPin, 950, 125); //0 bis 2 int zufallszahl = random(1,4); switch (zufallszahl) { case 1: servo1.write(90); break; case 2: servo2.write(90); break; case 3: servo3.write(90); break; } Serial.println(zufallszahl); runGame = false; } else { tone(buzzerPin, 1200, 125); } } }
Spielende
Das Spiel endet, wenn die Zeit von 6 Sekunden abgelaufen und damit einer der drei Servomotoren bewegt wurde.
Ein neues Spiel lässt sich über den Taster starten. Die Servomotoren werden auf die 0-Stellung gebracht und alle LEDs aktiviert.