Go Down

Topic: Problema nel rilvare Battito Cardiaco (Read 6666 times) previous topic - next topic

fardox

Feb 13, 2013, 10:58 pm Last Edit: Feb 14, 2013, 09:36 am by fardox Reason: 1
Buonasera, mi sto dilettando nel rilevare il battito cardiaco attraverso un semplice sensore infrarosso composto da emettitore e ricevitore, collegato ad arduino in questo modo:



Attualmente, il codice che ho trovato e leggerissimamente modificato è questo:

Code: [Select]
const int  CardioPin = 2;    
const int ledPin = 13;      

long oldMillis;
long oldMillis_antiBounce;

byte contatore = 0;
byte stato = 0;
byte ultimoStato = 0;


void setup() {

 pinMode(CardioPin, INPUT);
 pinMode(ledPin, OUTPUT);
 // initialize serial communication:
 Serial.begin(9600);
 oldMillis = millis();
 oldMillis_antiBounce = oldMillis;
 
}


void loop() {
 
 stato = digitalRead(CardioPin);
 if (stato != ultimoStato) {

   if (stato == HIGH) {
     //sistole...fronte di salita...
     digitalWrite(ledPin, HIGH);
     if ( millis()- oldMillis_antiBounce  > 10)
             {  // se impiega meno di 10 millisecondi per cambiare di stato è un rimbalzo e non lo conto
             contatore ++;
             oldMillis_antiBounce = millis();

             };
                   
     } else {
     // else stato = low significa che sono in diastole
             digitalWrite(ledPin, LOW);
   
     
   }
   ultimoStato = stato;  // lo stato è variato
 }

  if ( millis()- oldMillis  > 15000) {
    //15 secodi di statistica... calcolo media
    Serial.print ("bpm:");
    Serial.println ( contatore * 4);
    Serial.print("Stato");
    Serial.println(stato);
    contatore = 0;
    oldMillis = millis();
    oldMillis_antiBounce =      oldMillis;
    }

 
}



Il problema è che non mi rileva i battiti del cuore, anzi, mi indica bpm = 0 e stato = 0.

Potreste darmi qualche dritta?
Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! ;)
_-_-_-_-_-_-_-_-_-_-_-

Buongiorno!

Ad una prima occhiata all'interno del loop dovresti scrivere

Code: [Select]
contatore++;

anzichè

Code: [Select]
contatore ++;

Buon lavoro,
L.

BrainBooster

#2
Feb 14, 2013, 11:26 am Last Edit: Feb 14, 2013, 11:32 am by BrainBooster Reason: 1
per fare in modo che lo stato logico cambi da low ad high il tcrt5000 dovrebbe dare in uscita dei livelli logici ttl ben definiti, cosa che credo che non accada al tuo circuito.
dovresti aggiungere un comparatore con isteresi per squadrare e regolare le soglie di on off tramite un partitore .
anche una semplice porta logica (buffer/inverter) dovrebbe svolgere un egregio lavoro nel condizionare il segnale in ingresso.
Edit:
Per questo tipo di applicazione credo che il tcrt5000 non vada bene, perchè è un sensore a riflessione fatto per funzionare ad una certa distanza dagli oggetti, ed a causa della sua forma fisica (led sporgenti), invece per questo tipo di cose vedrei meglio il TCRT1010 (più piccolo, preciso e con trasmettitore e ricevitore incassati nel corpo del sensore).

fardox

Il sensore è un sensore di prossimità e in uscita mi fornisce 0 e 1 in base alla distanza dell'oggetto rilevato.

Che comparatore dovrei inserire?

Grazie.
Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! ;)
_-_-_-_-_-_-_-_-_-_-_-

BrainBooster

no, non ha un uscita digitale.
Leggi bene il datasheet

astrobeed

Non puoi rilevare il battito cardiaco con quello schema, le variazioni di luminosità dovute al flusso del sangue sono minime, serve una opportuna elettronica di amplificazione e discriminazione.
In commercio trovi sensori a molla per il battito cardiaco pronti all'uso con  uscita digitale, devi solo dargli l'alimentazione, costano abbastanza poco e ti semplificano non poco le cose.

Esempio di elettronica necessaria per rilevare il battito cardiaco e ottenere un segnale digitale misurabile tramite un micro.


flz47655

#6
Feb 14, 2013, 11:03 pm Last Edit: Feb 15, 2013, 11:28 am by flz47655 Reason: 1
Solo una note veloce per chi volesse costruire lo schema di esempio trovato da Astro: la scelta dei condensatori da 1uF è molto inadeguata!

Mi spiego meglio con un grafico (sulle ordinate c'è il guadagno volt/volt NON il valore assoluto del segnale in uscita):



Le curve corrispondono alla risposta in frequenza con condensatori di diverse capacità: 1u 2.2u 3.3u 4.7u 6.8u 10u 15u 22u dove le curve più basse corrispondono a capacità minori

Ipotizzando l'amplificatore operazionale ideale con un condensatore da 1uF si enfatizzano le frequenze dai 3 ai 4 Hz (quindi 180 e 240 bpm) questo a causa del filtro passa alto con frequenza di taglio a 2.34 Hz formato dal condensatore di 1uF e dalla resistenza di 68k. Una possibile soluzione potrebbe essere quella di aumentare il valore della resistenza verso massa dopo i condensatori.

Seguendo un'altra strada modificando i valori dei condensatori si può vedere dal grafico che con un modesto aumento della capacità si ha un grande miglioramento di prestazioni, anche quasi del 600% per stadio incrementando da 1uF a 10uF il valore del condensatore, oltre questo valore i vantaggi non compensano l'utilizzo di un condensatore di dimensioni maggiori. Con un condensatore da 10uF si ha un guadagno di 88 contro un guadagno di 15 nel caso del condensatore originale. Considerando i due stadi in cascata il guadagno diventa di 88*88=7744 contro 15*15=225, 34 volte maggiore nel migliore dei casi.

Il rumore (alte frequenze) viene amplificato/attenuato ugualmente e non ci sono vantaggi da questo punto di vista.

La dimensione di un condensatore elettrolitico da 10uF è simile se non identica ad uno da 1uF, il costo quasi identico, quindi direi molto vantaggioso l' "upgrade", oltre non conviene spingersi.

Ancora più importante il fatto che risposta in frequenza abbia una forma maggiormente passa-basso, ovvero che le frequenze di maggiore interesse per un battito del cuore siano maggiormente amplificate e non si abbiano distorsioni dovute a segnali ad onde quadre (che contengono anche frequenze multiple della fondamentale).

In soldoni, ecco un esempio di un segnale (simulato per semplicità come un treno di impulsi di ampiezza 5mV) di un cuore a 100 bpm (valore abbastanza tipico) all'uscita del primo amplificatore con un condensatore da 1uF (in verde) e con un condensatore da 10uF (in blu):



Il segnale col condensatore da 10uF (in blu) potrete ben capire che è utilizzabile con minori sforzi col micro  :D

@fardox: Ad ogni modo è per farti capire il livello di conoscenze e di difficoltà richieste per realizzare o ottimizzare con senso critico uno schema, se sei agli inizi potrai ben capire che è meglio comprare un qualcosa di pronto se vuoi qualcosa di funzionante subito

Ciao a tutti


In commercio trovi sensori a molla per il battito cardiaco pronti all'uso con  uscita digitale, devi solo dargli l'alimentazione, costano abbastanza poco e ti semplificano non poco le cose.


Ciao astrobeed, per favore potresti fornirci dei link dove si possono reperire questo tipo di strumentazioni?

Grazie mille per la collaborazione!

Michele Menniti

flz, gentilmente mi approfondisci questa cosa? da assoluto inesperto ho sempre saputo che il guadagno di uno stadio op-amp dipendesse esclusivamente dal rapporto tra le due R (ingresso-uscita vs ingresso-massa) e che nel caso dell'ingresso non invertente tale rapporto fosse il risultato + 1. Se ho ben capito quello che hai scritto invece diventa più che fondamentale la capacità in serie all'ingresso. Quello che vorrei capire è: il problema dipende dal fatto che quel dato filtro attenua a monte una data frequenza e quindi il risultato della sua amplificazione è minore, o che proprio una certa capacità entra esplicitamente nel calcolo dell'amplificazione? spero di essermi spiegato bene in qualche modo.....
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

flz47655

#9
Feb 15, 2013, 11:50 am Last Edit: Feb 15, 2013, 11:53 am by flz47655 Reason: 1
Caro Michele, certamente.

La capacità all'ingresso non taglia solamente la componente DC, sarebbe troppo bello

In realtà forma all'ingresso un filtro passa alto formato da condensatore più resistenza (1u e 68k), che attenua quindi le bassissime frequenze (con la classica formula si trova che la frequenza di taglio è di 2.34 Hz). Il filtro è presente anche all'uscita e quindi attenua ulteriormente i segnale a basse frequenze < 2.34 Hz.

Abbiamo poi un condensatore nel ramo di retroazione (tra uscita ed ingresso invertente) che limita la banda passante (filtro passa basso) ovvero che limita le alte frequenze (> 2.34 Hz)

Si forma quindi una sorta di filtro passa-banda con frequenza centrale di 2.34Hz come si può vedere dal primo grafico (curva verde, circuito con condensatori da 1uF)

Aumentando la capacità di ingresso e di uscita si modifica la frequenza di taglio del filtro passa alto (con 10uF diventa di 0.23Hz) e quindi si lasciano passare senza grossa attenuazione anche i segnali a bassissime frequenze (> 0.23 Hz)

Dai calcoli (scritti a mano nello schema originale) è stato trascurato il filtro passa alto che si forma sia all'ingresso sia all'uscita dell'amplificatore, grave errore visto che le frequenze di interesse sono quasi DC..

Il guadagno è solo di massima di 101, impostato con le resistenze nella configurazione non invertente, contando però le attenuazioni dovute ai condensatori (filtri di ingresso, di uscita, e nell'anello di retroazione) si trovano i valori della simulazione

Ad ogni modo ci sei andato vicino, oltre al filtro a monte però c'è anche il filtro a valle (all'uscita) a peggiorare ulteriormente le cose se non adeguatamente dimensionato

Michele Menniti

#10
Feb 15, 2013, 12:05 pm Last Edit: Feb 15, 2013, 12:09 pm by Michele Menniti Reason: 1
estremamente chiaro, grazie, ora mi tornano alcune cose del circuito sul quale sto lavorando. :)

EDIT: se possibile, un altro chiarimento: in altri schemi ho visto che quando si usano C polarizzati il segnale viene fatto entrare dal "-" ed uscire dal "+", sia in ingresso che in uscita; c'è una regola in tal senso o è indiferente?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed


Ciao astrobeed, per favore potresti fornirci dei link dove si possono reperire questo tipo di strumentazioni?


Per esempio questo, ovviamente non è applicabile per un vero uso elettromedicale, però va bene per "giocare".

flz47655

#12
Feb 15, 2013, 12:38 pm Last Edit: Feb 15, 2013, 12:54 pm by flz47655 Reason: 1
Se si utilizzano condensatori elettrolitici polarizzati è bene non portare mai il terminale + ad una tensione minore del terminale - per evitare il loro malfunzionamento precoce, facile a dirsi ma in realtà è difficile a farsi.

Per esempio nello schema trovato da Astro ci sarebbero altre migliorie da fare proprio su questo tema. Il condensatore tra IC1 e IC2 sarà infatti probabilmente il primo a rompersi a causa dell'inversione errata di polarità.

Per capire meglio ecco il grafico delle tensioni sempre simulando un segnale del cuore a 100 bpm sotto forma di treno di onde quadre:
al morsetto + del condensatore (in blu)
al morsetto - del condensatore (in verde)
differenza di potenziale, curva blu - verde (in rosso) ai capi del condensatore:



Quando la differenza (curva in rosso) è negativa il condensatore è polarizzato inversamente, come puoi vedere circa il 50% del tempo. E' quindi solo questione di ore prima del malfunzionamento dell'elettrolitico in base alle tensioni in gioco.

Utilizzando i condensatori da 10uF oltre ai vantaggi descritti precedentemente la situazione migliora nettamente, seppure il tempo di polarizzazione errata rimane del 50% la tensione quando il condensatore è polarizzato inversamente diventa in modulo molto minore nonostante il segnale di ampiezza maggiore.



In questi casi si può polarizzate con una tensione positiva aggiuntiva il condensatore per mantenere la differenza di potenziale corretta.

Presumo che i C sono utilizzati a prima vista all'incontrario per mantenere la polarizzazione corretta, questo dipende dalla forma d'onda del segnale in ingresso, se hai uno schema in particolare possiamo ragionarci sopra.

E' possibile realizzare un condensatore elettrolitico NON polarizzato partendo da due condensatori polarizzati in serie con polarità opposta, la capacità sarà però la metà

Testato

Ottima analisi flz, grazie.

Oltre ai due c in serie esistono anche gli elettrolituci non polarizzati. Si trovano in genere sui cross cover audio.
In questo esempio visto che parliamo di basse capacita userei dei poliestere in modo da eleminare il problema polarità ed avere esr minore
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Michele Menniti

Ora non voglio andare OT perché non è giusto, ma flz mi ha chiesto com'è la mia situazione: sul C di ingresso applico segnali (ma potrebbe essere anche una continua...) a frequenza costante, a valle del C c'è un offset DC che credo porti la rensione più alta in questo punto, quindi ho messo correttamente - come ingresso e + come uscita. Sul C di uscita invece ho messo a valle un partitore per abbassare il livello di DC rispetto a quanto mi trovo a monte del C, quindi penso che qui dovrebbe essere messo al contrario, quindi devo uscvire con -. Comunque sia mi sono arrivati quelli non polarizzati, che avevo già deciso di usare (sempre da 10µF), solo che in prima battuta quelli che avevo erano con tolleranza dell'80% ( :smiley-eek: ) ed infatti misuravano circa 3µF, mentre i polarizzati erano abbastanza precisi ed andavano molto meglio. Quelli che mi sono arrivati invece hanno tolleranza al 5%, oggi li monto e vediamo.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up