Arduino – Capítulo 8 – Theremin lumínico

¿Theremin? ¿Qué es eso? Un Theremin es nada más y nada menos que un instrumento musical que se toca sin tener ningún tipo de contacto físico con él, simplemente hay que mover las manos por encima de dicho instrumento. Si nunca habéis oído hablar de él, os recomiendo echar un vistazo en la Wikipedia.

ThereminUn Theremin cualquiera

 

El Theremin detecta la posición de las manos del músico en relación a dos antenas midiendo las variaciones en la capacidad eléctrica de las mismas. Las antenas están conectadas a un circuito analógico el cual, se encarga de generar el sonido. Una antena controla la frecuencia del sonido y otra el volumen del mismo. Aunque Arduino no puede replicar exactamente el misterioso sonido de este instrumento, si que le es posible emularlo mediante el uso de la función tone(). La figura siguiente nos muestra la diferencia entre los pulsos emitidos por la función analogWrite() y la función tone().

Figura 1

En lugar de detectar variaciones de capacidad eléctrica con Arduino, lo que haremos será utilizar una fotorresistencia para medir la cantidad de luz recibida. Moviendo nuestras manos sobre el sensor, lograremos alterar la cantidad de luz que incide sobre la fotorresistencia. El cambio en la tensión del pin analógico, determinará que frecuencia de nota musical deberá reproducir.

Conectaremos la fotorresistencia al Arduino utilizando un divisor de tensión similar al del capítulo 6. Probablemente te hayas percatado en el capítulo anterior que cuando obtenemos datos utilizando la función analogRead(), las lecturas no se encuentran siempre comprendidas entre 0 y 1023. La resistencia conectada a tierra limita el valor mínimo del rango y el brillo de la luz ambiental establece el valor máximo. En lugar de fijar un rango limitado, calibraremos los datos High y Low recogidos por el sensor, transformándolos en sonido mediante la función map() para de esta manera, obtener un rango de salida tan amplio como sea posible. Esto tiene la ventaja añadida de poder ajustar las lecturas del sensor cada vez que movamos el circuito a un nuevo entorno, como por ejemplo, una habitación con diferentes condiciones lumínicas.

 

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

– 1 resistencia de 10KΩ.

– 1 fotorresistencia.

– 1 altavoz piezoeléctrico.

Una vez tenemos los componentes necesarios, debemos seguir los siguientes pasos:

1 – Conectamos los cables de alimentación a nuestra protoboard.

2 – Cogemos nuestro pequeño altavoz y conectamos una de sus patillas a tierra y la otra al pin digital 8 de nuestro Arduino.

3 – Colocamos la fotorresistencia en la protoboard con una de sus patillas conectada a la alimentación de 5V. Seguidamente, conectamos la otra patilla de la fotorresistencia al pin analógico 0 y a tierra a través de la resistencia de 10KΩ.

Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente figura.

Diseño de protoboard

El esquema eléctrico correspondiente sería:

Esquema electrico

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

Primeramente crearemos una variable para almacenar el valor que analogRead() ha recibido de la fotorresistencia (sensorValue). Seguidamente, crearemos dos variables más, una para el valor High (sensorHigh) y otra para el Low (sensorLow). Inicializaremos el valor de la variable sensorLow a 1023 y a 0 el de la sensorHigh. Cuando ejecutemos el programa por primera vez, compararemos estos valores con los obtenidos por el sensor, de esta manera, sabremos a ciencia cierta cuales son los valores máximos y mínimos reales.

int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;

A continuación, creamos una constante llamada ledPin. Esta constante la utilizaremos como indicador de que el sensor  ha acabado de calibrarse. En este proyecto utilizaremos el led de la placa que esta conectado al pin 13.

const int ledPin = 13;

En la función setup(), estableceremos el pin 13 como salida mediante la función pinMode() y lo encenderemos.

void setup(){
 
     pinMode(ledPin, OUTPUT);
     digitalWrite(ledPin, HIGH);

Seguidamente, calibraremos los valores máximos y mínimos del sensor. Utilizaremos la sentencia while() para ejecutar un bucle durante cinco segundos. Dicho bucle se ejecutará hasta que se cumple una determinada condición. En nuestro caso, haremos uso de la función millis() para comprobar el tiempo actual. Esta función nos dirá cuanto tiempo ha transcurrido desde que el Arduino ha sido encendido o reseteado por última vez.

 while (millis() < 5000) {

Una vez dentro del bucle, vamos a leer el valor que nos da el sensor. Si dicho valor es menor que el contenido en la variable sensorLow (inicialmente era 1023), entonces actualizaremos el contenido de dicha variable con el valor obtenido. Si por el contrario, el valor obtenido es mayor que el contenido en la variable sensorHigh (inicialmente era 0), entonces actualizaremos el contenido de dicha variable con el nuevo valor.

      sensorValue = analogRead(A0);
          if (sensorValue > sensorHigh) {
                    sensorHigh = sensorValue;
          }
          if (sensorValue < sensorLow) {
                    sensorLow = sensorValue;
          }
 }//Fin del bucle while.

Transcurridos cinco segundos, el bucle while finalizará, por lo que apagaremos el led asociado al pin 13. Utilizaremos los valores High y Low obtenidos del sensor para escalar la frecuencia que será utilizada en la parte principal del programa.

     digitalWrite(ledPin, LOW);

} //Fin de la funcion setup.

A continuación, entraremos en la función loop(), para leer el valor del pin A0 y almacenarlo en la variable sensorValue.

void loop() {

        sensorValue = analogRead(A0);

Creamos una variable llamada pitch, cuyo valor es el resultado de mapear el contenido de la variable sensorValue. Usaremos los valores de sensorLow y sensorHigh como límites de los nuevos datos recogidos. Como valores de salida iniciales, probaremos con un rango de entre 50 y 4000. Estos números establecerán la escala de frecuencias que generará nuestro Arduino.

int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000);

Seguidamente, llamaremos a la función tone() para que reproduzca el sonido. Contiene tres argumentos:

– El pin en el que reproducirá el sonido (en nuestro caso será el pin 8).

– La frecuencia a reproducir (en nuestro caso viene determinada por la variable pitch).

– El tiempo de reproducción de la nota (probaremos con 20 milisegundos para empezar).

     tone(8,pitch,20);

Finalmente, utilizaremos la función delay() para obtener un retardo de 10 milisegundos y que el sonido tenga tiempo suficiente para ser reproducido.

         delay(10);

} //Fin de la funcion loop.

Puesta en marcha

Cuando pongamos en marcha nuestro Arduino por primera vez, dispondremos de una ventana de tiempo de 5 segundos para calibrar el sensor. Para hacer esto, moveremos nuestra mano arriba y abajo sobre la fotorresistencia, variando de esta manera la cantidad de luz que recibe. Cuanto más parecidos sean los movimientos a aquellos que vayamos a realizar cuando toquemos dicho instrumento, más precisa será la calibración.

Tras cinco segundos, la calibración habrá finalizado y el led del Arduino se apagará. Cuando esto ocurra, empezaremos a escuchar sonidos provenientes del altavoz piezoeléctrico. La cantidad de luz que recibe la fotorresistencia es la frecuencia que será reproducida.

Bien, en este proyecto hemos aprendido a utilizar un altavoz piezoeléctrico como elemento de salida, por lo que podemos añadir el sonido a nuestra lista de formas de mostrar información, ya no tenemos porque estar limitados a la luz y el monitor serie. Del mismo modo, hemos aprendido a utilizar el bucle de tipo while y la función tone, la cual, nos permite generar sonido en función de una serie de datos de entrada. Pero…, ¿que pasaría si en lugar de una fotorresistencia utilizáramos un potenciómetro o un sensor de temperatura como sensor de entrada?

 

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

Referencias

– Artículo basado en el capítulo “Project 06 – Light Theremin” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

– Más información sobre la función tone().

– Detalles técnicos sobre la función tone() aquí.

– Tutorial sobre el bucle while.

– Explicación de que es un altavoz piezoeléctrico en la Wikipedia.

Anuncios

3 pensamientos en “Arduino – Capítulo 8 – Theremin lumínico

  1. Pingback: Ardunio – Capítulo 14 – Cerradura de vibración | El gato inquieto

  2. Pingback: Theremin óptico – Umlaut

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s