Skip to content
monkeyserna edited this page May 24, 2014 · 1 revision

Ejemplos

Parpadeo de un led

Este sencillo ejemplo enciende y apaga 10 veces un led.

En pseudocódigo, realiza lo siguiente:

repite 10 veces:
    Enciende el primer led
    Espera 1 segundo
    Apaga el primer led
    Espera 1 segundo

Al pulsar el comando Execute, éste código es traducido a Python y enviado a la Raspberry Pi, para que ejecute el script realizado. La traducción a Python del script realizado se puede ver pulsando sobre Show code:

for count in range(10):
  sendToArduino(12,0,1)
  time.sleep(1)
  sendToArduino(12,0,0)
  time.sleep(1)

La función sendToArduino/3 es una función auxiliar disponible en la Raspberry Pi que envía por comunicación USB 3 bytes a Arduino. Concretamente, envía el comando 12 CMD_LED con dos parámetros: número de led (entre 0 y 13) y estado (encendido = 1 y apagado = 0).

Movimiento mediante sonar

El siguiente código realiza un movimiento de avance hasta detectar un objeto a 20cm o menos. Cuando el sonar detecta un objeto cercano, se detiene el movimiento.

Los pasos que realiza son

  • Establece movimiento de avance (el robot comienza a avanzar)
  • Mientras la lectura del sonar detecte objetos a más de 20 cm:
    • Espera 100ms (para no saturar las lecturas)
  • Detiene motores (esto significa que el sonar ha detectado un objeto cercano, y envía la señal STOP).

La traducción a python sería:

sendToArduino(4,255,0)
while readSonar() > 20:
  time.sleep(0.1)
sendToArduino(0,0,0)

Este script envía 2 comandos a Arduino:

  • Comando 4: CMD_MOVE_FORWARDS [SPEED], donde 255 especifica la velocidad de avance.
  • Comando 0: CMD_STOP, que no recibe parámetros y detiene el movimiento del robot.

La lectura del sonar es realizada desde la Raspberry Pi, por lo que se invoca a la función que realiza la lectura para conocer la lectura del sonar.

Variante con movimiento de servos

En el siguiente enlace es posible visualizar la ejecución de un código muy similar al anterior: https://www.youtube.com/watch?v=4JmeOW4XnzA

El código que ejecuta es:

Como se puede observar, primero se establece la posición del servo a 0º, para colocar el sonar en posición horizontal. También se incluye un retraso de medio segundo para que el servomotor termine de realizar su movimiento antes de comenzar con las lecturas.

El robot avanza hasta que detecta un objeto a 10cm o menos.

Siguelíneas

El siguiente código emplea los sensores infrarrojos situados en la parte inferior del robot para detectar líneas y recorrerlas. En este enlace es posible ver un vídeo de la ejecución de un siguelíneas: https://www.youtube.com/watch?v=nfWoZmEDF4Y

El código realiza lo siguiente:

  • Lee los sensores infrarrojos frontales, y obtiene la posición de la primera marca negra, empezando por la izquierda. Son 12 sensores, por lo que 0 indica que hay una marca muy a la izquierda, 11 que la marca está muy a la derecha y 5 o 6 son los valores centrales.

  • Mientras detecte linea:

    • Escala la posición del primer negro detectado desde su rango original (0-11) al rango disponible en un byte (0-255)
    • Establece una velocidad constante y el balance de giro del robot con este valor (0 indica giro brusco a la izquierda, 123 indica avance frontal y 255 giro brusco a la derecha)
    • Espera 100 milisegundos (para no saturar el robot)
    • Vuelve a leer los sensores frontales y detectar el primer negro

El código traducido a python, que será ejecutado desde la Raspberry Pi es el siguiente:

item = None

item = receiveFromArduino(14,0,0)
item = item.find("1")

while item >= 0:
  item = map(item,0,11,0,255)

  sendToArduino(1,255,item)
  time.sleep(0.1)
  item = receiveFromArduino(14,0,0)
  item = item.find("1")

sendToArduino(0,0,0)

La función auxiliar receiveFromArduino/3 envía el comando y los parámetros recibidos, y espera una respuesta al comando. El valor recibido es devuelto por esta función. Concretamente, el comando 14 CMD_FRONT lee la matriz de sensores frontales y envía de vuelta una secuencia de números binarios. Por ejemplo 000001100000. Este número concreto significa que los sensores que ocupan las posiciones centrales han detectado una marca negra en el suelo, mientras que el resto detectan blanco. Este número es tratado como una cadena para simplificar su programación y poder aprovechar las funciones disponibles sobre cadenas.

La siguiente instrucción find("1") busca (comenzando por la izquierda) la primera marca negra de la lectura del sonar. En el ejemplo anterior, el resultado sería 6 (ya que el sexto elemento de la lectura es el primer 1 leído). Si no se encuentran "1" en la lectura (es decir, todos los sensores detectan blanco) esta función devuelve -1.

El bucle se repite mientras la función anterior devuelva un número mayor o igual que cero, es decir, mientras se detecta alguna marca negra.

A continuación, se escala el valor desde [0,11] hasta [0,255] con la operación map (escalado) y se envía este valor como balance (segundo parámetro del comando 1 CMD_MOVE_BALANCED [speed] [balance], estableciendo la velocidad constante a 255 (velocidad máxima).

Las últimas instrucciones del bucle vuelven a realizar una lectura del sonar y a buscar el primer negro.

Por último, se envía el comando 0 CMD_STOP que detiene el movimiento del robot.

Clone this wiki locally