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?.