Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

Stein – Schere – Papier am Arduino

Posted on 5. März 202310. März 2024 by Stefan Draeger

In diesem kleinen Beitrag möchte ich dir zeigen, wie du das Spiel Stein – Schere – Papier am Arduino mit Servomotoren programmiert.

Stein - Schere - Papier am Arduino
Stein – Schere – Papier am Arduino

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
    • Gewinner ermitteln
  • Benötigte Ressourcen für dieses Spiel
    • Stromversorgung für die Servomotoren
  • Aufbau der Schaltung
  • Umgang mit der Heißklebepistole
  • Schilder für die Servomotoren
  • Halterung für die Servomotoren aus Pappe
  • Programmieren in der Arduino IDE
    • Ausrichten der Servomotoren
  • Schritt 1 – anlegen der Felder mit den Pins
  • Schritt 2 – definieren der Pins
    • Servomotoren einbinden
    • Funktion setup
    • Funktion loop
  • Schritt 3 – Aktion bei Tastendruck
  • Spielende

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.

Spiel - Stein-Schere-Papier am Arduino UNO
Dieses Video auf YouTube ansehen.

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!

Arduino UNO von Keyestudio
Arduino UNO von Keyestudio

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.

  • Power Supply Modul*,
  • 9V Block Akku mit USB Schnittstelle*,
  • 400 Pin Breadboard*

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.

Bilder für die Stein-Schere-Papier
Bilder für die Stein-Schere-Papier

Wenn deine Zeichenkünste genauso wie meine sehr beschränkt sind, dann findest du hier eine kleine ZIP-Datei mit Bildern.

Stein-Schere-Papier BilderHerunterladen

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.

Schilder auf Pappe mit den Symbolen für Stein-Schere-Papier
Schilder auf Pappe mit den Symbolen für Stein-Schere-Papier

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).

Arduino Code – Stein-Schere-PapierHerunterladen

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.

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}