Go Down

Topic: encoder rotativo recuperato da mouse (Read 3 times) previous topic - next topic

niki77


allora, i tempi di risposta dei fotodiodi (quindi anche dei led) sono nell'ordine dei nanosecondi, quindi più veloci fino a 1000 volte di un arduino :)


ALT, piccola precisazione.

L'encoder che sto usando è formato da un fotodiodo emettitore (anodo e catodo) e dal ricevitore che è nella versione a 3 pin, quindi è un dual foto transistor.
Il tutto è cosi collegato:

Fotodiodo emettitore collegato al +5 tramite resistenza da 1k che dovrebbe limitare la corrente a 50mA.
Il dual fototransistor collegato col comune al +5 e i due terminali del canale A e del canale B collegati ai due pin di arduino (senza pull-up) con due resistenze da 100k verso massa.
Così penso che il segnale non sia condizionato in alcun modo, ma come dicevo prima essendo ottico dovrebbe essere esente da disturbi e pertanto non credo vada trattato, ma si accettano obiezioni !
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

lesto

ahhhhhh allora tu non hai a che fare con un segnale digitale, ma analogico.
I fototransistor sono molto più lenti di un fotodiodo.
se metti il fototransistor sul buco, avrai sì un valore quasi a 5V, ma quando l'encoder gira in fretta, probabilmente il passaggio luce/non luce è abbastanza veloce per non accendere completamente il fototransistor, e quindi crea una specie di PWM. E' facile immaginare che il voltaggio non supera i 3V e quindi non viene riconosciuto come 1 logico.

soluzione: baudrate al massimo, fai un loop con una analogRead sui 2 pin a cui collegherai i sensori, e stampa i valori a video. poichè la seriale è un collo di bottiglia, fai la media di 1000 letture analogiche (una lettura analogica dura 200micros, a te i calcoli :) )
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

niki77

Ho pensato di provare a gestire l'interrupt con solo questo codice

Code: [Select]


attachInterrupt(1, interruptEncoder, RISING);



e il gestore

Code: [Select]


void interruptEncoder() 
{                     
  if(PIND&3)
    pulse++;
  else
    pulse--;
}



Praticamente legge solo i fronti di salita del canale A ( evento RISING su PD2) e verifico lo stato del canale B (PD3)
Se lo stato del canale B è alto, quindi uguale al canale A incremento,  altrimenti decrementa.
La teoria ci dovrebbe essere tutta, ora c'è da provare !

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

lesto

scusa ma quì c'è un errore di base.
Quando fai

attachInterrupt(1, interruptEncoder, RISING);

stai attaccando un interrupt sul pin di interrupt 1 (che non corrisponde al digitale 1), qundi
1: è inutile il controllo if(PIND&3) perchè il controllo è già fatta a priori.
2: sicuro che il pin interrupt 2 sia il PIND&3? altrimenti fin'ora stai misurando solo rumore
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

niki77

#14
May 09, 2012, 02:54 pm Last Edit: May 09, 2012, 02:57 pm by niki77 Reason: 1
Attenzione !!!!

Hai ragione, ho sempre fatto confusione , interrupt 0 è su PD2, ed interrupt 1 è su PD3 !

Quindi devo o spostare la condizione in  'PIND&2'

oppure cambiare l'interrupt gestito in  'attachInterrupt(0, interruptEncoder, RISING);'

supppongo però che questo sia intercorso dopo l'ultima modifica inquanto non era possibile che con le prove precedenti riuscissi ad avere risultati abbastanza coerenti solo col rumore.... ma poi che rumore??

P.S. possibile che di 15 (dico quindici non come numero a caso ma come 15) mouse a rotellina che ho smontato non ne ho trovato uno col detector digitale a 4 pin????????



Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Go Up