Montaje 8: Theremin luminoso

Requisitos:

  • 2 Fotorresistencias (LDR), 3 resistencias de 1Kohmio.
  • Un pulsador.
  • Un zumbador piezoeléctrico.

Planteamiento: Cómo hacer música moviendo las manos en el aire.

Presentación de: Ajuste dinámico del rango de entrada.

Las señales de las entradas analógicas a las que están conectadas las LDR se van a utilizar para controlar la frecuencia y duración de los sonidos del piezoeléctrico. Según la cantidad de luz que llegue a cada LDR tendremos una frecuencia y una duración. Controlar la duración de forma independiente permite pasar de unas notas a otras sin necesidad de recorrer todas las intermedias.

El procedimiento calibra( ) obtiene los valores mínimo y máximo de la señal para una situación de luz ambiente determinada, actualizando los valores de las variables max1, max2, min1 y min2.

La función mapa1 transforma linealmente el intervalo de valores de la señal de la primera LDR en el intervalo de duraciones (nº de repeticiones) de los pulsos que producen el sonido. La función mapa2 transforma linealmente el intervalo de valores de la señal de la segunda LDR en el intervalo de tiempos de pulso.

Como ambas funciones usan los valores de las variables actualizadas por el procedimiento calibra( ), tendremos el mismo rango de respuesta en diferentes condiciones de luz. Si la intensidad de luz varía apreciablemente durante la ejecución, la respuesta ya no sería fiable, pero podemos recalibrar presionando el pulsador.

VIDEO DEL MONTAJE 8

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int puls=5;  
 int zumb =10;
 int ldr1=0;
 int ldr2=1;
 int n=0;
 int max1=0;
 int min1=1024;
 int max2=0;
 int min2=1024;
 int medida1=0;
 int medida2=0;
 int tmin=50;                          //variables que definen el intervalo de nº de repeticiones que determinan
 int tmax=700;                         //las duraciones de cada frecuencia.
 int minnota=800;                      //variables que definen el intervalo de tiempos para los pulsos que 
 int maxnota=2000;                     //forman las distintas frecuencias del zumbador piezoeléctrico.
 int c=0;
 void setup() { 
   pinMode(zumb, OUTPUT);
   pinMode(puls,INPUT);
 }
 void calibra(){                       //procedimiento que actualiza los valores máximos y mínimos de la señal de
   if (medida1>=max1){                 //entrada de la fotorresistencia para establecer los límites máximo y mínimo
     max1=medida1;
   }
   if (medida1<=min1){
     min1=medida1;
   }
   if (medida2>=max2){
     max2=medida2;
   }
   if (medida2<=min2){
     min2=medida2;
   }
 }
 mapa1(medida1){                       //función que mapea los valores máximo y mínimo de la señal de entrada 
   return(tmin+(((tmax-tmin)/(max1-min1))*(medida1-min1)));    //de la primera LDR en el intervalo de duraciones
 }
 mapa2(medida2){                       //función que mapea los valores máximo y mínimo de la señal de entrada 
   return(minnota+(((maxnota-minnota)/(max2-min2))*(medida2-min2)));    //de la segunda LDR en el intervalo de tiempos de pulso
 }
 void resetea(){                       //procedimiento que reinicia las variables que se han ido actualizando
   c=0;                                //para volver a empezar recalibrando.
   max1=0;
   min1=1024;;
   max2=0;
   min2=1024;
 }
 void comprueba(){                     //procedimiento que hace un reset si se presiona el pulsador
   if(digitalRead(puls) == HIGH){      // si se pulsa el pulsador
     delay(2000);
     resetea();  
   } 
 } 

 void loop(){
   medida1=analogRead(ldr1);           //variable que guarda el valor de la señal de la primera LDR
   medida2=analogRead(ldr2);           //variable que guarda el valor de la señal de la segunda LDR
   calibra();
   comprueba();
   for(n=0;n<(mapa1(medida1));n++){    //procedimiento que produce los sonidos
     //for(n=0;n<5;n++)  
     digitalWrite(zumb,HIGH);
     delayMicroseconds(mapa2(medida2));
     digitalWrite(zumb, LOW);
     delayMicroseconds(mapa2(medida2));
   } 
 }    

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.