Arduino Nano - IR-Gabellichtschranke (Geschwindigkeitssensor)

Dieses Tutorial zeigt Ihnen, wie Sie mit dem Arduino Nano die IR-Gabellichtschranke auslesen, ein kleines U-förmiges Bauteil, das dem Board meldet, wenn etwas durch seine Lücke geht. Im Detail lernen wir:

Wir empfehlen:

Arduino Nano IR-Gabellichtschranke

Erforderliche Hardware

1×Official Arduino Nano
1×Alternativ: DIYables Nano V3.0 Development Board
1×USB-A-zu-Mini-B-Kabel
1×IR Slotted Optical Speed Sensor
1×Verbindungskabel
1×(Optional) Breadboard
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Breakout-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Stromverteiler für Arduino Nano

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

Dieses Bauteil hat viele Namen: Schlitzsensor, Photo Interrupter, Opto Interrupter oder U-förmiger IR-Sensor. Alle meinen dasselbe. Es ist eine Lichtschranke. Ein Licht scheint von einer Seite einer Lücke zur anderen Seite, und das Modul meldet, ob dieses Licht durchkommt.

Wie es ein Objekt erkennt

Wie die IR-Gabellichtschranke funktioniert

Sehen Sie sich die beiden Arme des "U" an. Der erste Arm enthält eine Infrarot-LED. Der zweite Arm enthält einen NPN-Fototransistor. Sie schauen sich über eine Lücke von 5.9 mm an.

Es gibt nur zwei Fälle:

  • Die Lücke ist leer. Der Fototransistor sieht das Infrarotlicht, daher setzt das Modul OUT auf HIGH.
  • Etwas Undurchsichtiges befindet sich in der Lücke, zum Beispiel ein Pappstreifen oder ein Zahn einer Encoderscheibe. Das Licht kann nicht durch, daher setzt das Modul OUT auf LOW.

Das Modul hat außerdem einen Schmitt-Trigger an Bord. Seine Aufgabe ist es, den rohen Lichtpegel in ein klares 0 oder 1 umzuwandeln. Weil die Flanken schon sauber sind, braucht Ihr Arduino-Nano-Sketch keinen Entprellcode.

Zwei Dinge sollten Sie beachten:

  • Klarer Kunststoff oder Glas kann Infrarotlicht durchlassen. Testen Sie mit etwas, durch das Sie nicht hindurchsehen können.
  • Einige Module anderer Marken arbeiten umgekehrt (LOW, wenn leer). Falls Ihres so ist, tauschen Sie LOW und HIGH im ersten Sketch. Der RPM-Sketch zählt eine Flanke pro Schlitz, daher liefert er bei beiden Arten das richtige Ergebnis.

Technische Daten

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 freier Lücke
Signalaufbereitung Eingebauter Schmitt-Trigger
Montage M3-Schraubenlöcher an beiden Enden
Pins 3 (VCC, GND, OUT)

Sie finden diesen Sensor in Projekten wie diesen: ein Drehzahlmesser für einen kleinen Motor, Raddrehzahl-Rückmeldung an einem Roboterauto, ein Zähler für Teile auf einem Band, ein Endanschlag, der einem beweglichen Teil meldet, dass es seine Grenze erreicht hat, und ein einfacher Kilometerzähler, der zählt, wie oft sich ein Rad gedreht hat.

Die Pinbelegung der IR-Gabellichtschranke

Pinbelegung der IR-Gabellichtschranke

Nur drei Pins führen aus dem Modul heraus:

  • VCC-Pin: muss mit dem 5V-Pin des Arduino Nano verbunden werden
  • GND-Pin: muss mit GND (0V) verbunden werden
  • OUT-Pin: die digitale Signalleitung; er muss mit einem Eingangspin des Arduino Nano verbunden werden (in diesem Tutorial D2)

※ Notiz:

Die Anordnung der Pins kann sich von Hersteller zu Hersteller unterscheiden, und die Reihenfolge kann sich sogar zwischen zwei Chargen desselben Produkts ändern. Orientieren Sie sich bei der Verwendung immer an den auf dem Modul aufgedruckten Beschriftungen. Schauen Sie genau hin!

Impulse in Geschwindigkeit umwandeln

Für sich allein sieht der Sensor nur "etwas" oder "nichts". Um die Geschwindigkeit zu messen, fügen wir eine Encoderscheibe hinzu. Das ist ein dünnes Rad mit Löchern am Rand. Es sitzt auf der Motorwelle, und sein Rand dreht sich durch die Lücke. Jeder Zahn unterbricht den Strahl einmal, daher gibt der OUT-Pin pro Zahn einen LOW-Impuls aus.

Die Scheibe, die bei den meisten TT-Getriebemotoren dabei ist, hat 20 Schlitze. 20 Impulse bedeuten also eine volle Umdrehung. Wenn der Arduino Nano die Impulse eine Sekunde lang zählt, lautet die Rechnung:

RPM = (Impulse in einer Sekunde x 60) / 20

Das "x 60" wandelt Sekunden in Minuten um. Das "/ 20" wandelt Impulse in Umdrehungen um.

Verdrahtungsdiagramm

Setzen Sie den Arduino Nano quer über die Mitte des Breadboards und führen Sie dann drei Jumper-Kabel vom Sensor: VCC an 5V, GND an GND und OUT an D2, wie das Bild unten zeigt.

Arduino Nano IR-Gabellichtschranke Verdrahtungsdiagramm

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

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

Der Nano ist ein 5V-Board, daher nehmen wir die Spannung von seinem 5V-Pin. Das OUT-Signal bewegt sich dann zwischen 0V und 5V, und das passt genau zu den Eingangspins des Nano. Sie brauchen keinen Pegelwandler und keinen zusätzlichen Widerstand.

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

Sie müssen keine Bibliothek installieren. Beide Sketches verwenden nur Funktionen, die schon Teil des Arduino-Cores sind.

Teil 1: den Schlitz mit digitalRead() prüfen

  • Der erste Schritt ist, den Pin des Arduino Nano festzulegen, der mit OUT verbunden ist:
const int SENSOR_PIN = 2;
  • In setup() wird dieser Pin als Eingang gesetzt. Das Modul steuert die Leitung selbst, daher genügt ein einfaches INPUT:
pinMode(SENSOR_PIN, INPUT);
  • In loop() wird der Pin immer wieder gelesen. Ein LOW-Wert sagt uns, dass der Strahl unterbrochen ist:
int state = digitalRead(SENSOR_PIN);
  • Der Sketch speichert den letzten Wert in lastState. Er gibt aus und zählt nur, wenn der neue Wert nicht mit dem alten übereinstimmt. So ergibt ein Objekt eine Zählung, auch wenn es lange in der Lücke bleibt.

Teil 2: schnelle Impulse mit einem Interrupt erfassen

Der Arduino Nano hat nur zwei Pins, die einen externen Interrupt auslösen können: D2 und D3. Deshalb geht der Sensor an D2. Jeder andere digitale Pin funktioniert für Teil 1, aber nicht für Teil 2.

  • Der Impulszähler wird mit dem Schlüsselwort volatile deklariert. Das sagt dem Compiler, dass sich der Wert jederzeit ändern kann, außerhalb des normalen Ablaufs von loop():
volatile unsigned long pulseCount = 0;
  • Die Interrupt-Routine hat eine kleine Aufgabe. Sie addiert 1 zum Zähler und kehrt zurück:
void countPulse() { pulseCount++; }
  • In setup() wird die Routine mit D2 verknüpft. Die Option FALLING startet sie in dem Moment, in dem OUT von HIGH auf LOW fällt. Das ist der Moment, in dem ein Zahn in die Lücke eintritt, daher wird jeder Zahn einmal gezählt:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Einmal pro Sekunde kopiert der Sketch den Zähler und setzt ihn auf null zurück. Der ATmega328P-Chip des Nano verarbeitet 8 Bit auf einmal, daher braucht das Kopieren einer 4-Byte-Zahl mehrere Schritte. noInterrupts() und interrupts() stellen sicher, dass ein neuer Impuls die Zahl nicht mitten im Kopieren ändern kann:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • Der letzte Schritt verwendet die Formel von oben:
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Arduino-Nano-Code zum Zählen von Objekten im Schlitz

Der folgende Sketch fragt D2 in loop() ab. Jedes Mal, wenn ein neues Objekt den Strahl unterbricht, addiert er eins zur Zählung und gibt sie aus. Wenn die Lücke wieder leer ist, gibt er eine kurze Meldung aus.

/* * Dieser Arduino Nano Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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-nano/arduino-nano-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Nano 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 Nano zum ersten Mal verwenden, lesen Sie wie man die Umgebung für den Arduino Nano in der Arduino IDE einrichtet.
  • Verdrahten Sie die Bauteile wie im Diagramm gezeigt.
  • Verbinden Sie das Arduino-Nano-Board über ein USB-Kabel mit Ihrem Computer.
  • Öffnen Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das Board Arduino Nano und den verwendeten COM-Port aus. Wenn der Upload später fehlschlägt, versuchen Sie ATmega328P (Old Bootloader) im Menü Processor.
  • Fügen Sie den obigen Code in einen neuen Sketch ein.
  • Drücken Sie die Schaltfläche Upload und warten Sie auf die Meldung "Done uploading".
  • Öffnen Sie den Serial Monitor und wählen Sie 9600 Baud.
  • Schieben Sie ein Stück Pappe oder einen Finger in die Lücke und ziehen Sie ihn wieder heraus. Tun Sie das dreimal.
  • Beobachten Sie die Meldungen im Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

Sehen Sie "blocked", während die Lücke leer ist? Dann hat Ihr Modul eine umgekehrte Logik. Tauschen Sie die LOW- und HIGH-Prüfungen im Code und laden Sie ihn erneut hoch.

Arduino-Nano-Code zum Messen der Motordrehzahl (RPM)

Ein Motor mit einer 20-Schlitz-Scheibe kann Hunderte von Impulsen pro Sekunde erzeugen. Beim Abfragen können einige davon verpasst werden, zum Beispiel während Serial.print() gerade Text sendet. Mit einem Interrupt unterbricht der Nano seine aktuelle Arbeit für sehr kurze Zeit, zählt den Impuls und macht dann weiter. Jeder Zahn wird gezählt.

Der Sketch gibt die Anzahl der Impulse und die Drehzahl (RPM) einmal pro Sekunde aus. Die Konstante SLOTS_PER_TURN ist 20. Wenn Ihre Scheibe eine andere Anzahl an Löchern hat, zählen Sie sie und tragen Sie diese Zahl in den Code ein.

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

  • Ändern Sie die Verdrahtung des ersten Sketches nicht. OUT muss an D2 bleiben. D3 ist die einzige andere Möglichkeit am Nano; wenn Sie ihn verwenden, setzen Sie SENSOR_PIN auf 3.
  • Montieren Sie die Encoderscheibe auf der Motorwelle oder dem Rad. Richten Sie sie so aus, dass die Zähne durch die Mitte der Lücke laufen und den Kunststoff nicht berühren.
  • Fügen Sie den RPM-Code in die Arduino IDE ein und laden Sie ihn auf den Nano hoch.
  • Öffnen Sie den Serial Monitor mit 9600 Baud.
  • Drehen Sie die Scheibe mit der Hand oder schalten Sie den Motor ein. Das Tutorial Arduino Nano - DC Motor zeigt, wie man einen Motor mit dem Nano ansteuert.
  • Lesen Sie die Drehzahl im Serial Monitor ab.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

Hier dreht sich der Motor mit etwa 300 U/min (RPM). Nehmen Sie die Zeile mit 98 Impulsen: 98 x 60 = 5880 Impulse pro Minute, und 5880 / 20 = 294 RPM. Die 0-Zeilen oben und unten wurden ausgegeben, bevor der Motor gestartet wurde und nachdem er gestoppt hat.

Gute Gewohnheiten für Interrupt-Code am Nano:

  • Markieren Sie jede Variable, die die Interrupt-Routine ändert, als volatile.
  • Halten Sie die Routine winzig. Setzen Sie niemals delay() oder Serial.print() hinein.
  • Bleiben Sie bei FALLING. CHANGE würde pro Zahn zweimal auslösen und Ihre Drehzahl verdoppeln.

Zusätzliches Wissen

Welchen Sensor sollten Sie wählen?

Eine Gabellichtschranke, ein IR-Hindernissensor und ein Drehgeber können alle Impulse an den Arduino Nano liefern. Dennoch löst jeder ein anderes Problem. Stellen Sie sich diese Fragen:

  • Geht das Objekt durch eine kleine, feste Lücke (ein Scheibenzahn, eine Fahne an einem beweglichen Teil)? Wählen Sie die IR-Gabellichtschranke. Sie liefert pro Durchgang ein sauberes digitales Signal.
  • Befindet sich das Objekt irgendwo vor dem Sensor, nicht in einer Lücke (eine Wand, eine Hand, eine Kiste auf einem Tisch)? Wählen Sie den IR-Hindernissensor. Er erkennt reflektiertes Licht im freien Raum.
  • Dreht eine Person einen Knopf, und braucht der Code die Richtung (links oder rechts)? Wählen Sie den Drehgeber. Er hat zwei Ausgänge (CLK und DT) und einen Taster.

Es ist offensichtlich, dass die Gabellichtschranke die zuverlässigste Zählung für schnell drehende Teile liefert, da das Ziel immer dieselbe 5.9 mm große Lücke an derselben Stelle durchquert. Ihre einzige Grenze ist, dass sie die Drehrichtung nicht erkennen kann.

Zwei Räder, zwei Sensoren

Ein kleines Roboterauto hat oft zwei angetriebene Räder. Der Nano hat genau zwei Interrupt-Pins, daher kann ein Sensor an D2 und ein zweiter Sensor an D3 gehen. Jeder Sensor braucht dann seinen eigenen Zähler und seine eigene Interrupt-Routine. Denken Sie daran, bevor Sie den Rest des Roboters planen: Wenn D2 und D3 schon von anderen Bauteilen belegt sind, verlegen Sie diese Bauteile auf andere Pins, denn kein anderer Nano-Pin kann diese Aufgabe übernehmen.

Fehlerbehebung

Problem Was zu prüfen ist
Die Zählung ändert sich nie Prüfen Sie, dass OUT an D2 und VCC an 5V geht. Lesen Sie die Pin-Beschriftungen Ihres Moduls, denn die Reihenfolge ist nicht bei jeder Charge gleich.
"Blocked" bei leerer Lücke Ihr Modul verwendet umgekehrte Logik. Tauschen Sie LOW und HIGH im ersten Sketch.
RPM ist immer 0 Die Scheibenzähne erreichen vielleicht die Lücke nicht. Verschieben Sie den Sensor so, dass die Zähne durch die Mitte des Schlitzes laufen.
RPM springt auf und ab Stellen Sie sicher, dass die Scheibe fest auf der Welle sitzt und nicht wackelt oder den Sensor berührt.
RPM ist zu hoch oder zu niedrig SLOTS_PER_TURN passt nicht zu Ihrer Scheibe. Zählen Sie die Löcher und korrigieren Sie die Konstante.

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!