Skip to main content

Lijnvolgen

Met twee IR-sensoren en twee motoren volgt je robot een zwarte lijn. Je sluit ze aan zoals bij Analoge IR-sensor en DC-motor: de sensoren op A0 (links) en A1 (rechts), de motoren op het motor shield.

Hoe werkt lijnvolgen?​

De truc: laat de motoren reageren op wat de sensoren zien. Je robot komt de tegels hieronder tegen.

Zeven tegels met een zwarte lijn: recht, onderbroken, schuin, een bocht, golvend, een zigzag en een lijn met haakse hoeken

Denk eerst zelf na​

  1. Beide sensoren zien wit (lijn zit tussen de sensoren in). Wat moeten de motoren doen?
  2. Alleen de linkersensor ziet zwart. Welke motor moet bijsturen?
  3. Alleen de rechtersensor ziet zwart. En nu?
  4. Beide sensoren zien zwart. Wat betekent dat?
Tip

Stel je voor dat de robot over de lijn heen rijdt, met de lijn tussen zijn twee sensoren. Als hij naar links afdwaalt, ziet de rechtersensor de lijn. Hij moet dus terug naar rechts. Dat doe je door de linker motor harder te laten draaien dan de rechter.

Antwoord
  1. Beide wit: rechtdoor. Allebei de motoren even hard vooruit.
  2. Alleen links zwart: de robot is naar rechts afgedwaald. Stuur naar links: rechter motor harder, linker motor zachter (of stil).
  3. Alleen rechts zwart: omgekeerd. Linker motor harder, rechter motor zachter.
  4. Beide zwart: meestal een kruising of het einde van het parcours. Wat je dan doet is een keuze: rechtdoor, stoppen of een kant op draaien.

Code​

Hieronder staat een werkende basis. De if-takken voor links en rechts bijsturen zijn nog leeg — die ga je zelf invullen.

Voorbeeld​

from leaphymicropython.sensors.linesensor import AnalogIR
from leaphymicropython.actuators.dcmotor import DCMotors
from time import sleep

motoren = DCMotors()
motor_a = motoren.motor_a
motor_b = motoren.motor_b

a0 = AnalogIR("A0", 2500) # linker sensor
a1 = AnalogIR("A1", 2500) # rechter sensor

while True:
left = a0.black_or_white()
right = a1.black_or_white()

if left == 'white' and right == 'white':
motor_a.forward(255)
motor_b.forward(255)
if left == 'white' and right == 'black':
# naar rechts bijsturen
motor_a.forward(255)
motor_b.forward(255)
if left == 'black' and right == 'white':
# naar links bijsturen
motor_a.forward(255)
motor_b.forward(255)
sleep(0.01)

Uitleg​

  • Eerst lees je beide sensoren uit (left en right).
  • Daarna kijk je met if-statements naar de mogelijke combinaties. Bij beide zwart doet deze code niets.
  • Bij beide wit rijden beide motoren vol vooruit.
  • Bij de overige gevallen moet je zelf bedenken welke motor je lager zet om bij te sturen.
Opdracht: vul de bijsturing in

Verander de snelheden bij naar rechts bijsturen en naar links bijsturen zodat de robot daadwerkelijk de lijn volgt.

Tip

Als de linkersensor wit ziet en de rechter zwart, is de robot naar links afgedwaald. Stuur naar rechts: motor_b (rechts) lager, motor_a (links) op 255. Maar pas op: welke motor links en welke rechts zit, hangt af van hoe je de motoren hebt aangesloten. Test eerst met motor_a.test().

Oplossing (één mogelijkheid)
from leaphymicropython.sensors.linesensor import AnalogIR
from leaphymicropython.actuators.dcmotor import DCMotors
from time import sleep

motoren = DCMotors()
motor_a = motoren.motor_a
motor_b = motoren.motor_b

a0 = AnalogIR("A0", 2500)
a1 = AnalogIR("A1", 2500)

while True:
left = a0.black_or_white()
right = a1.black_or_white()

if left == 'white' and right == 'white':
motor_a.forward(255)
motor_b.forward(255)
if left == 'white' and right == 'black':
motor_a.forward(255)
motor_b.forward(150) # rechter motor zachter
if left == 'black' and right == 'white':
motor_a.forward(150) # linker motor zachter
motor_b.forward(255)
sleep(0.01)

Welke motor je zachter zet hangt af van jouw bedrading. Test en pas aan tot het werkt.