Salve a tutti ![]()
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... ![]()
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
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 ![]()
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 ?
se si direi che mi interessa ![]()
Il tuo encoder è da 24 impulsi/giro quindi riesci ad apprezzare 15°: con 4x la risoluzione sale a 3.75°.
Ottimo
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 ? ![]()
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 ![]()
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
... ma purtroppo la vogli di vederlo funzionare è tanta ...
coumque grazie per il supporto
prometto che mi metterò a studiare un po' ![]()
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