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 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.
🧩 Spielregeln
- Stelle dich mittig vor das Spiel.
- Wähle eine Schwierigkeitsstufe durch drücken von grün, gelb oder rot, (leicht, mittel oder schwer).
- Leicht: Die Stäbe fallen von links nach rechts der Reihe nach, im Abstand zwischen 1 und 3 Sekunden.
- Mittel: Die Stäbe fallen zufällig, im Abstand zwischen 1 und 3 Sekunden.
- 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.
- Hänge die acht Stäbe senkrecht an die Magneten (LED rot = Magnet aus, LED grün = Magnet an).
- Nach dem Startsignal (5 mal blaues LED blinken) warte aufmerksam, die Stäbe fallen zufällig!
- Fange den fallenden Stab, bevor er den Boden berührt.
- Für jeden gefangenen Stab gibt es einen Punkt.
- Wenn ein Stab den Boden berührt, endet die Runde oder du verlierst einen Punkt.
- 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.
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.
⚡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
🔨 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.
Die Schaltung auf dem unteren Halbkreis, damit die Kabel nicht eingeklemmt oder beschädigt werden, habe ich Kabelkanal verwendet.
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.
Die in das Holz gedrehten M6 Schrauben halten die Stäbe sicher am Magenten.
⌨️ 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 );
}










