martes, 23 de febrero de 2021

Solución del "Callejón sin salida" en el modo MAZE, laberinto

 Hola a tod@s.

En este tema vamos a ver una posible solución al problema del callejón sin salida cuando nuestro coche robot está intentando salir de un laberinto.

Hemos llamado callejón sin salida a una situación en la que el coche robot encuentra una pared de frente (ultrasonido detecta algo a menos de 20cm) y al mirar a los lados las dos paredes, derecha e izquierda, están también a menos de 20cm. En ese caso el planteamiento ha sido hacer retroceder al coche para salir del callejón parando cada cierta distancia para ver si ya hay salida hacia alguno de los lados.

Para poder programarlo primero he creado una función que realiza toda la acción de obtener la distancia de las paredes a la izquierda y a la derecha "comparar_distancias". Esta función empieza conectando el servo (en mi caso el componente servomotor se llama así en la programación "servo" y está conectado al pin 2 de arduino), mirando hacia los lados y guardando el valor en las respectivas variables para finalmente desconectar el servo.

Trabajar con esta funciona simplificará bastante la programación después:


Entrando ya en la programación la primera orden (mediante otra función) será que el coche avance y si encuentra un obstáculo delante (distancia <= 20) pare y ejecute la función "comparar_distancias" mediante la cual obtendremos un valor para las variables dist_der y dist_izq. Si ambas distancias son < que 20 entramos en un mientras del que no saldremos hasta que alguna de las dos sea igual o mayor que 20. En ese mientras iremos haciendo retroceder al coche (500ms) y ejecutando la función comparar_distancias para ir obteniendo nuevos valor de dist_der y dist_izq.

Una vez el coche sale del callejón y alguno de los dos valores dist_der y dist_izq es > = que 20 el programa continua con la programación clásica del modo MAZE, laberinto, en el que comprobamos que lado tiene un valor mayor para que el coche gire en esa dirección.





Como siempre en programación, existen más formas de programar la solución al callejón sin salida incluso los bloques del ejemplo son adaptables y mejorables. Os animo a probar vuestras propias ideas.

Un saludo,
Raúl.

viernes, 19 de febrero de 2021

Coche robot con arduino: Sigue líneas de 4 canales (Parte 2 de 2)

 Hola a tod@s.

En el tema anterior sobre sigue líneas dejaba la siguiente imagen como propuesta de trabajo para programar el sigue líneas. Estaban los diferentes condicionales pero sin desarrollar:



En este tema vamos a ver el código en el interior de cada uno de esos condicionales.

El primero ya lo vimos: Cuando los sensores interiores están devolviendo un 1 (es decir están sobre la línea negra) le damos la orden de avanzar al coche. Realmente nos da igual el valor que tengan los sensores exteriores.

En los dos siguientes condicionales tenemos uno de los dos interiores sobre la línea negra, devolviendo valor 1, y el otro está ya fuera, está sobre algo más claro y por tanto está devolviendo 0. Como en el caso anterior no entramos a valorar lo que están devolviendo los exteriores porque realmente no nos hace falta para la orden que le vamos a dar al coche que es: girar hacia el lado donde está devolviendo 1 ya que se está saliendo por el lado donde está devolviendo 0. Ese giro, para que el coche siga avanzando lo máximo posible, lo hacemos de manera que mantenemos el motor del lado que da 0 encendido (máxima potencia) y el del lado que da 1 le hacemos un encendido de valor analógico 220 (de un máximo de 255) para que vaya algo más lenta esa rueda. Ese valor de 220 hay que ajustarlo para cada coche, incluso puede variar el comportamiento un poco si las pilas están más gastadas.

Importante que cuando hacemos girar al coche guardamos el sentido de giro en una variable que se llama "ultimo_movimiento", que como podéis comprobar es 0 en caso de giro a la derecha y 1 en caso de giro a la izquierda.


Por último entramos en la opción en la que los dos sensores interiores están dando valor 0 porque se han salido de la línea negra. Aquí si consultamos el estado de los sensores exteriores para ver por que lado nos estamos saliendo y procedemos de manera similar a como hemos hecho antes, ralentizando la velocidad de la rueda del lado que de 1 en el sensor exterior. Al igual que antes guardamos en la variable "ultimo_movimiento" el sentido hacia el que le hemos dicho que gire.


La última opción es aquella en la que todos los sensores dan 0, es decir el coche esta por completo fuera de la línea negra, en ese momento es cuando usaremos el valor de la variable "ultimo_movimiento" para indicar al coche hacia donde tiene que girar, que es en el sentido del movimiento que le estábamos indicando ya que lo que ha ocurrido es que aunque se lo hemos indicado no le ha dado tiempo a hacerlo o bien por ir muy rápido o porque el giro era muy brusco. Aquí ya si hacemos un giro total del coche encendiendo una rueda hacia atrás y otra hacia adelante para que no avance mientras no esté de nuevo sobre la línea.


Es muy divertido programar el sigue líneas y comprobaréis que la respuesta del coche depende mucho de como se programe. Las ideas de condicionales que he puesto son solo una de las muchas posibilidades para programarlo, seguro que podréis ir creando las vuestras propias.

Por último recordar que es muy importante que comprobéis que los sensores funcionan bien antes de probar la programación del sigue líneas y así podéis trabajar con más tranquilidad y confianza la programación.

Un saludo,

Raúl.

martes, 16 de febrero de 2021

Control por voz del coche robot

 Hola a tod@s.

En este tema vamos a ver como controlar mediante la voz el coche robot. Una función que es realmente espectacular y que gracias a la tecnología existente es bastante sencilla de programar.

El control lo implementaremos mediante AppInventor y sus funciones de reconocimiento de voz.

Recordar que si no tenéis ya iniciada la aplicación de control del coche mediante bluetooth podéis usar este archivo .aia como base. En él encontrareis ya incluido el componente bluetooth y el selector de lista de conectar y botón de desconectar: 

Archivo .aia base de conexión bluetooth: https://drive.google.com/file/d/1oqlpDn9KrgrQOGGfGlU5ku2eHjoRjf1L/view?usp=sharing

Por un lado en la parte de diseño, dentro del apartado de Medios, tendremos que añadir la función "ReconocimientoDeVoz". Añadiremos también un botón que servirá para activar la captura de voz. Esta es la opción más sencilla pero también podría programarse para que se active al agitar el dispositivo o al acercarlo al oido.



En la parte de bloques la programación es muy sencilla. Por un lado al pulsar el botón llamamos a ObtenerTexto del reconocimiento de voz. Esta funciona está dentro de la herramienta de reconocimiento de voz al igual que el bloque de "DepuésDeObtenerTexto" que usaremos también.



Un ejemplo de como podrían ser los bloques de programación pueden verse en la siguiente imagen. En función de las palabras que haya captado el dispositivo enviará por bluetooth las letras de control del coche a arduino.


El siguiente paso que daremos será el control del coche por voz mediante Inteligencia Artificial, de manera que no será necesario decir exactamente las palabras que tenga prefijadas App Inventor para controlar el coche. Crearemos etiquetas con diferentes acciones, que alimentaremos con un modelo de IA generado en Machine Learning for Kids, de manera que el dispositivo será capaz de asociar la información recibida por voz a una etiqueta/acción aunque el mensaje recibido no coincida con los valores de ejemplo.

En caso de que la acción realizada no sea la que esperábamos podremos realimentar el modelo desde la propia App para que pueda ir aprendiendo y mejorando sus respuestas.

Saludos,

Raúl.