Arduino - IR-Gabellichtschranke (Geschwindigkeitssensor)

In diesem Tutorial lernen wir:

Arduino IR-Gabellichtschranke (Geschwindigkeitssensor)

Erforderliche Hardware

1×Arduino Uno R3
1×USB 2.0 Kabel Typ A/B (für USB-A PC)
1×USB 2.0 Kabel Typ C/B (für USB-C PC)
1×IR Slotted Optical Speed Sensor
1×Verbindungskabel
1×(Optional) Breadboard
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Sensors/Servo Expansion Shield for Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V3 Starter-Kit (Arduino enthalten)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über die IR-Gabellichtschranke

Die IR-Gabellichtschranke ist ein kleines U-förmiges Modul. Man nennt sie auch Schlitzsensor, Opto-Interrupter oder U-förmigen IR-Sensor. Sie sagt dem Arduino, ob sich etwas in ihrem Schlitz befindet oder nicht. Mit einer Encoderscheibe kann sie auch sagen, wie schnell sich ein Motor oder ein Rad dreht.

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
Befestigung M3-Schraubenlöcher an beiden Enden
Pins 3 (VCC, GND, OUT)

Sie können sie verwenden für:

  • Die Messung der Motordrehzahl (U/min) mit einer Encoderscheibe
  • Den Bau eines Drehzahlmessers
  • Das Zählen von Objekten oder Impulsen
  • Die Messung von Entfernungen durch Zählen von Radumdrehungen
  • Die Rückmeldung der Raddrehzahl bei einem Roboter
  • Die Erkennung einer Grenze oder einer Position

Pinbelegung

Pinbelegung der IR-Gabellichtschranke

Die IR-Gabellichtschranke hat drei Pins:

  • VCC-Pin: muss mit VCC (5V oder 3,3V) verbunden werden
  • GND-Pin: muss mit GND (0V) verbunden werden
  • OUT-Pin: ist ein digitaler Ausgangspin. Er ist LOW, wenn der Schlitz blockiert ist, und HIGH, wenn der Schlitz frei ist. Dieser Pin muss mit einem Eingangspin des Arduino verbunden werden.

Die Reihenfolge der Pins kann sich zwischen Chargen unterscheiden. Bitte lesen Sie die Beschriftungen auf Ihrem Modul.

Funktionsweise

Funktionsweise der IR-Gabellichtschranke

Auf einer Seite des U sitzt eine Infrarot-LED. Auf der anderen Seite sitzt ein NPN-Fototransistor. Sie liegen sich über den 5,9 mm breiten Schlitz gegenüber.

  • Wenn der Schlitz leer ist, erreicht das IR-Licht den Fototransistor. Der OUT-Pin ist HIGH.
  • Wenn ein undurchsichtiges Objekt (ein Stück Karte oder ein Zahn einer Encoderscheibe) in den Schlitz gelangt, blockiert es das Licht. Der OUT-Pin ist LOW.

Der eingebaute Schmitt-Trigger macht den Ausgang zu einer sauberen und stabilen 0 oder 1, ohne Jitter. Deshalb müssen wir im Code nicht entprellen.

Einige Tipps:

  • Verwenden Sie undurchsichtige Objekte. Ein durchsichtiges Objekt blockiert das IR-Licht möglicherweise nicht gut.
  • Einige Module anderer Hersteller arbeiten andersherum. Wenn Ihr Sensor "blockiert" meldet, obwohl der Schlitz leer ist, tauschen Sie im ersten Code einfach LOW und HIGH. Der RPM-Code zählt eine Flanke pro Zahn, deshalb funktioniert er in beiden Fällen.

Drehzahlmessung mit einer Encoderscheibe

Eine Encoderscheibe ist eine runde Platte mit Schlitzen (Löchern) nahe am Rand. Die übliche Scheibe für TT-Getriebemotoren hat 20 Schlitze. Befestigen Sie die Scheibe auf der Motorwelle oder am Rad, sodass ihre Zähne durch den Schlitz des Sensors laufen, ohne ihn zu berühren.

Wenn sich die Scheibe dreht, blockiert jeder Zahn das Licht für einen Moment. Der OUT-Pin gibt einen Impuls pro Zahn aus. Eine volle Umdrehung ergibt 20 Impulse. Der Arduino zählt die Impulse in 1 Sekunde und berechnet dann die Drehzahl:

  • Impulse in 1 Sekunde × 60 = Impulse in 1 Minute
  • Impulse in 1 Minute ÷ 20 = Umdrehungen pro Minute (U/min, RPM)

Verdrahtungsdiagramm

Verbinden Sie VCC des Sensors mit 5V des Arduino, GND mit GND und OUT mit Pin 2 des Arduino, wie im folgenden Bild gezeigt.

Arduino IR-Gabellichtschranke Verdrahtungsdiagramm

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

Wir verwenden Pin 2, weil er beim Arduino Uno ein Interrupt-Pin ist. Der RPM-Code braucht ihn.

So programmieren Sie die IR-Gabellichtschranke

  • Keine Bibliothek erforderlich: Der Code verwendet nur eingebaute Funktionen.
  • Pin definieren: const int SENSOR_PIN = 2;
  • Den Pin mit pinMode() als Eingang festlegen: pinMode(SENSOR_PIN, INPUT);
  • Den Zustand mit digitalRead() lesen: int state = digitalRead(SENSOR_PIN);
  • Den Zustand prüfen: if (state == LOW) bedeutet, dass sich etwas im Schlitz befindet. HIGH bedeutet, dass der Schlitz frei ist.
  • Um schnelle Impulse zu zählen, verwenden Sie einen Interrupt. Jedes Mal, wenn der OUT-Pin von HIGH auf LOW wechselt (ein Zahn blockiert den Schlitz), führt der Arduino eine kleine Funktion aus: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Halten Sie den Zähler volatile, weil er sich innerhalb des Interrupts ändert: volatile unsigned long pulseCount = 0;
  • Wandeln Sie die Impulse jede Sekunde in U/min um: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Warum einen Interrupt verwenden? Wenn sich der Motor schnell dreht, sind die Impulse sehr kurz. Wenn wir den Pin nur in loop() prüfen, verpassen wir möglicherweise einige davon. Der Interrupt fängt jeden Impuls ab. Wir verwenden FALLING, damit jeder Zahn nur einmal gezählt wird.

Arduino-Code - Objekt im Schlitz erkennen

Der folgende Code macht diese Dinge:

  • Liest den OUT-Pin immer wieder
  • Gibt nur dann eine Meldung aus, wenn sich der Zustand ändert
  • Zählt, wie oft der Schlitz blockiert wird
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino 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

  • Verdrahten Sie wie im obigen Diagramm gezeigt.
  • Verbinden Sie den Arduino über ein USB-Kabel mit dem PC.
  • Öffnen Sie die Arduino IDE. Öffnen Sie das Menü Tools und wählen Sie das richtige Board und den richtigen Port aus.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie in der Arduino IDE auf die Schaltfläche Upload, um den Code auf den Arduino hochzuladen.
  • Öffnen Sie den Serial Monitor (Baudrate 9600).
  • Führen Sie ein Stück Karte oder Ihren Finger einige Male durch den Schlitz.
  • Sehen Sie sich das Ergebnis im Serial Monitor an.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 on COM15
2

Arduino-Code - Motordrehzahl messen (U/min)

Der folgende Code macht diese Dinge:

  • Zählt einen Impuls, jedes Mal wenn ein Zahn der Scheibe den Schlitz blockiert (Interrupt bei der FALLING-Flanke)
  • Berechnet jede Sekunde die Drehzahl in U/min
  • Gibt die Anzahl der Impulse und die Drehzahl aus
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino 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"); } }

Der Code verwendet SLOTS_PER_TURN = 20. Wenn Ihre Encoderscheibe eine andere Anzahl von Schlitzen hat, ändern Sie diese Zahl.

Schnelle Schritte

  • Befestigen Sie die Encoderscheibe auf der Motorwelle oder dem Rad, sodass ihre Zähne durch den Schlitz laufen.
  • Behalten Sie dieselbe Verdrahtung wie beim ersten Code bei.
  • Kopieren Sie den obigen Code, fügen Sie ihn in die Arduino IDE ein und laden Sie ihn hoch.
  • Drehen Sie die Scheibe von Hand oder versorgen Sie den Motor mit Strom. Zur Ansteuerung des Motors siehe Arduino - Gleichstrommotor.
  • Sehen Sie sich das Ergebnis im Serial Monitor an. Das folgende Beispiel zeigt einen Motor, der sich mit etwa 300 U/min dreht.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 on COM15
2

Zum Beispiel ergeben 100 Impulse in 1 Sekunde 100 × 60 ÷ 20 = 300 U/min.

Möchten Sie die Strecke finden, die ein Rad zurücklegt? Multiplizieren Sie die Anzahl der Umdrehungen mit dem Radumfang (π × Raddurchmesser).

Wenn Sie ein Objekt aus der Entfernung erkennen wollen (nicht in einem Schlitz), siehe Arduino - Infrarot-Hindernissensor. Wenn Sie einen Drehknopf und seine Richtung lesen wollen, siehe Arduino - Drehgeber.

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!