User Tools

Site Tools


Writing /var/lib/dokuwiki/data/meta/teaching/ie0624/actividad_arduino_timers_ints.meta failed
teaching:ie0624:actividad_arduino_timers_ints

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:ie0624:actividad_arduino_timers_ints [2017/03/29 10:58] – [Parte 1. Lectura de datos digitales (uso de un botón)] adminteaching:ie0624:actividad_arduino_timers_ints [2022/09/20 00:08] (current) – external edit 127.0.0.1
Line 21: Line 21:
   - Debe realizar una descripción de lo logrado a lo largo de la actividad, incluyendo las dificultades que se presentaron. Una bitácora de lo sucedido es lo mejor. (Anote no solo lo que usted ejecutó sino también el resultado de lo que ejecuta)   - Debe realizar una descripción de lo logrado a lo largo de la actividad, incluyendo las dificultades que se presentaron. Una bitácora de lo sucedido es lo mejor. (Anote no solo lo que usted ejecutó sino también el resultado de lo que ejecuta)
   - El reporte debe ser entregado mediante correo electrónico al asistente con copia al profesor del curso mediante correo electrónico. Debe utilizar formato PDF.   - El reporte debe ser entregado mediante correo electrónico al asistente con copia al profesor del curso mediante correo electrónico. Debe utilizar formato PDF.
 +  - El correo electrónico del reporte debe llevar el siguiente formato en el "subject": "IE0624 - Reporte N", donde N es el número de la actividad realizada.
 +
  
 ==== Evaluación ==== ==== Evaluación ====
Line 29: Line 31:
   - Portada (curso, semestre, año, fecha, número y nombre de práctica, integrantes). 2%   - Portada (curso, semestre, año, fecha, número y nombre de práctica, integrantes). 2%
   - Bitácora de trabajo describiendo el resultado de todos los pasos seguidos de la guía incluyendo dificultades y/o situaciones inesperadas. 30%   - Bitácora de trabajo describiendo el resultado de todos los pasos seguidos de la guía incluyendo dificultades y/o situaciones inesperadas. 30%
-  - Capturas o fotografías de puntos importantes realizadas durante la actividad (el circuito ensamblado, resultados observables en el osciloscopio, etc) 30+  - Capturas o fotografías de puntos importantes realizadas durante la actividad (el circuito ensamblado, resultados observables en el osciloscopio, etc) 20
-  - Respuestas al cuestionario de la guía. 30%+  - Respuestas al cuestionario de la guía. 20% 
 +  - Todo el código fuente de todos los programas utilizados a lo largo de la actividad. Debe agregar al inicio del código una descripción sobre dicho código (a qué parte de la práctica corresponde, la función que cumple dicho código). 20%
   - Referencias utilizadas en caso de acceder a alguna fuente de información de Internet o bibliográfica durante la realización de la actividad. 8%   - Referencias utilizadas en caso de acceder a alguna fuente de información de Internet o bibliográfica durante la realización de la actividad. 8%
  
Line 37: Line 40:
 ==== Parte 1. Lectura de datos digitales (uso de un botón) ==== ==== Parte 1. Lectura de datos digitales (uso de un botón) ====
  
-=== Circuito de entrada sencillo (botón resistencia) ===+=== Circuito de botón sencillo (botón resistencia) ===
  
   * Ensamble el siguiente circuito en una protoboard   * Ensamble el siguiente circuito en una protoboard
  
-{{ :teaching:ie0624:rebote1.png?nolink |}}+{{ :teaching:ie0624:rebote1.png?nolink&400 |}} 
 + 
 +  * Utilizando un osciloscopio capture el comportamiento de la señal de salida cuando se presiona y se libera el botón. La señal presenta ruido muy extremo, asegúrese de configurar el osciloscopio en modo "trigger" (disparo) primero para señal creciente y luego para señal decreciente con un periodo de tiempo suficientemente bajo para observar el "rebote" de la señal del botón. **1) Cuántos rebotes presenta la señal al presionar el botón y cuántos rebotes presenta la señal al liberar el botón.** (Haga tres experimentos y calcule el promedio) 
 + 
 +=== Circuito de botón con eliminación de rebote analógico === 
  
-  * Utilizando un osciloscopio capture el comportamiento de la señal de salida cuando se presiona y se libera el botón. La señal presenta ruido muy extremo, asegúrese de configurar el osciloscopio en modo "trigger" (disparo) primero para señal creciente y luego para señal decreciente con un periodo de tiempo suficientemente bajo para observar el "rebote" de la señal del botón. 1) Cuántos rebotes presenta la señal al presionar el botón y cuántos rebotes presenta la señal al liberar el botón. (Haga tres experimentos y calcule el promedio) 
   * Ensamble el siguiente circuito en una protoboard   * Ensamble el siguiente circuito en una protoboard
  
-{{ :teaching:ie0624:rebote2.png?nolink |}}+{{ :teaching:ie0624:rebote2.png?nolink&400 |}}
  
-  * Utilizando un osciloscopio capture el comportamiento de la señal de salida cuando se presiona y se libera el botón. Asegúrese de configurar el osciloscopio en modo "trigger" (disparo) primero para señal creciente y luego para señal decreciente con el mismo periodo de tiempo utilizado con el circuito anterior. 2) Cuántos rebotes presenta la señal al presionar el botón y cuántos rebotes presenta la señal al liberar el botón. (Haga tres experimentos y calcule el promedio) 3) Comente en qué maneras difiere la forma de la señal en este circuito con respecto al anterior. 4) Comente en qué manera difiere la forma de los "rebotes" o "ruido" con el circuito anterior.+  * Utilizando un osciloscopio capture el comportamiento de la señal de salida cuando se presiona y se libera el botón. Asegúrese de configurar el osciloscopio en modo "trigger" (disparo) primero para señal creciente y luego para señal decreciente con el mismo periodo de tiempo utilizado con el circuito anterior. **2) Cuántos rebotes presenta la señal al presionar el botón y cuántos rebotes presenta la señal al liberar el botón**. (Haga tres experimentos y calcule el promedio) **3) Comente en qué maneras difiere la forma de la señal en este circuito con respecto al anterior. 4) Comente en qué manera difiere la forma de los "rebotes" o "ruido" con el circuito anterior.** 
 + 
 +=== Circuito de botón para Arduino === 
 + 
 +  * Conecte su arduino a la PC (todavía no conecte el arduino a la protoboard) 
 +  * Ejecute el programa arduino y cree un archivo nuevo con el siguiente programa: 
 + 
 +<code c> 
 +  void setup(){ 
 +    //configure pin2 as an input and enable the internal pull-up resistor 
 +    pinMode(2, INPUT_PULLUP); 
 +    pinMode(13, OUTPUT);  
 +   
 +  } 
 +   
 +  void loop(){ 
 +    //read the pushbutton value into a variable 
 +    int sensorVal = digitalRead(2); 
 +     
 +    // Keep in mind the pullup means the pushbutton'
 +    // logic is inverted. It goes HIGH when it's open, 
 +    // and LOW when it's pressed. Turn on pin 13 when the  
 +    // button's pressed, and off when it's not: 
 +    if (sensorVal == HIGH) { 
 +      digitalWrite(13, LOW); 
 +    }  
 +    else { 
 +      digitalWrite(13, HIGH); 
 +    } 
 +  } 
 +</code> 
 + 
 +  * Guarde dicho archivo con el nombre boton_con_rebotes 
 +  * Conecte el botón al arduino de acuerdo al siguiente circuito: 
 + 
 +{{ :teaching:ie0624:rebote3.png?nolink&400 |}} 
 + 
 +  * Cargue y ejecute el programa en el arduino 
 +  * Conecte el osciloscopio al pin D13 del Arduino. Utilizando el osciloscopio capture el comportamiento de la señal de salida cuando se presiona y se libera el botón. Asegúrese de configurar el osciloscopio en modo "trigger" (disparo) primero para señal creciente y luego para señal decreciente con el mismo periodo de tiempo utilizado con el circuito anterior. **5) Comente las diferencias con respecto a los experimentos anteriores. 6) Se presentan rebotes?** 
 +  * Modifique el programa anterior para eliminar los rebotes por software. Para esto debe leer dos veces la entrada del botón, entre la primera lectura y la segunda lectura debe "esperar" (con delay) un tiempo prudencial para asegurarse que ya han ocurrido todos los rebotes. Si ambos valores coinciden entonces puede cambiar el estado del LED. 
 +  * Corrobore que los rebotes han sido eliminados utilizando el osciloscopio.  
 +  * Presente todas las capturas del osciloscopio en su reporte.
  
  
Line 54: Line 102:
 ==== Parte 2. TIMER ==== ==== Parte 2. TIMER ====
  
-==== Parte 3. Interrupción con señal externa como fuente (utilizando un botón) ====+  * Desconecte el Arduino de la PC y remueva momentaneamente el circuito del botón del Arduino 
 +  * Ejecute el siguiente programa:
  
-==== Parte 4. Programa problema (dos blinking simultáneos con variación de frecuencia utilizando interrupción externa) ====+<code c> 
 +  #define ledPin 13 
 +   
 +  void setup() 
 +  { 
 +    pinMode(ledPin, OUTPUT); 
 +     
 +    // initialize timer1  
 +    noInterrupts();           // disable all interrupts 
 +    TCCR1A 0; 
 +    TCCR1B 0; 
 +    TCNT1  0; 
 +   
 +    OCR1A = 32000;            // compare match register 
 +    TCCR1B |= (1 << CS12);    // 256 prescaler  
 +    TIMSK1 |(1 << OCIE1A);  // enable timer compare interrupt 
 +    TIMSK1 |(1 << TOIE1);   // enable timer overflow interrupt 
 +    interrupts();             // enable all interrupts 
 +  } 
 +   
 +  ISR(TIMER1_COMPA_vect)          // timer compare interrupt service routine 
 +  { 
 +    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin 
 +  } 
 +   
 +  ISR(TIMER1_OVF_vect)        // interrupt service routine that wraps a user defined function supplied by attachInterrupt 
 +  { 
 +    TCNT1 0;            // preload timer 
 +    digitalWrite(ledPin, digitalRead(ledPin) ^ 1); 
 +  } 
 +   
 +  void loop() 
 +  { 
 +     
 +  } 
 +</code>
  
 +  * **7) Calcule utilizando la hoja de fabricante la frecuencia de parpadeo del LED**
 +  * **8) Calcule utilizando la hoja de fabricante el tiempo que el pin D13 (LED) se encuentra en bajo y en alto.**
 +  * Agregue al pin D12 un LED con una resistencia en serie conectados a Vcc5V.
 +  * Modifique el programa anterior para encender y apagar el LED del pin D12 utilizando la rutina "loop" de arduino y el comando "delay(1000)"
 +  * Ambos LED deberían estar parpadeando independientemente.
  
 +==== Parte 3. Interrupción con señal externa como fuente (utilizando un botón) ====
  
 +  * Desconecte el Arduino de la PC
 +  * Reconecte el circuito del botón al pin D2
 +  * Ejecute el siguiente programa:
  
 +<code c>
 +  #define ledPin = 13;
 +  #define interruptPin 2
 +  #define interrupt 0
 +  
 +  void setup() {
 +    pinMode(ledPin, OUTPUT);
 +    pinMode(interruptPin, INPUT_PULLUP);
 +    attachInterrupt(interrupt, blink, RISING);
 +  }
 +  
 +  void loop() {
 +  }
 +  
 +  void blink() {
 +    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
 +  }
 +</code>
 +  * **9) Cuándo el LED cambia de estado? Cuando presiona el botón o cuando lo libera?**
 +  * Modifique el programa anterior para cambiar el estado del LED (toggle) cuando lo presiona y cuando lo libera.
 +  * Examine la señal D13 con el osciloscopio. Modifique el programa anterior para eliminar los rebotes.
 +
 +==== Parte 4. Programa problema (dos blinking simultáneos con variación de frecuencia utilizando interrupción externa) ====
  
-  - TIMERs +  * Utilizando los programas anteriores construya un nuevo programa que: 
-  - INTS +    * Realice un blinking de 1s utilizando la rutina normal "loop" 
-  - Programa normal leyendo datos (botón)+    * Realice un blinking de 1s utilizando la interrupción de "overrun" del Timer 
 +    * El tiempo del blinking 1s del "overrun" cambiará a la mitad cada vez que presione un botón externo. 
 +    * El botón externo debe ser utilizado mediante interrupciones. 
 +    * Los rebotes en el botón externo deben ser eliminados por software.
  
 ===== Referencias ===== ===== Referencias =====
Line 70: Line 189:
  
 http://www.labbookpages.co.uk/electronics/debounce.html http://www.labbookpages.co.uk/electronics/debounce.html
 +
 http://electronics.stackexchange.com/questions/66764/how-the-capacitor-works-in-a-debouncing-circuit http://electronics.stackexchange.com/questions/66764/how-the-capacitor-works-in-a-debouncing-circuit
 +
 https://oscarliang.com/arduino-timer-and-interrupt-tutorial/ https://oscarliang.com/arduino-timer-and-interrupt-tutorial/
 +
 +http://playground.arduino.cc/Code/Timer1
 +
 +http://forum.arduino.cc/index.php?topic=43333.0
 +
 +http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts
 +
 +https://oscarliang.com/arduino-timer-and-interrupt-tutorial/
 +
 +https://www.arduino.cc/en/Reference/AttachInterrupt
 +
  
teaching/ie0624/actividad_arduino_timers_ints.1490785120.txt.gz · Last modified: 2022/09/20 00:08 (external edit)