Bonjour,
Je cherche à développer une enceinte anti-bruit. Pour ce faire j'ai un système composé d'un micro de perturbation qui capte le son à atténuer et le transmet à une Arduino due via un adaptateur. Un autre micro d'erreur capte le résultat de l'atténuation et le transmet à la due également pour faire une boucle de rétroaction. Enfin la due est censée transmettre au 2nd haut-parleur un son qui serait opposé en phase grâce à un retard avec une bonne amplitude grâce à la rétroaction du 2nd micro.
Cependant je n'est aucune connaissance en c++ et en arduino. J'ai un début de programme qui fait la numérisation et je pense utiliser un tableau pour faire le retard mais je ne sais pas comment le programmer.
Voici mon programme :
volatile int E_mic_p = 0; // sur A0
volatile int E_mic_e = 0; // sur A1
volatile float f_p; // perturbation
volatile float f_e; // erreur
volatile float f_ps; // perturbation
volatile float f_es; // erreur
volatile int S_DAC0;
volatile int S_DAC1;
//pour afficher les valeurs
volatile int flag_print=LOW;
volatile int eA0;
volatile float perturbation;
volatile float perturbation_s;
volatile int sDAC0;
volatile byte changed = 0;
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Hello reducteur de bruit actif ");
delay(1000);
analogReadResolution(12);
analogWriteResolution(12);
pinMode(49, OUTPUT); // broche pour mesure temps exécution interruption
pinMode(50, INPUT_PULLUP); // broche pour horloge de la freq d'échantillonnage
attachInterrupt(digitalPinToInterrupt(50), echantillonne, RISING);
//pinMode(DAC0, OUTPUT);
//pinMode(DAC1, OUTPUT);
}
void echantillonne()
{
digitalWrite(49, HIGH);
E_mic_p = analogRead(A0); //0-4095
E_mic_e = analogRead(A1);
f_p = (E_mic_p-2047.5)*1650/2047.5; //+-1,65
f_e = (E_mic_e - 2047.5) * 1650/2047.5;
//processus
//inversion et atténuation
f_ps = f_p * -1;
f_es = f_e * -1;
//retard
if (i==0)
{
}
//
S_DAC0 = (f_ps +1650)*4095/3300; //0-4095
S_DAC1 = (f_es+1650)*4095/3300;
analogWrite(DAC0, S_DAC0);
analogWrite(DAC1, S_DAC1);
if (flag_print==LOW)
{
eA0=E_mic_p;
perturbation=f_p;
perturbation_s=f_ps;
sDAC0=S_DAC0;
flag_print=HIGH;
}
digitalWrite(49, LOW);
}
void loop()
{
if (flag_print==HIGH)
{
Serial.print(" A0=");
Serial.print(eA0);
Serial.print(" float eA0=");
Serial.print(perturbation);
Serial.print(" float après calcul =");
Serial.print(perturbation_s);
Serial.print(" S_DAC0=");
Serial.println(sDAC0);
flag_print=LOW;
}
delay(1500);
}