Sensor de so (micròfon)

El micròfon del robot detecta el soroll ambiental. No sap reconèixer paraules, però si pot reaccionar a una palmada, o un crit. Altres robots més sofisticats com el de la imatge sí que poden parlar i reconèixer el llenguatge.

En aquesta pàgina analitzarem els valors del sensor, i l'usarem per a controlar el robot.

Primer que res, ens connectem.


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

connect()

La senyal del so

Si recordeu un exemple anterior, la funció sound ens retorna un valor entre 0 i 100, segons la intensitat del so. Anem a provar-la de nou, però representant el seu valor en una gràfica.

Per a això, el que farem és recollir dades: llegirem els valors de la funció vàries vegades i els guardarem en la memòria de l'ordinador, per a després representar gràficament els valors.

Per a guardar dades en la memòria, els llenguatges de programació fan servir variables.

En el següent exemple, usem una variable anomenada data, que contindrà la llista de valors que llegim del sensor. Inicialment estarà buida, i dins del bucle anirem afegint valors.


In [ ]:
data = []                 # executeu este codi mentre parleu al micròfon
for i in range(200):
    data.append(sound())

Ara representarem gràficament els valors llegits.


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

Normalment voreu valors que pugen i baixen, entre 0 i 100, segons parleu menys o més fort. Podeu provar també a donar palmades.

Aleshores, per a controlar el robot, podem fer que reaccione quan el valor del so siga més alt d'un determinat llindar (umbral en castellà).

Control a distància per so

Feu un programa per a que el robot vaja recte mentre no li digueu que pare, és a dir, mentre no detecte un so alt.


In [ ]:
while sound()<50:
    forward()
stop()

Modifiqueu el programa de navegació, de manera que, en lloc de girar quan el robot detecta un contacte, ho faça quan detecta un so, per exemple una palmada.


In [ ]:
from functions import backward, left, right
from time import sleep
from random import random

try:
    while True:
        while sound()<50:
            forward()
        backward()
        sleep(1)
        if random() > 0.5:
            left()
        else:
            right()
        sleep(1)
except KeyboardInterrupt:
    stop()

Usar els dos sensors al mateix temps

En lloc de substiuir la condició de contacte per la de so, també podem afegir eixa segona condició a la primera. Els llenguatges de programació poden fer operacions lògiques per a combinar condicions. No és tan complicat com pareix, per exemple, les dos condicions s'escriurien així:

mentre el so siga menor que 50 i no hi haja contacte

Per a programar-ho en Python, només cal saber que "i" en anglès s'escriu "and" ;-)


In [ ]:
from functions import backward, left, right, touch
from time import sleep
from random import random

try:
    while True:
        while sound()<50 and not touch():
            forward()
        backward()
        sleep(1)
        if random() > 0.5:
            left()
        else:
            right()
        sleep(1)
except KeyboardInterrupt:
    stop()

Indicar la direcció

Controlar el robot, per a que després gire a l'atzar, no queda massa bé. Seria millor que poguérem controlar la direcció del gir amb el so. Recordeu que el robot no reconeix els sons, només els canvis de volum.

Com podríeu indicar-li la direcció de gir? A la millor, en compte d'un número a l'atzar, podríeu comprovar el valor del sensor de so un segon cop. Aleshores, amb una sola palmada, el robot giraria cap a un costat, i amb dos, cap a l'altre.


In [ ]:
from functions import backward, left, right, touch
from time import sleep
from random import random

try:
    while True:
        while sound()<50 and not touch():
            forward()
        backward()
        sleep(1)
        if sound() < 50:
            left()
        else:
            right()
        sleep(1)
except KeyboardInterrupt:
    stop()

I el gran repte

Podeu fer una versió completa amb tot?

  • el robot va recte mentre no hi haja contacte ni detecte cap so alt
  • si detecta un contacte, va cap arrere i gira a l'atzar a esquerra o dreta
  • però si el que ha detectat és el so, va cap arrere, i si detecta un segon so, gira a esquerra i si no a dreta

Complicat? No tant, però cal tindre les idees clares!


In [ ]:
from functions import backward, left, right, touch
from time import sleep
from random import random

try:
    while True:
        while sound()<50 and not touch():
            forward()
        if touch():
            backward()
            sleep(1)
            if random() < 0.5:
                left()
            else:
                right()
            sleep(1)
        else:
            backward()
            sleep(1)
            if sound() < 50:
                left()
            else:
                right()
            sleep(1)
except KeyboardInterrupt:
    stop()

Recapitulem

Abans de continuar, desconnecteu el robot:


In [ ]:
from functions import disconnect
disconnect()

Si heu arribat fins ací fent totes les variants, enhorabona! Comenceu a controlar de debó la programació. Si no, no patiu, açò no s'apren en dos hores!

En aquesta pàgina hem donat una ullada a les variables i a les operacions lògiques, i hem anat anidant cada cop més bucles i condicionals. Així és la programació!

I només hem vist la meitat de sensors! Passem a vore doncs el tercer.

>>> Sensor de llum