luca1590:
Si potrebbe essere anche che il sensore non sia adatto a questo tipo di applicazione, ma quello che è strano e che anche quando legge 3 giri al posto di uno il led del sensore non sfarfalla 3 volte ma lui si accende come dovrebbe una volta sola (dico 3 giri perché sono d'accordo che quando mi esce 48 se fosse il led che blinka 48 volte non me ne accorgerei).
Strano, quel LED è direttamente connesso all'uscita dell'operazionale come puoi vedere dallo schema:

Dato che quel sensore è normalmente HIGH, e passa LOW quando rileva un ostacolo (entro la sensibilità impostata col trimmerino che vedi onboard), se il tuo dischetto è bianco ed ha una fascia nera, il comportamento sarebbe esattamente l'opposto ossia dovrebbe normalmente "vedere" un ostacolo (il bianco che riflette il segnale IR del LED) quindi essere LOW, e passare HIGH appena arriva la parte scura, per cui nel tuo codice dovresti rimettere il RISING che avevi all'inizio.
Però devi essere certo di questo, ossia che il sensore riesca veramente a "vedere" quando passa la parte nera e che questo riconscimento sia regolare. Per verificarlo devi sperimentare (come dico sempre, bisogna cercare di ingegnarsi...
) ossia carica questo codice che mostra ogni secondo quanti impulsi ha ricevuto in totale (è lo stesso, in sostanza, senza azzerare la variabile):
#define P_SENSOR 2
volatile int rev=0;
unsigned long tmrLast;
void setup()
{
Serial.begin(9600);
pinMode(P_SENSOR,INPUT);
attachInterrupt(digitalPinToInterrupt(P_SENSOR), contaImpulsi, RISING);
tmrLast = millis();
}
void loop()
{
if ( millis() - tmrLast >= 1000 ) {
noInterrupts();
Serial.println(rev);
tmrLast = millis();
interrupts();
}
}
void contaImpulsi()
{
rev++;
}
Quindi:
- prendi un foglio dello stesso materiale del dischetto ossia un cartoncino bianco da un lato e dall'altro mettici il nastro nero
- prova a posizionare il foglio dal lato bianco davanti al sensore, alla stessa distanza del dischetto e vedi se il contatore dopo qualche primo impulso dovuto al movimento resta fermo o se sale anche mentre stai totalmente fermo. Se non aumenta allora passa al prossimo punto.
Se invece aumenta senza fare nulla, prova ad abbassare la sensibilità del sensore (col trimmerino) ossia mentre tieni fermo il cartoncino abbassa la sensibilità e fermati quando gli impusli "spuri" spariscono.
Se non spariscono né girandolo in un verso né nell'altro, allora o il modulo ha qualche problema o il materiale che usi non va bene per questo scopo, e devi passare ad altro.
- ora fai la stessa cosa col lato nero: anche qui, dopo un primo "assestamento" iniziale, se resti immobile dovrebbe non contare eventi.
Fammi sapere l'esito.
Ma dato che per me è proprio quel tipo di sensore che non va bene, almeno non utilizzato così, io farei un altro dischetto questa volta con un foro (diciamo del diametro del LED, puoi usare anche un foradocumenti) e dissalderei il LED (quello trasparente per intenderci) per portarlo dal lato opposto, in linea col sensore: in questo modo il sensore quasi certamente potrà "vedere" gli infrarossi solo quando il foro gli passa davanti.
luca1590:
Mettendo un filtro RC con R=10 e C=10 micro farad sembra funzionare meglio apparentemente conta corretto, devo provare con il motore acceso però.
Potrebbe migliorare un poco ma non stiamo mica parlando di un contatto meccanico che necessita di un "antirimbalzo"
Se vedi lo schema c'è in pratica già e c'è poi l'operazionale che fa da trigger. Se "rimbalza" significa che il sensore non è utilizzato correttamente...