Arduino tutorials Cap 4. Interrupciones externas


Muy buenas a todos de nuevo. Aquí os traigo la nueva entrega de la serie “Arduino tutorials”, en la cual hablamos de las interrupciones externas.

Este tema lo he querido dividir en dos, ya que las interrupciones son un tema muy extenso y complicado, así que en el próximo capítulo veremos el uso de las interrupciones internas y Timers.

Como siempre, aquí os dejo el link desde el cual os podéis descargar todos los códigos, documentos adjuntos y datsheets para que podáis desarrollar los ejemplos del tutorial en vuestra casa y jugar con él.

Sin más, aquí os dejo el video.

Espero que os haya gustado y espero vuestros comentarios con críticas, dudas, observaciones,…

Enjoy!

22 pensamientos en “Arduino tutorials Cap 4. Interrupciones externas”

  1. Hola Eloi, muchas gracias por el apoyo! me alegro de que te guste y te sea útil el video tutorial, ese es el fin de nuestro trabajo! no dejes de seguirnos, ya sabes, cada 15 días un nuevo tutorial sobre arduino

  2. Muchas gracias por la info. En mi caso me he estrellado un poco ya que utilizo una Mega y la INT0 esta en el pin 21, mientras que en el pin 2 esta la INT4.
    Saludos y muchas gracias

  3. Perdona Sandra, el próximo tuto lo intentaré orientar tanto al arduino UNo como al arduino MEGA! Un saludo!

  4. Lo siento, el link me dirige al TUTO CAP 3 no al CAP 4 de interrupciones Externas. Alguuiene me podria ayudar

  5. Buenos días Enrique! Ya está solucionado el problema del link de descarga. Te pido disculpas por el problema técnico.
    Un saludo y gracias por visitarnos!

  6. Hola, soy de mexico, y la verdad me dejaste muy convencido con tu tutorial, yo ahora estoy utilizando interrupciones y la verdad es muy bueno tu tutorial, sin mas que decir, muchas gracias y sigue asi, eres un buen programador

  7. Muchas gracias por el coment y los ánimos Agustin!
    Sigue visitándonos!

    Un saludo,

    0xDA_bit

  8. Hola, me gusto tu video bastante.
    Estoy elaborando un proyecto, necesito interrumpir la acción de varios ciclos for y retenerlos tanto tiempo como yo tenga presionado un push botton ya sea en alto o en bajo, intente hacer un while con cierta condición, “while (button); {}” o “while (!button):{}”, para que se ejecutará tanto tiempo como se respetará la misma, pero una vez dentro del mismo nunca sale. Espero que me puedas ayudar.

  9. Hola Ramiro, lo siento pero con tan poca información me resulta difícil ayudarte. Si pones tu código podría orientar por dónde van los tiros.

    Un saludo,

    0xDA_bit

  10. Hola David, primeramente felicitarte y agradecerte estos tutoriales que tanto facilitan la iniciación en el mundo de Arduino.
    Después de ver el video he intentado hacer un par de ejercicios sobre interrupciones internas, y he intentado uno con un sensor de inclinacíon, el objetivo es que si la placa está quieta hay dos leds intermitentes, si se inclina se enciende un tercer led, y me he puesto a hacerlo y no se como hacer que funcione. he probado varios tipos de interrupciones y no se que falla. a ver si con un pequeño vistazo sabes que me pasa. un saludo

    #include

    const int ledemer = 13;
    const int led1 = 7;
    const int led2 = 8;
    const int sensor = 2;

    void setup()
    {
    pinMode(sensor, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(ledemer, OUTPUT);
    digitalWrite(sensor, HIGH); //sensor de inclinación

    sei(); //habilita el uso de las interrupciones globales
    EIMSK |=(1<<INT0); //decimos que vamos a trabajar con la interrupcion cero
    EICRA |=(1<<ISC00); //deteccion por nivel bajo //MCUCR |=(1<<ISC00); ES LO MISMO

    Serial.begin(9600);
    }
    void loop()
    {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    delay(1000);
    Serial.println("led 1 encendido led 2 apagado");
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(1000);
    Serial.println("led 2 encendido led 1 apagado");

    if(digitalRead(sensor)==LOW)
    {
    digitalWrite(ledemer, HIGH);
    Serial.println("emergencia encendida sin interrpucion");
    }

    }

    ISR(INTO_vect)
    {
    if(digitalRead(sensor)==LOW)
    {
    digitalWrite(ledemer, HIGH);
    Serial.println("emergencia encendida");
    }

    }

    como ves e colocado unos serial print para ver donde fallo, cuando lo inclino me muestra por pantalla
    "emergencia encendida sin interrucipon" y se me enciende el led correspondiente, pero no me muestra por pantalla "emergencia encendida", es decir, no entra a la interrupcion.

    UN SALUDO Y GRACIAS DE ANTEMANO

  11. Hola Alex. Primero de todo, gracias por las felicitaciones. Comentarios como el tuyo dan ánimo para seguir trabajando en el blog.

    La realidad es que no he tenido mucho tiempo para revisar tu código porque ando algo pillado de tiempo pero te comento…
    Veo que inicializas el sensor como input y posteriormente en el “setup(){}” le estas fijando un valor HIGH (digitalWrite(sensor, HIGH);) al ser una entrada, no deberías fijarle un valor, ya que es el propio sensor el que te enviará su estado.
    Has probado de hacer un programa con el sensor solo, sin interrupciones ni otros leds, para saber que valores te envía?¿ te lo comento porque normalmente los sensores los suelo trabajar por las entradas analógicas, ya que tienes más precisión para saber que valor te está mandando.
    Dependiendo el rango del rango del sensor, si por ejemplo es de 10 bits, te enviará un valor entre 0 y 1024. Dónde el estado LOW, corresponde de 0 a 512 y el estado HIGH de 513 a 1024.

    Es posible que tu problema venga provocado por algo coincidente con lo que te comento.
    Prueba de hacer un programa como el que te acabo de comentar, para saber cual es el valor que te envía el sensor y que valor es el que te interesa para activar el led. Ya que también tienes programada la detección de la interrupción interna por flanco descendente…

    Coméntame como van los progresos e intentamos solventar el problema, ya que la semana que viene tendré más tiempo libre.

    Un saludo,

    0xDA_bit

  12. Muchas gracias por el interés, en cuanto tenga tiempo probaré lo que me has dicho y te comentaré mis progresos y te diré si he solucionado algo.
    Muchas gracias y un saludo

    Alex

  13. De nada Alex, para eso estamos. Ya me contaras tus avances tras realizar los programillas que hemos comentado.

    Un saludo,

    0xDA_bit

  14. Hola David, he probado todo lo que me has dicho, he probado un circuito con el sensor y me funciona perfectamente, y el problema lo tengo al meter las interrupciones, en la línea de “EICRA |=(1<<ISC00);"
    no se muy bien que tengo que poner, en este caso mi sensor en reposo está en estado algo y cuando lo inclinas se pone a estado bajo, por lo que he elegido una interrupción por nivel bajo (no se si poner ISC00 es lo correcto, y tampoco se que significa el ("1<<").
    Cuando hago funcionar todo menos la interrupción funciona perfectamente, cuando lo inclino me muestra por pantalla que está a 0, pero no entra en la interrupción, te pongo el código por si le puedes echar un pequeño vistazo.

    #include

    const int ledemer = 13;
    const int led1 = 7;
    const int led2 = 8;
    const int sensor = 2;

    void setup()
    {
    pinMode(sensor, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(ledemer, OUTPUT);
    //digitalWrite(sensor, HIGH); //sensor de inclinación. estatico 1, inclinado 0

    sei(); //habilita el uso de las interrupciones globales
    EIMSK |=(1<<INT0); //decimos que vamos a trabajar con la interrupcion cero
    EICRA |=(1<<ISC00); //deteccion por nivel bajo //MCUCR |=(1<<ISC00); ES LO MISMO

    Serial.begin(9600);
    }
    void loop()
    {
    int sen;

    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    delay(1000);
    Serial.println("led 1 encendido led 2 apagado");
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(1000);
    Serial.println("led 2 encendido led 1 apagado");

    sen=digitalRead(sensor);
    Serial.print("senor == ");
    Serial.println(sen);
    }

    ISR(INTO_vect)
    {
    if(digitalRead(sensor)== 0)
    {
    digitalWrite(ledemer, HIGH);
    Serial.println("emergencia encendida");
    }

    }

    Gracias de antemano y un saludo.

    ALEX.

  15. Gracias a tí por visitarnos Miguel! No dejes de visitarnos ya que tras el verano os esperan muchas novedades, entre ellas, nuevos videotutoriales!!

    Un saludo,

    0xDA_bit

  16. Buenas! Muy bueno el blog y los videos!!!
    Si quiero utilizar más de una interrupción como debería hacerlo?
    Utilizo Arduino Mega 2560. Cuando activo la INT4 funciona a la perfección, pero ahora quiero usar dos interrupciones a la vez, ya que recibiré alternamente una respuesta por un pin y la siguiente respuesta por el otro pin. La cosa curiosa (o tal vez no) es que cuando activo la segunda interrupcion, ya no me aparece nada por el monitor serie (!!¡¡). A ver si me podéis echar una mano!

    Intento calcular el tiempo que hay entre dos interrupciones. Guardo ese tiempo en un array y al pulsar un boton, me muestra el resultado. He hecho un algoritmo para que, segun el tiempo entre flancos, me diga si es un 1 o un 0 (no os lo pongo entero, que son muchas lineas!!😛

    unsigned long tiempoInt4 [200]; // para guardar el tiempo de todas las interrupciones de la respuesta en pin2
    unsigned long tiempoInt5 [200]; // para guardar el tiempo de todas las interrupciones de la respuesta en pin3

    void setup(){
    EICRB = 0x01; //INT4, triggered on any edge
    EIMSK = 0x10; //Enable INT4
    EIMSK |=(1<<INT5); // Esta es la que he añadido a posteriori
    pinMode (2, INPUT);
    pinMode (3, INPUT);

    Serial.begin(115200);
    Serial.println ("puerto serie OK");
    beep();//pita un buzzer para saber que el programa está preparado
    }
    void loop(){
    // aquí va el programa que pulsando un boton envio un comando y seguido, empiezo a recibir la respuesta
    // y con el otro boton me muestra lo que hay guardado en los arrays.
    }

    ISR(INT4_vect) {
    tiempoInt4[z]=micros();
    z++;
    }

    ISR(INT5_vect) {
    tiempoInt5[z]=micros();
    z++;
    }

    Lo que decia.. si no incluyo nada de la INT5, me funciona perfecto, pero incluyendo ésta, ya no puedo monitorizar nada por serie. El buzzer pita, con lo que entiendo que el programa carga bien.

    Muchas gracias por adelantado!!

    Mikel

  17. Estoy trabajando con este codigo y a la hora de compilar no me reconoce “attachInterrupt(pbrl,prac,RISING)”
    la parte de “prac” me dice que no esta declarado a que se debe, me podrias ayudar ?
    #include

    int pb = 50;
    int pbr = 52;
    int pbr1 = 18;
    volatile int inc;
    volatile long lastInt;

    void setup()
    {
    sei();
    pinMode(pb,OUTPUT);
    pinMode(pbr,OUTPUT);
    pinMode(pbr1,INPUT);
    attachInterrupt(pbrl,prac,RISING);
    Serial.begin(9600);

    }
    void loop(){

    void prac(){
    if ((millis()-lastInt)>200){
    lastInt = millis();
    digitalWrite(50,HIGH);
    }

    else
    digitalWrite(52,HIGH);

    }
    }

  18. Hola Jaime,
    Una pregunta, has mirado el videotutorial de las interrupciones? Si no lo has hecho te aconsejo que le eches un vistazo.
    Para poder ayudarte mejor te pediría algo más de información como con que pcb estas trabajando o que quieres hacer con este código.
    A primera vista lo único que te puedo decir es que no tienes declarado pbrl, así que el attachInterrupt() no sabe que interrupción ejecutar. Supongo que por eso te está dándo el problema.

    Espero más datos sobre el código para ayudarte un poco más.

    Un saludo,

    0xDA_bit

  19. Hola a todos.
    ¿Alguien sabría decirme si cuando un programa esta ejecutando una temporización (delay) activamos el comando de interrupciones ,para la temporización delay ?
    podrias poner un ejemplo para verlo mas claro.
    Saludos

  20. hoal buenas tardes, saludos desde Colombia, gracia por dejar este post tan completo, solo queria pedrile un favor, al momento de abrir los archivos .doc y .pdf no lo puedo hacer y quisiera saber si los podría volvera compartir pero de manera individual, así problablemente no tenga inconveniente en la visualización en otro equipo, Gracias.
    Pdta: mi equipo es Windows y no Mac, no se si eso influya en el problema.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s