viernes, 1 de enero de 2016

¿Qué son las interrupciones para Arduino?





Llegados a este punto, imagino que ya tenemos bien claro como funciona un sketch de Arduino y cómo podemos programar las tareas para que se vayan ejecutando una tras otra de forma ininterrumpida.

Podemos hacer que nuestro Arduino vigile quién entra en nuestro cuarto, usando por ejemplo un sensor de ultrasonidos, o bien, monotorice la temperatura de una habitación y nos la muestre en pantalla. Podemos hacer básicamente lo que queramos con tal de que definamos bien la lista de tareas y el orden en el que queremos que se ejecuten.

Pero como cualquier persona, nuestro Arduino tiene unos recursos limitados y si queremos que nuestro Arduino nos prepare una rica cena, le podría pasar que el ruido de los fogones no le permita escuchar que como tenemos la puerta abierta, unos ladrones han entrado a robar en la casa.

  • La solución es bien simple, pues que se quede esperando en la puerta. El problema es que si se queda esperando en la puerta entonces nadie nos hace la cena.  
  • No pasa nada, podemos decirle que cierre la puerta y que cada pocos minutos se acerque a ver si alguien está esperando. Pero claro con ese trajín, no puede atender bien la cocina, y algunas cosas se queman, u otras no terminan de prepararse bien. 
  • Entonces es cuando se da cuenta de la utilidad del timbre, y decide poner un pequeño altavoz en la cocina de modo que le permita escuchar cuando alguien llama, y solo entonces dejar de cocinar para atender, durante un breve instante, abrir la puerta y luego volver a sus labores.


Pues es justo de eso de lo que vamos a hablar hoy, de las interrupciones. Y cómo nuestro Arduino gracias al buen uso de ellas, puede dedicarse a sus tareas y olvidarse del mundo hasta que no suene "el timbre".



Para ello lo primero que tenemos que hacer es conectar al timbre para que podamos escucharlo, y tras ello tenemos que saber donde está el botón que abre la puerta principal desde la cocina. No basta con oir que llaman a la puerta, hay que saber donde está el pulsador que permitirá "abrir la puerta" y proseguir con nuestra tarea.


Incluso puede ser más complicado, imaginaros que vivimos en un edificio en el que para acceder a nuestro apartamento  pueden entrar bien en coche o bien a pie,  si entran directamente nuestro garaje en su coche tendremos que abrirle la puerta del parking, y si entran a pie, pues tendremos que abrirle la puerta principal del edificio.

En ese caso antes de abrir la puerta, tendremos quién es el que llama (no a todo el mundo vamos a dejarle entrar), saber qué puerta queremos abrir (puede que tengamos más de una), y qué debemos hacer (puede que sólo sea abrir la puerta, o puede que queremos también encender la luz de la entrada, poner música ambiente, y encender la calefacción). Y hacerlo todo rápidamente y para volver  corriendo a nuestras labores en la cocina.


Pues bien, lo primero lo primero. ¿Cuántas llamadas diferentes podemos atender?, o lo que es lo mismo ¿cuántas interrupciones diferentes puedo gestionar sin volverme loco? La respuesta está en el tipo de placa Arduino que tengamos entre manos.  Si estamos trabajando con la placa más popular, la Arduino UNO, tendremos solo la posibilidad de gestionar dos "timbres", si nuestro proyecto necesitara estar pendiente de más eventos, tendríamos que saltar a la placa Micro, la Leonardo, la Mega o la DUE.

Un breve resumen de ello lo podemos encontrar en la tabla adjunta.



Llegados a este punto, todo parece bien sencillo, programamos nuestro sketch y justo cuando sucede lo que queremos monitorizar, se disparará el trozo del programa que hayamos programado para esa ocasión. En nuestro ejemplo, sería a activar un relé para que se abriera la puerta que queramos.

En la siguiente entrada veremos cómo debemos encapsular este código para que se ejecute sólo si sucede el evento.  No os la perdáis, veréis que fácil es esto de manejar interrupciones con nuestro Arduino.

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a



e intentaremos responder a vuestra pregunta lo antes que podamos.

s.

¿En qué se diferencia un PinOut de un PinMap?



Esta entrada va a ser muy corta pero esperamos que muy reveladora. Trata sobre dos términos que normalmente nos encontramos en las descripciones de nuestras placas Arduino, o en general la de cualquier microcontrolador, pero que a veces confunden su significado. Una cosa es el PinOut de la placa y otra el PinMap.

Imaginaros que tenemos estamos pensando en usar una placa Arduino Beetle para una aplicación donde nos basta y sobra con la potencia del microcontrolador ATMega32U4, pero que se monta en una plaquita de tal solo 20mm X 22mm:


a bote pronto nos parece evidente el número de pines digital y analógico que dispondremos, simplemente leyendo lo que viene escrito sobre cada IO, pero ¿qué hay del resto de los pines? ¿donde está el famoso D13 con su LED?, ¿ o donde están los pines de recepción y transmisión, RX y TX?. ¿Puedo usar el protocolo de transmisión de datos SPI? Si es  así, ¿cuáles son los pines MOSI, MISO, SCLK, y SS?

A fin de cuentas el microcontrolador tiene 44 patillas, y en el Arduino Beetle Beetle solo veo 10 pines más el conector microUSB, ¿cómo puedo acceder al resto de los pines del microcontrolador que lleva montado?

La respuesta está en la apropiada definición del PinOut y del PinMap.

Si le echamos un vistazo al PinOut del microcontrolador ATMega32U4, independientemente de sobre qué placa o versión de placa se monte, siempre será exactamente el mismo



Pero si le echamos un vistazo al PinOut de la placa Arduino Beetle, veremos qué igual que usamos un mapa cuando vamos a montarnos en el METRO, aquí también necesitaremos un mapa, para indicarnos por cada una de estas bocas de METRO (los pines de la placa), cómo llegar al destino que deseamos (los pines del microcontrolador). El plano de nuestro METRO en este caso se llama PinMap.



Así que a medida que vayamos trabajando con más y más placas diferentes, y con más y más versiones de cada una de ellas, si no queremos volvernos locos es importante que  nos hagamos siempre con la versión actualizada del PinOut del microcontrolador que lleve montado y el PinMap que nos indique claramente en nuestra placa concreta quién es quién.

En resumen:

PinOut =  Son los pines que físicamente puedes ver en la placa
PinMap = Es el la tabla que indica cómo cada uno de los pines de la placa está conectado al microcontrolador. Y donde veremos más claramente

  1. todas las funciones de cada uno de los pines de la placa que tenemos entre manos,
  2. qué pines del microcontrolador está accesible a traves de los pines físicos de la placa, y
  3. qué pines del microcontrolador NO están accesible a través de los pines de nuestra placa. No es raro encontrarnos una placa que no usa toda la potencia o capacidad del microcontrolador que monta.



¿Quién fabrica los Arduinos?




El proyecto Arduino es parecido al enfoque que se sigue con el software libre, en este caso en lugar de open-source software, se llama open-source hardware. El Equipo Arduino cree que la gente debe ser capaz de estudiar el hardware Arduino y entender como funciona, hacer cambios en él, y distribuir al mundo estos cambios. Es por ello por lo que el Equipo Arduino hace disponible todos los ficheros de diseño, esquemáticos y otros documentos que permiten a cualquiera construirse su propio Arduino, todo bajo la licencia Creative Commons Attribution-ShareAlike 3.0.

La única restricción impuesta es que no se use el nombre Arduino, que debe aplicar solo a los productos diseñados, fabricados y soportados por el Equipo Arduino.

Es por ello por lo que en este proyecto todo el mundo tiene cabida.

El fabricante Arduino oficial de la mayoría de las placas es Smart Projects y está localizado en Italia (www.smartprj.com). Adicionalmente, SparkFun Electronics en USA (www.sparkfun.com) fabrica la Arduino Pro, una versión minimalista tan pequeña que no lleva ni conexión USB y requiere de un adaptador externo para poder cargarle los programas, Arduino Pro Mini y LilyPad. La placa Arduino Nano se fabrica por Gravitech también en USA.

Adicionalmente, un montón de fabricantes hacen y venden sus propias placas y shields (placas de expansión) compatibles, fomentando el objetivo del Equipo Arduino  de hacer disponible el hardware y el software a tanta gente como sea posible.

Uno de los muchos ejemplos que podemos encontrar serían placas del estilo


O versiones que incluyen algunas funcionalidades añadidas, como la ZUM BT-328 de BQ



como puede ser, la incorporación de bluetooth, incremento de la corriente máxima, la incorporación del botón reset en un lateral, la introducción de pines periféricos (GND, V, y Señal) en colores diferenciados para permitir la conexión de electrónica externa de forma directa, etc...


El problema es que incluso con organizaciones sin ánimo de lucro como Arduino, en estos días que corren, se respeta los derechos de propiedad, y se falsifican sin escrúpulos todos los detalles de las placas originales Arduino por fabricantes desalmados.

A veces será evidente la diferencia, y a veces no. Incluso muchas de ellas llevan chips falsificados marcados como de FTDI pero que no lo son


Es por eso, por lo que si queremos comprarnos una auténtica placa Arduino, mejor antes verificar en la web de Arduino, si el nombre del proveedor que está suministrándola se corresponde con alguno autorizado http://arduino.cc/en/pmwiki.php?n=Main/Buy.

Y si queremos comprar algo compatible, más económico, solo debemos intentar no incentivar las falsificaciones que fomentan la destrucción de la imagen de honestidad de los objetivos del Equipo Arduino

Nota: Con el objetivo de hacer más fácil que identifiquemos las falsificaciones en la página oficial de Arduino nos podemos encontrar algunos consejos: http://arduino.cc/en/Products/Counterfeit