Encuentra informaci贸n referente a la programaci贸n, electr贸nica y mucho m谩s, la p谩gina est谩 pensada para compartir contenido educativo relevante coadyuvando a su aprendizaje diario.
Interrupciones externas con Arduino

Las interrupciones externas con Arduino es un mecanismo por el cual podemos suspender o interrumpir en forma temporal la ejecuci贸n de un proceso de Arduino para ejecutar una subrutina realizando una tarea definida y posteriormente reanudar el proceso en el momento que se produjo la interrupci贸n.

Estas interrupciones externas o de hardware son muy 煤tiles cuando deseamos implementar alguna subrutina para modificar de forma parcial alguna variable de manera externa.

Generalmente cuando realizamos nuestros proyectos con Arduino lo hacemos pensando en realizar un secuencia de instrucciones que van realiz谩ndose una tarea tras otra en una l铆nea de tiempo, pero cuando necesitamos recoger una se帽al en cualquier momento en la l铆nea de tiempo de nuestro programa no podemos realizarlo porque estamos sujetos al tiempo del delay() que le demos.

Al iniciar en la programaci贸n de Arduino nuestros primeros proyectos son relativamente sencillos como el t铆pico encendido de una serie de led de forma secuencial con un tiempo predefinido, pero si quisi茅ramos aumentar o disminuir la velocidad de encendido de esta secuencia de LED en cualquier instante de nuestro programa no podr铆amos realizarlo con la forma en que estamos programando en Arduino hasta el momento, para solucionar estos inconvenientes Arduino tiene funciones para trabajar con interrupciones con las cuales podr铆amos resolver este ejercicio sencillo de la secuencia de led aumentando un bot贸n para aumentar la velocidad y otra para disminuir la velocidad de la secuencia de led en cualquier momento, de esta manera podemos ya a empezar a realizar proyectos cada vez m谩s grandes y complejos.

驴C贸mo trabajar con interrupciones con Arduino?

La respuesta es otra vez muy sencilla, en lo que se caracteriza Arduino es hacernos lo m谩s sencillo posible realizar proyectos electr贸nicos, por lo cual Arduino ya tiene funciones preparadas para trabajar con interrupciones, al igual que las placas de desarrollo de Arduino ya tienes entradas digitales preparadas para trabajar con interrupciones, estas entradas no son iguales en todas las placas de desarrollo de Arduino por lo cual debemos averiguar que pines y cuantos est谩n habilitadas para trabajar con interrupciones, a continuaci贸n se nuestra una peque帽a tabla para saber que entradas podemos utilizar.

Pines para usara en las interrupciones externas con Arduino

Funci贸n para trabajar con interrupciones externas con Arduino

Esta funci贸n nos permite trabajar con interrupciones externas o de hardware en Arduino de manera sencilla.  

Funci贸n attachInterrupt(interrupci贸n, ISR, mode)

Tiene tres paramentos, el primer par谩metro es el n煤mero de interrupci贸n que deseamos usar, como ya vimos anteriormente cada placa de Arduino presenta un n煤mero determinado de pines que podemos usar como interrupciones por lo cual debemos ser precavidos al momento de escoger el pin que usaremos para trabajar con interrupciones.

Este par谩metro debe ser del tipo entero y colocar el n煤mero de interrupci贸n a usar por ejemplo la placa de Arduino UNO solo posee dos pines habilitados para trabajar con interrupciones el pin 2 y 3, pero no podemos colocar directamente el n煤mero de pin habilitado para trabajar con interrupciones en la funci贸n attachInterrupt() por qu茅 ocurrir铆a un error grave ya que en realidad los n煤meros de interrupciones habilitados son 0 y 1 donde el pin 2 representar铆a a la interrupci贸n 0 y el pin 3 a la interrupci贸n 1.

Esto para muchos es confuso si bien se puede trabajar directamente de esta manera, la documentaci贸n de Arduino nos sugiere trabajar con la funci贸n digitalPinToInterrupt([pin habilitado para trabajar con interrupciones]) que tiene un solo par谩metro y es el pin habilitado para trabajar con interrupciones, es decir que podemos colocar directamente el n煤mero de pin y no as铆 el n煤mero de la interrupci贸n, y con esto podemos trabajar sin muchas complicaciones, la funci贸n quedar铆a as铆 attachInterrupt(digitalPinToInterrupt(pin), ISR, mode).

El segundo par谩metro es un ISR (Interrupt Service Routine – Rutina de servicio de interrupci贸n)  que no es m谩s que una funci贸n con algunas restricciones como por ejemplo que no tiene ning煤n par谩metro y adem谩s no debe devolver nada y debe ser lo m谩s corto posible para que su tiempo ejecuci贸n sea lo m谩s veloz posible, en caso de usar varios ISR la ejecuci贸n de las mismas se har谩 de forma secuencial una despu茅s de otra.

El tercer par谩metro es el modo de cuando se debe activar nuestra interrupci贸n y funcionar nuestra rutina de servicio de interrupci贸n (ISR), Arduino nos provee cuatro constantes v谩lidas para trabajar y son: LOW, CHANGE, RISING, FALLING, en el caso de las placas de Arduino Due, Zero y MKR1000 nos ofrece una constante extra que es el HIGH.

Significado de estas constantes para trabajar con interrupciones con Arduino

LOW.- Utilizado cunado necesitamos activar nuestra interrupci贸n mientras el pin habilitado este en bajo.

HIGH.- Similar al anterior pero es habilitada cuando este siempre nuestro pin de interrupci贸n en alto.

CHANGE.- Muy 煤til cuando requerimos detectar alg煤n cambio en el pin que estemos utilizando como interrupci贸n externa o de hardware.

RISING.- Este modo nos permite detectar el cambio del valor de nuestro pin de bajo a alto y activar de esta manera nuestra interrupci贸n.

FALLING.- Este modo es muy similar al anterior con la diferencia que se activa cuando cambia el valor del pin de alto a bajo.

Variable global volatile utilizada para trabajar con interrupciones

Las variables globales son generalmente utilizadas en cualquier lugar de nuestro programa, pero al tratar de interrupciones, Arduino nos sugiere declararlo con la palabra reservada volatile porque al pasar datos desde el ISR al nuestro c贸digo principal debemos asegurarnos que estas variables se actualicen de forma correcta cada vez que se lo necesite.

Ejemplo de Interrupciones con Arduino (Efectos de luces LED accionados por un pulsador)

Este ejemplo consiste en hacer un circuito de 4 Leds donde se pueda cambiar 3 efectos de luces con un pulsador, el primer efecto consiste en encender progresivamente los leds y apagarlos tambi茅n progresivamente, el segundo efecto es m谩s simple solo enciende y apaga todos los led y el tercer efecto es el t铆pico luces del auto fant谩stico.

Nota.- Para aprender siempre es necesario practicar por lo cual te reto a modificar este c贸digo para que el primer y tercer efecto, se ejecute de manera instant谩nea cuando accionemos el pulsador, la soluci贸n es m谩s simple de lo que crees.  

Materiales necesarios para nuestro proyecto de Arduino

  • 4 Leds
  • 4 Resistencias de 220 o 330 ohmios
  • 1 Resistencia de 10K
  • 1 Pulsador
  • Varios cables para conectar nuestro circuito
  • Arduino UNO

Conexi贸n de nuestro circuito para trabajar con interrupciones con Arduino

Diagrama del ejemplo de Interrupciones externas con Arduino

C贸digo para ser utilizado en nuestro proyecto de interrupciones

/* AUTOR: CREATIVIDAD CODIFICADADA
 *  www.creatividadcodificada.com
 *  NOMBRE DEL PROYECTO: JUEGO DE LUCES CON 4 LEDS
*/
// variable global volatil para cambiar el efecto de luces
volatile int efectoLed = 0;
// matriz o array para controlar todos los led 
// de mejor forma 
int led[4] = {8,9,10,11};
void setup() {
// Inicamos nuestro pines de salida y que esten apagados 
  for(int i = 0; i<=3; i++)
  {
    // Iniciamos todos los pines 8,9,10,11 como salidas
    pinMode(led[i],OUTPUT);
    //Iniciamos todos los led apagados
    digitalWrite(led[i], LOW);
    }
    //Activamos nuestra interrupcion 
    attachInterrupt(digitalPinToInterrupt(2),cambioEfecto,RISING);
  }

void loop() {
  switch(efectoLed)
  {
    //Primer efecto - Secuencia de Led
    case 0:     
          for(int j=0;j<=3; j++)
          {
            //Encendemos los led
            digitalWrite(led[j],HIGH);
            delay(200);  
            }
           for(int j=3;j>=0; j--)
          {
            //Apagamos lo led
            digitalWrite(led[j],LOW);  
            delay(200);
            }
            break;
      //Segundo Efecto - Enciende y apaga todos los led
      case 1:
            for(int j=0;j<=3; j++)digitalWrite(led[j],HIGH);
            delay(200);
            for(int j=0;j<=3;j++)digitalWrite(led[j],LOW);
            delay(200);
            break;
        //Tercer efecto - Auto fantastico
        case 2:
              for(int i=0;i<=3;i++)
              {
                // Enciende un led
                digitalWrite(led[i],HIGH);
                if(i>0)
                {
                  //Apaga el Led anterior
                  digitalWrite(led[i-1],LOW);
                  }
                delay(200);
                }
              for(int i=3;i>=0;i--)
              {
                digitalWrite(led[i],HIGH);
                if(i<3)
                {
                  digitalWrite(led[i+1],LOW);
                  }
                delay(200);
                }
               break; 
      default: 
              for(int k = 0; k<=3; k++)digitalWrite(led[k], LOW);
              break; 
    }
}
// Nuestra Funcion ISR
void cambioEfecto()
{
  efectoLed++;
  if(efectoLed >2) efectoLed=0;
  }

驴Que te parecio el art铆culo?

Su direcci贸n de email no sera publicado. Los campos obligatorios est谩n marcados con *.

驴Qu茅 hacemos con tus datos?

Creatividad Codificada como responsable tratar谩 tus datos con la finalidad de gestionar tu participaci贸n en nuestro blog informativo. Puedes acceder, rectificar y suprimir tus datos, as铆 como ejercer otros derechos consultando la informaci贸n adicional y detallada sobre protecci贸n de datos en nuestra Pol铆tica de Privacidad