Proyecto Arduino 15. Theremin, instrumento musical electrónico.

El Theremin (o ætérfono) es un instrumento musical inventado por el soviético Leon Theremin en 1919. Fue uno de los primeros instrumentos musicales electrónicos, y además de su sonido, lo más curioso es que el ejecutante no tiene ningún contacto físico con él. (Según wikipedia)

La práctica de hoy pretende simular este particular instrumento empleando un fotorresistor y un altavoz piezo.

Una vez montado y probado el circuito y el programa del Starter Kit, me decidí a incluir algunas mejoras de mi cosecha.

El theremin funciona moviemdo las manos encima del fotorresistor. Eso hace que reciba más o menos luz y consecuentemente se module la frecuencia aplicada al altavoz.

Lo primero, y para aprovechar de nuevo mi semáforo de LEDs, le acoplo un a modo de vumeter (o vúmetro). O sea que según la frecuencia del sonido se me encenderá el LED verde, el amarillo y el rojo.

Pero como el montaje no dispone de un interruptor de encendido/apagado, pues resulta que se queda pitando todo el rato. Así que le acoplo un potenciómetro que usaré para activar o desactivar el invento. Lo uso como un divisor de tensión, y la pata variable la conecto a una entrada del Arduino. Uso el valor de la entrada (HIGH/LOW) como argumento de un “while” que abarca todo el código. O sea, que cuando la tensión en pata del potenciómetro sea alta, se ejecuta el proceso, y cuando sea baja, no. Lo que es un interruptor.

const int Onoff = 7;

pinMode(Onoff, INPUT);

while ( digitalRead(Onoff) ) …

Esquema Thermin

Es interesante, también, el código en la zona de setup del programa, en la que se calibra la entrada de luz del fotorresistor.

// calibrate for the first five seconds after program runs
while (millis() < 5000) {
// record the maximum sensor value
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
// record the minimum sensor value
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}

Otra cosa es obtener “música” con este engendro.

(Aquí el video que muestra el funcionamiento)

Este es el código del programa:

/* +———————————————————-+
! ** A R D U I N O ** !
! PROGRAMA : PITIDOS !
! AUTOR : DAVID SANTAOLALLA !
! FECHA : 14/05/2015 !
! DESCRIPCION : CON UN FOTORESISTOR Y LA MANO MODULAMOS LA !
! FECUENCIA DE SALIDA DE UN ALTAVOZ. !
! MI APORTACION: UN VUMETRO DE TRES LEDS Y UN INTERRUPTOR !
! CON UN POTENCIOMETRO. !
! !
! !
+———————————————————-+
*/
// Constantes

// variable to hold sensor value
int sensorValue;
// variable to calibrate low value
int sensorLow = 1023;
// variable to calibrate high value
int sensorHigh = 0;
// LED pin
const int ledPin = 13;
// LEDs vu-metro
const int Rojo = 3;
const int Ambar = 4;
const int Verde = 5;
const int Onoff = 7;

void setup() {
// Make the LED pin an output and turn it on
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
//
Serial.begin(9600);

// Declaracion de pines de salida
pinMode(Rojo, OUTPUT);
pinMode(Ambar, OUTPUT);
pinMode(Verde, OUTPUT);

pinMode(Onoff, INPUT);

digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);

// calibrate for the first five seconds after program runs
while (millis() < 5000) {
// record the maximum sensor value
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
// record the minimum sensor value
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}
// turn the LED off, signaling the end of the calibration period
digitalWrite(ledPin, LOW);
}

void loop() {
while ( digitalRead(Onoff) ) {
digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);

//read the input from A0 and store it in a variable
sensorValue = analogRead(A0);

// map the sensor values to a wide range of pitches
int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000);
Serial.print(“Valor leido: “);
Serial.print(sensorValue);
Serial.print(” — “);
Serial.println(pitch);

// play the tone for 20 ms on pin 8
tone(8, pitch, 20);
if (pitch > 0){
// level 1;
digitalWrite(Verde, HIGH);
}
if (pitch > 2000){
// level 2;
digitalWrite(Ambar, HIGH);
}
if (pitch > 7000){
// level 3;
digitalWrite(Rojo, HIGH);
}

// wait for a moment
delay(10);
}
}

Anuncios

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