Archivo de la etiqueta: debounce

Ejemplos Prácticos Arduino

Digital Read Serial

Monitorizar el estado de un botón (pulsado/no pulsado) con Arduino y mostrarlo por el monitor serie.

Revisar el código del programa DigitalReadSerial de los ejemplos en Basis. Cargar y ejecutar en Arduino.

Esquema de conexión:

Explicación completa de la práctica: http://arduino.cc/en/Tutorial/DigitalReadSerial

Código: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio04-DigitalReadSerial

Comprobar desde el monitor serie como detecta Arduino las pulsaciones del pulsador.

Hacer la misma comprobación desde el Serial Plotter.

Quitar la resistencia ¿Que valores lee si dejo al aire la entrada digital 2?

Aumentar el tiempo de delay y ver cómo se modifica el comportamiento al pulsar el botón. Comprobar el efecto de los rebotes (bounce) y como se soluciona (debounce).

Encender Led al detectar pulsación

Ahora hacer que al detectar una pulsación del botón se encienda y al soltar el botón se apague. Imprimir por puerto serie cuando apague y encienda el led.

Esquema de conexión:

Código: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio05-Led_Pulsador

Comprobar cómo afecta el escribir por el puerto serie. Si no escribo por el puerto serie aumentan los rebotes.

¿Que habría que hacer para que solo encienda y apague el led cuando cambie el estado?

Solución: http://jecrespo.github.io/PrimerosPasosArduino/

¿Que habría que hacer para encender con una pulsación y apagar con otra?

Solución: https://www.arduino.cc/en/Tutorial/StateChangeDetection

Más ejemplos

El IDE de Arduino trae muchos ejemplos que podemos ver y probar por nuestra cuenta: https://www.arduino.cc/en/Tutorial/BuiltInExamples

Contador de pulsos

NOTA: para todas estas prácticas, usamos un botón conectado al pin digital 2 configurado como INPUT_PULLUP. En este caso al leer el pin 2 digitalRead(2) me devuelve 1 cuando no está pulsado el botón (abierto) y me devuelve 0 cuando está pulsado el botón (cerrado)

Práctica: Usar la resistencia interna de pull up de Arduino para detectar la pulsación de un botón (leer estado de una entrada digital) y encender el led 13 (integrado en placa) cuando tenga pulsado el botón y apagarlo cuando lo libere. Adicionalmente sacar por el monitor serie el estado de pulsación del botón con un 1 o un 0, de esta forma abriendo el Serial Plotter es posible ver la señal que recibe Arduino.

Tutorial: http://arduino.cc/en/Tutorial/InputPullupSerial

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup

NOTA: Ver efecto de la diferencia del tiempo de loop cuando pulso o no pulso el botón debido a el Serial.println que se ejecuta al pulsar el botón. Ver ejercicio https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_tiempo

NOTA: Si el tiempo de loop es muy largo podemos perder pulsaciones rápidas.

Práctica: Modificar el ejemplo anterior pero en lugar de mantener pulsado el botón para encender el led, con una pulsación enciende y con otra apaga el led. Ahora el led ponerlo en el pin 10 en lugar del 13. Detectar flancos para encender y apagar.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_interruptor

Práctica: Modificar el ejemplo anterior para contar el número de veces que se pulsa un botón detectando flancos ascendentes o descendentes y sacarlo por el monitor serie. Adicionalmente encender o apagar el led cada vez que haya 4 pulsaciones del botón.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio09-cuentapulsos

Solución a los rebotes

Práctica: Añadir una solución a los rebotes. Los rebotes son las falsas pulsaciones que se producen al hacer falsos contactos en el interruptor.

Más información https://www.arduino.cc/en/Tutorial/Debounce

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_interruptor_rebote

Otra forma de solucionar los rebotes por código: http://miarduinounotieneunblog.blogspot.com.es/2016/01/pulsador-antirrebote-con-contador-de.html

Solucionar rebotes por HW:

Calculadora de valores para debouncing: http://protological.com/debounce-calaculator/

Práctica avanzada: Ver el funcionamiento de la función tone() para generar notas. Tone() genera una onda cuadrada de una frecuencia específica y con un 50% de duty cycle en el pin especificado. La duración del tono puede ser especificado o en caso contrario continúa hasta llamar a la función noTone().

Solo un tono puede ser generado simultáneamente, si un tono ya se está ejecutando en otro pin, la llamada a tone() no tendrá efecto.

Para más información:

NOTA: no confundir tone con PWM. PWM tiene una frecuencia fija de 500Hz, por lo que entre línea verde y verde hay siempre 2ms.

Esquema de conexión:

Tutoriales:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio10-tone

Musica Star Wars con Arduino: http://miarduinounotieneunblog.blogspot.com.es/2016/01/banda-sonora-de-star-wars-con-un.html

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercio51-Musica_StarWars