Raspberry Pi - Optische IR-sleufsensor (snelheidssensor)

Deze tutorial legt uit hoe u met een Raspberry Pi de pulsen van een optische IR-sleufsensor (snelheidssensor) uitleest met een kort Python-script. U kent dit onderdeel misschien ook als vorkvormige optische sensor (photo interrupter of opto interrupter). Hij ziet wanneer iets door de smalle opening gaat. Met dat ene signaal kan de Raspberry Pi voorwerpen tellen, of vertellen hoe snel een wiel of een motoras draait. We leren hier:

Wij raden aan:

Raspberry Pi en optische IR-sleufsensor

Hardware Benodigd

1×Raspberry Pi 5
1×IR Slotted Optical Speed Sensor
1×Verbindingsdraden
1×(Optioneel) Breadboard
1×(Aanbevolen) Schroefklem Block Shield voor Raspberry Pi
1×(Aanbevolen) Raspberry Pi Prototyping Basisplaat & Breadboard Kit

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de optische IR-sleufsensor (snelheidssensor)

Kijk van opzij naar de module en u ziet de letter U. De twee armen van de U staan tegenover elkaar, met een opening van 5,9 mm ertussen. Een arm bevat een infrarood-LED. De andere arm bevat een NPN-fototransistor. De LED schijnt de hele tijd over de opening, en de fototransistor let op dat licht.

Optische IR-sleufsensor (snelheidssensor)
Type sensor fotoelektrisch met sleuf (IR-LED + NPN-fototransistor)
Breedte van de sleuf 5,9 mm
Bedrijfsspanning 3,3V tot 5V DC
Uitgang digitaal (TTL), LOW bij geblokkeerd, HIGH bij vrij
Signaalverwerking ingebouwde Schmitt-trigger
Montage M3-schroefgaten aan beide uiteinden
Pinnen 3 (VCC, GND, OUT)

Mensen gebruiken deze sensor voor taken zoals:

  • De snelheid (tpm) meten van een motor met een encoderschijf
  • Een eenvoudige toerenteller bouwen
  • Voorwerpen of pulsen tellen
  • Afstand meten door te tellen hoe vaak een wiel draait
  • Snelheidsfeedback geven voor de wielen van een robot
  • Een eindpositie of een beginpositie (home) detecteren

Hoe het werkt

Hoe de optische IR-sleufsensor werkt

De OUT-pin volgt de lichtstraal:

  • Lege opening: het infrarode licht bereikt de fototransistor, dus OUT blijft HIGH.
  • Iets ondoorzichtigs in de opening (een stuk karton, of een tand van een encoderschijf): het licht kan er niet doorheen, dus OUT zakt naar LOW.

Er zit ook een Schmitt-trigger op het bord. Hij maakt van het ruwe signaal een schone 0 of 1 zonder getril aan de randen. Hierdoor heeft uw Python-script geen debounce-code nodig.

Twee kleine punten om te onthouden:

  • Doorzichtig plastic of glas kan het IR-licht doorlaten, dus de sensor ziet het misschien niet. Gebruik ondoorzichtige voorwerpen.
  • Enkele modules van andere makers werken andersom. Als uw module "geblokkeerd" meldt terwijl de opening leeg is, wissel dan LOW en HIGH in het eerste script om. Het tpm-script telt een flank voor elke tand, dus het geeft in beide gevallen de juiste snelheid.

De pinout van de optische IR-sleufsensor (snelheidssensor)

Pinout van de optische IR-sleufsensor

De module heeft drie pinnen:

  • VCC: Deze pin moet worden verbonden met de voedingsspanning (3,3V tot 5V). Gebruik op de Raspberry Pi 3,3V.
  • GND: Deze pin moet worden verbonden met de massa (0V)
  • OUT: Deze pin stuurt het digitale signaal naar een GPIO-ingangspin van de Raspberry Pi

※ Notiz:

De volgorde van de pinnen op een module kan verschillen tussen fabrikanten, en zelfs tussen productiebatches. Gebruik daarom altijd de labels die op de module staan. Kijk goed!

Bedradingsschema

Raspberry Pi bedradingsschema met optische IR-sleufsensor

Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.

Om uw bekabelingsopstelling te vereenvoudigen en te organiseren, raden we het gebruik van een Schroevenklemaansluiting-shield voor Raspberry Pi aan. Deze shield zorgt voor veiligere en beter beheerbare verbindingen, zoals hieronder weergegeven:

Raspberry Pi Schroevenklemaansluiting-Shield
  • VCC-pin van de sensor naar 3,3V van de Raspberry Pi (pin 1)
  • GND-pin van de sensor naar GND van de Raspberry Pi (pin 6 of een andere GND-pin)
  • OUT-pin van de sensor naar GPIO17 van de Raspberry Pi (pin 11)

WARNING

Voed deze sensor niet vanaf de 5V-pin van de Raspberry Pi. De OUT-pin gaat even hoog als de VCC-spanning. Met 5V op VCC zou OUT 5V naar GPIO17 sturen, maar de GPIO-pinnen van de Raspberry Pi accepteren alleen 3,3V. Als u de sensor op 3,3V voedt, blijft het OUT-signaal veilig.

Opstelling van de encoderschijf voor snelheidsmeting

Het tweede script heeft een encoderschijf nodig. Dit is een ronde schijf met sleuven langs de rand.

  • Bevestig de schijf op de motoras of op het wiel.
  • Monteer de sensor met de M3-schroefgaten, zodat de rand van de schijf in de opening loopt.
  • Controleer dat de tanden van de schijf door de sleuf gaan zonder de armen van de sensor te raken.

U kunt de schijf met de hand laten draaien, of u kunt de motor laten draaien. De bedrading van de motor hoort niet bij deze pagina. Om een motor met de Raspberry Pi aan te sturen, zie de Raspberry Pi - DC Motor tutorial.

Programmeren voor de Raspberry Pi om voorwerpen te detecteren en te tellen met de optische IR-sleufsensor

Dit eerste script controleert GPIO17 steeds opnieuw in een lus. Het print alleen een regel als de status van de pin verandert. Elke keer dat de opening geblokkeerd raakt, gaat de teller met een omhoog.

Snelle Stappen

  • Zorg dat u Raspbian of een ander compatibel besturingssysteem voor Raspberry Pi op uw Pi hebt geïnstalleerd.
  • Zorg dat uw Raspberry Pi met hetzelfde lokale netwerk is verbonden als uw pc.
  • Zorg dat uw Raspberry Pi met internet is verbonden als u libraries moet installeren.
  • Als u de Raspberry Pi voor het eerst gebruikt, zie hoe u de Raspberry Pi instelt
  • Verbind uw pc via SSH met de Raspberry Pi met de ingebouwde SSH-client op Linux en macOS of PuTTY op Windows.
  • Controleer of de RPi.GPIO library is geïnstalleerd. Als die ontbreekt, installeer hem met deze commando's:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Sluit de sensor aan op de Raspberry Pi zoals in het bedradingsschema hierboven.
  • Maak een Python-scriptbestand OpticalSpeedSensor.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-ir-slotted-optical-speed-sensor import RPi.GPIO as GPIO import time SENSOR_PIN = 17 # GPIO17 (pin 11) connected to the OUT pin of the speed sensor GPIO.setmode(GPIO.BCM) GPIO.setup(SENSOR_PIN, GPIO.IN) last_state = GPIO.input(SENSOR_PIN) object_count = 0 # how many times the slot was blocked try: while True: state = GPIO.input(SENSOR_PIN) if state != last_state: # the state has changed if state == GPIO.LOW: # LOW = something is in the slot object_count += 1 print("The slot is blocked - count: {}".format(object_count)) else: # HIGH = the slot is clear print("The slot is clear") last_state = state time.sleep(0.001) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Sla het bestand op en start het script met dit commando:
python3 OpticalSpeedSensor.py
  • Schuif een stuk karton, of uw vinger, in de opening en trek het er weer uit. Doe dit een paar keer.
  • Controleer de resultaten in de terminal.
PuTTY - Raspberry Pi
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

De terminal blijft stil zolang er niets verandert. Een nieuwe regel verschijnt alleen op het moment dat de opening geblokkeerd raakt of weer vrij wordt. Het script blijft kijken totdat u in de terminal op Ctrl + C drukt. Het ruimt dan de GPIO-pin op voordat het stopt.

Programmeren voor de Raspberry Pi om de motorsnelheid (tpm) te meten met de optische IR-sleufsensor

Als een schijf snel draait, komen de pulsen heel snel. Een eenvoudige lus zoals hierboven kan er enkele missen. Dit script vraagt daarom aan RPi.GPIO om de pin op de achtergrond te bewaken met GPIO.add_event_detect(). Elke FALLING-flank (het moment dat een tand de opening blokkeert) roept een kleine functie aan die een bij een teller optelt. Zo geeft elke tand precies een telling.

Eens per seconde leest het script de teller, zet hem terug op nul en berekent de snelheid:

  • Een volledige omwenteling van een schijf met 20 sleuven geeft 20 pulsen.
  • Pulsen in 1 seconde × 60 = pulsen in 1 minuut.
  • Pulsen in 1 minuut ÷ 20 = omwentelingen in 1 minuut, en dat is de tpm (RPM).

De waarde 20 staat in SLOTS_PER_TURN. Dat is het aantal sleuven van de gewone encoderschijf die bij TT-tandwielmotoren wordt verkocht. Als uw schijf een ander aantal sleuven heeft, pas dan deze constante aan.

Snelle Stappen

  • Doe dezelfde voorbereiding als in het eerste voorbeeld: SSH naar de Raspberry Pi, installeer RPi.GPIO en houd dezelfde bedrading.
  • Plaats de encoderschijf, zoals getoond in de opstelling van de encoderschijf hierboven.
  • Maak een Python-scriptbestand OpticalSpeedSensorRPM.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-ir-slotted-optical-speed-sensor import RPi.GPIO as GPIO import time SENSOR_PIN = 17 # GPIO17 (pin 11) connected to the OUT pin of the speed sensor SLOTS_PER_TURN = 20 # number of slots (holes) in the encoder disc pulse_count = 0 # runs every time a tooth of the disc blocks the slot def count_pulse(channel): global pulse_count pulse_count += 1 GPIO.setmode(GPIO.BCM) GPIO.setup(SENSOR_PIN, GPIO.IN) GPIO.add_event_detect(SENSOR_PIN, GPIO.FALLING, callback=count_pulse) try: while True: time.sleep(1) # count pulses for 1 second pulses = pulse_count # read and reset the counter pulse_count = 0 rpm = pulses * 60 / SLOTS_PER_TURN # pulses per second -> turns per minute print("Pulses: {} | Speed: {:.2f} RPM".format(pulses, rpm)) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Sla het bestand op en start het script met dit commando:
python3 OpticalSpeedSensorRPM.py
  • Draai de schijf met de hand, of zet de motor aan.
  • Controleer de resultaten in de terminal. De onderstaande regels komen van een motor die met ongeveer 300 tpm draait:
PuTTY - Raspberry Pi
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

In tegenstelling tot het eerste script print dit script elke 1 seconde een regel (door de time.sleep(1) regel), ook als de schijf stilstaat. In dat geval toont het 0 pulsen en 0,00 tpm. De metingen blijven komen totdat u in de terminal op Ctrl + C drukt. Het script ruimt dan de GPIO-pin op en stopt.

Extra kennis

Optische sleufsensor versus obstakelsensor versus rotary encoder

Alle drie de onderdelen sturen pulsen of AAN/UIT-signalen naar de Raspberry Pi, dus ze zijn makkelijk te verwarren. Laten we vergelijken waarvoor elk is gemaakt:

Optische IR-sleufsensor (snelheidssensor) IR-obstakelsensor Rotary encoder
Wat hij meet een voorwerp in een opening van 5,9 mm een voorwerp ervoor, een paar centimeter ver weg hoe ver en welke kant een knop is gedraaid
Hoe hij meet lichtstraal over de opening wordt geblokkeerd gereflecteerd infrarood licht twee signalen die niet in fase zijn
Beste gebruik tpm, tellen, wielomwentelingen, beginpositie obstakels detecteren voor robots draaiknop voor de gebruiker
Geeft richting aan nee nee ja

Het is duidelijk dat de optische sleufsensor de juiste keuze is als het bewegende deel door de opening kan gaan en u snelheid of een exacte telling nodig hebt. Als het voorwerp erbuiten blijft, gebruik dan de obstakelsensor. Als een persoon aan een knop draait en de richting telt, gebruik dan de rotary encoder.

Het aantal sleuven op de encoderschijf kiezen

Laten we een schijf met weinig sleuven en een schijf met veel sleuven vergelijken:

  • Meer sleuven geven meer pulsen per omwenteling. De tpm-waarde krijgt fijnere stappen en reageert beter bij lage snelheid. Met 20 sleuven en een venster van 1 seconde verandert elke extra puls het resultaat met 3 tpm (60 ÷ 20).
  • Minder sleuven geven minder pulsen per seconde. Dit is makkelijker te volgen voor de Raspberry Pi als de motor heel snel draait, maar het resultaat verandert in grotere stappen.

Welke schijf u ook gebruikt, schrijf het echte aantal sleuven in SLOTS_PER_TURN. Anders is de tpm-waarde fout.

Afstand meten met wielomwentelingen

Als de encoderschijf samen met een wiel draait, kunt u ook uitrekenen hoe ver het wiel heeft gerold:

  • Omtrek van het wiel = π × diameter van het wiel
  • Afstand = aantal omwentelingen × omtrek van het wiel
  • Aantal omwentelingen = totaal aantal pulsen ÷ SLOTS_PER_TURN

Een wiel met een diameter van 65 mm rolt bijvoorbeeld ongeveer 204 mm per omwenteling. Na 10 omwentelingen is het dus ongeveer 2 meter verder.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!