Interaktive magische Artefakte vermittels Arduino-Kleincomputer
Einleitung
Für das Gaslicht-LARP "The Fog" haben Sandra H., Hagen H. und Marko K. eine interaktive magische Location gebastelt, die im Idealfall den Spielern hätte erlauben sollen, ohne SL den plotrelevanten Gegenstand aus einer Menge gleichartiger Artefakte herauszufinden.
Herzstück der Anlage waren zwei Arduino-kompatible Kleincomputer. Der eine war mit einem RFID-Lesegerät und einer Infrarot-LED ausgestattet, der andere mit einem IR-Sensor und einem MP3-Shield. Außerdem wurde eine handelsübliche Farbwechsel-LED-Lampe mit IR-Fernbedienung und eine kleine Aktivbox eingesetzt.
Die Anlage wurde in ein Kulissenelement eingebaut.
Die Spieler finden im Spiel 8 Pokale. Die Pokale können in einer Vertiefung in einem keltischen Lochstein eingesetzt werden. In 4 von diesen Pokalen ist ein RFID-Chip eingebaut. Jeder der vier Pokale lässt einen Kristall im Lochstein in einer anderen Farbe aufleuchten und spielt einen anderen Geräuscheffekt mittels des MP3-Shields und der Aktivbox ab. Anhand der Farben und Geräusche können die Spieler den "wichtigen" Pokal erkennen.
Material
MP3-Shield (gibt's bei eBay auch billiger)
Grundlagen
Im Folgenden werden zumindest Grundkenntnisse in Handhabung und Programmierung des Arduino vorausgesetzt. Anleitungen und grundlegende Beispiele finden sich im Netz, zum Beispiel bei Funduino.
Ermittlung der Infrarot-Codes
Damit die LED-Lampe durch den Arduino gesteuert werden kann, muss man ermitteln, welche Signale die Infrarot-Fernbedienung bei welcher Farbeinstellung sendet. Hierfür wurde zunächst eine kleine Schaltung mit einem IR-Sensor aufgebaut, die nichts weiter tut, als empfangene Codes in den seriellen Monitor zu schreiben. Die Codes werden dann zur späteren Verwendung notiert.
1 #include <IRremote.h>
2 int RECV_PIN = 11;
3 IRrecv irrecv(RECV_PIN);
4 decode_results results;
5
6 void setup()
7 {
8 Serial.begin(9600);
9 pinMode (13, OUTPUT);
10 irrecv.enableIRIn();
11 }
12
13 void loop() {
14 if (irrecv.decode(&results)) {
15 Serial.println(results.value, DEC);
16 irrecv.resume();
17 }
18 }
Schaltung Steuergerät Licht
Die Verkabelung des RFID-Sensors folgt dem RFID-Tutorial bei Funduino.
|
Arduino Mega |
MFRC522-READER |
Pin: |
53 |
SDA |
Pin: |
52 |
SCK |
Pin: |
51 |
MOSI |
Pin: |
50 |
MISO |
Pin: |
unbelegt |
IRQ |
Pin: |
GND |
GND |
Pin: |
5 |
RST |
Pin: |
3.3V |
3.3V |
Die Verkabelung der Infrarot-LED folgt im Wesentlichen dem Tutorial bei Ken Shirriff, dem Autor der IRRemote-Library. Den Infrarotsensor tatsächlich ans Laufen zu bekommen, war ein wenig knifflig, da die Pin-Belegung zwischen verschiedenen Arduino-Modellen etwas abweicht. Beim Arduino Mega wird die LED mit dem Vorwiderstand von 100 Ohm zwischen GND und Pin 9 geschaltet (der passende Widerstand hängt allerdings von der gewählten LED ab)
Ermittlung der RFID-Codes
Damit die Anlage die verschiedenen RFID-Tags erkennt, muss man ermitteln, welche IDs die Tags senden. Hierfür wurde zunächst eine kleines Programm eingesetzt, das wiederum nur empfangene Codes in den seriellen Monitor schreibt. Dieses Programm stammt aus dem Tutorial von Funduino, nur die Pin-Nummern wurden angepasst.
1 #include <SPI.h>
2 #include <MFRC522.h>
3 #define SS_PIN 53
4 #define RST_PIN 5
5
6 MFRC522 mfrc522(SS_PIN, RST_PIN);
7
8 void setup()
9 {
10 Serial.begin(9600);
11 SPI.begin();
12 mfrc522.PCD_Init();
13 }
14
15 void loop()
16 {
17 if ( ! mfrc522.PICC_IsNewCardPresent())
18 {
19 return;
20 }
21
22 if ( ! mfrc522.PICC_ReadCardSerial())
23 {
24 return;
25 }
26
27
28 Serial.print("Die ID des RFID-TAGS lautet:");
29 for (byte i = 0; i < mfrc522.uid.size; i++)
30 {
31 Serial.print(mfrc522.uid.uidByte[i], HEX);
32 Serial.print(" ");
33 }
34 Serial.println();
35 }
Programm Steuergerät Licht
Das eigentliche Programm des Steuergeräts lauscht nun einfach auf eine neue RFID-Karte und sendet bei den bekannten Karten jeweils das entsprechende Infrarotsignal für "Lampe Anschalten" (falls nötig) und für rotes, grünes, blaues oder weißes Licht. Als Fallback wird auch bei unbekannten Karten das rote Licht angeschaltet. Das Licht wird jeweils für einen gewissen Zeitraum angelassen, es sei denn, es wird in der Zwischenzeit eine andere bekannte Karte erkannt.
1 #include <SPI.h>
2 #include <IRremote.h>
3 #include <MFRC522.h>
4 #define SS_PIN 53
5 #define RST_PIN 5
6 MFRC522 mfrc522(SS_PIN, RST_PIN);
7 int sekunden;
8 int isAn;
9 IRsend irsend;
10
11 void sendeAus()
12 {
13 irsend.sendNEC(0xFFF807, 32);
14 isAn=0;
15 }
16 void sendeAn()
17 {
18 if (isAn==0){
19 irsend.sendNEC(0xFFB04F, 32);
20 irsend.sendNEC(0xFFB04F, 32);
21 irsend.sendNEC(0xFFB04F, 32);
22 irsend.sendNEC(0xFFB04F, 32);
23 isAn=1;
24 }
25 }
26 void sendeRot()
27 {
28 irsend.sendNEC(0xFF9867, 32);
29 }
30 void sendeBlau()
31 {
32 irsend.sendNEC(0xFF8877, 32);
33 }
34 void sendeGruen()
35 {
36 irsend.sendNEC(0xFFD827, 32);
37 }
38 void sendeWeiss()
39 {
40 irsend.sendNEC(0xFFA857, 32);
41 }
42
43
44 void setup()
45 {
46 Serial.begin(9600);
47 SPI.begin();
48 mfrc522.PCD_Init();
49 sekunden=0;
50 isAn=0;
51 /* sendeAn();
52 sendeWeiss();*/
53 }
54
55 void loop()
56 {
57 if (sekunden > 0)
58 {
59 sekunden--;
60 delay(1000);
61 } else
62 {
63 sendeAus();
64 }
65 if ( ! mfrc522.PICC_IsNewCardPresent())
66 {
67 return;
68 }
69
70 if ( ! mfrc522.PICC_ReadCardSerial())
71 {
72 return;
73 }
74
75 long code=0;
76 for (byte i = 0; i < mfrc522.uid.size; i++)
77 {
78 code=((code+mfrc522.uid.uidByte[i])*10);
79 }
80
81 if (code==2198740)
82 {
83 sendeAn();
84 sendeGruen();
85 sekunden=10;
86 } else if (code==910380)
87 {
88 sendeAn();
89 sendeWeiss();
90 sekunden=10;
91 }
92 else if (code==383550)
93 {
94 sendeAn();
95 sendeBlau();
96 sekunden=10;
97 }
98 else
99 {
100 sendeAn();
101 sendeRot();
102 sekunden=10;
103 }
104 }
Schaltung Steuergerät Geräusch
Der MP3-Shield wird nach Vorschrift auf den Arduino Uno aufgesetzt. Die nicht verwendeten Pins werden nach unten durchgeschleift, so dass der IR-Sensor entsprechend dem Tutorial oben auf dem MP3-Shield angeschlossen werden kann. Hierbei muß allerdings der Ausgabe-Pin des Sensors an Pin 13 statt 11 des Arduino angeschlossen werden. Die Variable irRemotePin wird entsprechend initialisiert.
Programm Steuergerät Geräusch
Das Programm zur Steuerung der Geräuscheffekte lauscht auf die Infrarotsignale, die auch die Farben der Lampe steuern und spielt zu jedem Signal einen passenden MP3-Track. Da bei mehrmaligem Empfang des gleichen Signals der Track von vorne gespielt würde, wird das erneute Anspielen für jeden Track eine bestimmte Zeit lang verhindert. Da sich mit dem Delay-Befehl in der loop-Schleife nur ungefähre Zeiträume einstellen lassen, muß hier etwas ausgetüftelt werden, welche Werte für "wartezeit" sinnvoll sind.
1 #include <MP3.h>
2 #include <SoftwareSerial.h>
3 #include <IRremote.h>
4 int volume = 20;
5 int warte [4] = {0,0,0,0};
6 int wartezeit [4] = {12,21,40,5};
7
8 /** define mp3 class */
9 MP3 mp3;
10
11
12 int irRemotePin = 13;
13 IRrecv irrecv(irRemotePin);
14 decode_results results;
15
16 void spiele(int track)
17 {
18 if (warte[track-1] > 0)
19 {
20 warte[track-1]--;
21 delay(500);
22 } else
23 {
24 for (int i=0; i<4; i++)
25 {
26 warte[i] = 0;
27 }
28 warte[track-1]=wartezeit[track-1];
29 mp3.play_sd(track);
30 }
31 }
32
33 // the setup routine runs once when you press reset:
34 void setup() {
35 // initialize the digital pin as an output.
36 pinMode(irRemotePin, INPUT);
37 /** begin function */
38 //delay(3000);
39 mp3.begin(MP3_SOFTWARE_SERIAL); // select software serial
40 //mp3.begin(MP3_HARDWARE_SERIAL);
41 // select hardware serial(or mp3.begin(MP3_HARDWARE_SERIAL);)
42 /** set volum to the default */
43 mp3.volume(volume);
44 /** set MP3 Shield CYCLE mode */
45 mp3.set_mode(MP3::SINGLE);
46
47 Serial.begin(9600);
48 irrecv.enableIRIn(); // Start the receiver
49
50 /** wait until arduino mp3 shield get ready */
51 }
52
53 // the loop routine runs over and over again forever:
54 void loop() {
55 if (irrecv.decode(&results)) {
56 Serial.println(results.value,HEX);
57 irrecv.resume(); // Receive the next value
58 switch(results.value)
59 {
60 case 0xFF9867: Serial.println("ROT_spiel0001"); spiele(1) ;break;
61 case 0xFFD827: Serial.println("Gruen_spiel0002"); spiele(2);break;
62 case 0xFFA857: Serial.println("Blau_spiel0003"); spiele(3);break;
63 case 0xFF8877: Serial.println("Weiss_spiel0004"); spiele(4);break;
64 }
65 }
66 }
Zusammenbau
Beide Schaltungen wurden zusammen mit einer 9V-Batterie in einer aufgeschnittenen Chipsdose untergebracht. Zur besseren Wartung wurde diese danach nicht wieder fixiert, sondern blieb relativ leicht zu öffnen. Die Dose wurde dann in einen Hohlraum in der Lochstein-Kulisse eingesetzt.
Der RFID-Sensor befand sich dabei am oberen Ende, so dass die Kelche fast unmittelbar auf den Sensor gesetzt werden konnten. Die LED-Lampe befand sich am unteren Ende und beleuchtete einen im Lochstein angebrachten Bergkristall.
Praktisches Fazit
Die Anlage hat im Test einwandfrei funktioniert. Auch im Spiel war die Anlage grundsätzlich funktionsfähig. Allerdings waren die Komponenten der Schaltung nicht ausreichend stabil verkapselt und vermutlich ist beim Einbau oder bei irgendeiner Kontrolle die Schaltung beschädigt worden. Oder die Schaltung war nicht ausreichend robust gegenüber Temperatur und Feuchtigkeit im Außenbereich. Das Ergebnis war jedenfalls, dass die Stromversorgung nur sehr kurz gehalten hat. Daher ist der ursprüngliche Plan, die Anlage einfach im Spielgelände stehen zu lassen und die Spieler nach eigenem Zeitplan und ohne SL mit der Anlage spielen zu lassen, nicht erfolgreich umgesetzt worden. Die SL war teilweise gezwungen, im "Time Freeze" die Batterien auszuwechseln.
Es sollte also darauf geachtet werden, die Schaltung ausreichend sicher als gekapseltes Bauelement zu entwerfen, um Kabelbrüche, Kurzschlüsse oder schlechte Lötstellen zu vermeiden.
Auf dem Mittelpunkt 2017 habe ich eine kurze Präsentation auf Basis dieses Artikels in der "Designers Hour" gehalten. Hier ist die Vorlage dazu
-- RalfHüls 2016-01-30 00:59:36