Arduino Mega - IR-Gabellichtschranke (Geschwindigkeitssensor)

In diesem Tutorial lernen Sie, wie Sie mit dem Arduino Mega das Signal einer IR-Gabellichtschranke lesen und dieses Signal dann in eine Objektanzahl oder eine Motordrehzahl in U/min (RPM) umwandeln. Im Detail lernen wir:

Wir empfehlen:

Arduino Mega und IR-Gabellichtschranke

Erforderliche Hardware

1×Arduino MEGA
1×Alternativ: DIYables MEGA Development Board
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) Screw Terminal Block Shield for Arduino Uno/Mega
1×(Empfohlen) Sensors/Servo Expansion Shield for Arduino Mega
1×(Empfohlen) Breadboard Shield for Arduino Mega
1×(Empfohlen) Enclosure for Arduino Mega

Oder Sie können die folgenden Kits kaufen:

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. Ein Arm des "U" enthält eine Infrarot-LED. Der andere Arm enthält einen NPN-Fototransistor. Die beiden Teile stehen sich über einen 5.9 mm breiten Spalt gegenüber. Dieser Spalt ist der Schlitz.

Der Sensor gibt ein einfaches digitales Signal aus. Er sagt dem Arduino Mega nur eine Sache: Ist der Schlitz frei, oder ist etwas darin? Deshalb eignet er sich gut zum Zählen, zur Endlagen- und Positionserkennung und, mit einer geschlitzten Encoderscheibe, zur Geschwindigkeitsmessung.

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)

Häufige Anwendungen:

  • Messung der Motordrehzahl (U/min) mit einer Encoderscheibe
  • Bau eines einfachen Drehzahlmessers
  • Zählen von Objekten oder Impulsen
  • Messung der Strecke durch Zählen der Radumdrehungen
  • Geschwindigkeitsrückmeldung für Roboterräder
  • Endlagen- und Positionserkennung

Die Pinbelegung der IR-Gabellichtschranke

Pinbelegung der IR-Gabellichtschranke

Das Modul hat drei Pins:

  • VCC-Pin: muss mit VCC (5V am Arduino Mega) verbunden werden
  • GND-Pin: muss mit GND (0V) verbunden werden
  • OUT-Pin: digitaler Ausgang, sendet den Zustand des Schlitzes vom Sensor an den Arduino Mega

※ Notiz:

Die Anordnung der Pins kann sich von Hersteller zu Hersteller und sogar von Charge zu Charge unterscheiden. Orientieren Sie sich beim Verwenden des Moduls immer an den Beschriftungen auf dem Modul. Schauen Sie genau hin!

Wie die IR-Gabellichtschranke funktioniert

Funktionsweise der IR-Gabellichtschranke

Die IR-LED sendet die ganze Zeit einen Strahl Infrarotlicht quer durch den Schlitz. Was dann passiert, hängt davon ab, was im Schlitz ist:

  • Nichts im Schlitz: Das IR-Licht erreicht den Fototransistor, und der OUT-Pin ist HIGH.
  • Ein undurchsichtiges Objekt im Schlitz (ein Stück Karton, ein Zahn einer Encoderscheibe): Das Licht wird blockiert, und der OUT-Pin ist LOW.

Im Modul ist ein Schmitt-Trigger eingebaut. Er bereinigt das Signal, sodass der OUT-Pin eine saubere und stabile 0 oder 1 ohne Jitter liefert. Deshalb ist im Code des Arduino Mega keine Software-Entprellung nötig.

Beachten Sie diese Punkte:

  • Durchsichtige Objekte blockieren IR-Licht möglicherweise nicht gut. Verwenden Sie undurchsichtige Objekte.
  • Einige Module anderer Hersteller haben die umgekehrte Logik. 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 Schlitz, daher funktioniert er in beiden Fällen.

Geschwindigkeit mit einer Encoderscheibe messen

Um die Geschwindigkeit zu messen, wird eine runde Encoderscheibe mit Schlitzen auf der Motorwelle oder am Rad befestigt. Der Rand der Scheibe dreht sich im Schlitz des Sensors. Jeder Zahn blockiert das Licht für einen kurzen Moment, und jedes Loch lässt es durch. So erzeugt der OUT-Pin einen Impuls pro Schlitz der Scheibe.

Die übliche Encoderscheibe für TT-Getriebemotoren hat 20 Schlitze. Das bedeutet:

  • 1 volle Umdrehung = 20 Impulse
  • Impulse in 1 Sekunde x 60 = Impulse pro Minute
  • Impulse pro Minute / 20 = Umdrehungen pro Minute (U/min, RPM)

Schaltplan

Die Verdrahtung zwischen dem Arduino Mega und der IR-Gabellichtschranke sehen Sie im Bild unten.

Schaltplan Arduino Mega mit IR-Gabellichtschranke

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

IR-Gabellichtschranke Arduino Mega
VCC 5V
GND GND
OUT Pin 2

Warum Pin 2 am Arduino Mega?

Der erste Code verwendet nur digitalRead(), daher würde jeder digitale Pin des Arduino Mega funktionieren. Der RPM-Code verwendet jedoch einen externen Interrupt, und nicht jeder Pin des Arduino Mega unterstützt das. Der Arduino Mega 2560 hat sechs Pins für externe Interrupts:

Arduino Mega Pin Andere Verwendung dieses Pins
2 Keine (frei)
3 Keine (frei)
18 TX1 (Serial1)
19 RX1 (Serial1)
20 SDA (I2C)
21 SCL (I2C)

Pin 2 und Pin 3 sind die beste Wahl, weil sie sich keine Aufgabe mit Serial1 oder I2C teilen. Wenn Ihr Projekt auch ein I2C-LCD oder ein Serial1-Gerät verwendet, meiden Sie die Pins 18 bis 21. Wir verwenden in beiden Codebeispielen Pin 2, sodass Sie den Sensor einmal verdrahten und beide Programme ausführen können.

※ Notiz:

Der Arduino Mega arbeitet mit 5V-Logik. Versorgen Sie den Sensor über den 5V-Pin des Arduino Mega. Der OUT-Pin schwingt dann zwischen 0V und 5V, genau das, was die Eingangspins des Mega erwarten. Ein Pegelwandler ist nicht nötig.

Wie man den Arduino Mega für die IR-Gabellichtschranke programmiert

Es wird keine Bibliothek benötigt. Der Code verwendet nur eingebaute Arduino-Funktionen.

Den Zustand des Schlitzes lesen

  • Der erste Schritt ist, den Pin des Arduino Mega anzugeben, der mit dem OUT-Pin des Sensors verbunden ist:
const int SENSOR_PIN = 2;
  • Der nächste Schritt ist, den Pin in der Funktion setup() als digitalen Eingang festzulegen:
pinMode(SENSOR_PIN, INPUT);
  • Danach wird der Zustand des Schlitzes mit digitalRead() gelesen. LOW bedeutet, dass etwas im Schlitz ist, und HIGH bedeutet, dass der Schlitz frei ist:
int state = digitalRead(SENSOR_PIN);
  • Damit jedes Objekt nur einmal gezählt wird, wird der neue Zustand mit dem vorherigen Zustand verglichen. Ein Wechsel von HIGH auf LOW bedeutet, dass ein neues Objekt in den Schlitz gekommen ist.

Impulse mit einem Interrupt zählen

  • Eine Zählervariable wird als volatile deklariert, weil sie in der Interrupt-Funktion geändert wird:
volatile unsigned long pulseCount = 0;
  • Eine kurze Funktion wird geschrieben, die bei jedem Impuls läuft. Sie addiert nur eins zum Zähler:
void countPulse() { pulseCount++; }
  • Die Funktion wird in der Funktion setup() an Pin 2 angehängt. FALLING bedeutet, dass die Funktion jedes Mal läuft, wenn der OUT-Pin von HIGH auf LOW wechselt, also jedes Mal, wenn ein Zahn der Scheibe den Schlitz blockiert:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Einmal pro Sekunde wird der Zähler gelesen und zurückgesetzt. Der Arduino Mega ist ein 8-Bit-Board und liest daher eine 32-Bit-Variable in mehreren Schritten. Wenn man die Interrupts kurz ausschaltet, kann sich der Wert nicht mitten im Lesen ändern:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • Zum Schluss wird die Drehzahl (RPM) aus den in einer Sekunde gezählten Impulsen berechnet:
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Arduino Mega Code zum Erkennen von Objekten im Schlitz

Dieser Code prüft den OUT-Pin in loop() immer wieder. Er gibt nur dann eine Meldung aus, wenn sich der Zustand ändert, und er zählt jedes Mal, wenn der Schlitz blockiert wird.

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega 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-mega/arduino-mega-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Mega 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

  • Wenn Sie den Arduino Mega zum ersten Mal verwenden, lesen Sie wie man die Umgebung für den Arduino Mega in der Arduino IDE einrichtet.
  • Verdrahten Sie die Bauteile wie im Diagramm gezeigt.
  • Verbinden Sie das Arduino-Mega-Board über ein USB-Kabel mit Ihrem Computer.
  • Öffnen Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das Board Arduino Mega or Mega 2560 und den richtigen COM-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 Mega hochzuladen.
  • Öffnen Sie den Serial Monitor und stellen Sie die Baudrate auf 9600 ein.
  • Führen Sie ein Stück Karton oder Ihren Finger einige Male durch den Schlitz.
  • Prüfen Sie das Ergebnis im Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Mega Or...
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Mega Or...' 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 Mega Or... on COM15
2

Wenn die Meldungen falsch herum sind ("blockiert", obwohl der Schlitz leer ist), verwendet Ihr Modul die umgekehrte Logik. Tauschen Sie LOW und HIGH im Code.

Arduino Mega Code zum Messen der Motordrehzahl (U/min)

Impulse einer drehenden Scheibe sind schnell. Wenn der Code den Pin nur in loop() prüft, kann er einige verpassen, zum Beispiel während er mit der Ausgabe im Serial Monitor beschäftigt ist. Ein Interrupt löst dieses Problem. Der Arduino Mega unterbricht, was er gerade tut, addiert eins zum Zähler und kehrt zurück, daher geht kein Impuls verloren.

Dieser Code zählt die Impulse am Interrupt-Pin 2. Jede Sekunde berechnet er die Drehzahl (RPM) und gibt beide Werte aus. SLOTS_PER_TURN ist auf 20 gesetzt. Ändern Sie den Wert passend zur Anzahl der Schlitze Ihrer Scheibe.

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega 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-mega/arduino-mega-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Mega 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"); } }

Schnelle Schritte

  • Behalten Sie dieselbe Verdrahtung wie im ersten Beispiel. Der OUT-Pin muss an Pin 2 bleiben (oder an einem anderen Interrupt-Pin: 3, 18, 19, 20 oder 21; wenn Sie ihn verschieben, ändern Sie SENSOR_PIN im Code).
  • Befestigen Sie die Encoderscheibe auf der Motorwelle oder am Rad. Achten Sie darauf, dass die Zähne durch den Schlitz laufen, ohne den Sensor zu berühren.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie auf die Schaltfläche Upload, um den Code auf den Arduino Mega hochzuladen.
  • Öffnen Sie den Serial Monitor mit 9600 Baud.
  • Drehen Sie die Scheibe von Hand oder schalten Sie den Motor ein. Wie man den Motor mit dem Arduino Mega ansteuert, sehen Sie im Tutorial Arduino Mega - Gleichstrommotor.
  • Prüfen Sie das Ergebnis im Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Mega Or...
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Mega Or...' 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 Mega Or... on COM15
2

In der Ausgabe oben dreht sich der Motor mit etwa 300 U/min. Zum Beispiel ergeben 100 Impulse in einer Sekunde 100 x 60 / 20 = 300 U/min. Die erste und die letzte Zeile zeigen 0 U/min, weil sich die Scheibe nicht dreht.

※ Notiz:

  • Deklarieren Sie jede Variable, die in der Interrupt-Funktion geändert wird, als volatile.
  • Halten Sie die Interrupt-Funktion kurz. Rufen Sie darin nicht Serial.print() oder delay() auf.
  • Verwenden Sie FALLING, damit jeder Zahn der Scheibe genau einen Zählschritt ergibt.

Zusätzliches Wissen

Gabellichtschranke vs. IR-Hindernissensor vs. Drehgeber

Diese drei Bauteile geben alle Impulse oder digitale Signale an den Arduino Mega, aber jedes ist für eine andere Aufgabe gemacht.

IR-Gabellichtschranke IR-Hindernissensor Drehgeber
Wie er erfasst Ein Objekt unterbricht einen Lichtstrahl in einem Schlitz IR-Licht wird von einem Objekt davor reflektiert Drehen eines Knopfes oder einer Welle
Erfassungsbereich Nur im 5.9 mm breiten Schlitz Freier Raum vor dem Sensor Kein Objekt, er erfasst die Drehung
Ausgang 1 digitales Signal 1 digitales Signal 2 Signale (CLK, DT) + Taster
Drehrichtung Nein Nein Ja
Am besten für U/min, Zählen, Positionserkennung Roboter, die Wänden ausweichen, Annäherungsalarme Menüs, Lautstärkeregler, manuelle Eingabe

Es ist offensichtlich, dass die Gabellichtschranke beim Zählen schneller Impulse genauer ist, weil das Objekt immer durch denselben kleinen, festen Spalt läuft. Wählen Sie den Hindernissensor, wenn das Objekt nicht durch einen Schlitz läuft, und wählen Sie den Drehgeber, wenn Sie auch die Richtung kennen müssen.

Die Anzahl der Schlitze pro Umdrehung wählen

Die Anzahl der Schlitze in der Scheibe bestimmt die Auflösung der Messung:

  • Mehr Schlitze: mehr Impulse pro Umdrehung, daher können langsame Drehzahlen gleichmäßiger gemessen werden. Der Code liest in Schritten von 60 / SLOTS_PER_TURN U/min. Bei 20 Schlitzen ist jeder Schritt 3 U/min.
  • Weniger Schlitze: weniger Impulse pro Sekunde, daher weniger Arbeit für den Arduino Mega bei sehr hohen Drehzahlen.

Eine Scheibe mit 20 Schlitzen ist ein guter Mittelweg für kleine Getriebemotoren. Wenn Sie eine andere Scheibe verwenden, zählen Sie ihre Schlitze und ändern Sie SLOTS_PER_TURN im Code.

Die Strecke aus Radumdrehungen messen

Wenn die Encoderscheibe an einem Roboterrad befestigt ist, geben dieselben Impulse auch die Strecke an, die das Rad gerollt ist:

  • Umdrehungen = gesamte Impulse / SLOTS_PER_TURN
  • Radumfang = π x Raddurchmesser
  • Strecke = Umdrehungen x Radumfang

Zum Beispiel hat ein Rad mit 65 mm Durchmesser einen Umfang von etwa 204 mm. Nach 200 Impulsen mit einer Scheibe mit 20 Schlitzen hat das Rad 10 Umdrehungen gemacht, also ist es etwa 2.04 Meter gerollt.

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

Verwandte Tutorials

※ 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!