Acerca del proyecto
En este proyecto vamos a trabajar con las interrupciones que nos proporciona arduino las cuales permite salir del flujo normal del programa ejecutando la función y ISR ignorando por completo cualquier otra tarea. Lo que vamos a ver son las funciones cómo utilizarlas, cuales son los eventos, sus pines asociado estos eventos de interrupción y cómo podemos aplicar un pequeño ejercicio para poder entender mejor esta esta funcionalidad del arduino.
Conocimiento previo
Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.
Proyecto | Descripción |
---|---|
attachInterrupt() | Damos la definición de esta función cómo utilizar la cuáles son los parámetros qué necesita para poder ejecutar la interrupción. |
Circuito pull down | El circuito pull down nos permite inyectar una señal una señal lógica baja o cero, al momento de presionar el pulsador se inyecta una señal alta o estado lógico 1, en este proyecto está el plano y la explicación de cómo puede montar este circuito. |
Arduino interruptores miniatura | En este proyecto aplicamos los conocimientos de las entradas y salidas digitales las funciones básicas y de Cómo podemos aplicar estos el circuito pull down en un ejemplo sencillo. |
Arduino entradas salidas | Este es otro ejemplo donde tenemos un arduino un switch y led's dónde donde encendemos y apagamos cada led con las entradas del switch |
Para que son las interrupciones
Para qué son las interrupciones, coloquemos como contexto el siguiente ejemplo: hay un circuito donde esta un led, lo vamos a prender y apagar cierto tiempo, al controlador le vamos a colocar dos pulsadores con conexión pulldown los cuales vamos a nombrar: el primero cómo aumentar y el segundo disminuir. Estos pulsadores se van a encargar de aumentar o disminuir le tiempo en que se va a encender y apagar el LED y la lógica que tenemos que hacer en el programa es la siguiente: dentro del void loop
que se ejecuta por en el arduino siempre vamos a estar preguntando si el pulsador uno está activado o hay una señal alta, si es así, vamos a tomar una variable la cual va incrementar el tiempo, luego vamos a preguntar si el pulsador dos o el pulsador disminuir está activo, si no lo dejamos quieto y ahí la secuencia del programa se dirige hacia la instrucción principal que es prender y apagar el LED; nótese que siempre tenemos que estar preguntando a los pulsadores si están o no están activos para poder aumentar o disminuir el tiempo que se va a encender el led, lo cual es un desgaste en el tiempo ya que si tuviéramos más pulsadores o más entradas obviamente tendríamos que estar preguntando a cada una de ellas si la señal ha cambiado o no ha cambiado.
Las interrupciones lo que permiten es generar una función asociada a un evento ajeno que no se esté preguntando en el código, en este caso usaríamos una interrupción por Hardware el cual en el momento de qui se presiona un pulsador lo que va hacer el programa es detener la ejecución del flujo normal va a ir a esa función específica en este caso aumentar el valor de la variable y luego va a volver a dónde se encontraba ejecutando el código o la instrucción normal, en este caso nosotros no tenemos que realizar la ejecución o estar preguntando por los pulsadores ya que el mismo procesador del arduino va a detectar ese cambio de la pulsación y ejecutará por sí solo a la interrupción que es una de las ventajas que nos genera este tipo de eventos.
Interrupciones en arduino
Las interrupciones son útiles para realizar ciertas acciones, eventos dentro de nuestra lógica o en el programa lo que hace un microcontrolador al momento de recibir un evento o una interrupción es detener la ejecución de ese programa en ese instante ejecutar en una función por aparte la lógica que tiene que hacer con la interrupción y luego devolverán al flujo donde dejo de ejecutar la interrupción, esto nos ayuda a resolver problemas de tiempos y de ejecución ya que no necesitamos depender de una acción que esté siempre preguntando un evento para poder ejecutarse.
En qué consiste el proyecto que vamos a realizar con las interrupciones, primero vamos a identificar los pines que estamos utilizando para escuchar este tipo de acciones en el arduino, en la siguiente tabla tenemos un resumen de los pines que están habilitados para poder escuchar ese tipo de acciones, por ejemplo estamos trabajando en este caso con la placa Leonardo y podemos ver que tiene habilitado los pines 0, 1, 2, 3, y 7 lo que vamos a hacer es utilizar la instrucción attachInterrupt()
para crear el evento en este caso un evento y ISR como explicamos anteriormente para ejecutar la acción que vamos a asustar a esta interrupción
Pines de interrupción
Placa | Pines interrupciones |
---|---|
Uno, Nano, Mini | 2, 3 |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo | 0, 1, 2, 3, 7 |
Zero | Todos los pines digitales excepto el 4 |
MKR1000 | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Due, 101 | Todos los pines digitales |
La función que vamos a trabajar es attachInterrupt()
la cual nos pide tres parámetros que vamos a pasarle para que puedan estar escuchando una interrupción y ejecutar el código que necesitamos, los parámetros son los siguientes: el primero es el número de interrupción o en este caso el pin de interrupción vamos a utilizar el pin 2 o el pin 3 del arduino Leonardo y lo vamos a pasar a la función digitalPinToInterrupt()
que nos retornara el número de interrupción, el segundo parámetro es la función y ISR que vamos a crear esta función tiene que ser corta y no tener tiempos de espera o delay ya que lo único que va a hacer es ejecutar un pedazo de código que necesitamos, el último parámetro es el modo qué define cuando se tiene que activar la interrupción el modo que nosotros vamos a utilizar es el RISING el cual consiste en que va a estar escuchando el cambio de un estado bajo a alto que nuestro caso lo vamos a simular con un circuito pull down así como vamos a ver en las siguientes imágenes que tenemos más adelante.
Para más detalle de cómo funciona estas funciones en el link de conocimiento previo podrá encontrar el post donde está la definición cómo utilizar y los parámetros de la instrucción attachInterrupt()
.
Materiales
Los materiales que vamos a utilizar para este proyecto básicamente son los que utilizamos para crear el circuito Pull Down por 2 y un led para poder visualizar el resultado
Material | Cantidad | Descripción |
---|---|---|
Pulsadores normalmente abiertos | 2 | Para el circuito pull down |
Resistencias de 1k | 3 | Resistencias protección led y circuito pull down |
Diodos led | 1 | Indicador del circuito |
Arduino | 1 | Controlador del circuito |
Conexión
Para conectar este proyecto observamos en el plano básicamente lo que estamos haciendo es recrear los circuitos pulldown, en este caso vamos a trabajar dos, uno para aumentar y el otro para disminuir la intensidad de frecuencia que parpadea led. Esto los vamos a conectar respectivamente al pin 2 y al pin 3 y por último en el pin 10 vamos a colocar el led que va a ser nuestro indicador.
Para más detalles de cómo se conecta el circuito Pull Down en conocimiento previo tenemos es el link para que puedan ir a verlo donde se explica a detalle.
Código
Una vez que tengamos entendido como es que va a funcionar nuestro proyecto, entendamos cómo es la funcionalidad de las interrupciones y ya tengamos el circuito montado, realizaremos el código, básicamente lo que va hacer es lo siguiente: vamos a declarar los pines que vamos a utilizar luego vamos a inicializar las interrupciones como mencionamos anteriormente y el modo RISING y por último creamos las funciones que son las que se van a encargar de ejecutar la interrupción cuando ésta sea lanzada, veamos el paso a paso del código:
// Paso 1
int pinOutput = 10;
int pinLess = 2;
int pinPluss = 3;
int delayValue = 500;
// Paso 2
void setup() {
Serial.begin(9600);
pinMode(pinOutput, OUTPUT);
pinMode(pinLess, INPUT);
pinMode(pinPluss, INPUT);
attachInterrupt(digitalPinToInterrupt(pinLess), less, RISING);
attachInterrupt(digitalPinToInterrupt(pinPluss), pluss, RISING);
}
// Paso 3
void loop() {
digitalWrite(pinOutput, HIGH);
delay(delayValue);
digitalWrite(pinOutput, LOW);
delay(delayValue);
Serial.print("Valor del delay");
Serial.println(delayValue);
}
// Paso 4
void less() {
Serial.println("Entra a less");
delayValue = delayValue - 50;
delay(10);
}
// Paso 5
void pluss() {
Serial.println("Entra a pluss");
delayValue = delayValue + 50;
delay(10);
}
- Vamos a declarar las variables correspondientes de los pines y vamos a inicializar la variable del delay qué es la que se va a encargar de encender y apagar el LED.
- Vamos a inicializar los pines como entrada y salida utilizando el
pinMode()
, vamos a inicializar la terminal serial para poder ver el log de nuestro proyecto y vamos a crear los eventos de interrupción de los pines 2 y 3 que declaramos en las funciones, a estos les vamos a indicar que se van a escuchar ejecutar con el evento RISING. - Dentro del void loop lo que vamos a hacer es que se encienda y se apague el led con el tiempo de delayValue y por último imprimimos en la terminal serial el valor del delay así se va a quedar funcionando hasta que alguna de las interrupciones sea ejecutada y aumente o disminuya el valor del delay.
- Creamos la función de disminuir en dónde está escuchando bajo el pin 3 y lo único que va a hacer es tomar la variable del delay y le va a restar 50ms.
- Vamos a crear la función de aumentar ya está a nuestra variable de delay le vamos a unmentar 50ms.
Funcionamiento
Básicamente lo que hace el programa es prender y apagar el led a una frecuencia de medio segundos, cuando es presionado alguno de los dos interruptores lo que va hacer es ejecutar la interrupción se va a ir a la función correspondiente lo que va hacer es aumentar o disminuir el tiempo una vez que haya ejecutado esa función va a devolver en el punto donde el programa se quedó y va a seguir ejecutándose pero el tiempo de frecuencia de encendido y apagado del led va a cambiar porque aumentamos o disminuimos esa frecuencia.