Sensor de llum

Aquest sensor té dos parts:

  • un diode emissor de llum roja
  • un transistor detector de llum, que dóna un valor proporcional a la intensitat de llum reflectida per la superfície

Utilitzarem el sensor per a detectar una línia negra, i controlar el robot per a seguir la trajectòria.

En primer lloc, connectem el robot.


In [ ]:
from functions import connect, light, forward, stop

connect()

Gràfica del sensor

Per a analitzar els valors del sensor, farem una gràfica, però en aquest mentre el robot es mou.

Heu de col·locar el robot perpendicularment a la línia negra, de manera que el codi següent farà avançar el robot uns segons per a travessar-la, llegint els valos abans de la línia, sobre ella, i després de la línia.


In [ ]:
forward()
data = []
for i in range(25):
    data.append(light())
stop()

A continuació representeu la gràfica. Hauríeu d'obtindre una mena de "V" perquè els valors alts corresponen a la superfície blanca (que reflexa més llum) i els baixos a la negra (que en reflexa menys).


In [ ]:
from functions import plot
plot(data)

Heu de seleccionar un valor intermedi per a distingir entre blanc i negre. Serà el llindar que usareu:

  • si la lectura està per damunt, el sensor està detectant blanc
  • si està per baix, negre.

Seguiment de línia, versió 1.0

Per a seguir la línia, la idea és senzilla:

  • el robot va pel costat de la línia, per la part de dins del circuit tancat
  • si el sensor detecta blanc, el robot va recte
  • si detecta negre, el robot gira per rectificar la seua trajectòria

Depenent del sentit en que està recorrent el circuit, haurà de rectificar girant a l'esquerra o a la dreta.


In [ ]:
from functions import left, right

In [ ]:
try:
    while True:
        if light()>40:
            forward()
        else:
            right()
except KeyboardInterrupt:
    stop()

Versió 2.0

Si el robot se n'ix per la curva, cal fer un gir més pronunciat. Les funcions que hem utilitzat fins ara giren una roda mentre l'altra està parada. Es pot girar més si, en lloc d'estar parada, l'altra roda gira en sentit contrari. Per a fer-ho, useu les següents funcions:


In [ ]:
from functions import left_sharp, right_sharp

In [ ]:
try:
    while True:
        if light()>40:
            forward()
        else:
            right_sharp()
except KeyboardInterrupt:
    stop()

Versió 3.0

En general, pot haver curves a esquerra i dreta. Aleshores, el mètode anterior no és suficient. Una solució seria usar dos sensors, un per cada costat de la línia, però només en tenim un per robot.

Una altra solució és fer que el sensor vaja per la vora de la línia, de manera que la superfície serà meitat negra i meitat blanca. Si definim dos llindars, aleshores:

  • si el sensor està per baix dels dos llindars, és negre
  • si està per dalt dels dos, és blanc
  • si està enmig, és la vora de la línia

El robot anirà recte quan vaja per la vora de la línia, i pot rectificar a esquerra en un cas, i a dreta en l'altre.


In [ ]:
try:
    while True:
        if light()>85:
            left_sharp(speed=10)
        else:
            if light()<15:
                right_sharp(speed=10)
            else:
                forward(speed=50)
except KeyboardInterrupt:
    stop()

Versió 4.0

Si el robot oscil·la massa, fins i tot pot travessar la línia i desorientar-se completament.

La solució és disminuir la velocitat, indicant-ho a les funcions de moviment, per exemple:

forward(speed=65)

El valor per defecte és 100, el màxim, i el mínim és 0.


In [ ]:
try:
    while True:
        if light()>40:
            left_sharp(speed=50)
        else:
            if light()<15:
                right_sharp(speed=50)
            else:
                forward(speed=50)
except KeyboardInterrupt:
    stop()

Recapitulem

Abans de continuar, desconnecteu el robot:


In [ ]:
from functions import disconnect
disconnect()

En aquesta pàgina no hem vist conceptes nous, però hem aplicat el que ja sabíem al problema de seguir la línia.

Passem a vore el darrer sensor.

>>> Sensor ultrasònic