Programación

Como se comentó en la introducción el objetivo es automatizar el mecanismo existente que hace que manualmente podamos levantar y bajar las llamas del tejado de la casa que viene en el Kit 60003 añadiendo también un efecto de luces y por otro lado añadir a la estación de bomberos un efecto de luces y sirena (Kit 60004).

Todo este sistema lo controlaremos mediante la pulsación de ciertos códigos  a través de un mando a distancia (que el receptor de infrarrojos captará) los cuales se mostrarán a través un display alfanumérico donde también se podrán visualizar diferentes mensajes de alerta.

Los códigos que he elegido con su respectiva funcionalidad son los siguientes:

    • 112 → Funcionalidad total:  Estación de bomberos + casa con el fuego.
    • 080 → Funcionalidad parcial: Sólo estación de bomberos.
    • 999 → Funcionalidad parcial: Sólo casa con el fuego.
    • 000 → Apagado de cualquier funcionalidad que pueda existir.

En el siguiente enlace tenéis disponible para descargar el Sketch con la funcionalidad completa así como todas las librerías necesarias.

Descargar sketch

También podéis descargar las últimas versiones de las librerías utilizadas en los siguientes enlaces:

Os comento una serie de observaciones:

OBSERVACIÓN 1:

En el Arduino Uno / Arduino Duemilanove los pines de tipo PWM son los siguientes: 3, 5, 6, 9, 10 y 11.

La utilización de la librería del Servo nos inutiliza el PWM ( analogwrite ) de los pines 9 y 10 ya que para su funcionamiento utiliza el Timer1.

La utilización de la librería IRremote nos inutiliza el PWM ( analogwrite ) de los pines 3 y 11  ya que para su funcionamiento utiliza el Timer2

Recordemos que:

Timer0

    • Usado para las funciones «millis», «micros()»  y «delay» y también para la función «analogWrite» de los  pines 5 y  6.

Timer1

    • Usado para las funciones «analogWrite» de los  pines 9 y 10.
    • Usado por la Servo library.
    • Usado por la librería NewTone().

Timer2

    • Usado para las funciones «analogWrite» de los  pins 3 y 11.
    • Usado por la IRremote library.
    • Usado por la función Tone().

Por tanto al utilizar tanto la librería del Servo como la librería IRremote solo disponemos de las pines 5 y 6 para poder utilizar la función analogwrite() (PWM).

Tampoco podríamos utilizar para hacer un efecto de sirena las funciones Tone() y NewTone() ya que usan el Timer2 y Timer1 respectivamente y estos son utilizados por la  librería del Servo y la librería IRremote.

OBSERVACIÓN 2:

Para simular acciones paralelas (como si fuera un efecto multitarea) no podemos utilizar instrucciones como el delay o permanecer en un bucle hasta que se cumpliera una condición ya que pararía la ejecución en un punto concreto.

Para ello se ha utilizado en las funciones la instrucción millis()  (Ej:. if (millis() – t > intervalo) ) que nos permite ejecutar cada x tiempo ciertas instrucciones sin detenerse en un punto.

De esta manera no paramos la ejecución en ningún punto concreto y el hilo de ejecución pasará por cada una de las funciones de nuestro Sketch haciendo el efecto de hacer «n» acciones en paralelo en el intervalo de tiempo que hemos especificado para cada una de ellas.

OBSERVACIÓN 3:

El display alfanumérico que he utilizado (Octopus Segment LED Brick v1.0 de Elecfreaks) utiliza las siguientes librerías de Adafruit:

    • Adafruit LED Backpack library
    • Adafruit GFX library

En este display me he encontrado con los siguientes problemas que no se si en versiones posteriores de fabricación se han podido corregir.

1.- Por un lado los identificadores de los panales de izquierda a derecha en el display comprado no son correlativos como cabría esperar si no que son: 2 3 0 1 en vez de 0 1 2 3.

Para solventar este problema en el código he creado la constante estática:

static const uint8_t panel[] = {2,3,0,1};

De esta manera al utilizar el array tendremos en la posición 0 el panel 2 , en la posición 1 el 3 y así sucesivamente lo cual nos facilita un poco el código.

2.- Por otro lado he visto que los segmentos L y N de cada panel del display están cambiados, por esta razón cuando se escribe letras tipo K, R, N, Z no se muestran correctamente.

En la la librería de Adafruit y para su display original:

0 DP N M L K J H G2 G1 F E D C B A

Por el contrario para nuestro display tendría que ser:

0 DP L M N K J H G2 G1 F E D C B A

Para corregir este problema he tenido que modificar el archivo de la librería “Adafruit_LEDBackpack.cpp” y modificar algunos códigos de la constante estática “static const uint16_t alphafonttable[] PROGMEM” que hacían referencia a los segmentos comentados:

Ejemplo (letra K):

    • Original:        0010010001110000  // K
    • Modificada:   0000110001110000  // K

NOTA: No los he cambiado todos, solo los que me hacían falta para este proyecto, pero si tenéis que utilizar otras letras que utilicen estos segmentos habría que cambiarlos siempre que en vuestro display se presente el problema que os acabo de comentar.

OBSERVACIÓN 4:

Como podéis ver en el código no se hace referencia a ningún pin a la hora de utilizar el display alfanumérico esto es debido a que el display utiliza los pines I2C del Arduino.

De esta manera el pin SCL del display lo conectamos al pin A5 del Arduino ya que este es el pin I2C clock en un Arduino UNO.

Por otro lado el pin SDA del display lo conectamos al pin A4 del Arduino ya que este es el pin I2C data  en un Arduino UNO.

« Anterior