Trastejant

Crea, comparte, aprende y disfruta

Interrupciones

Interrupción

En ocasiones nos sucede que nos gustaría estar atentos de un evento que pueda ocurrir en nuestro circuito (que se pulse un botón, que un sensor detecte algo, un encoder avisando de una vuelta completa… ). El problema es que no podemos hacer que nuestro Sketch se dedique exclusivamente a esperar que eso ocurra.

Lo ideal sería que Arduino pudiese dedicarse a otras funciones, como mostrar información por un display o controlar los motores que mantienen nuestro robot en movimiento, y en que en caso de que ese evento esperado ocurra pare todo, haga lo que tenga que hacer, y retome su trabajo habitual. Pues para eso mismo sirven las interrupciones.

Las interrupciones se pueden programar en unos pines concretos y tienen la capacidad- si se configuran así- de decirle al microprocesador que ha ocurrido algo importante y debe cambiar su trabajo. En el caso de la mayor parte de las placas de Arduino estos pines se encuentran en en las entradas/salidas digitales 2 y 3.

Para configurar estos pines como interrupciones contamos con la función attachInterrupt() que recibe tres parámetros. El primero es el número de pin de interrupción (0 para D2 y 1 para D3), el segundo es la función a la que debe llamar si se produce una interrupción y el ultimo es el tipo de interrupción que debe esperar. Existen estos tipos de interrupción:

  •  LOW La interrupción se produce si el pin se encuentra en nivel bajo (LOW).
  •  CHANGE La interrupción es el momento en el que el pin cambia su valor.
  •  RISING para disparar la interrupción cuando el pin pase de valor de bajo (LOW) a alto (HIGH).
  •  FALLING para cuando el pin cambie de valor alto (HIGH) a bajo (LOW)

Veamos un ejemplo. Supongamos que tenemos un robot movido por dos servos de rotación continua conectados a los pines D9 y D10. También tenemos un sensor tipo bumper para detectar las colisiones, este conectado a D2 (recordemos que D2 es la interrupción 0).
Queremos que el robot este avanzando y si el sensor detecta una colisión, queremos que se pare inmediatamente, sin terminar el delay ni realizar ninguna acción que pudiera tener pendiente, como lectura de sensores, actuadores… etc.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//Llamamos a la librería servo  
    #include    
 
//Creamos dos objetos de la librería servo, para controlar cada uno de nuestros servomotores  
    Servo servoDch;  
    Servo servoIzq;  
 
 
    void setup(){  
    //Configuramos los pines a los que estan conectados nuestros servos  
      servoDch.attach(9);  
      servoIzq.attach(10);  
 
      //Configuramos la interrupción. Si el estado de D2 cambia, llamaremos a colision  
      attachInterrupt(0, colision, CHANGE);  
    }  
 
    void loop(){  
        //En el bucle nuestro robot estará andando primero en una dirección y despues en otra.   
        servoDch.write(0);  
        servoIzq.write(0);  
        delay(1000);  
        servoDch.write(180);  
        servoIzq.write(180);  
    }  
 
    void colision(){  
    //Esta es la función a la que se llamará en caso de colisión. Esta a su vez llama a parar.  
      parar();  
    }         
 
    void parar(){  
    //Paramos los dos servos  
        servoDch.write(90);  
        servoIzq.write(90);  
    }

La función a la que llamemos cuando se produce una interrupción no debe ser compleja, no debe tener parámetros ni devolver nada. Se la conoce como rutina de interrupción de servicio y lo ideal es que simplemente de dedique a realizar una tarea muy concreta, si necesitamos hacer algo más complejo, es mejor que simplemente la rutina de interrupción de servicio llame a otro método que se encargue de hacer las cosas.

Ahora sabemos como es la forma correcta de estar siempre pendiente de un evento sin necesidades de dedicar todo el tiempo de Arduino a ello. El potencial de las interrupciones es muy alto y seguro que a medida que vayas dedicando tiempo a crear tus pequeños proyectos te irás dando cuenta de la importancia que tienen.


También te puede interesar...

No hay temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.