Un theremin rústico hecho con Arduino

Si hay un instrumento musical fascinante para mí, es el theremin.

Se trata de un instrumento que se ejecuta sin contacto físico. Aquí puede verse un video de cómo suena:Theremin en youtubeAsí que yo quise realizar una aproximación a la programación de un instrumento sin contacto, utilizando un sensor de distancia (ultrasónico) y un buzzer. Este fue el resultado:

Theremin de tres notas con Arduino

Tenemos el buzzer conectado al pin 9 (y a gnd), y el sensor ultrasónico HC-SR04 conectado así:

  • VCC – a 5v
  • TRIG – al pin 12
  • ECHO – al pin 13
  • GND – a gnd

Y este es el código:

#define PIN_TRIG 12
#define PIN_ECO 13
int buzzer = 9;
int numTones = 10;

int tones[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494};
                //DO, DO#, RE, RE#, MI, FA, FA#, SOL, SOL#, A, A#, B

void setup() {
  Serial.begin (9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECO, INPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {
//Este fragmento de código es para tomar la información del sensor ultrasónico HC-SR04
long duracion, distancia;
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);

duracion=pulseIn(PIN_ECO, HIGH);
distancia=(duracion/2)/29;
//Aquí hacemos que la distancia se muestre en el "Monitor Serial"
Serial.println(distancia);

//En esta parte indicamos qué nota tocar de acuerdo a la distancia
switch (distancia) {
      case 0 ... 10:
        tone(buzzer, tones[1]);
        delay(500);
        break;
      case 11 ... 20:
        tone(buzzer, tones[5]);
        delay(500);
        break;
      case 21 ... 30:
        tone(buzzer, tones[8]);
        delay(500);
        break;
      default: 
        noTone(buzzer);      
        delay(500);
}
}

 

Utilización de un pulsador en Arduino

Para poder utilizar un pulsador con Arduino, empecé leyendo este posteo de luisllamas.es

En él se explica que hay dos maneras de conectar un pulsador:

  • En la primera, cuando el pulsador está libre se lee «high» y cuando está pulsado se lee «low». Esta forma de conectar es llamada resistencia pull-down
  • En la segunda, cuando el pulsador no está presionado se lee «low», y al presionarlo se lee «high». Se llama resistencia pull-up

Como quiero utilizar el pulsador para encender un led, opté por la segunda opción.

pulsadorEntonces,

  • Conecto una pata del pulsador directamente a 5v.
  • La otra pata, va conectada a una resistencia y en la misma serie al pin 8.
  • Por otra parte, la resistencia se conecta a GND.

Y el código es:

int valor = 0;


void setup() {

  Serial.begin(9600);

  pinMode(8, INPUT);

  pinMode(13, OUTPUT);

  }

  

  void loop() {

    valor=digitalRead(8);

    if (valor == HIGH) {

      digitalWrite(13, HIGH);}

    else {

      digitalWrite(13, LOW);

    }

    delay (500);

    }

 

Piano de frutas sólo con Arduino

Siempre se ve el clásico ejemplo del piano de bananas. Cuando decidí probar hacer mi propio piano de frutas, encontré que todos los caminos me conducían a Makey Makey.

Sin embargo, buscando un poco más encontré en este posteo del blog untitled.es, la manera de hacer un piano de frutas sin utilizar Makey Makey.

Pagando con un twitt se pueden descargar el plano y el código para realizar un piano de frutas.

El código descargado comienza con esta hermosa leyenda:

/*
Realizado por http://Untitled.es 
Descubre nuevos tutoriales todas las semanas.

Puedes utilizar este ejemplo para lo que te apetezca: 
- Modificarlo 
- Venderlo 
- Leerlo en forma de cuento antes de dormir

Incluso, si decides añadirlo a tu proyecto, puedes compartir la fuente.
*/

Y después de varios intentos, cambiar esto y aquello, desconectar todo y empezar por una sola fruta, descubrí que mi primer piano de frutas no sonaba porque le había puesto una resistencia demasiado grande.

Finalmente, mi código de dos notas (y un led «testigo» en el pin 13) quedó así:

int nota1 = 261;

int nota2 = 1046; 

int zumbador = 8;

void setup() {

  Serial.begin(9600);

  pinMode(zumbador, OUTPUT);  

}

void loop() {

  Serial.print("Analog 1: ");

  Serial.println(analogRead(0));

  if (analogRead(0)<=1020) {

    digitalWrite(13, HIGH); 

    tone(zumbador, nota1);

    delay(100);

    noTone(zumbador);

    digitalWrite(13, LOW);

    }

  if (analogRead(1)<=1020) {

   tone(zumbador, nota2);

    delay(100);

    noTone(zumbador);

    }

    }