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:
- Función tone(): https://www.arduino.cc/en/Reference/Tone
- Detalles técnicos: https://code.google.com/archive/p/rogue-code/wikis/ToneLibraryDocumentation.wiki#Ugly_Details
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