Stückzähler mit dem KY-032 Modul zur Hinderniserkennung
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 Hinderniserkennungsmodul KY-032.
Hardware: Modul KY-032

Auch diesmal galt es 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-032 handelt, einem Modul zur Hindernis-Erkennung.
Die funktionalen Teile sind eine Infrarot-LED und ein Fototransistor, die so nebeneinander an einem Ende eingelötet sind. Das Funktionsprinzip ist dieses: Ein IR-Lichtstrahl wird von der LED ausgesendet. Trifft der Strahl auf ein Objekt, so wird die Infrarotstrahlung von diesem reflektiert. Ein Teil wird zurück in die Richtung des Moduls geworfen und trifft dort auf den Fototransistor. Das heißt: jedesmal, wenn ein Hindernis in der Nähe befindet, wird ein Signal geliefert, weil der Fototransistor IR-Strahlung registiert. Diese muss im Übrigen nicht vom Modul selbst stammen, man kann auch eine einfache Infrarot-Fernbedienung benutzen, um es zu täuschen.
Mittels zweier Potentiometer kann man einstellen, ab welcher Lichtstärke empfangener IR-Strahlung das Modul Alarm schlagen soll, sprich die Data-Leitung auf HIGH setzt. Beim Einstellen hilft eine zweite LED neben der Power-LED, die immer dann leuchtet, wenn der HIGH-Zustand erreicht wurde und erlischt, sobald die Leitung auf LOW geht. So lässt sich der Abstand einstellen, am wann ein Hindernis erkannt werden soll, also die Empfindlichkeit.

Das der Lichtstrahl Infrarotlicht benutzt, hat den Vorteil, dass nur dieses erkannt wird und normales 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.
Die Anschlusspins des KY-032-Moduls sind schnell erklärt, von oben nach unten sind dies (Vorderseite oben, Pins rechts):
- EN (Enable): Falls der Jumper EN entfernt wurde, kann hier ein Signal angelegt werden, wenn das Modul nur zeitweise aktiviert werden soll
- Data / Signal: liefert HIGH oder LOW, je nachdem, ob IR-Strahlung eintrifft oder nicht
- +5V
- GND
Anwendungsgebiete
Einen Sensor zur Hinderniserkennung kann man vielfältig verwenden. Zum Beispiel könnte man ihn vorne in Fahrtrichtung an einen Staubsaugerroboter anbringen, damit dieser nicht gegen jedes Hindernis rempelt, sondern vorher Halt macht. Genauer wäre da zwar vielleicht ein Ultraschall-Sensor, aber kleiner, leichter und wohl auch ein bisschen günstiger wird dieses Modul sein.
Oder man bastelt sich einen Stückzähler, der jedesmal, wenn ein Stück an einem Fließband vorbeikommt, einen Zähler um eins erhöht, um zum Schluss zu wissen, wieviele Stück vorbeigekommen sind, oder auch wieviele Stück pro Stunde produziert worden sind.
Man könnte das Modul auch missbrauchen, um einfach nur Infrarotstrahlung zu detektieren. Damit könnte man einen ganz einfachen Infrarot-Empfänger basteln, der etwas tut, wenn eine IR-Fernbedienung auf das Modul gerichtet wird und ein Knopf gedrückt wird. Und dann etwas auslösen, ganz gleich, was für eine Fernbedienung benutzt wurde, oder welcher Knopf gedrückt wurde.
Oder man positioniert das Modul innen vor die Tür in einem Kasten und reagiert, wenn kein Hindernis mehr erkannt wird, denn dann wurde die Tür geöffnet. Zum Beispiel, wenn man protokollieren möchte, wann ein Zugriff erfolgte.
Ich habe mich als Beispielanwendung für den Stückzähler entschieden, weil der so schön anschaulich ist. Das Modul wird folgendermaßen an des Multi Function Shield angeschlossen:
Modul KY-032 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 Hindernis da / Hindernis nicht da mittels der LEDs am MFS anzeigen und jedesmal, wenn ein Stück am Sensor vorbeigeführt wurde, kurz piepen und 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.
Die auf dem Modul befindlichen Potis können dazu benutzt werden, den Abstand einzustellen, in dem gezählt wird. Dies ist auch von der Farbe und Oberfläche der vorbeigeführten Gegenstände abhängig. Hier ein kleines Video, was das Programm macht:

Source-Code
Und hier noch 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 10 // 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=0;
int wert=0;
int wertBefore=-1;
boolean silence=false;
int btn=0;
long last=millis();
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 (wert == 0) {
MFS.writeLeds(LED_1, ON);
MFS.writeLeds(LED_2, OFF);
} else {
MFS.writeLeds(LED_1, OFF);
MFS.writeLeds(LED_2, ON);
if (millis() - last > 50) { // ungenaues Zählen durch Kantenreflexion vermeiden
last = millis();
za++;
if (!silence) MFS.beep(1);
if (za > 9999) za=0;
MFS.write(za);
}
}
wertBefore = wert;
}
delay(DurPause);
}
}