
Das Stabfangspiel ist ein Reaktions- und Geschicklichkeitsspiel für eine oder mehrere Personen. Mehrere Stäbe (z. B. Holzstäbe oder Kunststoffstäbe) hängen senkrecht in einem Kreis oder einer Reihe. Ein Spieler steht bereit, und plötzlich lässt eine Mechanik, eine zweite Person die Stäbe los. Der Spieler muss so viele Stäbe wie möglich auffangen, bevor sie den Boden berühren. Ziel ist es, Reaktionsgeschwindigkeit, Hand-Auge-Koordination und Konzentration zu trainieren – ähnlich wie bei sportlichen Reaktionstests (z. B. im Training von Fußballern oder E-Sportlern). Das Spiel kann als einfaches Holzspiel für Kinder oder als technisches Reaktionsgerät mit Arduino gebaut werden.
Ich habe mich für eine Version entschieden bei dem über dem Spielfeld mehrere Stäbe angebracht, die jeweils von Elektromagneten gehalten werden. Der Arduino wählt in zufälligen Abständen einen Stab aus und schaltet den entsprechenden Magneten ab, der Stab fällt und für jeden gefangenen Stab gibt es Punkte.
Die Version 1 (Version 2 ist im Bau), besteht aus einem Halbkreis aus OSB Holz, an dem die Magneten von unten festgeschraubt werden. Ein breites Brett verlängert den Halbkreis, bis zu einem Lautsprecher Stativ. Das Stativ sorgt für einen guten Stand und die Möglichkeit das Spiel in der Höhe zu verstellen.
Hier das noch unlackierte Holz:
Nach dem schwarz lackieren, sieht das ganze schon etwas schöner aus.
Ablauf des Arduino "Catch the Stick" Game:
- Wähle einen Modi
- Pillepalle
- Höllenritt
- Apokalypse
- Drücke Start
- Hänge die Stabe an die Magnete, wenn ein Magnet "EIN" ist, wird die LED grün
- Alle LEDs blinken 5 mal blau, dann geht es los
- Fange die Stäbe
- Die Magnete die "AUS" sind, wechseln von grün nach rot
- Sind alle Stäbe "FREI" gehen alle LEDS auf rot
- Es beginnt von vorne
Schaltung des Arduino "Catch the Stick" Game:
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
Die Version 1.1 ist noch einer Plastikbox untergebracht 
Version 1.2, ist in einer stabilen Box aus Pappe untergebracht, die Bos ist schwarz lackiert und fällt damit auf der Oberseite des Spiels gar nicht mehr auf.
Die Magnete sind von oben durch das Holz geschraubt und zusätzlich von unten und oben mit einer Unterlegscheibe gesichert.
Immer die 2 LEDs links und rechts vom Magnet, zeigt den Zustand an.
In der Version 1 habe ich die Kabel in einem Rohr verlegt, was zwar zweckmäßig aber nicht so hübsch ist.
Nachdem alles funktioniert, habe ich die Kabel in die Löcher gesteckt und alles schwarz lackiert. Damit sind (zumindest von unten) die Kabel und das Rohr nicht mehr zu sehen.
In die Hölzer sind M6 schrauben geschraubt. Dazu ein 4,5mm Loch bohren und die Schrauben ohne Dübel oder Kleber in das Holz schrauben.
In der Version 1 ist die Schrift beim Lasern nicht ganz so geworden wie gewollt. Immer die LED die an ist, dieser Modi wird gespielt.
Hier noch der Arduino CODE:
#include <Adafruit_NeoPixel.h>Adafruit_NeoPixel strip_pin11 = Adafruit_NeoPixel(30,11, NEO_GRB + NEO_KHZ800);
int zeit_aufhaengen = 1500;
int spiel = 0;
int zufallholz = 0;
int zufallzeit = 0;
int level = 0;
void Unterprogramm100();bool holz1 = true;
bool holz2 = true;
bool holz3 = true;
bool holz4 = true;
bool holz5 = true;
bool holz6 = true;
bool holz7 = true;
bool holz8 = true;
void Unterprogramm3();void Unterprogramm1();void Unterprogramm0();void Unterprogramm4();void Unterprogramm5();void Unterprogramm2();void setup() {
strip_pin11.begin();
strip_pin11.show();
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
pinMode(3, OUTPUT);
pinMode(7, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
strip_pin11.setBrightness(50);zeit_aufhaengen = 1500;spiel = 0;for (int i = 0; i < ( analogRead(4) + analogRead(5) ); i++) {
zufallholz = random( 0 , 50 );
}for (int i = 0; i < ( analogRead(4) + analogRead(5) ); i++) {
zufallzeit = random( 0 , 10000 );
}level = 0;Unterprogramm0();Unterprogramm100();}void loop() {
if (( analogRead(1) > 700 )) {level = 1;
}
if (( analogRead(2) > 700 )) {level = 2;
}
if (( analogRead(3) > 700 )) {level = 3;
}
strip_pin11.show();
if (( ( analogRead(0) > 700 ) || ( spiel == 100 ) )) {Unterprogramm1();
for (int i = 0; i < 5; i++) {
spiel = 0;
for (int i = 0; i < 30; i++) {
strip_pin11.setPixelColor(spiel,0 ,0 ,100 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
delay( 300 );
spiel = 0;
for (int i = 0; i < 30; i++) {
strip_pin11.setPixelColor(spiel,0 ,0 ,0 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
delay( 500 );
}
spiel = 1;
Unterprogramm2();
}
if (( ( level == 1 ) && ( spiel == 1 ) )) {Unterprogramm3();
}
if (( ( level == 2 ) && ( spiel == 1 ) )) {Unterprogramm4();
}
if (( ( level == 3 ) && ( spiel == 1 ) )) {Unterprogramm5();
}
if (( spiel == 2 )) {spiel = 0;
for (int i = 0; i < 30; i++) {
strip_pin11.setPixelColor(spiel,100 ,0 ,0 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
spiel = 2;
while ( ( spiel == 2 ) ) {
if (( analogRead(0) > 700 )) {spiel = 0;
for (int i = 0; i < 30; i++) {
strip_pin11.setPixelColor(spiel,0 ,0 ,0 );
spiel = ( spiel + 1 );
}
strip_pin11.show();
spiel = 100;
Unterprogramm0();
Unterprogramm100();
delay( 300 );
}
}
}
}//setzen
void Unterprogramm100() {
holz1 = true;
holz2 = true;
holz3 = true;
holz4 = true;
holz5 = true;
holz6 = true;
holz7 = true;
holz8 = true;
}//level 1
void Unterprogramm3() {
while ( ( spiel == 1 ) ) {
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,100 ,0 ,0 );
strip_pin11.setPixelColor(1,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,100 ,0 ,0 );
strip_pin11.setPixelColor(5,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,100 ,0 ,0 );
strip_pin11.setPixelColor(9,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,100 ,0 ,0 );
strip_pin11.setPixelColor(13,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(16,100 ,0 ,0 );
strip_pin11.setPixelColor(17,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(21,100 ,0 ,0 );
strip_pin11.setPixelColor(22,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(24,100 ,0 ,0 );
strip_pin11.setPixelColor(25,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
zufallzeit = random( 1000 , 4000 );
delay( zufallzeit );
strip_pin11.setPixelColor(29,100 ,0 ,0 );
strip_pin11.setPixelColor(28,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
spiel = 2;
level = 0;
}
}//greun
void Unterprogramm1() {
strip_pin11.setPixelColor(0,0 ,100 ,0 );
strip_pin11.setPixelColor(1,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 5 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(4,0 ,100 ,0 );
strip_pin11.setPixelColor(5,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 4 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(8,0 ,100 ,0 );
strip_pin11.setPixelColor(9,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 6 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(12,0 ,100 ,0 );
strip_pin11.setPixelColor(13,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 3 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(16,0 ,100 ,0 );
strip_pin11.setPixelColor(17,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 7 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(21,0 ,100 ,0 );
strip_pin11.setPixelColor(22,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 10 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(24,0 ,100 ,0 );
strip_pin11.setPixelColor(25,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 9 , HIGH );
delay( zeit_aufhaengen );
strip_pin11.setPixelColor(29,0 ,100 ,0 );
strip_pin11.setPixelColor(28,0 ,100 ,0 );
strip_pin11.show();
digitalWrite( 8 , HIGH );
delay( zeit_aufhaengen );
}//led rot
void Unterprogramm0() {
strip_pin11.setPixelColor(0,100 ,0 ,0 );
strip_pin11.setPixelColor(1,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(4,100 ,0 ,0 );
strip_pin11.setPixelColor(5,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(8,100 ,0 ,0 );
strip_pin11.setPixelColor(9,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(12,100 ,0 ,0 );
strip_pin11.setPixelColor(13,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(16,100 ,0 ,0 );
strip_pin11.setPixelColor(17,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(21,100 ,0 ,0 );
strip_pin11.setPixelColor(22,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(24,100 ,0 ,0 );
strip_pin11.setPixelColor(25,100 ,0 ,0 );
strip_pin11.show();
strip_pin11.setPixelColor(28,100 ,0 ,0 );
strip_pin11.setPixelColor(29,100 ,0 ,0 );
strip_pin11.show();
}//level 2
void Unterprogramm4() {
while ( ( spiel == 1 ) ) {
zufallholz = random( 1 , 9 );
if (( ( zufallholz == 1 ) && ( holz1 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,100 ,0 ,0 );
strip_pin11.setPixelColor(1,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
holz1 = false;
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,100 ,0 ,0 );
strip_pin11.setPixelColor(5,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
holz2 = false;
}
if (( ( zufallholz == 3 ) && ( holz3 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,100 ,0 ,0 );
strip_pin11.setPixelColor(9,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
holz3 = false;
}
if (( ( zufallholz == 4 ) && ( holz4 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,100 ,0 ,0 );
strip_pin11.setPixelColor(13,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
holz4 = false;
}
if (( ( zufallholz == 5 ) && ( holz5 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(16,100 ,0 ,0 );
strip_pin11.setPixelColor(17,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(21,100 ,0 ,0 );
strip_pin11.setPixelColor(22,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(24,100 ,0 ,0 );
strip_pin11.setPixelColor(25,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
holz7 = false;
}
if (( ( zufallholz == 8 ) && ( holz8 == true ) )) {zufallzeit = random( 1000 , 3000 );
delay( zufallzeit );
strip_pin11.setPixelColor(29,100 ,0 ,0 );
strip_pin11.setPixelColor(28,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
holz8 = false;
}
if (( ( holz1 == false ) && ( ( holz2 == false ) && ( ( holz3 == false ) && ( ( holz4 == false ) && ( ( holz5 == false ) && ( ( holz6 == false ) && ( ( holz7 == false ) && ( holz8 == false ) ) ) ) ) ) ) )) {spiel = 2;
level = 0;
}
}
}//Level3
void Unterprogramm5() {
while ( ( spiel == 1 ) ) {
zufallholz = random( 1 , 9 );
if (( ( zufallholz == 1 ) && ( holz1 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(0,100 ,0 ,0 );
strip_pin11.setPixelColor(1,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 5 , LOW );
holz1 = false;
}
if (( ( zufallholz == 2 ) && ( holz2 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(4,100 ,0 ,0 );
strip_pin11.setPixelColor(5,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 4 , LOW );
holz2 = false;
}
if (( ( zufallholz == 3 ) && ( holz3 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(8,100 ,0 ,0 );
strip_pin11.setPixelColor(9,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 6 , LOW );
holz3 = false;
}
if (( ( zufallholz == 4 ) && ( holz4 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(12,100 ,0 ,0 );
strip_pin11.setPixelColor(13,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 3 , LOW );
holz4 = false;
}
if (( ( zufallholz == 5 ) && ( holz5 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(16,100 ,0 ,0 );
strip_pin11.setPixelColor(17,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 7 , LOW );
holz5 = false;
}
if (( ( zufallholz == 6 ) && ( holz6 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(21,100 ,0 ,0 );
strip_pin11.setPixelColor(22,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 10 , LOW );
holz6 = false;
}
if (( ( zufallholz == 7 ) && ( holz7 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(24,100 ,0 ,0 );
strip_pin11.setPixelColor(25,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 9 , LOW );
holz7 = false;
}
if (( ( zufallholz == 8 ) && ( holz8 == true ) )) {zufallzeit = random( 500 , 5000 );
delay( zufallzeit );
strip_pin11.setPixelColor(29,100 ,0 ,0 );
strip_pin11.setPixelColor(28,100 ,0 ,0 );
strip_pin11.show();
digitalWrite( 8 , LOW );
holz8 = false;
}
if (( ( holz1 == false ) && ( ( holz2 == false ) && ( ( holz3 == false ) && ( ( holz4 == false ) && ( ( holz5 == false ) && ( ( holz6 == false ) && ( ( holz7 == false ) && ( holz8 == false ) ) ) ) ) ) ) )) {spiel = 2;
level = 0;
}
}
}//greun spiel
void Unterprogramm2() {
strip_pin11.setPixelColor(0,0 ,100 ,0 );
strip_pin11.setPixelColor(1,0 ,100 ,0 );
strip_pin11.setPixelColor(4,0 ,100 ,0 );
strip_pin11.setPixelColor(5,0 ,100 ,0 );
strip_pin11.setPixelColor(8,0 ,100 ,0 );
strip_pin11.setPixelColor(9,0 ,100 ,0 );
strip_pin11.setPixelColor(12,0 ,100 ,0 );
strip_pin11.setPixelColor(13,0 ,100 ,0 );
strip_pin11.setPixelColor(16,0 ,100 ,0 );
strip_pin11.setPixelColor(17,0 ,100 ,0 );
strip_pin11.setPixelColor(21,0 ,100 ,0 );
strip_pin11.setPixelColor(22,0 ,100 ,0 );
strip_pin11.setPixelColor(24,0 ,100 ,0 );
strip_pin11.setPixelColor(25,0 ,100 ,0 );
strip_pin11.setPixelColor(29,0 ,100 ,0 );
strip_pin11.setPixelColor(28,0 ,100 ,0 );
strip_pin11.show();
}

















