Rubén Beiroa Mosquera

Aprender Arduino, prototipado y programación avanzada con 100 ejercicios


Скачать книгу

entre un Arduino u otro ya que, si tenemos que atender a varios eventos críticos, lo recomendable es buscar un Arduino que, por hardware, permita programar todos esos eventos como interrupciones:

      •Uno, Nano, Mini o basados en el MCU 328 tienen 2 interrupciones, pines: 2, 3.

      •Micro, Leonardo o basados en el MCU 32u4 tienen 5 interrupciones, pines:0, 1, 2, 3, 7.

      •UNO WiFi y DUE tienen interrupciones para todos sus pines.

      •Mega, Mega2560 y MegaADK tienen 6 interrupciones, pines: 2, 3, 18, 19, 20, 21.

image image

       011

      Interrupciones por tiempo Parpadeo de un led

      En cuanto a la gestión de tiempo, ya hemos trabajo con las instrucciones delay, delayMicroseconds, millis y micros.

      Las interrupciones por tiempo vienen a sustituir a un delay o a un delayMicrosenconds; como ya es sabido, estas instrucciones lo que hacen es detener la ejecución de un programa durante un tiempo determinado: hasta ahora era la única forma que teníamos de ejecutar tareas temporales.

      El inconveniente de esta solución es que no se puede ejecutar otra tarea y, para muchas aplicaciones, será necesario la ejecución de tareas temporales pero también atender a otras tareas; pues bien, con las interrupciones temporales, conseguimos esto mismo.

      Al igual que ocurría con las interrupciones por señal, tenemos una función que se va a ejecutar sin ser llamada desde otra línea del programa y que, en este caso, lo hará cada cierto tiempo. El <<mecanismo>> que utiliza este tipo de interrupciones son los Timers; estos mecanismos son capaces de llevar el contaje de tiempo y podemos trabajar con ellos gracias a las diferentes librerías de las que disponemos.

      Cada Arduino tiene un determinado número de Timers; en concreto, el Arduino UNO tiene tres Timers. En este capítulo haremos un caso práctico utilizando el Timer 1 así que vayamos al gestor de librerías e instalemos image la librería correspondiente image:

      •La instrucción <<Timer1.attachInterrupt()>> define la función que se tiene que ejecutar.

      •Con la instrucción <<Timer1.initialize()>>, definimos cada cuánto tiempo se ejecuta la función del punto anterior. El tiempo se mide en microsegundos.

      •Con estas instrucciones ya podemos hacer, por ejemplo, que un led parpadee cada segundo sin necesidad de bloquear el programa image.

      Otras instrucciones de la librería TimerOne:

      •<<Timer1.setPeriod(microseconds)>> establece un nuevo tiempo de interrupción.

      •<<Timer1.start()>> arranca la interrupción con el nuevo tiempo.

      •<<Timer1.stop()>> detiene la temporización.

      •<<Timer1.restart()>> reinicia el temporizador.

      •<<Timer1.pwm(pin, duty)>> configura las PWM asociadas a este Timer.

      •<<Timer1.setPwmDuty(pin, duty)>> establece un nuevo tiempo para las señales PWM.

      •<<Timer1.disablePwm(pin)>> deshabilita la PWM.

      •<<Timer1.detachInterrupt()>> deshabilita la interrupción.

      No para todos los Timers tenemos las mismas instrucciones, ya que usamos diferentes librerías para trabajar con ellos y también existen diferencias entre ellos.

      Con un buen uso de este tipo de interrupciones, conseguiremos mejorar el rendimiento de nuestros programas.

image image image

       012

      Interrupciones por tiempo Timer2 y 3

      A continuación se estudiarán diferentes soluciones con el objetivo de sacar el máximo rendimiento a los Timers:

      •El hecho de utilizar un único Timer no significa que solo podamos hacer una única temporización. Si buscamos la base de tiempo adecuada, podemos hacer multitud de temporizaciones; por ejemplo, hacer que 3 leds parpadeen a un ritmo diferente. En este caso image, el led conectado al pin 13 parpadea cada segundo, el del pin 12 cada 2 segundos y el del pin 11 cada 4 segundos.

      •Otro posible uso es limitar el número de temporizaciones; por ejemplo, para que se repita un número determinado de veces o debido a algún tipo de evento externo. Por ejemplo, si el valor de un sensor supera un umbral, se debe encender un led que empiece a parpadear cada segundo image.

      •Cuando utilizamos <<analogWrite()>>, se genera una señal PWM en el pin y, con el ciclo de trabajo indicado, esto funciona gracias a los Timers. Entonces, en el Arduino UNO, tenemos tres Timers y 6 salidas PWM. El Timer1 se encarga de generar las señales PWM de los pines 9 y 10, pero hasta ahora teníamos una serie de limitaciones:

      •El valor del ciclo de trabajo tenía que estar comprendido entre 0 y 255.

      •No podíamos cambiar la frecuencia de la señal PWM.

      Con la librería TimerOne, tenemos los recursos necesarios para eliminar estas limitaciones:

      •Podemos fijar la frecuencia de una señal PWM con la instrucción <<Timer1.initialize()>> (lo que realmente hacemos es configurar el periodo, pero la frecuencia es la inversa de este) y, con la instrucción <<Timer1.pwm(,)>>, indicamos el pin y el periodo de trabajo de la señal. En el caso del Arduino UNO, esto funcionaría en los pines 9 y 10 image.

      •Para programar los Timers 2 y 3, necesitamos las librerías MsTimer2 y TimerThree, respectivamente.

      La libería MsTimer2 solo permite 3 acciones:

      •Configuración del tiempo para la interrupción <<MsTimer2::set()>>.

      •Activar interrupción <<MsTimer2::start()>>.

      •Desactivar interrupción <<MsTimer2::stop()>>.

      •En el siguiente caso image se usarán estas tres instrucciones para que un led parpadee 10 veces cada medio segundo.

      En cuanto a la libería TimerThree, tenemos las mismas acciones que en la librería TimerOne image:

      •Pero, según la documentación de Arduino, esta librería solo funcionaría para el caso en el que trabajemos con el Arduino Mega (http://playground.arduino.cc/Code/Timer1).

      Con esta última librería, acabamos de ver todo lo referente a las interrupciones temporales;