Síntesis de ondas usando el método DDS ARDUINO

He montado el prototipo de sintetizador, por método DDS,  que desarrolló el equipo de LabIII en Colonia, en el  2009  por Martin Nawrath. El código  se puede encontrar en el siguiente enlace:

http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinewave-generator/

La rutina funciona bien pero es necesario implementar el filtro pasabajos que se propone en el enlace para purificar las señales. En el primer segundo parece que se genera una señal que no corresponde a la frecuencia deseada (es necesario hacer mediciones).

El método de síntesis directa, DDS, se basa en el uso del reloj interno de la tarjeta Arduino, y en una lista de 256 valores que varian entre 0 y 255, que corresponden a la forma de una onda senosoidal. Ha surgido la idea de enriquecer este código con listas de valores de otros tipos de onda como dientes de sierra, o cuadradas, e implementar un sistema sensor que permita cambiar la frecuencia de la señal generada. Estamos estudiando la posibilidad de implementar un doble oscilador.

La implementación de este montaje es FUNDAMENTAL para el proyecto, pues nos permite estimular con ondas sonoras distintos sistemas físicos como el tubo de Rubens.

Rutina ARDUINO No. 5 Tren de tonos aleatorios- duración ajustable

// TREN DE TONOS CON FRECUENCIA ALEATORIA DURACIÓN AJUSTABLE
// Este programa controla el sonido emitido usando la funcion TONE, a partir de un número pseudo-aleatorio, 
// conectando los extremos entre tierra y los 5V, y su pata central en el pin análogo A0 
// se controla la duración de un tren de pulsos que se emiten por un pequeño parlante conectado al pin digital 13 y a tierra.
// El parámetro temporal de la duración de cada pulso se controla por el potenciometro.
// sencilla rutina preparada para el proyecto FreeAudioLab- por Johan Bocanegra. https://freeaudiolab.wordpress.com

int sensorPin = A0;    // seleccione el pin de lectura del sensor
int soundPin = 13;      // seleccione el pin para emitir el sonido
int sensorValue = 0;  // variable para almacenar la lectura del sensor
int randNumber=0;    // variable para almacenar el número aleatorio
int ledPin= 6;       // Seleccione el pin del LED de operación

void setup() {

  pinMode(ledPin, OUTPUT);  
  pinMode(soundPin, OUTPUT);      // declara los pines de salida
}

void loop() {

  sensorValue = analogRead(sensorPin);     // lee el valor del sensor
  randNumber = random(1024); // genera un número pseudo-aleatorio
  noTone(13);		
    analogWrite(ledPin, sensorValue /4);    // Ajusta la intensidad del LED de operación
  tone(soundPin, randNumber/2,sensorValue*2); // genera un tono de frecuencia aleatoria, con duración proporcional al valor del sensor
delay(sensorValue*2);        // espera un lapso de tiempo

}

Rutina ARDUINO No. 4 Tren de tonos con frecuencia ajustable

// GENERADOR DE ONDAS CON AJUSTE DE FRECUENCIA Y LED DE INTENSIDAD VARIABLE
// Este programa controla el sonido emitido usando la funcion tone, a partir de la lectura de un potenciometro, 
// conectando los extremos entre tierra y los 5V, y su pata central en el pin análogo A0 
// se controla la frecuencia, 0hz - 1024hz, de un tren de pulsos que se emiten por un pequeño parlante conectado al pin digital 13 y a tierra.
// El parámetro temporal de la duración de cada pulso, y del tiempo entre pulsos y pulso se varía desde esta rutina.
// Adicionalmente se controla desde el mismo sensor la intensidad de un LED usando la función ANALOGWRITE
// sencilla rutina preparada para el proyecto FreeAudioLab- por Johan Bocanegra. https://freeaudiolab.wordpress.com

int sensorPin = A0;    // seleccionar la entrada para el sensor
int soundPin = 13;      // seleccionar el pin para la generación del tono
int ledPin = 11;        // seleccionar un pin que permita usar la opcion PWM
int sensorValue = 0;  // variable para almacenar el valor de la lectura del potenciometro
int timer = 200;      // seleccionar el parámetro temporal

void setup() {
  // declara los pines como salidas:
  pinMode(soundPin, OUTPUT);  
  pinMode(ledPin, OUTPUT);    
}

void loop() {
  // Lee el valor del sensor:
  sensorValue = analogRead(sensorPin);    
  noTone(13);		
    analogWrite(ledPin, sensorValue / 4);    // Prende el LED con una intensidad proporcionar al valor del sensorhe LED on
  tone(soundPin, sensorValue, timer);   // genera un tono de frecuencia igual al valor del sensor, y de una duración igual al parámetro timer
delay(timer);  // espera durante un tiempo
}

Rutina ARDUINO No.3 Tren de tonos con frecuencia y duración ajustable

La siguiente rutina permite controlar desde un potenciometro el tono y la duración de un tren de tonos. El prototipo cuenta con LED de operación.

// TREN DE TONOS Y DURACIÓN VARIABLE Y LED DE OPERACIÓN
// Este programa controla el sonido emitido usando la funcion tone, a partir de la lectura de un potenciometro, 
// conectando los extremos entre tierra y los 5V, y su pata central en el pin análogo A0 
// se controla la frecuencia de un tono, 0hz - 1024hz, seguido por otro tono con justo la mitad de la frecuencia del original
// un tren de pulsos que se emiten por un pequeño parlante conectado al pin digital 13 y a tierra.
// El parámetro temporal se multiplica por el valor del sensor de modo que la duración de cada pulso depende del sensor.
// Adicionalmente un LED conectado al pin 12 titila con la emisión de cada pulso.
// sencilla rutina preparada para el proyecto FreeAudioLab- por Johan Bocanegra. https://freeaudiolab.wordpress.com

int sensorPin = A0;    // seleccione el pin para lectura del potenciometro
int soundPin = 13;      // seleccione el pin por el que se emiten los tonos
int ledPin = 12;        // seleccione el pin de conexión para el LED de operación
int sensorValue = 0;  // variablble para almacenar la lectura del potenciometro
int timer = 200;      // variable que controla la duración del pulso, milisegundos. 

void setup() {
  // declara los pines como SALIDAS:
  pinMode(soundPin, OUTPUT);  
  pinMode(ledPin, OUTPUT);    
}

void loop() {
  // Lee el valor del sensor:
  sensorValue = analogRead(sensorPin);    
  noTone(13);		
  digitalWrite(ledPin, HIGH);   // prende el LED
  tone(soundPin, sensorValue, timer * sensorValue); //emite un sonido con frecuencia ajustable desde la lectura del potenciometro, y duración igual al valor de timer
  tone(soundPin, sensorValue / 2, timer * sensorValue); // emite un segundo sonido de la misma duración, con una frecuencia igual a la mitad del valor del sensor
 digitalWrite(ledPin, LOW); // apaga el LED 
  delay(timer * sensorValue);  // espera por un tiempo igual al valor del parámetro timer. 
}