-
Notifications
You must be signed in to change notification settings - Fork 0
Ejemplos blockly
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).
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.
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.
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.
- Introducción
- Qué es Charlie
- Objetivos
- Alcance
- Proyectos similares
- Cómo controlar el robot
- Aspectos generales
- Modo de conducción libre
- Modo de programación gráfica 1. Ejemplos 2. Referencia de instrucciones
- Depuración
- Instalación
- Hardware
- Software
- Configuración de red
- Funcionamiento
- Comunicaciones
- Blockly
- Motores
- Cámara
- Comandos
- Explicación del código fuente
- Código de Arduino
- Aplicación Android
- Página web
- Servidor de comandos
- Script de arranque
- Resultados
- Evolución del proyecto
- Trabajo descartado
- Futuras ampliaciones
- Resultado final
- Agradecimientos
- Referencias
- Fuentes consultadas
- Datasheets