miércoles, febrero 24, 2016

¡Alto ahi! Programando el control remoto

Algo importante a tener en cuenta es que cada vez que cargamos un programa nuevo a nuestro robot estamos borrando el anterior. En otras palabras, un programa pisa a otro programa. Esto, puede parecer medio engorroso pero al mismo tiempo permite preparar al robot para realizar tareas muy específicas y que no haya lugar a confusión. Pero también podríamos pensar en varios programas a la vez que se activaran a través de un menú… es una buena idea, pero antes de pensarla es importante conocer las posiblidades del control remoto.


Hasta ahora habíamos pensado pequeños programas autónomos, esto es, programas en los cuales el robot sigue una serie de instrucciones de acuerdo a lo que indican los sensores. Pero a esta cuestión, podríamos ahora agregar acciones al robot que dependieran de una instrucción en tiempo real enviada a distancia.


El misterio del control remoto
Un control remoto es un dispositivo que se comunica a través de señales infrarojas. La radiación infrarroja es un tipo de radiación electromagnética y térmica invisible al ojo humano… con una simple camara de celular podemos verificar si el control remoto funciona correctamente.




Una vez que verificamos que el control funciona (lleva una batería en su interior, que debe estar cargada) vamos a programar a mBot para que siga la instrucciones que le daremos, infrarrojos mediante.


La programación del control
Programar el control remoto es bastante simple, ya que solo tendremos que usar el condicional que indique que si apretamos un botón del control, el robot debe moverse en una dirección determinada. La primera dificultad que detectaremos al resolver esta cuestión es que, al girar, el robot necesita tiempo para posicionarse y avanzar. Eso lo tendremos que tener en cuenta en la programación e introducir una "espera" que permita adaptar nuestras órdenes a los tiempos físicos en los que el robot se mueve.

Por otra parte es importante que tengamos en cuenta, también, que no se trata solamente de avanzar y avanzar… ¿que pasa si nos sorprende una pared? No queremos que el robot se estrelle así que tomaremos una medida de seguridad: vamos a configurar el sensor ultrasónico frontal para que, al detectar un obstáculo a unos 25 cm, se detenga automáticamente.


El programa en Makeblock (versión de Scratch para mBot) quedaría, entonces, así:


¡Alto ahi!
Y como verán, al final del programa, incluimos unas líneas para colocar un freno “manual”, de manera tal que, si algo falla, podamos activarlo. Esto supone que los motores se detendrán si presionamos la tecla “A” en el control. Como broche final, una agregamos dos notas a modo de bocina, cosa que el robot avise que, efectivamente, recibió la señal de ¡Alto ahí!




Este es el tercer post sobre experiencias con mBot
Si te intersa conocer como llegamos aquí podés vistar nuestros posts anteriores: “Primeras experiencias en robótica educativa” y “Con ojos de robot” en este mismo blog.

sábado, febrero 13, 2016

Con ojos de robot

¿Pueden ver los robots? Si miramos a mBot no dudaremos un segundo en responder afirmativamente porque está diseñado de forma tal que sus sensores frontales parecen tiernos ojitos. Sin embargo, más allá de la humanización, la forma en que funcionan los sensores no es necesariamente igual a como lo harían nuestros ojos y por lo tanto, para progamar el robot, tenemos que tener en cuenta algunas cositas…


Un sensor es un dispositivo capaz de detectar magnitudes (físicas o químicas) y transformarlas en variables eléctricas… que a los efectos de un robot podemos entenderlas como la información que utilizaremos para que el programa pueda tomar ciertas decisiones dependiendo de cuál sea la información en cuestión. Por ejemplo, si la información es que hay una pared por delante, entonces el programa ordenará que hay que frenar… digamos, si no queremos que se choque.

Los ultrasónicos
¿Pero de que forma pueden "ver" los robots? Lo hacen a través de los sensores, por supuesto. Hay sensores de diversas clases (no solo por su calidad y características generales) sino por el tipo de magnitudes que pueden detectar. Los sensores frontales de mBot que se ven claramente en la fotografía y parecen los ojos de su "cara" son, en rigor, sensores ultrasónicos, que no perciben la luz sino que “ven” sonido exactamente de la misma forma en que lo haría el “radar” de un murciélago. El sensor ultrasónico emite un sonido (inaudible para los humanos) que rebota sobre el objeto detectado por lo que recibe un eco. A continuación, el sensor mide la distancia a partir del tiempo en que el eco demoró en volver y convierte ese dato en información.

Para ensayar esta funcionalidad del sensor ultrasónico, preparé un pequeño programa que hace lo siguiente:


  1. Crea la variable “Distancia” de modo tal que el robot pueda guardar la información medida por el sensor (e indica que este esta conectado al puerto 3)
  2. Ordena que si esa distancia es menor a 20 cm el motor se detenga…
  3. Pero si la distancia es superior, el robot debe avanzar hacia adelante

Este es el código en su versión en MakeBlock para Scratch:



Y he aquí el resultado ¡el mBot puede “ver” la pared!




Line follower
Pero mBot tiene otro sensor más. En este caso no se trata de un sensor ultrasónico sino de un “line follower” o “seguidor de línea”. El “line follower” tiene dos “ojitos” que pueden detectar la luz. Las opciones son son solo dos: o ven luz, o no la ven. Estos “ojitos” esta ubicados debajo del robot.


Pero al estar alineados horizontalmente permiten al robot seguir una línea oscura tomando desiciones a partir de lo que pueden “ver”. 

Como confirmaremos a continuación el sistema es muy simple: si se apartaron de la línea negra "ven" luz a la derecha... o a la izquierda y de esa forman tendrán información importante para volver a la posición de seguimiento de la línea.

Para verificar si el sensor de línea funciona correctamente preparé este programita que hace lo siguiente:


  1. Crea la variable “status” de modo tal que el robot pueda guardar la información medida por el sensor (e indica que este esta conectado al puerto
  2. Si el ojito derecho del sensor ve luz, el parlante toca dos veces la nota “Do”
  3. Si es el ojito izquierdo del sensor el que ve luz, el parlante toda dos veces la no nota “Si”
  4. Consecuentemente si ninguno de los dos ojitos ve luz, por defecto, el parlante se mantiende en silencio.


Aquí pueden ver el código de bloques en el cual se ven muy claramente los "loops" para generar la señal de sonido (la nota está indicada en sistema de notación musical americano).



Vamos a probarlo sobre una “pista de línea” para ver como funciona:





Esta función es muy importante porque nos permitirá programar al robot para que pueda seguir un camino a partir de una línea negra trazada en el suelo… desafío del que, seguramente, les contaré más adelante.





jueves, febrero 11, 2016

Primeras experiencias en robótica educativa

Hace un tiempo atrás publiqué algunos post sobre el recientemente renovado interés por la enseñanza de la programación en la currícula escolar. En línea con estas ideas, la robótica educativa, Arduino mediante, se presenta como una posiblidad más que atractiva en materia de "programar para aprender". 

Explorando estas ideas descubrí mBotDejaré las teorizaciones para más adelante: por ahora presentare a mi nuevo amigo de exploraciones y les contaré como resolví (provisoriamente) el problema de hacerlo funcionar en Ubuntu.

Como se imaginarán, mBot es un robot de diseño "humanizado" basado en Arduino  realmente muy fácil de usar. En muy pocos pasos puede montase su hardware con tanta facilidad que, de momento, uno duda si es un juguete más. 


mBot ensamblado y listo para su programación

El sentido de utilizar mBot se vincula directamente al aprendizaje de la programación, ya que su mecánica y su electrónica se encuentran totalmente resueltas. La placa del robot, basada en Arduino obviamente puede programarse en C usando Arduino IDE (Entorno integrado para desarrollos) pero también con una extensión de Scratch, basada en bloques... No se trata de la extensión regular de Scratch para Arduino sino de una adaptación llamada Mblock, por lo cual es necesario instalar una extensión específica. Y es aquí empiezan mis problemas ya que no utilizo Windows sino Ubuntu... 

Encontré en los foros algunas discusiones y solicitudes al desarrollador, incluso está en proceso una versión de para Chrome. Sin embargo, no conseguí que nada de esto funcionara por el momento. ¿Cómo lo resolví? No es una solución elegante pero, por ahora, me sirvió para salir del paso.

Aprender a programar en C directamente puede ser medio engorroso. Especialmente porque los ejemplos están demasiado "organizados" y es casi imposible hacerlo de forma intuitiva. La programación por bloques, por el contrario, permite un acceso lineal a los comandos que permite incorporar la lógica de la programación de modo mucho más simple. La versión de Scratch para mBot tiene la posiblidad de traducir los bloques en texto. Esta traducción automática facilita mucho, a mi entender, la compresión de las lineas de programa y su funcionamiento.


MBlock para Scratch en Wine:
Programa "adelante y atrás" para que las ruedas avancen o retrocedan según la instrucción del control remoto. A la derecha el código del programa en modo texto.

Como pueden ver en la imagen anterior, resolví el problema haciendo correr la versión de mBlock para Scratch en Wine. Sin embargo, la opción "upload" no funciona en Linux ya que por algún problema no resuelto aún el programa no reconoce el puerto. La solución fue copiar el código y "pegarlo" en Arduino IDE ya que desde ese entorno y en Linux, es posible cargar el robot con el programa.


El código ahora escrito y "pegado" en Ardduino IDE listo para ser cargado al robot.

Solo una pequeña observación: el código pegado "tal cual" indicó un error al compilarse que se resolvió eliminando dos instrucciones que aparecen por defecto en la conversión y aparentemente molestan en mi IDE (como puede verse en la captura estas son: #include: Arduino.h  e #include Servo.h fueron borradas de la versioń final).

El programa en cuestión es muy simple: mueve las ruedas hacia adelante y hacia atrás utilizando los comandos del control remoto:



Y ahora que tenemos una estrategia... les iré acercando novedades sobre mBot... en breve.