Arduino UNO R4 - IR-Gabellichtschranke (Geschwindigkeitssensor)

In diesem Leitfaden lernen wir, wie man die IR-Gabellichtschranke mit dem Arduino UNO R4 verwendet. Im Detail lernen wir:

Arduino UNO R4 und IR-Gabellichtschranke

Über die IR-Gabellichtschranke

Dieses kleine Modul hat eine U-Form. Man nennt es auch Gabellichtschranke oder Photointerrupter. Ein Arm enthält eine Infrarot-LED. Der andere Arm enthält einen NPN-Fototransistor. Sie liegen sich über einen 5.9 mm breiten Spalt gegenüber. Der Sensor sagt dem Arduino UNO R4 eine einfache Sache: Ist der Spalt leer, oder ist etwas darin?

IR-Gabellichtschranke
Sensortyp Schlitz-Lichtschranke (IR-LED + NPN-Fototransistor)
Schlitzbreite 5.9 mm
Betriebsspannung 3.3V bis 5V DC
Ausgang digital (TTL), LOW bei Unterbrechung, HIGH bei freiem Schlitz
Signalaufbereitung eingebauter Schmitt-Trigger
Montage M3-Schraubenlöcher an beiden Enden
Pins 3 (VCC, GND, OUT)

Häufige Anwendungen:

  • Die Motordrehzahl (U/min) mit einer Encoderscheibe messen, wie ein Drehzahlmesser.
  • Objekte oder Impulse zählen.
  • Eine Strecke messen, indem man Radumdrehungen zählt.
  • Einem Roboter die Raddrehzahl zurückmelden.
  • Eine Endlage oder eine Startposition erkennen.

Pinbelegung

Pinbelegung der IR-Gabellichtschranke

Das Modul hat drei Pins:

  • VCC-Pin: mit 5V am Arduino UNO R4 verbinden (das Modul akzeptiert 3.3V bis 5V).
  • GND-Pin: mit GND (0V) verbinden.
  • OUT-Pin: digitaler Ausgang, mit einem Eingangspin des Arduino UNO R4 verbinden.

Die Pin-Reihenfolge kann von Charge zu Charge anders sein. Lesen Sie immer die Beschriftungen auf Ihrem Modul.

Wie es funktioniert

Wie die IR-Gabellichtschranke funktioniert

Die IR-LED leuchtet die ganze Zeit durch den Schlitz.

  • Der Schlitz ist leer: Das Licht erreicht den Fototransistor, deshalb ist der OUT-Pin HIGH.
  • Der Schlitz wird von etwas Undurchsichtigem blockiert (eine Karte, ein Finger, ein Zahn einer Encoderscheibe): Das Licht kann nicht hindurch, deshalb ist der OUT-Pin LOW.

Der eingebaute Schmitt-Trigger macht aus dem rohen Lichtpegel eine saubere 0 oder 1. Das Signal zittert nicht, deshalb brauchen Sie kein Software-Entprellen.

Zwei kleine Dinge, die Sie wissen sollten:

  • Klares Plastik oder Glas kann IR-Licht durchlassen. Verwenden Sie undurchsichtige Objekte.
  • Einige Module anderer Hersteller arbeiten umgekehrt. Wenn Ihre Platine "blockiert" meldet, obwohl der Schlitz leer ist, tauschen Sie im ersten Code einfach LOW und HIGH. Der RPM-Code zählt eine Flanke pro Schlitz, deshalb funktioniert er mit beiden Typen.

Verdrahtungsdiagramm

Es sind nur drei Drähte nötig: VCC an 5V, GND an GND und OUT an Pin 2 des Arduino UNO R4. Der UNO R4 ist ein 5-V-Board, daher ist 5-V-Versorgung hier in Ordnung, und das OUT-Signal bleibt auf einem sicheren Pegel.

Arduino UNO R4 Schaltplan mit IR-Gabellichtschranke

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Siehe Der beste Weg, den Arduino Uno R4 und andere Komponenten mit Strom zu versorgen.

Wir nutzen Pin 2, weil er einen Interrupt auslösen kann. Der zweite Code braucht das.

Wie man die IR-Gabellichtschranke programmiert

Prüfen, ob der Schlitz blockiert ist (Polling):

  • Legen Sie den Pin, der mit dem OUT-Pin verbunden ist, als Eingang fest:
pinMode(SENSOR_PIN, INPUT);
  • Lesen Sie den Pin. LOW bedeutet blockiert, HIGH bedeutet frei:
int state = digitalRead(SENSOR_PIN);
  • Vergleichen Sie mit dem letzten Wert, damit Sie nur reagieren, wenn sich der Zustand ändert:
if (state != lastState) { // the slot just became blocked or clear }

Schnelle Impulse zählen (Interrupt):

  • Legen Sie einen Zähler an. Markieren Sie ihn als volatile, weil der Interrupt ihn ändert:
volatile unsigned long pulseCount = 0;
  • Schreiben Sie eine winzige Funktion, die den Zähler um eins erhöht:
void countPulse() { pulseCount++; }
  • Führen Sie diese Funktion jedes Mal aus, wenn das Signal von HIGH auf LOW fällt (ein Zahn tritt in den Schlitz ein):
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Kopieren Sie den Zähler einmal pro Sekunde bei angehaltenen Interrupts und setzen Sie ihn zurück, dann rechnen Sie die Impulse in U/min um:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Warum diese Formel? Bei einer Scheibe mit 20 Schlitzen ergibt eine volle Umdrehung 20 Impulse. Impulse in 1 Sekunde × 60 ergibt Impulse pro Minute. Teilen Sie durch 20, und Sie erhalten Umdrehungen pro Minute (U/min, RPM).

Arduino UNO R4 Code - Objekt im Schlitz erkennen

Dieser Sketch prüft den OUT-Pin immer wieder. Er gibt nur dann eine Zeile aus, wenn sich der Zustand ändert, und er erhöht einen Zähler um eins, jedes Mal wenn der Schlitz blockiert wird.

/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 pin connected to the OUT pin of the speed sensor int lastState; // the previous state of the sensor int objectCount = 0; // how many times the slot was blocked void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); lastState = digitalRead(SENSOR_PIN); } void loop() { int state = digitalRead(SENSOR_PIN); if (state != lastState) { // the state has changed if (state == LOW) { // LOW = something is in the slot objectCount++; Serial.print("The slot is blocked - count: "); Serial.println(objectCount); } else { // HIGH = the slot is clear Serial.println("The slot is clear"); } lastState = state; } }

Schnelle Schritte

Folgen Sie diesen Anweisungen Schritt für Schritt:

  • Falls Sie die Arduino Uno R4 WiFi/Minima zum ersten Mal verwenden, lesen Sie das Tutorial Einrichten der Umgebung für Arduino Uno R4 WiFi/Minima in der Arduino IDE.
  • Verdrahten Sie die Bauteile gemäß dem bereitgestellten Diagramm.
  • Verbinden Sie das Arduino Uno R4-Board über ein USB-Kabel mit Ihrem Computer.
  • Starten Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das passende Arduino Uno R4-Board (z. B. Arduino Uno R4 WiFi) und den COM-Port aus.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie auf die Schaltfläche Hochladen, um den Code auf den Arduino UNO R4 zu übertragen.
  • Öffnen Sie den Serial Monitor und stellen Sie 9600 Baud ein.
  • Schieben Sie ein Stück Karte (oder Ihren Finger) in den Schlitz und ziehen Sie es wieder heraus. Machen Sie das einige Male.
  • Sehen Sie sich das Ergebnis im Serial Monitor an.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
The slot is blocked - count: 1 The slot is clear The slot is blocked - count: 2 The slot is clear The slot is blocked - count: 3 The slot is clear
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Jeder Durchgang erzeugt zwei Zeilen: eine, wenn die Karte hineingeht, eine, wenn sie herauskommt. Solange sich nichts ändert, wird keine Zeile ausgegeben.

Arduino UNO R4 Code - Motordrehzahl messen (U/min)

Polling in loop() ist für langsame Objekte in Ordnung. Eine drehende Scheibe ist viel schneller, und loop() könnte einige Zähne verpassen. Deshalb zählt dieser Sketch die Impulse mit einem Interrupt auf der FALLING-Flanke, was genau einen Zählschritt pro Zahn ergibt. Jede Sekunde gibt er die Impulszahl und die Drehzahl in U/min aus.

Die Konstante SLOTS_PER_TURN ist auf 20 gesetzt. Das ist die übliche Encoderscheibe, die mit TT-Getriebemotoren geliefert wird. Wenn Ihre Scheibe eine andere Anzahl von Schlitzen hat, ändern Sie diesen Wert.

/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 pin connected to the OUT pin of the speed sensor const int SLOTS_PER_TURN = 20; // number of slots (holes) in the encoder disc volatile unsigned long pulseCount = 0; // changed inside the interrupt unsigned long lastTime = 0; // runs every time a tooth of the disc blocks the slot void countPulse() { pulseCount++; } void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING); } void loop() { if (millis() - lastTime >= 1000) { // every 1 second lastTime = millis(); noInterrupts(); // read and reset the counter safely unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN; // pulses per second -> turns per minute Serial.print("Pulses: "); Serial.print(pulses); Serial.print(" | Speed: "); Serial.print(rpm); Serial.println(" RPM"); } }

Die Encoderscheibe einrichten

  • Befestigen Sie die Encoderscheibe an der Motorwelle oder am Rad.
  • Platzieren Sie den Sensor so, dass die Zähne der Scheibe durch den Schlitz laufen.
  • Achten Sie darauf, dass die Scheibe die Sensorarme nicht berührt.
  • Sie können die Scheibe von Hand drehen oder den Motor einschalten. Der Motor braucht seine eigene Verdrahtung. Dazu lesen Sie das Tutorial Arduino UNO R4 - Gleichstrommotor.

Schnelle Schritte

  • Behalten Sie die gleiche Verdrahtung wie zuvor.
  • Kopieren Sie den RPM-Code oben und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie auf die Schaltfläche Hochladen.
  • Öffnen Sie den Serial Monitor mit 9600 Baud.
  • Drehen Sie die Scheibe und lassen Sie sie dann anhalten.
  • Beobachten Sie die Drehzahl im Serial Monitor. Hier läuft der Motor mit etwa 300 U/min:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
Pulses: 0 | Speed: 0.00 RPM Pulses: 98 | Speed: 294.00 RPM Pulses: 101 | Speed: 303.00 RPM Pulses: 100 | Speed: 300.00 RPM Pulses: 99 | Speed: 297.00 RPM Pulses: 0 | Speed: 0.00 RPM
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Prüfen Sie eine Zeile: 100 Impulse × 60 ÷ 20 = 300 U/min.

Möchten Sie wissen, wie weit sich ein Rad bewegt hat? Multiplizieren Sie die Anzahl der Umdrehungen mit dem Radumfang (π × Raddurchmesser).

※ Notiz:

  • Halten Sie die Interrupt-Funktion kurz. Rufen Sie darin nicht Serial.print() auf.
  • Jede Variable, die der Interrupt ändert, muss volatile sein.
  • Möchten Sie ein Objekt in der Entfernung statt in einem Schlitz erkennen? Probieren Sie den Hindernisvermeidungssensor. Brauchen Sie einen Drehknopf, der auch die Drehrichtung angibt? Probieren Sie den Drehencoder.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Funktionsreferenzen

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!