Archivo de la etiqueta: detector de flancos

Práctica: Funciones Definidas de Usuario

Menú Interactivo

Hacer un menú interactivo a través del puerto serie donde al pulsar la opción 1 enciende el led del pin 9, al pulsar la opción 2 apaga el led del pin 9 y al pulsar la opción 3 mido el voltaje que tengo en la entrada analógica A0 conectada a un potenciómetro y la muestra por pantalla.

Instalación:

Solución Ejercicio16: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_Avanzado_2017/tree/master/Ejercicio16-Menu_Interactivo

Función Detecta flanco

Señales digitales:

Hacer una función que detecte flancos ascendentes y descendentes, para ser reutilizada en otros proyectos.

Ponerla en un ejemplo con alguno de los botones.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio09-Funcion_Detecta_Flanco

Para ejercicio detecta flanco, probar con dos botones en los pines 2 y 3. La función detecta flanco solo funciona con un pulsador, pero cuando se intenta usar con dos pulsadores ya no funciona, la solución es crear un objeto.

Código para detectar flanco en dos pulsadores que falla: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/blob/master/Ejercicio09-Funcion_Detecta_Flanco_Error/Ejercicio09-Funcion_Detecta_Flanco_Error.ino

Dado Digital

Usando las funciones de números aleatorios hacer un dado digital que genere un número aleatorio entre 1 y 4 y encienda un led aleatorio cada vez que se pulse el botón A.

Usar la función de detección de flanco hecha en el anterior ejercicio.

Random Numbers

  • randomSeed() – Inicializa el generador de número pseudo-aleatorios
  • random() – Genera números pseudo-aleatorios

Paso 1 – Generar un valor aleatorio entre 1 y 4 al pulsar el botón

Paso 2 – Apagar el led anteriormente encendido y encender el nuevo led.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio10-Dado

Ejercicio propuesto. Hacer una ruleta electrónica con un neopixel ring

Anuncios

Prácticas Repaso Arduino

Práctica: Ejemplos Básicos con Arduino

Repasar cada uno de los ejemplos básicos:

  • Leer entradas digitales
  • Leer entrada digital sin referencia externa
  • Leer entradas analógicas
  • Leer entrada analógica mejorada
  • Escribir salida analógica
  • Escribir salida digital con acción de un botón
  • Mejora de botón para evitar rebotes
  • Contar pulsaciones

Ejemplos básicos con Arduino: http://jecrespo.github.io/ArduinoBasicExamples/

Práctica: Detectar Flanco

Hacer un sistema de encendido y apagado de un led mediante una pulsación. Con una pulsación enciende y con otra apaga el led. Para hacer esto debemos detectar flancos al encender y apagar.

Usar la resistencia interna de pull up de Arduino para detectar la pulsación de un botón en el pin 2 (leer estado de una entrada digital) y encender/apagar el led puesto en el pin 10 (no olvidar la resistencia) al detectar un flanco ascendente. Adicionalmente sacar por el monitor serie el estado de pulsación del botón con un 1 (pulsado) o un 0 (no pulsado) y en la misma línea el estado del led con un 3 (led encendido) y 0 (led apagado), de esta forma abriendo el Serial Plotter es posible ver cuando se enciende y apaga el led al detectar flancos.

Esquema de conexión:

Resultado:

Solución Ejercicio01: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_Avanzado_2017/tree/master/Ejercicio01-Detectar_Flanco

Solución a los Rebotes (Debounce)

Los rebotes son las falsas pulsaciones que se producen al hacer falsos contactos en el interruptor.

Para ello esperar un tiempo llamado debounceDelay para comprobar que el cambio de estado se mantiene y no son rebotes (ruido).

Para ello crear una variable “debounceDelay” que pueda cambiar su valor y sea el tiempo mínimo en ms que debe estar la señal estable para considerar que no es un rebote. En cada loop comprobar el tiempo desde el último cambio de estado de la señal digital y si es mayor que “debounceDelay” proceder a hacer las comprobaciones de flanco y encender o apagar el LED.

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

Solución Ejercicio02: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_Avanzado_2017/tree/master/Ejercicio02-Detectar_Flanco_Debounce

Otra forma de solucionar los rebotes por código:

http://miarduinounotieneunblog.blogspot.com.es/2016/01/pulsador-antirrebote-con-contador-de.html ¿véis algún problema con esta solución? Si hay ruido o la señal cambia continuamente, nunca sale del bucle y el programa no puede hacer otras cosas.

Solución: El código puede quedarse durante mucho tiempo en la función antirrebote(), bloqueado Arduino para hacer otras tareas.

Solucionar rebotes por HW:

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

Práctica: Medir valor de un Condensador

Usar un Arduino para medir el valor de un Condensador. En este ejercicio se usan pines digitales de entrada y salida para manejar las corrientes y una entrada analógica para leer el voltaje.

Ver: https://www.arduino.cc/en/Tutorial/CapacitanceMeter

Esquema de conexión:

¡ATENCIÓN! Poner un condensador de 100uF y asegurarse de poner correctamente la polaridad. Símbolo – (patilla con símbolo – – – -) a masa.

La resistencia R tiene un valor de 10Kohms.

Al conectar un condensador en serie con una resistencia, a una fuente de tensión eléctrica (o comúnmente, fuente de alimentación), la corriente empieza a circular por ambos. El condensador va acumulando carga entre sus placas. Cuando el condensador se encuentra totalmente cargado, deja de circular corriente por el circuito.

TC = R * C

  • R resistencia de carga en ohms
  • C capacidad del condensador en faradios

Explicación del sketch:

  • Configurar el pin de descarga a INPUT (alta impedancia de modo que no pueda descargar el condensador). Pin 11.
  • Registre el tiempo de inicio con millis ()
  • Establecer el pin de carga en OUTPUT y ponerlo a HIGH. Pin 13.
  • Compruebe la tensión repetidamente en un bucle hasta que llegue a 63.2% de la tensión total.
  • Después de cargar, restar el tiempo actual de la hora de inicio para averiguar cuánto tiempo le costó al condensador para cargar.
  • Dividir el Tiempo en segundos por la resistencia de carga en ohmios para encontrar la Capacitancia.
  • Imprimir por serial el valor con serial.print
  • Descargue el condensador. Para hacer esto:
    • Poner a LOW el pin de carga en la entrada
    • Configurar el de descarga en OUTPUT y haga que sea LOW
    • Leer el voltaje para asegurarse de que el condensador está completamente descargado
    • Loop y hacerlo de nuevo

Para asegurarse que el condensador está descargado, asegurarse de quitar alimentación cuando lo indique el sketch por pantalla.

Solución Ejercicio03: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_Avanzado_2017/tree/master/Ejercicio03-Medidor_Condensadores

Para ampliar la explicación del ejercicio https://www.arduino.cc/en/Tutorial/CapacitanceMeter

Más Prácticas

Otros ejemplos sencillos de prácticas con Arduino en https://aprendiendoarduino.wordpress.com/2017/07/04/ejemplos-sencillos-arduino/, usando este montaje de prácticas https://aprendiendoarduino.wordpress.com/2017/07/02/montaje-practicas/

  • Leer LDR
  • Contar Pulsos
  • Mover Servo

Ejemplos Entradas y Salidas Digitales

Input Pullup

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.

Imprimir por pantalla el tiempo de loop, que nos servirá para analizar la importancia de este tiempo en el comportamiento del programa.

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

Esquema de conexión:

Diagrama eléctrico:

Resultado:

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

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio16-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.

NOTA: Si el tiempo de loop es muy largo podemos perder pulsaciones rápidas. Probar a poner un delay.

Interruptor

Con la base del 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. Para hacer esto debemos detectar flancos para encender y apagar.

Más información sobre como detectar flancos: http://rufianenlared.com/flancos/

Esquema de conexión:

Resultado:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio17-pullup_interruptor

Función Detecta Flanco

Hacer tres funciones para detectar que hagan las siguientes funciones y que se le pase como parámetro el pin donde detectar el flanco:

  • Detectar flanco ascendente
  • Detectar flanco descendente
  • Detectar flanco. Devuelve 1 para un flanco ascendente y un -1 para un flanco descendente.

Para usar estas funciones, deben llamarse en cada loop y para no perder un flanco, deben llamarse como máximo cada 300 ms.

Usarla en el ejemplo anterior del interruptor.

Solución:

Comprobar que si quiere detectar flanco en dos pines con una misma función no es posible. Para solucionarlo es necesario usar clases.

Solución:

Contador de pulsos

Usar Arduino para contar pulsaciones de un pulsador. 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.

NOTA: comprobar los rebotes y pensar cómo eliminarlos.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio18-cuentapulsos