Multi Function Shield mit Lichtschranken-Modul KY-010

Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.

Heute wird ein weiteres Bauteil meiner 37-in-one-Sensoren-Bulk-Bestellung behandelt. Es ist das Lichtschrankenmodul KY-010.

Hardware: Modul KY-010


Zu allererst galt es mal wieder, das Modul zu identifizieren, denn eine Bezeichnung fehlte mal wieder. Aber der Vergleich mit Fotos aus dem Internet ergab, dass es sich um ein KY-010 handelt, einem Lichtschrankenmodul.

Es besteht im Prinzip um eine schwarze, auf den Kopf gestellte Brücke, an dessen Seiten ein Infrarot-Sender (IR-LED) und ein Infrarot-Empfänger (Foto-Transistor) eingebaut sind.

Das Prinzip ist ganz einfach: ein Infrarot-Lichtstrahl wird durch die LED losgeschickt und auf der anderen Seite durch den Fototransistor erkannt und die Signal-Leitung wird auf HIGH geschaltet. Wird jetzt irgendetwas zwischen die Brücke gebracht, wird der Lichtstrahl unterbrochen und das Signal wird LOW.

Das der Lichtstrahl Infrarotlicht benutzt, hat den Vorteil, dass nur dieses erkannt wird und normaler Tageslicht, das einfällt die Messung nicht stört. So kann außerdem mit sehr viel geringeren Lichtstärken gearbeitet werden, was den Stromverbrauch reduziert.

Doch wozu kann man dieses Mini-Schlitz überhaupt praktisch gebrauchen? Nun, man kann z. B. ein geknicktes Stück Papier dazwischen klemmen und das andere Ende mit einer Türklinge oder ähnlichem verbinden. Wird die Klinke niedergedrückt, wird das Papier herausgerissen und die Lichtschranke ist nicht mehr unterbrochen. Das kann ein Mikrocontroller registrieren und Alarm geben.


Oder man nutzt die Lichtschranke zusammen mit Lochscheiben. Diese haben wie auf dem Bild zusehen Einkerbungen an der Seite, die bei einer Drehung des Rades abwechselnd Licht durchlassen und dann wieder den Lichtstrahl unterbrechen. So kann man die Geschwindigkeit feststellen, mit der das Rad gedreht wird und mit ein bisschen Trickserei auch die Drehrichtung.

Auf dem Inneren ist das Inneren einer Maus von Microsoft zu sehen, die noch eine Mauskugel benutzt. Diese liegt auf der Tischplatte auf und rollt dementsprechend bei Bewegungen der Maus bzw. Hand mit. Die Bewegung wird auf eine X und eine Y-Achse auf Schlitzräder übertragen, welche jeweils mit dem geschlitzen Enden eine Lichtschranke ansteuern. Die Steuerelektronik kann erkennen, wie schnell und in welche Richtung die Achsen und damit die Maus bewegt wurde und gibt das an den Computer weiter, der dann den Mauszeiger auf dem Bildschirm nachführt. Dieser Aufbau war viele Jahre lang Standard, bevor optische Mäuse die mechanischen verdrängten und die Anwender sich freuen durften: Nie wieder Mauskugel- und Mausachsen-Putzen.

Die Anschlusspins des KY-010-Moduls sind schnell erklärt, von oben nach unten sind dies (Vorderseite oben, Pins rechts): Die Pins +5V und GND lassen den IR-Lichtstrahl leuchten und die Data-Leitung gibt das Signal des Fototransistors weiter und liefert HIGH bzw. LOW, je nach Zustand, also ob der Lichtstrahl ankommt, oder nicht.

Mit einem Schlitzrad einen Zähler realisieren


Bei dieser Schaltung liegt die Schwierigkeit ein wenig im Mechanischen. Man braucht eine Schlitzrad und eine Achse, damit sich das Rad drehen kann. Außerdem muss es genau so positioniert sein, dass die geschlitzten Enden zwischen der Lichtschranke des Moduls zum liegen kommen.

Ich habe dafür kurzerhand die alte Maus weiter zerlegt und die Steuer-Platine entfernt, um im Gehäuse Platz für das KY-010-Modul zu haben. Das Lager für das Schlitzrad konnte ich so weiter nutzen. Glücklicherweise passte dann an einer Seite noch der Abstand zwischen Mauswand und Schlitzradende fast perfekt. Ein bisschen Klebeknete ( Uhu Patafix, Tesa Tack, Pritt Multi-Fix oder auch Läufer Typutz) und schon war das Modul an der richtigen Position.

Wer kein Schlitzrad zur Hand hat, kann sich auch einer aus Papier basteln, mit einem Stück Draht als Achse und einer irgendwie gearteten Lagerung.

Oder aber man nimmt einfach ein Stück Papier und hält dieses zwischen die Lichtschranke und zieht es wieder weg, um den Vorgang nur zu simulieren.


Danach muss der Sensor nur noch an des Multi Function Shield angeschlossen werden: Modul KY-010 Kabelfarbe MFS/Arduino (DATA) grün 5 (3x4 Header) (GND) schwarz GND (3x4 Header) (+5V) rot +5V (3x4 Header) Damit ist der Hardware-Aufbau auch schon durch.




Software

Kommen wir zum passenden Programm. Das soll jede Zustandänderung zwischen Licht da / Licht nicht da durch einen Piepton anzeigen und dabei einen Zähler hochzählen, der auf dem Sieben-Segment-Display des Shields angezeigt wird.

Taster 1 soll das Ganze stumm schalten, falls das Gepiepe nervt. Und Taster 2 soll den Zähler wieder auf Null stellen.

Hier ein kleines Video, was das Programm macht:



Source-Code

Und hier ist der Source-Code für das gezeigte Programm:

//////////////////////////////////////////////////////// // (C) 2018 by Oliver Kuhlemann // // Bei Verwendung freue ich mich über Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // //////////////////////////////////////////////////////// #include <TimerOne.h> // für Timings und Interrupts #include <MultiFuncShield.h> // API für das Multi Function Shield #define PinData 5 // wo ist Data angeschlossen? #define DurPause 1 // Pause in ms zwischen den Messungen void setup() { Timer1.initialize(); MFS.initialize(&Timer1); // initialize multi-function shield library pinMode (PinData, INPUT); } void loop() { int za=-1; int wert=0; int wertBefore=-1; boolean silence=false; int btn=0; MFS.beep(1, 5, 2); // bereit MFS.write(za); while (1) { btn=MFS.getButton(); if (btn == BUTTON_1_PRESSED) { silence = !silence; if (silence) { MFS.write ("ton-"); } else { MFS.write ("ton+"); } } if (btn == BUTTON_2_PRESSED) { MFS.write ("null"); za=0; } wert = digitalRead(PinData); if (wert != wertBefore) { if (!silence) MFS.beep(1); if (wert == 0) { MFS.writeLeds(LED_1, ON); MFS.writeLeds(LED_2, OFF); } else { MFS.writeLeds(LED_1, OFF); MFS.writeLeds(LED_2, ON); } za++; if (za > 9999) za=0; MFS.write(za); wertBefore = wert; } delay(DurPause); } }