Skip to main content

Time of Flight-sensor

Een Time of Flight (TOF) sensor meet afstand met een lichtstraal. Hij is preciezer dan een ultrasone sensor en werkt ook bij geluid. De TOF praat over I2C, dus via de pinnen SDA en SCL.

Materiaal​

  • Nano op het shieldArduino Nano RP2040 Connect op het Leaphy Murphy ShieldHet Leaphy Murphy Shield, de groene printplaat waar de Nano in past
  • Time of Flight-sensorMet de pinnen SDA, SCL, VCC en GNDDe Time of Flight-sensor, een groen druppelvormig printje met de pinnen SDA, SCL, VCC en GND
  • SDA/SCL-moduleEen multiplexer, alleen nodig bij twee of meer TOF-sensorenDe SDA/SCL-module (multiplexer) voor het Leaphy Murphy Shield
Controlevraag

Waarom heb je een multiplexer nodig bij meerdere TOF-sensoren?

Antwoord

Alle TOF-sensoren hebben hetzelfde I2C-adres. De microcontroller zou ze niet uit elkaar kunnen houden. Met een multiplexer geef je elke sensor een eigen channel, zodat je ze los kunt aanspreken.

Eén TOF zonder multiplexer​

Aansluiten​

Aansluitschema: één TOF zonder multiplexer op het shield, met SDA aan A4, SCL aan A5, en VCC en GND op het rijtje van A4

  • SDA van de TOF aan de pin A4 (binnenste rij; op het shield A4/D18/SDA)
  • SCL van de TOF aan de pin A5 (binnenste rij; A5/D19/SCL)
  • VCC aan 3V3 (middelste rij) en GND aan GND (buitenste rij), allebei op het rijtje van A4

In het schema kruisen twee draden elkaar: op de TOF zit SDA links van SCL, maar de draad van SDA moet het verst opzij.

Beschermend stickertje

Op een nieuwe TOF zit vaak een doorzichtig plastic stickertje. Trek dat er voorzichtig af voor een betere meting.

Code​

from leaphymicropython.sensors.tof import TimeOfFlight
from time import sleep

tof = TimeOfFlight()

while True:
afstand = tof.get_distance()
print(afstand)
sleep(1)

Uitleg​

  • TimeOfFlight() maakt een sensor aan op het standaard I2C-adres.
  • tof.get_distance() geeft de afstand in millimeters.
Controlevraag

Wat krijg je terug als er niets voor de sensor staat?

Antwoord

Het getal 8191. Dat betekent: geen geldige meting. Je krijgt het ook als een object te ver weg is of juist te dichtbij (onder ongeveer 5 cm). De TOF meet betrouwbaar tussen ongeveer 5 cm en 200 cm.

Alleen geldige metingen​

Soms staat er niets voor de sensor, of zit een object buiten bereik. Dan krijg je een hoog getal terug. De regel is simpel: alles boven 8090 is geen echte afstand.

from leaphymicropython.sensors.tof import TimeOfFlight
from time import sleep

tof = TimeOfFlight()

while True:
afstand = tof.get_distance()
if afstand > 8090:
print("geen geldige meting")
else:
print(afstand)
sleep(1)
  • Alles tot en met 8090 noemt de bibliotheek een afstand, in millimeters. Betrouwbaar meet de sensor tussen ongeveer 50 en 2000 mm (5 cm tot 2 m). Daarbuiten krijg je soms nog een getal, maar reken er niet op.
  • Is het getal groter dan 8090? Dan is er geen geldige meting:
    • 8191: de sensor antwoordt, maar ziet niets binnen bereik (te ver, te dichtbij of niets ervoor);
    • boven 9000: de sensor antwoordt niet, bijvoorbeeld door een losse SDA- of SCL-draad of een verkeerd channel. Zie Er gaat iets mis.
Controlevraag

Wat zie je in de Shell als je je hand vlak (minder dan 5 cm) voor de sensor houdt?

Antwoord

geen geldige meting. Onder ongeveer 5 cm geeft de TOF 8191, en dat is groter dan 8090.

Eén TOF met multiplexer​

Met de SDA/SCL-module kun je tot acht I2C-apparaten aansluiten op channels 0 t/m 7. Elke sensor krijgt zo zijn eigen kanaal.

Aansluiten​

Aansluitschema: de TOF op channel 7 van de multiplexer, met SDA, SCL, VCC en GND elk op de pin met dezelfde naam; de multiplexer steekt in de bus rechts op het shield

In dit voorbeeld zit de TOF op channel 7 van de multiplexer. Het cijfer staat boven het stel pinnen waarin je de sensor steekt. Op een channel staan vier pinnen onder elkaar: SDA, SCL, VCC en GND. Elke draad van de TOF gaat naar de pin met dezelfde naam.

Code​

from leaphymicropython.sensors.tof import TimeOfFlight
from time import sleep

tof = TimeOfFlight(channel=7)

while True:
print(tof.get_distance())
sleep(1)

Uitleg​

TimeOfFlight(channel=7)

Met channel=7 vertel je de bibliotheek op welk kanaal van de multiplexer de sensor zit. Vergeet niet dit aan te passen als je de sensor in een ander kanaal steekt.

Controlevraag

Welk getal vul je in bij channel= als je de sensor in het stel pinnen onder 0 steekt?

Antwoord

channel=0. Het cijfer boven het stel pinnen op de multiplexer is precies het kanaal dat je in je code invult.

Twee of meer TOFs met multiplexer​

Heb je twee TOFs nodig (bijvoorbeeld om links en rechts te meten)? Dan steek je ze in twee verschillende channels van de multiplexer.

Aansluiten​

Aansluitschema: TOF 1 op channel 0 en TOF 2 op channel 7 van de multiplexer, elke draad op de pin met dezelfde naam

In dit voorbeeld:

  • TOF 1 op channel 0
  • TOF 2 op channel 7

Bij channel 0 tot en met 3 (bovenaan de multiplexer) staan de pinnen andersom: GND bovenaan en SDA onderaan. Daarom kruisen de draden van TOF 1 in het schema. Steek ook hier elke draad op de pin met dezelfde naam.

Code​

from leaphymicropython.sensors.tof import TimeOfFlight
from time import sleep

tof_0 = TimeOfFlight(channel=0)
tof_7 = TimeOfFlight(channel=7)

while True:
afstand_0 = tof_0.get_distance()
afstand_7 = tof_7.get_distance()
print(afstand_0, afstand_7)
sleep(1)

In de Shell zie je nu twee getallen naast elkaar: de afstand voor sensor 0 en sensor 7.

Opdracht: drie sensoren

Voeg een derde TOF toe op channel 3 en print ook die waarde mee.

Oplossing
from leaphymicropython.sensors.tof import TimeOfFlight
from time import sleep

tof_0 = TimeOfFlight(channel=0)
tof_3 = TimeOfFlight(channel=3)
tof_7 = TimeOfFlight(channel=7)

while True:
print(tof_0.get_distance(), tof_3.get_distance(), tof_7.get_distance())
sleep(1)