Hola a todos, estoy tratando de obtener mediante un micrófono audio y con un arduino DUE invertir la onda y luego reproducirla por unos cascos para hacer una cancelación activa de sonido, SI, se que con un euro en componentes se puede hacer pero esto es un proyecto propuesto por un profesor y he de utilizar la placa DUE.
Hace años que no toco arduino y no me acuerdo demasiado pero con un poco de investigación por aquí y por allá he conseguido montar este código que me permite leer perfectamente una onda sinusoidal de 20kHz, el problema es que lee la entrada del pin 0 un momento y luego te hace el display de 1001 valores(creo), no es una lectura y display continua, le pregunté al profesor y me dio que buscase un método llamado First In First Out pero todo lo que veo es un buffer de x logitud de bits que es leído, guardado y luego reproducido, sin embargo esto ha de ser en vivo, tan simple como leer un solo valor, multiplicarlo por -1 y devolverlo sin guardarlo ni nada, tal como haría un opamp en modo inversor unitario , también tengo al duda de como declarar la salida ya que yo solo he trabajado con analogwrite y digitalwrite pero esto precisa de valores de tensión determinados.
Alguna idea?
Este es el código que he estado utilizando, tiene comentado el apartado del plotter ya que solo lo usé para comprobar que leía correctamente hasta 20kHz
Hace años que no toco arduino y no me acuerdo demasiado pero con un poco de investigación por aquí y por allá he conseguido montar este código que me permite leer perfectamente una onda sinusoidal de 20kHz, el problema es que lee la entrada del pin 0 un momento y luego te hace el display de 1001 valores(creo), no es una lectura y display continua, le pregunté al profesor y me dio que buscase un método llamado First In First Out pero todo lo que veo es un buffer de x logitud de bits que es leído, guardado y luego reproducido, sin embargo esto ha de ser en vivo, tan simple como leer un solo valor, multiplicarlo por -1 y devolverlo sin guardarlo ni nada, tal como haría un opamp en modo inversor unitario , también tengo al duda de como declarar la salida ya que yo solo he trabajado con analogwrite y digitalwrite pero esto precisa de valores de tensión determinados.
Alguna idea?
Este es el código que he estado utilizando, tiene comentado el apartado del plotter ya que solo lo usé para comprobar que leía correctamente hasta 20kHz
C:
unsigned long start_time;
unsigned long stop_time;
unsigned long values[1000]; /guarda 1001 valores?
void setup() {
Serial.begin(9600);
ADC->ADC_MR |= 0x80; //Activa el modo libre en el ADC
ADC->ADC_CHER = 0x80; //Activa el ADC en el pin A0 ( adc7???)
//pinMode(13, OUTPUT); // Declara pin como salida
// digitalWrite(13, HIGH); // Determina el estado inicial del pin
}
/*ADC->ADC_CDR[7]; //esto lee los datos mediante el adc
*/
void loop() {
unsigned int i;
start_time = micros();
for(i=0;i<1000;i++){
while((ADC->ADC_ISR & 0x80)==0); // espera a la conversión
values[i]=ADC->ADC_CDR[7]; //obtiene los valores en el adc7
//pin13!=pin13;
//pin13=estado por hacer tratar de hacer onda cuadrada que con cada cambio de estado muestre cuando hace una adquisición de datos para saber la velocidad.
//digitalWrite(13, estado); por hacer
}
// stop_time = micros();
//
// Serial.print("Tiempo total: ");
// Serial.println(stop_time-start_time);
// Serial.print("Tiempo medio por conversion: ");
// Serial.println((float)(stop_time-start_time)/1000);
//
// Serial.println("Valores: ");
// for(i=0;i<1000;i++) {
// Serial.println(values[i]);
// }
//
// delay(2000);
}