La modalità di lettura del valore di un encoder dipende dal tipo di encoder. Di seguito vengono descritti i metodi di lettura per gli encoder incrementali e assoluti.
Encoder incrementale
Gli encoder incrementali forniscono due canali di segnale in uscita: il canale A e il canale B. Si tratta di segnali impulsivi sfasati tra loro di 90 gradi elettrici. Rilevando le variazioni di stato sul canale A e sul canale B, è possibile determinare sia il senso sia l'angolo di rotazione. Di seguito sono riportati i passaggi fondamentali per leggere un encoder incrementale con Arduino.
- Collegare il canale A e il canale B dell'encoder ai pin di Arduino abilitati agli interrupt (ad esempio, i pin 2 e 3).
- Definire una variabile globale nel codice Arduino per memorizzare il conteggio dell'encoder.
- Scrivere una routine di servizio dell'interrupt (ISR) per gestire le variazioni di stato sul canale A e sul canale B. In questa routine, determinare il senso di rotazione confrontando lo stato corrente di un canale con lo stato precedente dell'altro, quindi aggiornare di conseguenza il conteggio dell'encoder.
volatile long encoderCount = 0;
int lastB = 0;
void encoderInterrupt() {
int A = digitalRead(2);
int B = digitalRead(3);
// Decodifica di quadratura semplificata: confronta A corrente con B precedente
if (A == lastB) {
encoderCount++;
} else {
encoderCount--;
}
lastB = B;
}
- Nella funzione
setup(), configurare le modalità dei pin e associare gli interrupt in modo che l'ISR venga attivata ogni volta che lo stato del canale A o del canale B cambia.
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
lastB = digitalRead(3);
attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
- Nel
loop()principale, leggere la variabileencoderCountper ottenere la posizione relativa e il senso di rotazione dell'albero motore.
Nota: L'esempio precedente utilizza un approccio semplificato alla decodifica di quadratura. Per encoder ad alta velocità o ad alta risoluzione, si consiglia di utilizzare una macchina a stati completa per la quadratura oppure una libreria dedicata all'interfaccia encoder, al fine di evitare perdite di conteggio dovute a jitter del segnale o rimbalzi dei contatti.
Encoder assoluto
Gli encoder assoluti forniscono in uscita un segnale digitale che rappresenta la posizione assoluta dell'albero motore. L'esempio seguente si applica specificamente agli encoder assoluti con uscita parallela, in cui ogni bit del valore di posizione è presentato su un filo dati separato.
Nota: La maggior parte degli encoder assoluti industriali utilizza interfacce di comunicazione seriale come SSI, SPI o RS-485 anziché uscite parallele. Tali interfacce richiedono metodi di lettura diversi e, in alcuni casi, librerie di protocollo dedicate. Fare sempre riferimento al datasheet del proprio encoder per i dettagli corretti su interfaccia e cablaggio.
- Collegare ciascun pin dati dell'encoder a un pin di ingresso digitale su Arduino.
- Nella funzione
setup(), impostare ciascun pin dati in modalità di ingresso.
void setup() {
pinMode(dataPin1, INPUT);
pinMode(dataPin2, INPUT);
// ... Pin dati aggiuntivi, a seconda del numero di bit dell'encoder
}
- Scrivere una funzione per leggere il valore dell'encoder. In questa funzione, leggere lo stato di ciascun pin dati utilizzando
digitalRead()e combinare i risultati in un unico valore intero.
int readEncoder() {
int value = 0;
value |= digitalRead(dataPin1) << 0;
value |= digitalRead(dataPin2) << 1;
// ... Pin dati aggiuntivi, a seconda del numero di bit dell'encoder
return value;
}
- Nel
loop()principale, chiamare la funzionereadEncoder()per ottenere la posizione assoluta dell'albero motore.
Nota: Questi esempi riguardano i tipi di encoder di base. Gli encoder nelle applicazioni reali potrebbero richiedere un'elaborazione più avanzata, come l'implementazione del debouncing del segnale o l'utilizzo di un circuito integrato dedicato all'interfaccia encoder. Fare sempre riferimento al datasheet dell'encoder per garantire un cablaggio e una gestione del segnale corretti.