¿Puedes tocar acordes en Arduino con un solo altavoz piezoeléctrico?

4

Necesito poder tocar dos tonos a la vez y tengo el arduino uni con un pequeño altavoz piezo de 8 ohmios. ¿Es posible hacerlo?

Código de ejemplo

#define  c     3830    // 261 Hz 

int tone1 = 10; // digital pin10
int tone2 = 9 // digital pin9
void setup() {
    pinMode(tone1, OUTPUT);    // pin as output
    pinMode(tone2, OUTPUT);    // pin as output
} 

void loop() {
   playTone(1000,500,700)
} 

void playTone(long duration, int freq, int freq2) {
    duration *= 1000;
    int period = (1.0 / freq) * 1000000;
    long elapsed_time = 0;
    while (elapsed_time < duration) {
        digitalWrite(tone1,HIGH);
        digitalWrite(tone2,HIGH);
        delayMicroseconds(period / 2);
        digitalWrite(tone1,LOW);
        digitalWrite(tone2,LOW);
        delayMicroseconds(period / 2);
        elapsed_time += (period);
    }
}
    
pregunta h00j

2 respuestas

4

Debería ser factible. Tener una tabla de búsqueda sinusoidal. Calcule la diferencia de fase entre muestras sucesivas para ambas señales a la frecuencia de muestreo utilizada. Al marcar el temporizador (a su frecuencia de muestra), agregue esas fases a los acumuladores de dos fases, busque sus valores en la tabla senoidal, agréguelas y establezca una salida PWM a ese valor.
Use un filtro de paso bajo para filtrar una tensión analógica del PWM.

Por ejemplo, suponga que desea una señal de 2 kHz con una señal de 3 kHz y su frecuencia de muestreo es de 10 kHz. Su tabla sinusoidal tiene un valor para cada grado. Su señal de 2kHz pasará 72 ° por muestra, su señal de 3kHz 108 °. Entonces, para la primera señal, lea 72 valores más en la tabla senoidal, para la otra, irá 108 valores más en cada muestra.

Esto también funciona para mezclar más de dos señales.

Las principales diferencias con la solución de Telaclavo son que sus señales son ondas cuadradas, mientras que las mías son senos, lo que prefieras. Mi solución es más intensiva en CPU, mientras que la suya utiliza más E / S y componentes externos (sumador de voltaje).

    
respondido por el stevenvh
3

Si el número máximo de tonos que necesita para tocar simultáneamente es solo dos (o incluso tres o cuatro), usaría dos pines de salida, configurados para entregar PWM, y agregaría sus contribuciones externamente, ya sea con dos resistencias (si no necesita mucho volumen), o con un opamp como un sumador.

Si usa una sola señal PWM para recrear la suma de los dos tonos, necesitará atención de la CPU para cada muestra de su señal total. El ATmega328 no tiene DMA.

Con los dos pines, no acapares la CPU. De hecho, durante los intervalos de tiempo en que ninguna de las dos frecuencias cambia, la CPU no tendrá que hacer nada.

Otra ventaja es que puede cambiar cualquiera de las frecuencias, en tiempo real. No necesita una tabla de búsqueda para cada combinación de posibles frecuencias.

    
respondido por el Telaclavo

Lea otras preguntas en las etiquetas