Pages: [1] 2 3   Go Down
Author Topic: Problema nel rilvare Battito Cardiaco  (Read 5541 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 158
Arduino = Tecnologia
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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?
« Last Edit: February 14, 2013, 03:36:59 am by fardox » Logged

Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! smiley-wink
_-_-_-_-_-_-_-_-_-_-_-

Bologna, Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno!

Ad una prima occhiata all'interno del loop dovresti scrivere

Code:
contatore++;

anzichè

Code:
contatore ++;

Buon lavoro,
L.
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
« Last Edit: February 14, 2013, 05:32:07 am by BrainBooster » Logged

Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 158
Arduino = Tecnologia
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! smiley-wink
_-_-_-_-_-_-_-_-_-_-_-

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9183
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Parma
Online Online
Edison Member
*
Karma: 20
Posts: 2361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-grin

@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
« Last Edit: February 15, 2013, 05:28:35 am by flz47655 » Logged

Orino, VA, Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.....
Logged

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

Parma
Online Online
Edison Member
*
Karma: 20
Posts: 2361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: February 15, 2013, 05:53:34 am by flz47655 » Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

estremamente chiaro, grazie, ora mi tornano alcune cose del circuito sul quale sto lavorando. smiley

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?
« Last Edit: February 15, 2013, 06:09:04 am by Michele Menniti » Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9183
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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".
Logged

Parma
Online Online
Edison Member
*
Karma: 20
Posts: 2361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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à
« Last Edit: February 15, 2013, 06:54:42 am by flz47655 » Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Pages: [1] 2 3   Go Up
Jump to: