Kinder Electric
mit Mikrocontroller und Fotowiderständen
Mit dem wohlbekannten und populären Spiel „Kinder Electric“ haben wir uns bereits beschäftigt. In seiner Grundausführung ist die notwendige
Beschaltung äußerst einfach. Um es etwas interessanter zu gestalten, haben wir in dem Beispiel eine „Falsche Antwort“-LED eingeführt, was die Schaltung auch ein wenig
anspruchsvoller machte. Doch ein großer Nachteil der Schaltung wurde in dem Versuch nicht ausgeschmerzt. Alle Frage- und Antwort-Buchsen waren mit Drahtbrücken fest
miteinander verknüpft, was bedeutet, dass die richtige Antwort für jeweilige Frage-Buchse immer auf dem gleichen Platz stand. Das würde nach einiger Zeit
unweigerlich dazu führen, dass man die richtige Antwort auch ohne sie eigentlich zu kennen erraten könnte.
Die Schaltung kann man unter diesem Link erreichen:
In dem neuen Versuch wollen wir diese Lücke schließen. Zu diesem Zweck werden die Karten mit Fragen und Antworten kodiert. Das führt dazu, dass von Karte zu
Karte andere Verknüpfungen der Frage- und Antwort-Buchsen gebildet werden. So wird ausgeschlossen, dass man anhand des Schemas der davor benutzten Karten erraten kann,
welche Antwort auf die gestellte Frage die richtige ist.
Die Kodierung der Karten wird mithilfe von Leuchtdioden und Fotowiderständen realisiert. In dem Beispiel kommen drei Fotowiderstände zum Einsatz, was bedeutet,
dass sieben unterschiedliche Abhängigkeiten der Frage- und Antwort-Buchsen realisierbar sind. Bei Bedarf kann man die Zahl der Fotowiderstände erhöhen und mehr
Kodierungsmöglichkeiten erschaffen.
Die Fotowiderstände werden jeweils von einer Leuchtdiode beleuchtet. Beim Einstecken einer Frage-Antwort-Karte werden die Leuchtdioden verdeckt, was dazu führt,
dass der Widerstand der Fotowiderstände sich verändert. Die Fotowiderstände bilden mit festen Widerständen von 10 kOhm drei Spannungsteiler. Die Spannung der
Spannungsteiler wird anschließend über analoge Eingänge des Mikrocontrollers erfasst. Anhand der Spannungswerte bestimmt er den Spielmodus und damit die Verbindungen
zwischen Frage- und Antwort-Buchsen.
Mikrocontroller
Die Entscheidungen, ob die Antworten richtig oder falsch sind, übernimmt Arduino Uno. Vier Eingänge, Pins 2,3,4 und 5, verraten ihm, in welche Frage-Buchse
der Frage-Stecker gesteckt wurde. Vier weitere Eingänge, Pins 6,7,8,9, liefern ihm die Information, welche Antwort-Buchse gewählt wurde. Mit zwei Leuchtdioden,
Ausgänge 10 und 11, teilt er der Außenwelt mit, ob die Antwort falsch oder richtig ist. Dabei beachtet er stets, welcher Karten-Modus eingestellt ist. Das wird mit
drei Spannungsteiler, die jeweils einen Fotowiderstand enthalten, festgelegt. Die Spannungen der Spannungsteiler werden an den analogen Eingängen A0, A1 und A2
abgefragt. Beim Einstecken einer Frage-Antwort-Karte werden vordefinierte Fotowiderstände verdeckt, wodurch ihre Widerstände sich ändern und die betreffenden
Spannungsteiler andere Spannungen liefern.
Schaltplan
Um Eingänge zu sparen, werden die Frage- und Antwort-Buchsen über Sperrdioden mit Eingängen des Mikrocontrollers verbunden. Für die Frage-Buchsen
sind vier Eingänge, Pins 2,3,4 und 5 zuständig. Dank entsprechender Verdrahtung werden die Nummern der Frage-Buchsen binär-kodiert dem Mikrocontroller mitgeteilt.
Wenn z.B. die Frage-Buchse Nr. 7 gewählt und über den Stecker ST1 mit Masse verbunden wird, werden drei Eingänge aktiv: Pin 2, Pin 3 und Pin 4. Pin 5 bleibt unberührt.
Jeder Pin hat andere Wertigkeit: 0/1, 0/2, 0/4 oder 0/8 (deaktiviert/aktiv). Daraus ergibt sich für den Mikrocontroller die Information, dass Frage-Buchse Nr. 7
(1+2+4+0) gewählt wurde.
Ähnlich gestaltet sich die Situation bei Antwort-Buchsen. Hier kommen die Pins 6,7,8 und 9, die ebenfalls als Eingänge definiert sind, ins Spiel. Wird in dem Feld die
Antwort-Buchse Nummer 6 gewählt, werden über den Stecker ST2 die Eingänge Pin 7 und Pin 8 mit Masse verbunden und so aktiviert. Auch hier werden die Informationen von Pin 6
bis Pin 9 (0/1, 0/2, 0/4, 0/8) binär kodiert. In dem Fall handelt es sich bei der „verstecken“ Zahl um 6 (0+2+4+0).
Bei LED1 handelt es sich um rote Leuchtdiode für falsche Antworten. Die LED2 ist gelb und blinkt bei richtigen Antworten. Die LEDs Nummer 3 bis 5 beleuchten die
Fotowiderstände R3, R5 und R7. Die Widerstände R3 bis R8 bilden paarweise Spannungsteiler, die dem Mikrocontroller mitteilen, welcher Fotowiderstand abgedeckt wurde.
Auf diese Weise, ebenfalls binär kodiert, ermittelt der Mikrocontroller, um welchem Spielmodus es
sich gerade handelt.
Programm (Sketch)
// ************************************************************************************************
// Kinder Electric mit Mikrocontroller
// Eine Schaltung mit Arduino Uno und Fotowiderständen.
// Arduino IDE 2.3.2
// ************************************************************************************************
int Fotowiderstand_1 = A0; // Analoge Eingänge für Karten-Modus
int Fotowiderstand_2 = A1;
int Fotowiderstand_3 = A2;
int Fragebuchsen_Bits [4] = {2,3,4,5}; // Kodierung Fragebuchsen
int Antwortbuchsen_Bits [4] = {6,7,8,9}; // Kodierung Antwortbuchsen
int Kartenmodus_Analog [3] = {A0, A1, A2}; // Kodierung Karten-Modus
// Zuordnung der Antwortbuchsen zu
// Fragebuchsen abhängig von Karten-
// Modus:
int Frage_Antwort_Tabelle [4][9] = {{5,8,2,4,9,3,1,7,6},
{4,7,5,1,9,8,3,6,2},
{8,9,3,6,1,4,2,7,5},
{9,1,4,7,2,5,3,8,6} };
int Rote_LED = 10; // Status LED - falsche Antwort
int Gelbe_LED = 11; // Status LED - richtige Antwort
byte Wert [2]; // Zwischen Byte-Variable
int Bit_Wert;
// Atuelle Nummer der Frage- und
// Antwort Buchse und Karten-Modus
int Frage_Buchse, Antwort_Buchse, Karten_Modus;
unsigned long Millis_Aktuell, Millis_Alt; // Zeitmessung Blinker
bool Blinker;
// ************************************************************************************************
void setup() {
for (int i=0; i<4; i++) { // Digitale Eingänge
pinMode(Fragebuchsen_Bits [i], INPUT_PULLUP);
pinMode(Antwortbuchsen_Bits [i], INPUT_PULLUP);
}
pinMode(Rote_LED, OUTPUT); // Digitale Ausgänge
pinMode(Gelbe_LED, OUTPUT);
Millis_Alt = millis(); // Millisekunden aktuell festhalten
}
// ************************************************************************************************
void loop() {
// Blinker ------------------------------------------------------------------------------------
Millis_Aktuell = millis(); // Blinker alle 400 ms
if (Millis_Aktuell > (Millis_Alt + 400)) {
Blinker = !Blinker;
Millis_Alt = millis();
}
// Hier wird ermittelt, welcher Karten-Modus aktiviert wurde. ---------------------------------
Wert [0] = 0;
for (int i=0; i<3; i++) {
int Analog_Wert = analogRead (Kartenmodus_Analog [i]);
if (Analog_Wert > 800) { Bit_Wert= 0; } else { Bit_Wert = 1; }
bitWrite (Wert[0], i, Bit_Wert);
Karten_Modus = Wert[0]; // Aktueller Karten-Modus
}
// Hier wird ermittelt, in welche Frage- oder Antwort-Buchse ein Stecker gesteckt wurde. ------
Frage_Buchse = 0;
Antwort_Buchse = 0;
Wert [0] = 0; Wert [1] = 0;
for (int i=0; i<4; i++) {
Bit_Wert = digitalRead(Fragebuchsen_Bits [i]);
bitWrite (Wert[0], i, !Bit_Wert);
Frage_Buchse = Wert[0]; // Aktuelle Frage
Bit_Wert = digitalRead(Antwortbuchsen_Bits [i]);
bitWrite (Wert[1], i, !Bit_Wert);
Antwort_Buchse = Wert[1]; // Aktuelle Antwort
}
// Hier wird ermittelt, ob auf gestellte Frage die richtige Antwort folgte --------------------
delay(100);
if ((Frage_Buchse > 0) && (Antwort_Buchse > 0)) {
if (Frage_Antwort_Tabelle [Karten_Modus-1][Frage_Buchse-1] != Antwort_Buchse) {
digitalWrite(Rote_LED, HIGH); // Falsche Antwort
digitalWrite(Gelbe_LED, LOW);
} else {
if (Blinker) {
digitalWrite(Gelbe_LED, HIGH); // Richtige Antwort
} else {
digitalWrite(Gelbe_LED, LOW);
}
digitalWrite(Rote_LED, LOW);
}
} else {
digitalWrite(Gelbe_LED, LOW); // Warten auf Frage und Antwort
digitalWrite(Rote_LED, LOW);
}
}
// ************************************************************************************************
Spielmodus
Durch Veränderung des Spielmodus werden auch die Verbindungen zwischen den zuständigen Frage- und Antwort-Buchsen verändert. Dank dessen ist es zwecklos,
sich zu merken, welche Antwort-Buchse zu welcher Frage-Buchse gehört. Bei einer weiteren Spieltafel wird der Modus geändert und die Antworten stehen dann auf anderen
Plätzen. Hier ein Beispiel für Frage-Buchsen Nummer 3 und 6.
Spielmodus 1
Im Modus 1 ist die Frage-Buchse Nr. 3 mit der Antwort-Buchse Nr. 2 verbunden. Entsprechend Nummer 6 mit 3.
Spielmodus 2
Im Modus 2 sehen die Verbindungen jetzt anders aus: Frage Platz 3 ist jetzt mit Antwort Platz 5 verbunden. Entsprechend Nummer 6
mit 8.
Spielmodus 3
Verbindungen im Modus 3.
Spielmodus 4
Auch im Modus 4 gestalten sich die Verbindungen anders.
Ein Modus wird dadurch bestimmt, dass bestimmte Fotowiderstände von den sie beleuchtenden Leuchtdioden verdeckt werden. In dem Beispiel werden zu diesem
Zweck einfach kleine Fragmente der Frage-Antwort-Karte herausgeschnitten. Die nicht herausgeschnittenen Fragmente der Karten trennen dann beim Einstecken die
Leuchtdioden von den Fotowiderständen.
Wenn z.B. im unterem Bereich aus der Karte die Abdeckfragmente 1 und 3 herausgeschnitten werden, wird der zweite Fotowiderstand (R5) mit dem
Fragment 2 abgedeckt. Er wird jetzt von seiner Leuchtdiode (LED4) nicht mehr beleuchtet und verändert folglich seinen Widerstand. Der Spannungsteiler R5-R6
liefert jetzt am Eingang A1 andere Spannung, was der Mikrocontroller erfasst und daraus den Spielmodus herleitet. In dem Fall handelt es sich um Spielmodus
Nummer 2.
Fotowiderstand
Je nachdem wie ein Fotowiderstand beleuchtet wird, verändert er seinen Widerstand. Je heller es wird, umso kleiner wird sein Widerstand.
Zusammen mit einem festen Widerstand kann ein Spannungsteiler gebildet werden. Je nach Beleuchtung liefert der Spannungsteiler unterschiedliche
Spannungen, die gemessen werden können.
Frage-Antwort Tabelle
Die Verbindungen Frage-Antwort, die vom jeweiligen Modus abhängen, sind in der Variable Frage_Antwort_Tabelle enthalten. Sie ist als
zweidimensionales Array definiert.
[4] – Vier Modi vordefiniert
[9] – Neun Verknüpfungen pro Modus
Die Handhabung der Tabelle ist nicht schwer. Wenn der Mikrocontroller feststellt, dass gerade Modus Nummer 3 vorgewählt wurde und der ST1-Stecker in die
Frage-Buchse Nummer 4 gesteckt wurde, kann er aus der Tabelle entnehmen, dass die richtige Antwort oberhalb der Antwort-Buchse
Nummer 6 steht.
Die Mikrocontroller, den man auch als abgespeckte Computer ansehen kann, gehören zu den leistungsfähigsten Mikrochips der Elektronik-Welt. Versehen
mit einem kleinen Programm können sie Aufgaben bewältigen, die mit herkömmlichen elektronischen Teilen nur schwer oder gar nicht realisierbar sind. Dabei sind sie
äußerst flexibel. Man erstellt ein neues Programm und schon ist der Mikrocontroller in einer ganz anderen Welt tätig.
Was gestern für jeden Neueinsteiger nur schwer verständlich war, wie z.B. Assembler-Programmierung, wird heute zum Kinderspiel. Neue Software übernehmen viele Aufgaben,
machen Programmierung einfach und erleichtern damit den Einstieg jedem Anfänger erheblich. Es ist eine gute Zeit, jetzt mit Mikrocontroller-Experimenten
anzufangen.
TPS: Tatenprogrammierbare Steuerung. Versuche und Experimente mit dem Mikrocontroller HT46F47E. Zum Programmieren
werden lediglich zwei Tastschalter benötigt.
Ein Mikrocontroller mit Zusätzen (SoC). Er hat eingebaute Touchsensoren, verfügt über WLAN und Bleutooth und
kann u.a. mit Arduino IDE programmiert werden.
Raspberry Pi ist vollwertiger Computer und hat mit kleinen PICs oder ATtinys denkbar wenig zu tun. Da die Entwickler dem Raspi eine kleine
Elektronik-Schnittstelle für elektronische Experimente hinzugefügt haben, kommt er auch in unsere Reihe der
Mikrocontroller.