Problema strano con sensore IR FC-03

Ciao a tutti,
vi scrivo per un problema strano con il sensore in oggetto, per cui vi spiego.
Avendo preso il solito kit auto 2WD per "sperimentare" un poco dopo aver "giocato" facendo un piccolo rover con il Meccano e due stepper (troppo lenti), ho acquistato anche due sensori FC-03 come questo:

I 4 pin sono indicati rispettivamente VCC, GND, DO, AO, per cui dato che ho trovato in rete questo schema del sensore:

l'uso mi sembrava abbastanza chiaro.

Collego quindi DO al pin 2 (interrupt 0), e preparo questo sketch di test:

#define LED1 13                // LED collegato al pin digitale 13  
#define M1_SENS 2
#define M1_INT 0

volatile int count1 = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  pinMode(LED1, OUTPUT);       // imposta il pin digitale come output  
  pinMode(M1_SENS, INPUT);
  attachInterrupt(M1_INT, motorStep1, RISING);
}  

void loop() {  
  if ( count1 >= 20 ) {
    digitalWrite(LED1, !digitalRead(LED1));
    count1 = 0;
  }
}

void motorStep1()
{
  count1++;
  Serial.println(count1);
}

Ebbene, se simulo a mano ostruendo il passaggio dei led dell'encoder (ma la stessa cosa la faceva anche montato sul disco) usando ad esempio un pezzo di plastica, l'output mostrato mi conta DUE interrupt quando inserisco l'ostacolo, e DUE quando lo rimuovo (quindi 1 e 2 quando lo inserisco, poi 3 e 4 quando lo tolgo, poi 5 e 6 ecc.)!

Innanzitutto dato che ho impostato l'interrupt su RISING dovrebbe darmelo solamente quando lo inserisco (o tolgo) e non in entrambe le direzioni. Cambiare in FALLING mi porta allo stesso identico risultato. E non è colpa del Serial.print perché ho provato anche a spostare la visualizzazione nel loop() e non cambia (anzi ogni tanto saltava anche qualche conteggio, es. 1 2 3 5 6 7 9...) per via del fatto che gli interrupt erano più rapidi del loop().

Ma la cosa peggiore è che ho misteriosamente DUE trigger per evento!

La prima prova che ho fatto è stata di metterci un MIO circuitino, fatto con una millefori e un LED e fototransistor IR, ma senza operazionale quindi l'uscita sarebbe analogica ma in linea di massima alimentato a 5V ho livelli logici. E con questo invece funziona perfettamente (ma non posso usarlo perché il posizionamento di LED e fototransistor vicino al disco è troppo critico, inoltre vorrei sfruttare le apposite fessure presenti sul kit auto)!

Allora mi è venuto in mente di provare a usare l'uscita AO (analogica). Stesso sketch, stesso modulo, a questo punto invece FUNZIONA!

Mi direte: se funziona che problema hai? Semplicemente vorrei capire perché quello che sarebbe marcato come output digitale, e che teoricamente sarebbe quello da utilizzare visto anche lo schema, abbastanza semplice, abbia quello strano comportamento del 2+2, e quindi se sia questo sensore cinese ad essere bacato per qualche ragione.

Qualcuno di voi ha usato questo sensore? E ha avuto gli stessi problemi?

L'operazionale LM393 è un comparatore a singola alimentazione (5V).

La tensione di riferimento è data dal partitore 10k/30k quindi è 3.75V.

La tensione in uscita all'operazionale oscilla tra 50mV e 5V circa.

Il sospetto è che non sia un comparatore, ma un operazionale normale.

Per avere conferma leggi la sigla.

Grazie per la risposta, cyberhs, ecco i miei commenti alle tue annotazioni:

L'operazionale è un Texas LM393 12N confermo quindi che secondo me è proprio un comparatore (doppio, tra l'altro), ovviamente singola alimentazione, tra 2 e 36V

Il partitore è 10K-10K, non 10K-30K (forse si leggeva male dall'immagine ridimensionata), quindi la tensione di riverimento è Vcc/2 nel mio caso quindi 2.5V.

L'uscita dovrebbe essere sempre tra pochi mV fino a Vcc quindi 5V, per cui mi sembra rurro regolare.

il problema che non capisco è per quale ragione ho quel "doppio rimbalzo" ad ogni evento, come se l'operazionale reagisse secondo me con una forma d'onda di questo tipo, per intenderci (purtroppo non ho un oscilloscopio, altrimenti mi sarei tolto la curiosità):

Questo mi spiega per quale motivo sia con RISING sia con FALLING ho esattamente lo stesso risultato (2 eventi per transizione on-off e off-on), ma stando allo schema non mi spiego il comportamento dell'output (non di Arduino perché con il semplicissimo schema di sensore che ho fatto io con una millefori funziona perfettamente).

Se qualcun altro di voi ha questo modulo, mi piacerebbe sapere se ha riscontrato lo stesso problema oppure se questi siano moduli difettosi.

Prova ad aggiungere un condensatore elettrolitico da 47μ sull'alimentazione.

Inoltre, verifica se gli ingressi dell'altro comparatore sono stati posto a massa: lasciarli liberi non è una buona cosa.

Allora, ho fatto un piccolo esperimento nel frattempo, ossia ho collegato l'uscita digitale (la DO, quella dell'uscita dal comparatore) ad un ingresso analogico e un piccolo sketch per tracciare i valori letti in 5 secondi, per cercare di "simulare" un oscilloscopio:

#define M1_SENS A0

unsigned long endTime;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  endTime = millis() + 5000;  // 5 secondi di registrazione
}  

void loop() {
  if (millis() <= endTime)
    Serial.println(analogRead(M1_SENS));
}

I risultati sembrano smentire la mia supposizione, in quanto leggo valori coerenti ossia 28-29 con il sensore aperto (luce che passa) e poi 999-1000 quando lo chiudo (ostruendolo con un cartoncino).
In sostanza, non vedo alcun "rimbalzo", per cui tuttora non mi spiego il comportamento del DO (né i doppi interrupt in apertura e in chiusura, né per quale ragione ci siano eventi sia in apertura sia in chiusura nonostante l'impostazione RISING o FALLING)!!

Anche collegando l'uscita analogica (AO, quella sul partitore del fototransistor -vedi schema-) ho risultati analoghi, con valori attorno a 40-41 a sensore aperto, e 998-1003 a sensore chiuso, con l'unica differenza che qui prima di arrivare al valore massimo ci sono un paio di letture intermedie (ad esempio 40 40 41 40 172 986 999 1001 1000 ...) ma ovviamente dipendono dal "passaggio" del cartoncino sulla fessura. Per cui non mi spiego come mai collegando all'interrupt il DO ho doppie chiamate all'ISR, e come mai queste si ripetano sia in apertura sia in chiusura)!

Qualche idea su cosa altro possa provare per capire se sono i moduli bacati (come i sensori ultrasuoni SR04 che non acquisterò più visto che si "bloccano" quando vanno in timeout, mentre gli SRF-05 vanno alla perfezione) o se ci sia qualche spiegazione che mi sfugge?

Collega una resistenza da 100k tra l'ingresso non invertente(+) dell'operazionale e l'uscita dell'operazionale per aggiungere un isteresi,il difetto dovrebbe scomparire

Grazie ci proverò, anche se non è facilissimo (il circuito è multistrato e con componenti tutti SMD), ma non mi è neanche chiaro a cosa possa servire la retroazione, se (almeno stando ai valori deltti e che ho riportato) non sembra esserci in realtà questo "rimbalzo" anomalo.

Poi mi sembra strano che nessuno abbia mai usato questi modulini cinesi, che sono apparentemente gli unici che ho trovato in giro con dimensioni adatte per i car kit..
Nessuno ha avuto esperienza diretta?

Possibile che nessuno abbia mai avuto a che fare con questo sensore FC-03?

Il perche' si comporti cosi senza averlo in mano non saprei, ma hai provato, giusto per curiosita', ad usare l'uscita del transistor, invece che quella del comparatore, e vedere se il difetto rimane ? :wink:

Etem, lo ha fatto:

Allora mi è venuto in mente di provare a usare l'uscita AO (analogica). Stesso sketch, stesso modulo, a questo punto invece FUNZIONA!

:

Mi era sfuggito, scusa :sweat_smile: ... a questo punto sembra ovvio che il problema e' causato dall'IC, ma senza poterci fare delle misure, non mi viene in mente molto ... fra l'altro il 393 ha un'uscita open-collector, quindi non dovrebbe avere possibilita' di "mezze tensioni", o e' libero (e tenuto a VCC dalla resistenza di pull-up da 10K), oppure e' a massa (meno gli 0.6V circa della caduta del transistor di uscita) ... non e' che possa dare tensioni intermedie come un normale operazionale, per causare false letture da parte di arduino ...

A meno che i valori sulla schedina siano stati calcolati cosi male da fare in modo che la commutazione disturbi il riferimento, non mi viene in mente molto altro ... si potrebbe cercare di aggiungere un condensatorino (anche solo pochi microfarad) fra il pin negativo e la massa (in parallelo alla R da 30K, anche solo 2 o 3 uF, tanto per stabilizzare il riferimento), ma bisogna vedere se ci si riesce comodamente, dato che e' tutto SMD ... ed ovviamente l'elettrolitico in parallelo all'alimentazione ci vuole per forza, non so perche' il costruttore non l'ha messo nello schema ... ma piu di quello, senza poter fare delle misure, non mi viene in mente ...

Etemenanki:
Mi era sfuggito, scusa :sweat_smile: ... a questo punto sembra ovvio che il problema e' causato dall'IC, ma senza poterci fare delle misure, non mi viene in mente molto ...

Hm ok, grazie per il tentativo;-)
Però con quello sketch microscopico che fa semplicemente il dump di analogRead() in continuo, i valori mi sembrano coincidere con quanto mi aspetterei vedendo lo schema elettrico del "coso", a questo punto non mi spiego né i "bounce" né l'ISR che viene chiamata sia su RISING sia su FALLING!

Magari se non riusciamo a trovare qualcuno che abbia sottomano un FC-03 per capire se a lui funziona (e come) o se siano quelli che ho acquistato io ad essere in qualche modo difettosi, appena rientro in ufficio vado in laboratorio e collego il sensore ad un oscilloscopio, e vediamo. Nel frattempo uso l'uscita analogica, ma mi piace cercare di comprendere le cose..:wink:

Hm, ragazzi, possibile che nessuno abbia usato questo benedetto FC-03 per capire se siano i miei ad essere "bacati" o si debbano invece usare in modo diverso?..