Arduino-y-Protocoder-LED

En esta nueva entrada del curso de programación con Protocoder vamos a aprender a utilizar matrices LED para crear animaciones para nuestros robots. En este caso, utilizaremos la matriz para crear un ojo que podremos controlar remotamente gracias a Protocoder.

Lista de materiales

  • Placa ZUM BT-328
  • Matriz de LED: En este caso, utilizamos una placa basada en el chip MAX72xx
  • Comodoro: Podéis descargar al final de la entrada los archivos de nuestro robot

Código Arduino

El código Arduino se encargará de recibir datos desde el programa de Protocoder y, en función de los datos recibidos, se moverá el ojo a una determinada posición. Además, el ojo parpadeará de manera “aleatoria” cada cierto tiempo.

Para controlar la matriz de LED utilizamos la librería LedControl, que podéis descargar aquí o junto al resto de código al final de la entrada. Si queréis conocer todas las posibilidades que brinda la librería, podéis encontrar más información en esta página de Arduino Playground.

Para comenzar a programar la parte de Arduino, tenemos que incluir la librería, definir los pines y crear un objeto LedControl, que en nuestro caso hemos llamado LM:

Con la ultima línea del código anterior, creamos el objeto LM con el que controlaremos la matriz de LED.

También creamos la variable inString que se encargará de almacenar los datos que se reciban por Bluetooth. Las funciones readFromAndroid y writeData, se encargarán de almacenar los datos en inString y de “escoger” hacia donde “mira” el ojo, respectivamente. Si quieres conocer más a fondo estas funciones, puedes visitar esta página.

En este caso, una vez que se ha leído completamente el mensaje (después de recibir el carácter ‘=’) borramos la pantalla con la orden LM.clearDisplay(0);, para asegurar que la posición se represente correctamente.

En el “setup”, iniciamos el puerto serie, activamos la matriz LED (ya que por defecto está en modo de ahorro de energía), establecemos el brillo al máximo, “borramos” la matriz de LED y, finalmente, establecemos que el ojo mire hacia el centro.

Se han incluido dos rutinas de prueba, testPos(), que cambia entre las posiciones del ojo y test(), que enciende progresivamente cada uno de los LED.

Para generar las diferentes posiciones de parpadeo podemos utilizar una matriz del archivo que podéis encontrar en las descargas, donde marcaremos qué LED queremos que estén encendidos y los “traduciremos” a código. La función que utilizamos para encender un LED es:

Estado puede ser false o true, para apagar o encender el LED, respectivamente. Para el caso de la función lookCenter(), que coloca el ojo mirando hacia delante, la matriz dibujada es:

GRID-LED

El código de Arduino correspondiente a la imagen es:

De esta manera podemos generar diferentes patrones con los LED. En nuestro caso se han generado funciones que modifican la posición de la pupila (lookLeft, lookRight, lookUp, lookDown y lookCenter) y funciones que simulan un parpadeo (blinkClose, blinkOpen y fullBlink).

La variable delayBlink cambia la velocidad de transición entre cierre y apertura de ojo. La utilizaremos para aumentar o reducir la velocidad del parpadeo. La función fullblink toma como parámetro el tiempo que pasa entre el ojo abierto y el ojo cerrado. La utilizaremos para aumentar o reducir la frecuencia del parpadeo.

Las funciones blinkClose y blinkOpen cierran y abren el ojo, respectivamente, y utilizan la variable delayBlink para determinar la velocidad del parpadeo.

Por ultimo, la función loop se encarga de controlar la rutina del parpadeo y la recepción de datos desde la conexión Bluetooth, llamando a las funciones readFromAndroid y writeData.

Para gestionar el parpadeo del ojo, utilizamos la primera parte del código:

Para que el parpadeo sea diferente cada vez que se ejecuta la rutina, se han incluido dos tipos, simple y doble, cada uno controlado por una rutina similar. En primer lugar se comprueba si el tiempo actual de ejecución del programa es mayor que el tiempo establecido para el siguiente parpadeo. En caso de que la condición sea true, es decir, sea cierto la condición, se ejecutará la rutina del parpadeo y se establecerá el siguiente tiempo, sumando una cantidad variable, con la función random, a la variable que determina el siguiente tiempo.

Para leer el texto que se ha enviado a través de la conexión Bluetooth desde Protocoder, se utiliza el siguiente código:

Código Protocoder

El programa que vamos a generar en Protocoder se encargará de enviar, a través de la conexión Bluetooth, datos a Arduino.

bq_Aquaris_E4_250

Para comenzar la programación, utilizaremos la cabecera habitual de nuestros programas, además de la gestión de la conexión y desconexión Bluetooth. Si quieres saber más a fondo cómo funciona este código, puedes visitar esta entrada/a>.

bluetooth

Para enviar datos a la placa ZUM, utilizamos la función send, que toma como parámetros la cadena de caracteres a enviar. Por ejemplo, para que el ojo mire hacia la derecha hay que enviar la palabra “right”, por lo que tenemos que escribir send(“right”);. El código de la función send es:

A continuación, vamos a crear los botones que determinarán la posición del ojo. Para ello, subimos los archivos que queramos utilizar a Protocoder y después creamos los botones con la orden:

botonesOJOS

Para ajustar el tamaño y posición de los botones, utilizamos dos variables:

  • WidthImg, utilizada para asignar el alto y ancho de la imagen.
  • posX, utilizada para determinar la posición X de los botones.

En nuestro caso, incluimos la función send(); dentro de la función a realizar una vez que se ha pulsado el botón, enviando la orden correspondiente a la posición:

Diseño 3D: Comodoro

Para realizar el diseño 3D de Comodoro se ha utilizado el programa Blender.

Comodoro-sepia

Para imprimir el diseño, utilizaremos Cura con los siguientes ajustes para generar el soporte:

preferencias-soporte

Este soporte es muy fácil de eliminar y aporta estabilidad a la impresión.

Dentro de Cura, se ha modificado la escala a 40.79 para ajustar el diseño al tamaño de nuestra matriz de LED, pero el escalado a aplicar puede variar dependiendo del tamaño de la matriz que se utilice.

Comodoro Size