encoder rotativo

Salve a tutti :slight_smile:
ho acquistato un encoder rotativo con risoluzione 2 bit, tipo di segnale di uscita : quadratura e con 24 impulsi per giro...
questo mi servirebbe da montare su una puleggia di una funivia modellino per calcolare sia la velocitĂ  effettiva dell' impianto ( in cm al secondo ) , sia i centimetri fune che passano da quando una cabina preme su un microswitch in uscita a quella successiva e riportare entrambi i valori sul pc .
ho provato a guardare un po' di esempi ma non li comprendo benissimo ... qualcuno sa dove posso trovarne uno che io possa utilizzare ?

Leggi questo articolo:

ho letto l'esempio. ma non capisco se stia calcolando la velocitĂ  o solamente il numero di giri... :frowning:

Per calcolare la velocitĂ  ci sono due strade: o misuri il tempo che trascorre tra un impulso ed il successivo, oppure conti quanti impulsi si sono verificati nell'unitĂ  di tempo.

Il secondo metodo si appoggia su external interrupt ed è da preferire poiché non blocca il sistema in attesa del secondo impulso.

Se sai che con 1 cm di spostamento il sensore misura 4 impulsi e Arduino ne conta 8 in un secondo puoi affermare che la velocità è 2 cm/s.

grazie :slight_smile: :slight_smile: concetto afferrato... il problema ora è come scrivere ad arduino di calcolare gli impulsi in una determinata unità di tempo, per poi azzerare e rincominciare ... posso poi far fare ad arduino il calcolo della velocità e riporatre il valore sul pc ?

Un encoder in quadratura serve per conoscere anche il verso di rotazione.

La tua funivia può cambiare direzione?

Sìsi può cambiare direzione :wink:

Un encoder in quadratura consente anche di ottenere un raddoppio (2X) od un quadruplo (4X) degli impulsi: questo si usa per aver maggiore risoluzione.

Ti interessa questa maggiore risoluzione?

Porta vantaggi ? :slight_smile: se si direi che mi interessa :slight_smile:

Il tuo encoder è da 24 impulsi/giro quindi riesci ad apprezzare 15°: con 4x la risoluzione sale a 3.75°.

Ottimo :slight_smile: come lo scrivo nel programma ?

Lo cosa è già prevista nello sketch indicato precedentemente.

Ovviamente devi trasformare gli impulsi EncoderValue in velocitĂ , sapendo che 24 impulsi/giro diventano 96.

Usando millis(), se dopo un secondo leggi 20 impulsi (oppure -20 secondo la direzione) avrai tutti i valori per il calcolo.

Ricordati che dopo la lettura devi azzerare la variabile EncoderValue.

millis() non c'è nello skatch che mi hai mostrato in precedenza giusto ? come e dove lo inserisco ? :slight_smile:

ma millis() esattamente a cosa serve ? cosa devo inserirci ?

altra domandina: il calcolo del valore velocitĂ  posso farlo fare direttamente ad Arduino? in modo che possa visulaizzare sul pc giĂ  il valore velocitĂ  e non debba farlo io con una calcolatrice :slight_smile:

Il millis() è un contatore che si incrementa automaticamente ogni millesimo di secondo.

E' utile per determinare il tempo trascorso:

unsigned long Tempo = millis();
....
if (miliis() - Tempo > 5000) .... // se sono trascorsi 5 secondi fai qualcosa

Devi comprendere le basi di Arduino per andare avanti.

vero :confused: ... ma purtroppo la vogli di vederlo funzionare è tanta ...
coumque grazie per il supporto :slight_smile: prometto che mi metterò a studiare un po' :wink:

Ma non posso usare il delay ?
Non funziona se scritto così : (riporto solo il loop )

void loop () {

encoderValue*2= velocitá; // 2 sono i cm percorsi ad ogni impulso e velocità è una variabile float definita all' inizio come float velocità = 0;

Serial.println (velocitĂ  );
Delay (10);
encoderValue = 0;
Delay (1000) ;
}
Scrivendo così non dovrebbe ogni secondo ripercorrere il loop ?

Perché millis () non è un contatore incrementale che non si può azzerare ?

millis() è un contatore unsigned long che si incrementa ogni millesimo di secondo e riparte da 0 dopo aver raggiunto 0xFFFFFFFF = 4.294.967.295 ms = circa 49 giorni