Archivo de la etiqueta: tone

Buzzer con Arduino

Un buzzer pasivo o un altavoz son dispositivos que permiten convertir una señal eléctrica en una onda de sonido. Estos dispositivos no disponen de electrónica interna, por lo que tenemos que proporcionar una señal eléctrica para conseguir el sonido deseado.

En oposición, los buzzer activos disponen de un oscilador interno, por lo que únicamente tenemos que alimentar el dispositivo para que se produzca el sonido.

El buzzer activo es el que tiene la pegatina y al alimentarlo entre 5V y GND suena a una frecuencia fija,

Usar el ejemplo de blink para probarlo y comparar con el buzzer pasivo. El buzzer activo es adecuado para hacer avisos sonoros pero no para reproducir tonos o música.

El buzzer pasivo no tiene un oscilador interno y por lo tanto la frecuencia del sonido debemos hacerla desde Arduino, para ello disponemos de la función tone(): https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/

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().

Esquema de conexión:

Hacer sonar un sonido: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio21-tone

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

Entradas y Salidas Analógicas Arduino. PWM

Una señal eléctrica analógica es aquella en la que los valores de la tensión o voltaje varían constantemente y pueden tomar cualquier valor. En el caso de la corriente alterna, la señal analógica incrementa su valor con signo eléctrico positivo (+) durante medio ciclo y disminuye a continuación con signo eléctrico negativo (–) en el medio ciclo siguiente.

Un sistema de control (como un microcontrolador) no tiene capacidad alguna para trabajar con señales analógicas, de modo que necesita convertir las señales analógicas en señales digitales para poder trabajar con ellas.

La señal digital obtenida de una analógica tiene dos propiedades fundamentales:

En el caso de un arduino Uno, el valor de 0 voltios analógico es expresado en digital como B0000000000 (0) y el valor de 5V analógico es expresado en digital como B1111111111 (1023). Por lo tanto todo valor analógico intermedio es expresado con un valor entre 0 y 1023, es decir, sumo 1 en binario cada 4,883 mV.

Arduino Uno tiene una resolución de 10 bits, es decir, unos valores entre 0 y 1023.

Arduino Due tiene una resolución de 12 bits, es decir, unos valores entre 0 y 4095.

Diferencia entre señales analógicas y digitales:

Entradas Analógicas en Arduino

Los microcontroladores de Arduino contienen en la placa un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los pines analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto, si necesitamos más pines digitales podemos usar los pines analógicos. La nomenclatura para los pines analógicos es A0, A1, etc…

En arduino los pines analógicos se definen y tienen las propiedades siguientes: http://arduino.cc/en/Tutorial/AnalogInputPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

En Visualino disponemos de las funciones para leer de entradas analógicas y escribir en salidas analógicas en la agrupación de bloques “Pin Functions”.

Otras funciones interesantes con entradas/salidas analógicas:

En Visualino estás disponibles las funciones map y random en la agrupación “Math”

Salidas Analógicas. PWM

Como hemos dicho Arduino Uno tiene entradas analógicas que gracias a los conversores analógico digital puede entender ese valor el microcontrolador, pero no tiene salidas analógicas puras y para solucionar esto, usa la técnica de PWM.

Algunos pines digitales pueden usarse como salidas analógicas PWM:

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras, sin embargo el Arduino Due sí tiene salidas analógicas puras mediante dos DAC. El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.

La función para hacer una salida PWM en un pin es:

En Visualino disponemos de la función analogWrite() para escribir entradas analógicas con PWM en la agrupación de bloques “Pin Functions”.

La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período.

duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función)

Diferentes valores de una señal PWM:

En este ejemplo se ve cómo simular con PWM una onda sinusoidal analógica.

En Arduino la frecuencia de PWM es de 500Hz. Pero es un valor que puede modificarse en caso que lo necesitemos.

En la actualidad existen muchos circuitos integrados en los que se implementa la modulación PWM, por ejemplo para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores, controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos y algunas otras aplicaciones.

Definición de PWM en la web de Arduino: http://arduino.cc/en/Tutorial/PWM

Para ampliar un poco más de información sobre PWM ver: http://rufianenlared.com/que-es-pwm/

Función Tone()

No confundir PWM con la función tone() que es utilizada para generar una onda cuadrada de ciclo de trabajo 50% y frecuencia variable, con el fin de emitir sonidos audibles, modificando la frecuencia.

Más información de tone() en: https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

Programación Arduino

Hagamos unos ejemplos de programación con Arduino para practicar los conceptos aprendidos.

Regular intensidad de un LED

Leer un voltaje analógico desde un potenciometro y sacarlo por consola. Conectar un potenciómetro en la entrada analógica A0, leer su valor e iluminar el LED en función del valor leído.

Tutoriales:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio11-Analog

Smoothing: Modificar el ejercicio anterior para leer una entrada analógica llegada de un potenciómetro y sacar por el puerto serie la media de los últimas 10 lecturas. Luego hacer una transición más suave al escribir en el puerto analógico.

Tutorial: https://www.arduino.cc/en/Tutorial/Smoothing

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio12-Smoothing

Sonidos con Arduino

Para generar sonidos con Arduino debemos debemos usar un buzzer o piezo. Si conectamos un piezo con una señal digital, vibran a una frecuencia sigue bastante fielmente la variación eléctrica con que los excita, y si vibran a la frecuencia audible, oiremos el sonido que producen.

Para generar vibraciones podemos usar la función tone() que genera notas en el espectro audible. 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().

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

Música Star Wars: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio51-Musica_StarWars

Aviso de Temperatura Alta

Partiendo del sketch https://www.arduino.cc/en/Tutorial/ifStatementConditional modificarlo para simular un envío de un mensaje mediante Serial.println() cada vez que haya una alarma cuando se supere el umbral (Temperatura) y otro mensaje cada vez recupere la alarma cuando vuelva a estar por debajo del umbral y la temperatura sea correcta.

Diagrama de flujo:

ejercicio52

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma

Histeresis: Comprobar el efecto del programa cuando estamos justo en el umbral donde tendremos continuas alarmas y recuperaciones. Para solucionar esto añadir histéresis.

Diagrama de flujo:

ejercicio52_histeresis

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma_Histeresis

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

Contador de pulsos

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 un led cuando tenga pulsado el botón. Adicionalmente sacar por el monitor serie el estado de pulsación del botón

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

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

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.

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

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

Añadir una solución a los rebotes que se dan con el código del ejercicio 9.

Solución a los rebotes: http://miarduinounotieneunblog.blogspot.com.es/2016/01/pulsador-antirrebote-con-contador-de.html o via HW con un condensador.

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