Problema nel rilvare Battito Cardiaco

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:

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?

Buongiorno!

Ad una prima occhiata all'interno del loop dovresti scrivere

contatore++;

anzichè

contatore ++;

Buon lavoro,
L.

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

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.

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

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.

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 8888=7744 contro 1515=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:

@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

astrobeed:
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!

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

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

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

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?

DarkyDesign:
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".

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à

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

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% ( :astonished: ) 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.

Esattamente, meglio risolvere il problema alla base ed acquistare alcuni dispositivi già pronti come questo:

Ringrazio tutti per l'interesse dimostrato!
:smiley: :smiley: :smiley:

@Michele:
Il condensatore di ingresso non è detto che sia sempre polarizzato correttamente in questo modo. Io invertirei la polarità del condensatore col + rivolto verso l'ingresso.

Se hai un segnale con una componente continua superiore alla tensione di offset il condensatore viene polarizzato incorrettamente, se la tensione di offset è variabile ti consiglio di aggiungere una tensione di polarizzazione fittizia al segnale di ingresso che comunque verrebbe bloccata dal condensatore ma che così permette di avere all'ingresso sempre una tensione maggiore che all'uscita, devi dimensionarla in base alla tensione massima dell'offset e all'ampiezza del segnale.

@Testato: purtroppo i poliestere arrivano al massimo ad 1uF mentre in questo caso si parla di capacità da 10uF e quindi sono da escludere, certe volte gli elettrolitici sono imbattibili come rapporto capacità/dimensioni/prezzo, se si hanno degli elettrolitici non polarizzati si è risolto il problema

@Testato: purtroppo i poliestere arrivano al massimo ad 1uF mentre in questo caso si parla di capacità da 10uF e quindi sono da escludere

i poliestere e' da tanto che sono saliti di capacita', ormai elettrolitici non ne uso piu' :slight_smile:
http://www.ebay.it/itm/1-x-CONDENSATORE-POLIESTERE-10uF-100V-PASSO-27mm-/380575109937?pt=Componenti_elettronici_passivi&hash=item589c0b5331&_uhb=1#ht_3041wt_906

@Testato: Non sapevo di questi nuovi poliestere, come potrai ben vedere dal prezzo però non sono ancora accessibili per dispositivi elettronici a basso costo.. condensatori non polarizzati (chiamati anche bipolari) elettrolitici da 10uF costano 0.1€ contro i 3€ e passa dei poliestere, mi sa che aspetterò a lungo prima di fare il passo :smiley:

@Fardox: dando un'occhiata allo schema il dispositivo che hai citato è un giocattolino

yes, il prezzo e' piu' alto, non si puo' avere tutto dalla vita :slight_smile:
su RS il massimo che c'e' e' un poliestere da 33uF, 10 euro cadauno, ma e' bene sapere che esistano :slight_smile: