kk logo

Catch the Stick ist ein spannendes Reaktionsspiel, das deine Schnelligkeit und Konzentration auf die Probe stellt. Inspiriert vom klassischen „Fang den Stock“-Spiel, wurde diese Version mit moderner Technik erweitert: Acht Stäbe werden durch Elektromagnete gehalten, die von einem Arduino-Mikrocontroller gesteuert werden. In zufälligen Abständen lässt der Arduino einen Stab fallen, jetzt heißt es blitzschnell reagieren und den fallenden Stab fangen, bevor er den Boden berührt!


Catch the Stick arduino Reaktionsspiel bauen

🎯 Spielregeln

  1. Ziel ist es, so viele Stäbe wie möglich zu fangen bevor sie den Boden berühren.
  2. Stelle dich mittig vor das Spiel.
  3. Wähle eine Schwierigkeitsstufe durch drehen am Poti. Von links nach rechts, leicht, mittel, schwer.
    1. Leicht: Die Stäbe fallen von links nach rechts der Reihe nach, im Abstand zwischen 1 und 3 Sekunden.
    2. Mittel: Die Stäbe fallen zufällig, im Abstand zwischen 1 und 3 Sekunden.
    3. Schwer: Die Magnete werden beim aufhängen zufällig eingeschaltet, signalisiert durch die grüne LED. Die Stäbe fallen zufällig, im Abstand zwischen 0,5 und 5 Sekunden.  
  4. Hänge die acht Stäbe senkrecht an die Magneten (LED rot = Magnet aus, LED grün = Magnet an). 
  5. Nach dem Startsignal (5 mal blaues LED blinken) warte aufmerksam, die Stäbe fallen zufällig!
  6. Fange den fallenden Stab, bevor er den Boden berührt.
  7. Für jeden gefangenen Stab gibt es einen Punkt.
  8. Wenn ein Stab den Boden berührt, endet die Runde oder du verlierst einen Punkt.
  9. Wer am Ende die meisten Stäbe gefangen hat, gewinnt!

Catch the Stick arduino Reaktionsspiel basteln

🚧 Material

  • Arduino Nano mit Screw shild
  • 2x L298N H-Brücke für 2 Motoren
  • Netzteil 12 VDC mit mindestens 3 Ampere
  • Cocurve, String 9 mm WS2811 digitales LED-Pixelmodul, 2811 IC RGB,
    • Aliexpress Bezeichnung: 50 Stück/String 9 mm WS2811 digitales LED-Pixelmodul, 2811 IC RGB, Schwarz/Grün/Weiß/RGB-Draht, adressierbar, kein wasserdicht, IP30 DC5V
  • 8 Magnete (Produktname: Saug-Solenoid; Typ: Saug-Typ)
    • Aliexpress Bezeichnung: gesaugter elektrischer Hub Magnet Elektro Magnet 12VDC 2,5 kg 5,5 lb 20x15mm
  • Boxenstativ, Lautsprecherständer, Boxenständer
    • PA-Lautsprecherständer, höhenverstellbar, 28 Zoll bis 55 Zoll / 35 Zoll bis 67 Zoll, DJ-Stativständer mit Montagehalterung, universelle Stativ-Lautsprecherständer
  • Stabiler Besenstil 
  • 2x Sperrholzplatte Pappel, 10mm, ca. 1000x600 mm
  • 2x Bastelfurnier (oder Balsaholz) Pappel, 2-3mm, ca. 1300x60mm
  • 7x Vierkantholz ca. 30x30x40mm
  • Kleinteile wie Kabel, Klemmen, Schrumpfschlauch, Leim, Klebband usw.  

⚡Schaltung

Bei der Schaltung habe ich mich für zwei H-Brücke L298N entschieden, weil diese im Gegensatz zu Relais, geräuschlos sind, keine Spannungsspitzen haben, kaum Strom verbrauchen und nicht jeder Kontakt extra verdrahtet werden muss. Mit 2 H-Brücken kann ich 8 Magnete ansteuern, was völlig ausreichend ist. Das LED Band ist ein DC5Volt WS2812B. Die LEDs haben einen WS2812 Chip, können also wie NEOPixel programmiert werden. Die Spannungsversorgung der NEO Pixel kann etnweder vom Arduino, von einer der H-Brücken (5 Volt Ausgang) oder einem externen Netzteil erfolgen. Der Übersicht wegen habe ich die Kabel der Spannungsversorgung nur angedeutet. 

  • Orange = + 5 Volt vom Arduino 
  • Blau = - GND
  • Rot = + 12 Volt vom Netzteil 

Arduino Catch the Stick Spiel selber bauen

🔨 Bauanleitung

Zwei Halbkreise mit den Massen auf das 10mm Holz übertragen und aussägen. Mit einer Schnur, die an einer Schraube befestigt ist und einem Stift der am anderen der Schnur befestigt ist, bekommst du einen ganz guten Halbkreis hin.  Alle Angaben in Millimeter 
Arduino Catch the Stick Spiel bauanleitung

 Nun die Schaltung auf dem unteren Brett aufbauen und testen. Später kommst du an die Schaltung durch eine Öffnung an der Rückseite noch hin aber jetzt ist es leichter einen Fehler zu finden und zu beheben.

Arduino Catch the Stick Spiel Geschicklichkeitsspiel 2

Arduino Catch the Stick Spiel Geschicklichkeitsspiel 3

Nun leimst du die Abstandhölzer auf das untere Brett und auf die Abstandhölzer dann das obere Brett. Ist alles gut ausrichtet leimst du das gebohrte (für die LEDs) Bastelfurnier vorne auf die beiden Hölzer und befestigst das ganze mit vielen Schraubzwingen befestigt. Das gleiche machst du nun um das ganze Spiel herum mit Bastelfurnier. Das Bastelfurnier lässt sich ganz leicht an dem Halbkreis entlang biegen.

Arduino Catch the Stick Spiel Geschicklichkeitsspiel 6

Arduino Catch the Stick Spiel mit Arduino bauanleitung

Nur die Stelle hinter der Schaltung bleibt frei. Nach dem schleifen und lackieren werden die LEDs eingesetzt und die ganze Schaltung noch einmal getestet. 
Arduino Catch the Stick Spiel Geschicklichkeitsspiel 4

Nun kann der Starttaster und der Schwierigkeitspoti noch angebracht und verdrahtet werden (ggf. vorher Lackieren). 

Arduino Catch the Stick Spiel Geschicklichkeitsspiel 5

Nachdem sicher ist das alles funktioniert wird mit Schrauben, nicht mir Leim, der Teil hinter der Schaltung geschlossen. Nun kann der Besenstiel in das Spiel geleimt werden (ggf. vorher an den Stellen wo nicht geleimt wird Lackieren). Der Besenstiel wird nun mit dem Boxenstativ verschraubt. Bevor du spielen kannst musst du noch 8 Spielhölzer absägen und eine M6 oder M8 Schraube in das Holz drehen. 

Arduino Geschicklichkeitsspiel Catch the Stick

Ein tolles Spiel, egal ob Familienfeiern, Sportfeste, Firmenveranstaltung, Spielstraßen und vieles mehr.  

Arduino Catch the Stick Spiel Geschicklichkeitsspiel 1

⌨️ Arduino Programm

 

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel strip_pin11 = Adafruit_NeoPixel(17,11, NEO_GRB + NEO_KHZ800);
int zeit_aufhaengen = 1500;
int spiel = 0;
int level = 0;
int zufallholz = 0;
int zufallzeit = 0;
bool aus = true;
long ZeitVariable = 0L;
void level_2();

bool holz1 = false;
bool holz2 = false;
bool holz3 = false;
bool holz4 = false;
bool holz5 = false;
bool holz6 = false;
bool holz7 = false;
bool holz8 = false;
void level_3();

void blinken();

void led_alle_rot();

int led = 0;
void level_1();

void zufallen_heangen();

void aufhaengen();

void led_rot();

void spiel_var();

void led_alle_aus();

void setup() {
strip_pin11.begin();
strip_pin11.show();
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
strip_pin11.setBrightness(50);

zeit_aufhaengen = 1500;

spiel = 0;

level = 0;

for (int i = 0; i < analogRead(4); i++) {
zufallholz = random( 0 , 50 );
}

for (int i = 0; i < analogRead(5); i++) {
zufallzeit = random( 0 , 10000 );
}

aus = true;

spiel_var();

led_alle_rot();

}

void loop() {
ZeitVariable = millis();
while(ZeitVariable + 200L >= millis()) {
if (( !( digitalRead(2) ) && ( ( analogRead(0) > 0 ) && ( analogRead(0) <= 250 ) ) )) {

spiel = 1;
led_alle_aus();
led_rot();
aufhaengen();
blinken();
led_rot();
level_1();
delay( 1000 );
led_alle_rot();
}
if (( !( digitalRead(2) ) && ( ( analogRead(0) > 250 ) && ( analogRead(0) <= 600 ) ) )) {

spiel = 1;
led_alle_aus();
led_rot();
spiel_var();
aufhaengen();
blinken();
led_rot();
spiel_var();
level_2();
delay( 1000 );
led_alle_rot();
}
if (( !( digitalRead(2) ) && ( analogRead(0) > 600 ) )) {

spiel = 1;
led_alle_aus();
led_rot();
spiel_var();
zufallen_heangen();
blinken();
led_rot();
spiel = 2;
spiel_var();
level_3();
delay( 1000 );
led_alle_rot();
}
if (( ( analogRead(0) > 0 ) && ( analogRead(0) <= 250 ) )) {

strip_pin11.setPixelColor(16,0,0,255 );
strip_pin11.show();
}
if (( ( analogRead(0) > 250 ) && ( analogRead(0) <= 600 ) )) {

strip_pin11.setPixelColor(16,200,160,70 );
strip_pin11.show();
}
if (( analogRead(0) > 600 )) {

strip_pin11.setPixelColor(16,0,255,0 );
strip_pin11.show();
}
}
strip_pin11.setPixelColor(random( 0 , 15 ),random( 0 , 200 ) ,random( 0 , 200 ) ,random( 0 , 200 ) );
strip_pin11.show();
}

//level 2
void level_2() {
while ( ( spiel == 1 ) ) {
zufallholz = random( 1 , 9 );
if (( ( zufallholz == 1 ) && ( holz1 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
holz1 = false;
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(2,0 ,255,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
holz2 = false;
}
if (( ( zufallholz == 3 ) && ( holz3 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,0 ,255,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
holz3 = false;
}
if (( ( zufallholz == 4 ) && ( holz4 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(6,0 ,255,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
holz4 = false;
}
if (( ( zufallholz == 5 ) && ( holz5 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,0 ,255,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(10,0 ,255,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,0 ,255,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
holz7 = false;
}
if (( ( zufallholz == 8 ) && ( holz8 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(14,0 ,255,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
holz8 = false;
}
if (( ( holz1 == false ) && ( ( holz2 == false ) && ( ( holz3 == false ) && ( ( holz4 == false ) && ( ( holz5 == false ) && ( ( holz6 == false ) && ( ( holz7 == false ) && ( holz8 == false ) ) ) ) ) ) ) )) {

spiel = 2;
level = 0;
}
}
}

//Level 3
void level_3() {
while ( ( spiel == 2 ) ) {
zufallholz = random( 1 , 9 );
if (( ( zufallholz == 1 ) && ( holz1 == true ) )) {

zufallzeit = random( 500 , 7000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
holz1 = false;
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {

zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(2,0 ,255,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
holz2 = false;
}
if (( ( zufallholz == 3 ) && ( holz3 == true ) )) {

zufallzeit = random( 500 , 7000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,0 ,255,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
holz3 = false;
}
if (( ( zufallholz == 4 ) && ( holz4 == true ) )) {

zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(6,0 ,255,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
holz4 = false;
}
if (( ( zufallholz == 5 ) && ( holz5 == true ) )) {

zufallzeit = random( 500 , 7000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,0 ,255,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(10,0 ,255,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

zufallzeit = random( 500 , 7000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,0 ,255,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
holz7 = false;
}
if (( ( zufallholz == 8 ) && ( holz8 == true ) )) {

zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(14,0 ,255,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
holz8 = false;
}
if (( ( holz1 == false ) && ( ( holz2 == false ) && ( ( holz3 == false ) && ( ( holz4 == false ) && ( ( holz5 == false ) && ( ( holz6 == false ) && ( ( holz7 == false ) && ( holz8 == false ) ) ) ) ) ) ) )) {

spiel = 0;
level = 0;
}
}
}

//blau blinken vor start
void blinken() {
for (int i = 0; i < 5; i++) {
spiel = 0;
for (int i = 0; i < 15; i++) {
strip_pin11.setPixelColor(spiel,0 ,0 ,100 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
delay( 300 );
spiel = 0;
for (int i = 0; i < 15; i++) {
strip_pin11.setPixelColor(spiel,0 ,0 ,0 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
delay( 500 );
}
spiel = 1;
}

//LED greun schalten
void led_alle_rot() {
led = 0;
for (int i = 0; i < 15; i++) {
strip_pin11.setPixelColor(led,255 ,0 ,0 );
led = ( led + 1 );
}
strip_pin11.show();
delay( 500 );
}

//level 1
void level_1() {
while ( ( spiel == 1 ) ) {
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(2,0 ,255,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,0 ,255,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(6,0 ,255,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,0 ,255,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(10,0 ,255,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,0 ,255,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(14,0 ,255,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
spiel = 2;
level = 0;
}
}

//zufaelliges haengen
void zufallen_heangen() {
delay( 1500 );
while ( ( spiel == 1 ) ) {
if (( ( zufallholz == 1 ) && ( holz1 == true ) )) {

strip_pin11.setPixelColor(0,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 3 , HIGH );
holz1 = false;
delay( 1500 );
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {

strip_pin11.setPixelColor(2,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 4 , HIGH );
holz2 = false;
delay( 1500 );
}
if (( ( zufallholz == 3 ) && ( holz3 == true ) )) {

strip_pin11.setPixelColor(4,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 5 , HIGH );
holz3 = false;
delay( 1500 );
}
if (( ( zufallholz == 4 ) && ( holz4 == true ) )) {

strip_pin11.setPixelColor(6,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 6 , HIGH );
holz4 = false;
delay( 1500 );
}
if (( ( zufallholz == 5 ) && ( holz5 == true ) )) {

strip_pin11.setPixelColor(8,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 7 , HIGH );
holz5 = false;
delay( 1500 );
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

strip_pin11.setPixelColor(10,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 8 , HIGH );
holz6 = false;
delay( 1500 );
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

strip_pin11.setPixelColor(12,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 9 , HIGH );
holz7 = false;
delay( 1500 );
}
if (( ( zufallholz == 8 ) && ( holz8 == true ) )) {

strip_pin11.setPixelColor(14,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 10 , HIGH );
holz8 = false;
delay( 1500 );
}
zufallholz = random( 1 , 9 );
if (( ( holz1 == false ) && ( ( holz2 == false ) && ( ( holz3 == false ) && ( ( holz4 == false ) && ( ( holz5 == false ) && ( ( holz6 == false ) && ( ( holz7 == false ) && ( holz8 == false ) ) ) ) ) ) ) )) {

spiel = 2;
level = 0;
}
}
}

//staebe aufhaengen
void aufhaengen() {
delay( 1500 );
strip_pin11.setPixelColor(0,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 3 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(2,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 4 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(4,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 5 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(6,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 6 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(8,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 7 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(10,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 8 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(12,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 9 , HIGH );
delay( 1500 );
strip_pin11.setPixelColor(14,0 ,255 ,0 );
strip_pin11.show();
digitalWrite( 10 , HIGH );
spiel = 0;
}

//led rot schalten
void led_rot() {
strip_pin11.setPixelColor(0,255 ,0 ,0 );
strip_pin11.setPixelColor(2,255 ,0 ,0 );
strip_pin11.setPixelColor(4,255 ,0 ,0 );
strip_pin11.setPixelColor(6,255 ,0 ,0 );
strip_pin11.setPixelColor(8,255 ,0 ,0 );
strip_pin11.setPixelColor(10,255 ,0 ,0 );
strip_pin11.setPixelColor(12,255 ,0 ,0 );
strip_pin11.setPixelColor(14,255 ,0 ,0 );
strip_pin11.show();
}

//setzen
void spiel_var() {
holz1 = true;
holz2 = true;
holz3 = true;
holz4 = true;
holz5 = true;
holz6 = true;
holz7 = true;
holz8 = true;
}

//LED greun schalten
void led_alle_aus() {
led = 0;
for (int i = 0; i < 15; i++) {
strip_pin11.setPixelColor(led,0 ,0 ,0 );
led = ( led + 1 );
}
strip_pin11.show();
delay( 500 );
}

Ronnie

schwäbischer tüftler und bastler, kraftsportler, neurodivers, 45 Jahre, 1 Frau, 5 Kinder und 1003 Ideen. 

ronnie berzins at mee

Kontakt

visitenkarte