kk logo

bauanleitung Arduino Catch the Stick Spiel 8Catch 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 der Magnete los – und der zugehörige Stab fällt. Jetzt heißt es blitzschnell reagieren und den fallenden Stab fangen, bevor er den Boden berührt!

Hier gibt es die Version 1, nur mit einem Brett ohne Gehäuse: https://www.kreativekiste.de/catch-the-stick-version-1

🎯 Ziel des Spiels

Ziel ist es, so viele Stäbe wie möglich zu fangen bevor sie den Boden berühren. Das Spiel testet Reaktionsfähigkeit, Aufmerksamkeit und Hand-Auge-Koordination – perfekt für schnelle Duelle oder als Training für Reflexe und Konzentration.

bauanleitung Arduino Catch the Stick Spiel 6

 

🧩 Spielregeln

  1. Stelle dich mittig vor das Spiel.
  2. Wähle eine Schwierigkeitsstufe durch drücken von grün, gelb oder rot, (leicht, mittel oder 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.  
  3. Hänge die acht Stäbe senkrecht an die Magneten (LED rot = Magnet aus, LED grün = Magnet an). 
  4. Nach dem Startsignal (5 mal blaues LED blinken) warte aufmerksam, die Stäbe fallen zufällig!
  5. Fange den fallenden Stab, bevor er den Boden berührt.
  6. Für jeden gefangenen Stab gibt es einen Punkt.
  7. Wenn ein Stab den Boden berührt, endet die Runde oder du verlierst einen Punkt.
  8. Wer am Ende die meisten Stäbe gefangen hat, gewinnt!

Die Idee das Spiel "schwäbisch" zu nenen, fande ich am Anfang genial, leider sieht das K zu sehr nach einem H aus weshalb, es schwer zu lesen ist. In der Version 3 werde ich das Spiel einfach beim englischen Text lassen. 

bauanleitung Arduino Catch the Stick Spiel 5

 

In der Version 3 darf ich kein OSB Holz verwenden. Der Lack hält schlecht aber vor allem ist das Muster der Platten immer zu sehen. Ebenfalls werde ich in Version 3 den LED Streifen durch einzelne LEDs ersetzen, da mir der auf das Holz geklebte LED Streifen nicht gut gefällt. 

bauanleitung Arduino Catch the Stick Spiel 7

⚡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. Der Übersicht wegen habe ich die Kabel der Spannungsversorgung nur angedeutet. Das LED Band ist ein DC5Volt WS2812B.

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

3 Catch the Stick Spiel mit Arduino und Rohren einfach selber bauen

🔨 Bauanleitung

 In der Version 1 habe ich die Magnete einfach "nur" auf das Brett geschraubt und die Schaltung in eine Kiste gepackt. In diesem Fall habe ich den Halbkreis 2 mal ausgesägt. Die Schaltung auf den ersten Kreis gebaut und den 2 Halbkreis dann mit Abstandshalter auf den ersten geschraubt. Mit einem 3mm Balsaholz, dass sich leicht biegen lässt habe ich das Gehäuse dann geschlossen und Lackiert. 

bauanleitung Arduino Catch the Stick Spiel 4

Die Schaltung auf dem unteren Halbkreis, damit die Kabel nicht eingeklemmt oder beschädigt werden, habe ich Kabelkanal verwendet. 

bauanleitung Arduino Catch the Stick Spiel 3

 

Auch hier habe ich wieder ein Lautsprecher-Stativ verwendet. In das Rohr habe ich den Stiel von einem Rechen gesteckt und festgeschraubt. Die Taster sind in einem kleinen Holzgehäuse verbaut. Die Schwierigkeitsstufe muss nicht ausgewählt werden, sondern wird nach dem Ampelprinzip durch drücken ausgewählt. Grün - einfach, gelb - mittel, rot - schwer. 

bauanleitung Arduino Catch the Stick Spiel 1

 Die in das Holz gedrehten M6 Schrauben halten die Stäbe sicher am Magenten. 

Arduino Geschicklichkeitsspiel Catch the Stick

⌨️ Arduino Programm

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel strip_pin5 = Adafruit_NeoPixel(30,5, NEO_GRB + NEO_KHZ800);
int zeit_aufhaengen = 1500;
int spiel = 0;
int level = 0;
int zufallholz = 0;
int zufallzeit = 0;
void zufallen_heangen();

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 level_1();

void led_alle_rot();

int led = 0;
void spiel_var();

void level_2();

void led_rot();

void aufhaengen();

void blinken();

void led_alle_aus();

void setup() {
strip_pin5.begin();
strip_pin5.show();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
strip_pin5.setBrightness(70);

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 );
}

spiel_var();

led_alle_rot();

}

void loop() {
if (!( digitalRead(2) )) {

spiel = 1;
led_alle_aus();
led_rot();
aufhaengen();
blinken();
led_rot();
level_1();
led_alle_rot();
}
if (!( digitalRead(3) )) {

spiel = 1;
led_alle_aus();
led_rot();
spiel_var();
aufhaengen();
blinken();
led_rot();
spiel_var();
level_2();
led_alle_rot();
}
if (!( digitalRead(4) )) {

spiel = 1;
led_alle_aus();
led_rot();
spiel_var();
zufallen_heangen();
blinken();
led_rot();
spiel = 2;
spiel_var();
level_3();
led_alle_rot();
}
}

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

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

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

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

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

strip_pin5.setPixelColor(16,0 ,255 ,0 );
strip_pin5.setPixelColor(17,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 10 , HIGH );
holz5 = false;
delay( 1500 );
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

strip_pin5.setPixelColor(21,0 ,255 ,0 );
strip_pin5.setPixelColor(22,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 11 , HIGH );
holz6 = false;
delay( 1500 );
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

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

strip_pin5.setPixelColor(28,0 ,255 ,0 );
strip_pin5.setPixelColor(29,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 13 , HIGH );
holz8 = false;
delay( 1500 );
}
zufallholz = random( 1 , 9 );
Serial.print(zufallholz );
Serial.println();
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_pin5.setPixelColor(0,0 ,255 ,0 );
strip_pin5.setPixelColor(1,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 6 , LOW );
holz1 = false;
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {

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

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

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

zufallzeit = random( 500 , 7000 );
delay( zufallzeit );
strip_pin5.setPixelColor(16,0 ,255 ,0 );
strip_pin5.setPixelColor(17,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 10 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin5.setPixelColor(21,0 ,255 ,0 );
strip_pin5.setPixelColor(22,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 11 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

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

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

spiel = 0;
level = 0;
}
}
}

//level 1
void level_1() {
while ( ( spiel == 1 ) ) {
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(0,0 ,255 ,0 );
strip_pin5.setPixelColor(1,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 6 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(4,0 ,255,0 );
strip_pin5.setPixelColor(5,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 7 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(8,0 ,255,0 );
strip_pin5.setPixelColor(9,0 ,255,0 );
strip_pin5.show();
digitalWrite( 8 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(12,0 ,255,0 );
strip_pin5.setPixelColor(13,0 ,255,0 );
strip_pin5.show();
digitalWrite( 9 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(16,0 ,255,0 );
strip_pin5.setPixelColor(17,0 ,255,0 );
strip_pin5.show();
digitalWrite( 10 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(21,0 ,255,0 );
strip_pin5.setPixelColor(22,0 ,255,0 );
strip_pin5.show();
digitalWrite( 11 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(24,0 ,255,0 );
strip_pin5.setPixelColor(25,0 ,255,0 );
strip_pin5.show();
digitalWrite( 12 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin5.setPixelColor(28,0 ,255,0 );
strip_pin5.setPixelColor(29,0 ,255,0 );
strip_pin5.show();
digitalWrite( 13 , LOW );
spiel = 2;
level = 0;
}
}

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

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

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

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

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

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

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

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin5.setPixelColor(16,0 ,255,0 );
strip_pin5.setPixelColor(17,0 ,255,0 );
strip_pin5.show();
digitalWrite( 10 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {

zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin5.setPixelColor(21,0 ,255,0 );
strip_pin5.setPixelColor(22,0 ,255,0 );
strip_pin5.show();
digitalWrite( 11 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {

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

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

spiel = 2;
level = 0;
}
}
}

//led rot schalten
void led_rot() {
strip_pin5.setPixelColor(0,255 ,0 ,0 );
strip_pin5.setPixelColor(1,255 ,0 ,0 );
strip_pin5.setPixelColor(4,255 ,0 ,0 );
strip_pin5.setPixelColor(5,255 ,0 ,0 );
strip_pin5.setPixelColor(8,255 ,0 ,0 );
strip_pin5.setPixelColor(9,255 ,0 ,0 );
strip_pin5.setPixelColor(12,255 ,0 ,0 );
strip_pin5.setPixelColor(13,255 ,0 ,0 );
strip_pin5.setPixelColor(16,255 ,0 ,0 );
strip_pin5.setPixelColor(17,255 ,0 ,0 );
strip_pin5.setPixelColor(21,255 ,0 ,0 );
strip_pin5.setPixelColor(22,255 ,0 ,0 );
strip_pin5.setPixelColor(24,255 ,0 ,0 );
strip_pin5.setPixelColor(25,255 ,0 ,0 );
strip_pin5.setPixelColor(28,255 ,0 ,0 );
strip_pin5.setPixelColor(29,255 ,0 ,0 );
strip_pin5.show();
}

//staebe aufhaengen
void aufhaengen() {
delay( 1500 );
strip_pin5.setPixelColor(0,0 ,255 ,0 );
strip_pin5.setPixelColor(1,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 6 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(4,0 ,255 ,0 );
strip_pin5.setPixelColor(5,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 7 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(8,0 ,255 ,0 );
strip_pin5.setPixelColor(9,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 8 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(12,0 ,255 ,0 );
strip_pin5.setPixelColor(13,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 9 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(16,0 ,255 ,0 );
strip_pin5.setPixelColor(17,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 10 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(21,0 ,255 ,0 );
strip_pin5.setPixelColor(22,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 11 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(24,0 ,255 ,0 );
strip_pin5.setPixelColor(25,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 12 , HIGH );
delay( 1500 );
strip_pin5.setPixelColor(28,0 ,255 ,0 );
strip_pin5.setPixelColor(29,0 ,255 ,0 );
strip_pin5.show();
digitalWrite( 13 , HIGH );
spiel = 0;
}

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

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

Ronnie

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

ronnie berzins at mee

Zitat des Monats

Denn du bist ein Unikat, einzig in deiner Art
Wir alle ecken an so wie in ein Quadrat
Du bist ein Unikat, du bist so wie du bist
Egal, was sie labern, wir geben kein'n Fick.

SDP, Unikat