problema microfono MAX9814

Buongiorno,
Sono nuova sia del forum sia di arduino in generale.
Per un progetto universitario utilizziamo un microfono MAX9814 per cercare di rilevare il battito cardiaco, abbiamo realizzato un filtro digitale del 4 ordine passa basso a 200Hz. Dopo svariati tentativi non siamo riuscite in nessun modo a determinare i picchi relativi ai battiti cardiaci.
Come possiamo fare?
grazie mille!!!!!

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Ho subito fatto la mia presentazione e letto tutto il regolamento.
C'è per caso qualcuno in grado di aiutarmi??

... difficile senza uno schema dei collegamenti e il codice che hai scritto (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

Allora l'out è collegato all'ingresso di un filtro Butterworth low pass del 4 ordine il quale alla fine si collega con A2; il VCC ha un alimentazione di 5V e il gain insieme al GND sono collegati al GND. IL nostro problema è andare a realizzare un filtro passa alto in modo da isolare i picchi che corrispondono ai battiti, lo script non riusciamo a realizzarmo. Vi scrivo comunque le poche righe di codice che siamo riuscite a scrivere.

int audioPin=A2;
int audioValue=0;

void setup() {
  Serial.begin(9600);

}

void loop() {
   audioValue = analogRead(audioPin);
    Serial.println(audioValue);
    

}

Tu sai che in ingresso sui pin di Arduino possono arrivare SOLO tensioni positive rispetto al GND ? Quindi eventuali segnali che hanno componenti negative vanni shiftati ...

Inoltre all'uscita del filto che segnale avete ? Puoi fare un'immagine del segnale preso da un oscilloscopio e metere il riferimento dello ZERO e l'ampiezza ?

Guglielmo

gpb01:
Tu sai che in ingresso sui pin di Arduino possono arrivare SOLO tensioni positive rispetto al GND ? Quindi eventuali segnali che hanno componenti negative vanni shiftati ...

Guglielmo

Cosa intendi per shiftati??

Intendo che.se ci sono componenti negative, devi fare una traslazione del segnale analogico portando tutto sopra lo zero o, brutalmente, tagliando o raddrizzando il segnale. In ogni caso NON puoi avere nulla che vada sotto GND e sopra Vcc.

Guglielmo

   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(A2);
      if (sample < 1023)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }

Il nostro problema è realizzare il filtro passa alto per eliminare il rumore di fondo :frowning: :frowning: :frowning: :frowning:

Mi sono dimenticata di dire come sono inizializzati signalMax e signal Min.

   unsigned int signalMax = 0;
   unsigned int signalMin = 1023;

Senza lo schema elettrico del vostro circuito posso solo tirare ad indovinare ... comunque, cosa esattamente volete ricavare, un semplice impulso in corrispondenza del picco piu elevato, oppure l'inviluppo del picco completo ?

(e poi, perche' con un microfono ? ... e' volersi far del male da soli, dato tutto il rumore che capta per forza ... strofinii, sfregamenti, il movimento delle dita per quanto piccolo, se non usate una coppetta stagna anche i rumori di fondo ... non era meglio un'elettrodo ?)

Anche noi avremmo voluto utilizzare un elettrodo, ma il nostro professore ci ha espressamente detto di usare un microfono. Comunque vorremmo realizzare un programma che in una finestra temporale di circa 3 secondi vada a fare un conteggio delle letture tra un picco e l'altro; il nostro problema è che non riusciamon a realizzare un filtro passa alto per cercare di eliminare il rumore di fondo ed evidenziare i picchi, come possiamo determinare la frequenza di taglio del filtro?

Ecco, mi sembrava strana la vostra richiesta di un "passa alto" ... la massima frequenza cardiaca sotto sforzo in un soggetto giovane e sano dovrebbe essere, se non ricordo male, intorno ai 3Hz, e diminuisce con l'eta', in piu quella a riposo puo essere trnquillamente la meta', quindi quello che vi servirebbe e' un passa-basso, ed intendo "molto basso", per eliminare i disturbi ed i rumori di fondo ... ma non solo quello, prima di tutto (ed e' la cosa piu importante in uno stetoscopio) vi serve anche un sistema acusticamente isolante intorno al microfono (che faccia, in pratica, la funzione della coppetta dello stetoscopio per il medico, cioe' quella di isolare acusticamente la zona sensibile al rumore dal rumore ambiente)

Quindi andiamo per ordine, che forse si riesce a ricavare qualcosa di funzionante ... prima di tutto, il microfono che usate di che tipo e' esattamente ? ... perche' "MAX9814" non e' la sigla di un microfono, ma quella di un'integrato SMD, un preamplificatore per microfoni electret della Maxim, con un paio di funzioni interessanti, ma comunque non un microfono ... a meno che non stia parlando della schedina che monta un MAX9814, una capsulina electret ed un po di componenti venduto come breakout da alcune ditte, tipo ad esempio questo della adafruit o roba simile ...

Secondo punto importante, come lo isolate acusticamente dall'ambiente quando lo appoggiate al petto per la rilevazione ? ... questa e' una delle cose piu importanti, anche se non sembra, perche' la maggior parte del rumore la si elimina a livello di microfono, non dopo ... la cosa migliore sarebbe una coppetta in metallo da stetoscopio, ma dato che non credo la si possa trovare facilmente, se non come ricambio medico a prezzi assurdi, si puo ripiegare su un'alternativa piu casalinga, simile ai primitivi stetoscopi a cono, in pratica vi serve un cono in legno, plastica spessa e dura o metallo, alto da 3 a 5 cm circa, con un'apertura grande di circa 5cm di diametro, da appoggiare al petto (quindi bordo liscio ed arrotondato, possibilmente con un bordo di gomma, perche' andra' premuto sulla pelle abbastanza da formare un contatto "stagno", a prova di aria, in questo modo aumentera' l'efficenza e ridurra' drasticamente il rumore esterno), ed il lato stretto con un foro sufficente ad inserirci ed incollarci dentro la capsula microfonica, anche questo incollaggio dovra' ovviamente essere a tenuta d'aria ... se avete una stampante 3d stamparlo in plastica e' un'attimo, altrimenti tocca cercare qualche oggetto da massacrare modificare con cura (:D) da cui ricavarlo ...

Una volta fatto questo, si passa alla parte elettronica, senza questi accorgimenti iniziali un risultato decente e' praticamente impossibile da ottenere ...

Allora prima di tutto questo è progetto da 3 credit, quindi un po' improvvisato; non credevamo fosse così complicato:(
Abbiamo utilizzato il microfono nel link

e successivamente filtrato sulla breadboard il segnale a 200 Hz con un filtro Butterworth low pass del quarto ordine; abbiamo scelto questa frequenza di taglio poiché leggendo in giro abbiamo scoperto che il "rumore" prodotto dal battito cardiaco (fetale) va dai 35 ai 200 hz, mentre il battito cardiaco come hai giustamente scritto gira intorno ai 1-3 Hz.

Per quanto riguarda il rumore ci è stato detto di isolare attraverso delle scatole d'uova poiché pare che insonorizzino.

Mi dispiace non essere in grado di dare maggiori dettagli, ma siamo anche noi un po' a corto di informazioni! :frowning:

Ora sto chiudendo e andando via, ma domani provo a buttarti giu uno schemino di come dovrebbe essere realizzato anche a livello fisico (e no, mi sa che le scatole delle uova non isolano piu di tanto, purtroppo).

Etemenanki:
... mi sa che le scatole delle uova non isolano piu di tanto, purtroppo ...

Infatti :smiley:

Si usano al contrario, dato che NON riflettono bene i suoni, per foderare le pareti e fare delle camere insonorizzate a "basso costo" :smiley: :smiley: :smiley:

Guglielmo

Allora, quando si progetta qualcosa di simile ad uno stetoscopio, e' necessario partire dalle basi dell'acustica e della meccanica, anche se lo strumento e' elettronico ... e sarebbe da evidenziarlo nel risultato, mi sembra strano che per una cosa cosi complessa vi diano una miseria di tre crediti (oppure il professore che ve l'ha dato non capisce un tubo in materia, ma quello e' meglio non scriverglielo, altrimenti i crediti ve li toglie :D)

La prima cosa da sapere' e' che il sistema e' "interattivo", nel senso che il risultato, cioe' le frequenze rilevate, si basano in buona parte sul diametro della coppetta (testina), ma anche e soprattutto sulla pressione che il medico fa con la testina sulla pelle ... il sistema pelle-coppetta e' un sistema che ha una sua propria frequenza di risonanza, che dipende dal diametro del disco di appoggio e dalla tensione della pelle su cui e' appoggiato, piu si preme, piu la pelle si tende, piu la frequenza di risonanza si alza, e differenti sono i tipi di rumore che vengono trasmessi meglio o peggio a diverse pressioni ... infatti il medico, per camiare la frequenza di risonanza del sistema ed ascoltare differenti tipi di rumori a frequenze diverse, cambia la pressione della testina sulla pelle del paziente ... inoltre, ma a voi non interessa, e' il motivo per cui le comuni testine Littman degli stetoscopi hanno molte volte due facce diverse, la piu larga per i rumori cardiaci, quella piu stretta per quelli polmonari a frequenze superiori.

steto-1.png

Inoltre, ovviamente, per ridurre al massimo l'interferenza dei rumori ambientali, il sistema deve essere "stagno", a tenuta d'aria ... per cui prima di tutto, dovreste realizzare un portamicrofono conico in materiale rigido, plastica dura, legno, metallo, non ha molta importanza, basta che sia ben rigido, con le pareti spesse almeno 4 o 5 mm, con una sagoma simile a questa, in cui incollare il microfono (se non lo si puo fare curvo come nel disegno, va bene anche un cono con le pareti diritte, per un'uso simile) ... il bordo di gomma aiuta ma non e' indispensabile dato che premendolo bene la pelle fa da sigillo, pero' se c'e' rende il tutto piu semplice ...

Anche il microfono, dovra' essere incollato dopo averlo dissaldato dalla basetta, perche' anche la schedina contribuisce a raccogliere e trasmettere meccanicamente al microfono del rumore ...

Una volta fatto questo, che gia di per se dovrebbe risolvervi almeno la meta' del problema, sarebbe meglio prevedere un diverso tipo di filtro, non un semplice passa-basso come quello che avete realizzato con taglio a 200Hz, ma un filtro "variabile" a due bande, per la precisione un passabanda con due diverse bande selezionabili (o piu semplicemente, due passabanda intercambiabili con un deviatore), uno da 120 a 220 per l'ascolto del ritmo fetale, piu rapido, ed uno dalla DC a 5Hz per l'ascolto degli adulti (il che eliminerebbe un'altro grosso disturbo, la 50Hz della rete presente quasi ovunque) ...

Poi servira' un rilevatore di picchi per trasformare i picchi principali dell'onda in impulsi elaborabili, non un filtro passaalto, ma quello e' un'altro discorso ...

steto-1.png

Grazie, ci attiveremo per fare questo! Sei stato gentilissimo!!!
E per quanto riguarda la parte di programmazione (quella che ci spaventa di più), come possiamo determinare i picchi con il codice?? E farci quindi comparire i battiti in un minuto?

Io sono piu che altro un tecnico hardware, non un programmatore ... una mano ve la do volentieri su quello che conosco, ma sul software sarebbe meglio che intervenisse qualcuno che ne sa piu di me sulla programmazione ...

Comunque, una possibile soluzione (almeno parziale) passa sempre per l'hardware ... nel senso che se il segnale in uscita dal vostro microfono lo fate passare per un circuito discriminatore di picco, avreste in uscita degli impulsi corrispondenti ai soli picchi piu alti di livello, da leggere poi con un qualsiasi ingresso con un'interrupt abilitato per contare numero e tempi ...

Una cosa simile il piu semplice possibile potrebbe essere l'uso di una porta trigger, a cui si fornisce una tensione di bias all'ingresso tramite un potenziometro (cosi si puo regolare il livello a cui scatta, per escludere i picchi minori) ... oppure dovrebbe essere possibile anche con un paio di operazionali, al momento non mi viene in mente nulla di gia fatto, ma provo a buttare giu un possibile circuitino il piu semplice possibile ...

Farlo solo via software invece, non so, prima di tutto bisogna vedere che tipo di segnale esce dal vostro microfono (io non ne ho di quelli, quindi prove non posso farne) ... se esce un segnale solo positivo, si puo mandarlo ad un'ingresso analogico, campionandolo ad una certa velocita', e poi via software provare ad isolare e "contare" solo i gruppi di letture sopra una certa soglia, ma non ho idea a quale frequenza massima arduino possa effettuare un campionamento di questo genere ... e' una piccola MCU ad 8 bit con memoria limitata, non e' che puo fare piu di tanto ... e suppongo un po di memoria servira', perche' l'unico sistema che mi viene in mente cosi al volo e' (forse)

  1. campionare (leggere il valore)

  2. confrontare con la soglia impostata (per vedere se si tratta di un'impulso alto)

  3. se piu alto (e se prima era inferiore alla soglia per un certo numero di campioni, questo per essere sicuri che si tratta di un nuovo impulso, e non rumore o picco di disturbo) alzare una flag di stato ... se piu basso (e se prima era piu alto della soglia per un certo numero di campioni, che significa che l'impulso precedente e' terminato), abbassare la flag di controllo per permettere la registrazione di un nuovo impulso

  4. se la flag di stato e' alta (e se la flag di controllo e' bassa), incrementare il contatore ed alzare la flag di controllo che impedisca ulteriori incrementi del contatore finche' il livello non e' sceso sotto la soglia (per evitare di leggere piu volte lo stesso impulso)

  5. mettere il valore in un buffer circolare (che contenga un certo numero di campioni, in modo da poter effettuare i confronti del punto 3)

  6. ricominciare da capo ...

Ovviamente qui e' meglio aspettare l'intervento di un programmatore ... magari c'e' un sistema piu semplice, piu efficente, oppure entrambe le cose ... che a me non viene in mente ...

Se dalla schedina esce anche una componente negativa rispetto a massa, serve tagliarla via con un diodo, altrimenti il pin di arduino si brucerebbe ... ma questo e' il problema minore ...