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.
Dies ist die Version 1, eher experimentell. Version 2 ist im Bau, dann in superschön ;-)
Das Gestell des Spiels besteht aus einem Stativ für Lautsprecher und einem Halbkreis aus OSB Holz.
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 2 Vorteile haben. 1, das klicken der Relais ist zu deutlich vor dem lösen des Magnetes zu hören, damit hat der Spieler einen zeitlichen Vorteil. 2, die L298N, verbraucht kaum Leistung des Arduino. 8 Relaisspulen "ziehen" einiges an Strom. Deshalb also H-Brücken und keine Relais. 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.
- Orange = + 5 Volt vom Arduino
- Blau = - GND
- Rot = + 12 Volt vom Netzteil
Die Version 1 ist noch einer Plastikbox untergebracht
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ässig aber nicht so hübsch ist.
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();
}