Go Down

Topic: Creación de Audiómetro con Arduino UNO  (Read 2974 times) previous topic - next topic

BryannLuna

Oct 08, 2018, 01:10 am Last Edit: Oct 08, 2018, 03:04 am by surbyte Reason: Visualizacion de imagenes
¡Hola, buen día!.

Primero que nada, soy nuevo en la comunidad y en general con Arduino, recién voy introduciéndome a este mundo, soy ingeniero en TIC's por lo que tengo un poco de nociones electrónicas pero sinceramente no es mi campo.

Les cuento un poco sobre esto, trabajo en un hospital privado en un departamento donde elaboramos proyectos (Llámese ingeniería médica) y recién nos han propuesto generar un proyecto nuevo:

- Crear un audiómetro para detección de problemas auditivos.

¿Cómo funciona un audiómetro?

Un audiómetro genera señales senoidales con frecuencias entre los 0 Hz hasta 8kHz (0-8000), su amplitud (Volumen) varía entre los 0 dB SPL (Nivel de Presión Sonora por sus siglas en inglés "Sound Pressure Level") hasta los 120 dB SPL.

Solución Propuesta:

Crear una interfaz gráfica (ya ha sido creada en C# WPF, adjunto imagen) en donde el operador seleccione 2 opciones

  1.- La frecuencia a reproducir (De 0 a 8k)
  2.- Intensidad del Sonido (De 0 a 120 dB)

Una ves seleccionadas ambas opciones, reproducir mediante Arduino conectado a una salida de audio 6.5mm (como enchufes de guitarra) hacia unos audífonos la señal solicitada.

Básicamente el Arduino solamente será nuestro generador de funciones / señales y en la interfaz de la computadora se graficarán los resultados mediante los resultados que el paciente indique.




Dado que el Arduino UNO solo genera señales digitales y por pulso (PWM) me vi en la necesidad de comprar un DAC MCP 4725 de 12 bits el cual (por teoría) supongo que a 12 bits puede generar un rango dinámico de 72 dB. Pensé en comprar el AD9850 ya que según la documentación puede trabajar a 32 bits y en teoría debería entregar 192 dB (más vale que sobre a que falte).

¿Ustedes que me recomiendan?, primero haré las pruebas con el MCP y si el resultado es más o menos el deseado, me lanzaría a comprar el AD9850 pero mi única y GRAN DUDA ES:

¿PUEDE UN GENERADOR DE FUNCIONES O SEÑALES COMO EL AD9850 O EL DAC REPRODUCIR LA ONDA EN FORMA DE AUDIO?


En caso de que sí, con la ayuda de un sonómetro (decibelómetro) mediríamos la eficacia de los decibeles dentro de una cabina aislada de audio pero como les comenté al inicio, mi fuerte no es la electrónica, espero me hayan entendido, en los archivos adjuntos agrego un pequeño diagrama de flujo (que hice a prisas) para darles la idea del proyecto. MUCHAS GRACIAS.





Pablo_Lucini

Por qué no te fijás en un Arduino Due que tiene dos DAC de 12 bits. Tal vez puedas omitir un DAC externo y manejarlo por software.

BryannLuna

Por qué no te fijás en un Arduino Due que tiene dos DAC de 12 bits. Tal vez puedas omitir un DAC externo y manejarlo por software.
Si lo tomé en cuenta pero no se si ambos DAC del Arduino DUE puedan usarse en serie para generar 24 bits, la verdad lo desconozco, otra de las razones por las que dudé, según mi lógica, si se utilizan ambos DAC requeriría mayor voltaje de entrada al Arduino y eso podría perjudicarlo o generar ruido en la señal si mal no estoy. Por eso me vi en la necesidad de recurrir a un DAC externo.

Saludos y gracias por la sugerencia!, el día de mañana adquiriré un osciloscopio para verificar las frecuencias que el DAC MCP entrega y ver de que manera puedo modularlas, saludos.

Daniel_Arg

#3
Oct 09, 2018, 11:33 am Last Edit: Oct 09, 2018, 11:35 am by Daniel_Arg
¿Un osciloscopio para la gama de frecuencias audibles?

Quote
¿PUEDE UN GENERADOR DE FUNCIONES O SEÑALES COMO EL AD9850 O EL DAC REPRODUCIR LA ONDA EN FORMA DE AUDIO?
Estas perdido como Adán en el día de la madre. Si tu lo dices..... que genera las señales, eso es lo que hace, generar ondas cuadradas y senoidales en un amplio rango de frecuencias. También las audibles.

El AD9850 te va bien para lo que quieres hacer, junto a un arduino nano, talvez  un encoder, una pantalla 2x16 o 4x20, tal vez un CD22100 para seleccionar las salidas de estas dos formas de onda que van al amplificador de auriculares o tal vez silenciar un oído. Tal vez una resistencia electrónica para prescindir de un potenciómetro de ajuste de volumen.

Por favor, no confundas byte con decibelios.

Supongo que el instrumento que intentas fabricar a está inventado. Sería bueno tener algo mas de información de algún aparato comercial.

Confieso que tengo poco interés en ayudarte desde el momento que dices que trabajas para un hospital  privado. Preferiría que contraten a un diseñador y programador. Diferente sería que fuera para un hospital público.

Buena suerte.

surbyte

#4
Oct 09, 2018, 04:54 pm Last Edit: Oct 09, 2018, 04:57 pm by surbyte
Yo estuve haciendo algunas cuentas que conducen a que la mejor opción es el DDS.
El DAC propuesto presentará problemas de resolución a alta frecuencia suponiendo que usaras un Arduino MEGA por ejemplo, ya que un UNO esta mas limitado.
No se me cruzó el DUE que es muy buena opción.

Imagina la situación de 8Khz Su T = 1/F = 125useg
Ahora para lograr tus 4096 pasos o sea 12 bits tendrias que enviar un dato al DAC cada 125useg/4096 = 0,030517578125 useg = 30.51 nseg

Si el ciclo del reloj de un UNO es de 62.5nseg obviamente no se puede.
Un MEGA también esta a 62.5 nseg asi que no sirve

Un DUE 84Mhz pero su DAC según la hoja de datos dice

DACC, per the specsheet), section 44.6, Functional Description:
Quote
The DACC uses the master clock (MCK) divided by two to perform conversions. This clock is named DACC Clock. Once a conversion starts the DACC takes 25 clock periods to provide the analog result on the selected analog output.
Ya que el reloj del DUE esta a 84Mhz. Una conversón toma 25 y dos entonces es como si tuvieramos el reloj a la mitad o sea 42 Mhz => 25 ciclos reloj son 25x 1/42Mhz = 595 nseg.

Ahora he visto coss como esta en el DUE generando audio a 44Khz

http://rcarduino.blogspot.com/2012/12/arduino-due-dds-part-1-sinewaves-and.html

Con esto tienes un buen punto de partida si usas un DUE

Pero la mejor opcion gratis porque casi no tienes que usar nada ni poder de un Arduino es el DDS que lo hace todo a tu gusto.

Es caro pero es la mejor alternativa.

BryannLuna

#5
Oct 10, 2018, 04:59 am Last Edit: Oct 10, 2018, 11:04 pm by BryannLuna
¿Un osciloscopio para la gama de frecuencias audibles?

Confieso que tengo poco interés en ayudarte desde el momento que dices que trabajas para un hospital  privado. Preferiría que contraten a un diseñador y programador. Diferente sería que fuera para un hospital público.

Buena suerte.
El fin de utilizar el osciloscopio es para comprobar la modulación de la señal senoidal al utilizar el DAC, no tanto para verificar si es audible o no.

Y tu opinión es respetable. No vengo aquí como trabajador ni inversionista ni nada, es meramente amor al arte, no me pagan por invertir en comprar Arduinos ni herramientas de trabajo, es un proyecto propuesto (no formal) y, ¿de que serviría la ingeniería si no intentamos utilizar el ingenio en esto?. Claro, directamente del hospital y siendo yo el líder de proyectos claro que sería más rápido y factible contratar a un especialista en ello, pero en términos tangibles no, y repito, es solamente una idea, una ambición, tómalo de la manera que quieras pero mi meta o fin es aprender, pues el hospital no requiere el equipo ya que contamos con varios profesionales pero mi idea tampoco es clonar lo que ya está hecho. Si puedo innovar utilizando Arduino y creando interfaces o utilizando otro método de generación de señales pues ya es ganancia propia y un ahorro inimaginable. Pues un audiómetro profesional oscila entre los $45 mil pesos mexicanos hasta los $100k. Entre Arduino, cables y demás no he gastado más de $1k y me parece perfecto.

Imagina la situación de 8Khz Su T = 1/F = 125useg
Ahora para lograr tus 4096 pasos o sea 12 bits tendrias que enviar un dato al DAC cada 125useg/4096 = 0,030517578125 useg = 30.51 nseg

Si el ciclo del reloj de un UNO es de 62.5nseg obviamente no se puede.
Un MEGA también esta a 62.5 nseg asi que no sirve
Me encantó el razonamiento que usaste y estas atascado de razón. Un DUE sería más factible para el proyecto, por desgracia me adelante al poco conocimiento en Arduino que tengo y adquirí el UNO hace 2 semanas. Pero propuesta la alternativa de utilizar el DDS externo (en este caso el AD9850) me veo en la necesidad de adquirirlo y comenzar a experimentar. Me has aclarado el camino y te lo agradezco. Por el momento haré pruebas con el DAC a 8 bits para adaptarme al ciclo del Arduino UNO y os comento que tal me fue. Gracias!

Daniel_Arg

Hay multímetros baratos que miden la frecuencia  e incluso puedes usar un arduino para ello, como lo hace esta persona en Youtube generador de frecuencias con el chip ad9850 . Incluso como muestra en el video que coincide la frecuencia generada con la medida por el otro arduino no necesitas eso.

No entiendo porque tendrías que modular la señal senoidal (ya sea en frecuencia o amplitud) para medir el  grado de hipoacusia de un paciente.

BryannLuna

#7
Oct 10, 2018, 06:43 am Last Edit: Oct 10, 2018, 11:01 pm by BryannLuna
@Daniel_Arg

A vale ya entiendo el punto!, bueno eso sí, el osciloscopio fue lo primero que me vino a la mente, y dado que no estoy acostumbrado a trabajar con señales pensé que me serviría para ver de que manera se modulan y como se ven gráficamente, no debí haber faltado a las materias de sistemas y señales en la universidad jaja, gracias por el consejo e interesante el video! Utilizan el DDS

Daniel_Arg

#8
Oct 10, 2018, 07:27 am Last Edit: Oct 10, 2018, 07:36 am by Daniel_Arg
Hasta el momento hablamos de la parte física del audiómetro, pero debes saber que es lo que necesita el profesional médico y operador del instrumento, para ir pensando en el soft, que incluso puede modificar el hardware.
Vaya a saber si es necesario un generador de señales y si es suficiente con una colección de audios que pueden estar grabados en una memoria SD en formato mp3.

He buscado en google y hay estudios basados en conversaciones realizadas en distintos ambientes,  avenida, café, playa etc.  

También he visto que el paciente debe dar una respuesta con un pulsador pero también podría responder tocando en la pantalla con un multiple choice. Pensar en la opción del ruido blanco para anular la transmisión ósea hacia el otro oído.

No te limites a arduino y un generador de señal, porque un audiómetro podría corren en una netbook y su placa interna de sonido o una externa por USB.   Generador de tonos para windows

Mira este otro video de un audiómetro para PC.



BryannLuna

#9
Oct 11, 2018, 12:08 am Last Edit: Oct 12, 2018, 12:39 am by BryannLuna Reason: Imágenes no se pueden visualizar
Buen día chicos, he vuelto, les comento, he logrado conectar el DAC siguiendo las instrucciones del desarrollador e implementando la librería Adafruit. El código quedó de la siguiente manera para 8 bits.

Code: [Select]
#include <Wire.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

// Set this value to 9, 8, 7, 6 or 5 to adjust the resolution
#define DAC_RESOLUTION    (8)

const PROGMEM uint16_t DACLookup_FullSine_8Bit[256] =
{
  2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398,
  2447, 2496, 2545, 2594, 2642, 2690, 2737, 2784,
  2831, 2877, 2923, 2968, 3013, 3057, 3100, 3143,
  3185, 3226, 3267, 3307, 3346, 3385, 3423, 3459,
  3495, 3530, 3565, 3598, 3630, 3662, 3692, 3722,
  3750, 3777, 3804, 3829, 3853, 3876, 3898, 3919,
  3939, 3958, 3975, 3992, 4007, 4021, 4034, 4045,
  4056, 4065, 4073, 4080, 4085, 4089, 4093, 4094,
  4095, 4094, 4093, 4089, 4085, 4080, 4073, 4065,
  4056, 4045, 4034, 4021, 4007, 3992, 3975, 3958,
  3939, 3919, 3898, 3876, 3853, 3829, 3804, 3777,
  3750, 3722, 3692, 3662, 3630, 3598, 3565, 3530,
  3495, 3459, 3423, 3385, 3346, 3307, 3267, 3226,
  3185, 3143, 3100, 3057, 3013, 2968, 2923, 2877,
  2831, 2784, 2737, 2690, 2642, 2594, 2545, 2496,
  2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098,
  2048, 1997, 1947, 1897, 1847, 1797, 1747, 1697,
  1648, 1599, 1550, 1501, 1453, 1405, 1358, 1311,
  1264, 1218, 1172, 1127, 1082, 1038,  995,  952,
   910,  869,  828,  788,  749,  710,  672,  636,
   600,  565,  530,  497,  465,  433,  403,  373,
   345,  318,  291,  266,  242,  219,  197,  176,
   156,  137,  120,  103,   88,   74,   61,   50,
    39,   30,   22,   15,   10,    6,    2,    1,
     0,    1,    2,    6,   10,   15,   22,   30,
    39,   50,   61,   74,   88,  103,  120,  137,
   156,  176,  197,  219,  242,  266,  291,  318,
   345,  373,  403,  433,  465,  497,  530,  565,
   600,  636,  672,  710,  749,  788,  828,  869,
   910,  952,  995, 1038, 1082, 1127, 1172, 1218,
  1264, 1311, 1358, 1405, 1453, 1501, 1550, 1599,
  1648, 1697, 1747, 1797, 1847, 1897, 1947, 1997
};

void setup(void) {
  dac.begin(0x60);
}

void loop(void) {
    uint16_t i;

    #if DAC_RESOLUTION == 8
      for (i = 0; i < 256; i++)
      {
        dac.setVoltage(pgm_read_word(&(DACLookup_FullSine_8Bit[i])), false);
      }
    #endif
}


Y me genera la siguiente señal a 13.8 Hz (varía en ocasiones 0.03Hz pero supongo que es por la calidad de los cables o algún ruido que se está generando):





El circuito ha quedado montado de la siguiente manera:







Ahora bien, mi siguiente duda es:

¿Cómo puedo implementar la función sin() de Arduino con 2 potenciometros para poder manipular la amplitud (magnitud de voltaje) y la frecuencia de la señal?, ¿la función dicha trabaja en PWM?

Saludos!

EDIT: Algo similar a esto

Generador de señales con potenciometros

Daniel_Arg

Que atento para ver como llegas a fabricar con ese chip y arduino una frecuencia de varios kilociclos.

Le vas a tener que dar un poco de meta azul de la que fabrica Walter White, al oscilador de arduino.



BryannLuna

#11
Oct 11, 2018, 02:00 am Last Edit: Oct 11, 2018, 02:04 am by BryannLuna
Le vas a tener que dar un poco de meta azul de la que fabrica Walter White...
¿Willy Wonka?, no, Heisenberg  :smiley-lol:

No pretendo generar kilos aún, con que llegue a 1k estoy satisfecho en lo que consigo el DDS pero me está agradando la etapa experimental. Saludos!

Daniel_Arg

Prueba con poner esto en el loop , y luego habilita el delay.

Code: [Select]
for (int i = 0; i < 4095 ; i= i*2){
  dac.setVoltage(i, false);
// delay(1); 
}


Es en plan de jugar, porque como ya te explicaron ese chip no te va a servir.

surbyte

Tus imágenes de Dropbox no son visibles. Por favor, subelas al mismo hilo como adjuntos para lo cual tendras que editar y luego usa el apartado al final de las normas para poder visualizarlas.
No uses dropbox, ni googledrive ni onedrive para mostrar imágenes.

Para lograr una senoide debes proponerte cuantos puntos quieres graficar los que claro dependen de tu DAC y su resolución. Si tienes 8 bits pueds usar  una tabla de 256 pasos.
Desde 0 a 255 en un vector.
Luego ese vector es barrido y el dato enviado al DAC. Como resultado obtienes la senoide.
Eso a medida que aumentas los bits de resolución se hace mas y mas pesado.

256 valores a 1 useg te darán un T de 256 useg y por lo tanto una F = 1/T de 3906 hz. Es solo un ejemplo.

Entonces necesitas un timer a 1 useg y dendro de su rutina barres incrementando el índice los valores de la table seno.

Espero se entienda.

BryannLuna

Es en plan de jugar, porque como ya te explicaron ese chip no te va a servir.
Correcto, he logrado visualizar con el loop un poco de cambio en la amplitud pero se adapta bastante a la idea, gracias Daniel!.

Tus imágenes de Dropbox no son visibles.
Una disculpa!, al momento de crear el post eran visibles pero supongo que Dropbox las habrá bloqueado o tendrá algún tiempo límite para la visualización de las imágenes, de igual manera ya adjunté las imágenes a la respuesta. Gracias por el aviso. En cuanto al timer entendí tu objetivo, lo intentaré y veré que tal me sale.

He intentado replicar el uso del DAC en éste video, si lo logran ver, verán que utiliza un potenciometro para modular la frecuencia de la onda senoidal pero no entiendo como lo conectó, ya que conecto el potenciometro a 5v, el 2do cable a A0 y el 3ro a GND si mal no recuerdo, el timer del LED del Arduino incrementa si manipulo el potenciometro pero no el DAC. ¿Tendrán alguna idea de cómo está conectado?.

Ya he solicitado el DDS AD9850, solo es cuestión de esperar  :smiley-sleep: gracias por la paciencia, saludos.

Go Up