Encoder incrementale

Si tratta di un interruttore encoder rotativo continuo; Tipo: codice encoder con interruttore; Metodo di regolazione: rotativo a 360 gradi; Numero di cifre: 20 cifre; Pin: 5.
Diametro dell'albero: 6 mm; Lunghezza dell'albero: 20 mm.
Questo è di tipo meccanico. Esiste anche una versione ottica che si distingue per essere alimentata.
Schema di collegamento:
-
OUT A → Pin digitale 2 di Arduino (con interrupt)
-
OUT B → Pin digitale 3 di Arduino
-
GND (destro) → GND di Arduino
-
SWITCH → Pin digitale 4 di Arduino (con INPUT_PULLUP)
-
GND (sinistro) → GND di Arduino
Esiste anche una versione ottica che si distingue per essere alimentata.
Useremo questa perchè più pratca da montare.
 
Schema di collegamento:
Codice: |

|
#include <Encoder.h>
#define DT_PIN 2
#define CLK_PIN 3
#define BUTTON_PIN 4
Encoder encoder(DT_PIN, CLK_PIN);
int lastEncoderValue = 0;
int lastButtonState = LOW;
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
int encoderValue = encoder.read() / 4;
// Limita il valore tra 0 e 255
if (encoderValue < 0) {
encoder.write(0);
encoderValue = 0;
}
else if (encoderValue > 255) {
encoder.write(255 * 4); // Riporta il valore a 255
encoderValue = 255;
}
if (encoderValue != lastEncoderValue) {
Serial.println("Encoder: " + String(encoderValue));
}
lastEncoderValue = encoderValue;
// Gestione del pulsante per resettare il valore
int buttonState = !digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState && buttonState == HIGH) {
encoder.write(0);
lastEncoderValue = 0;
Serial.println("Encoder resettato a 0");
delay(200);
}
lastButtonState = buttonState;
} |
Stesso codice ma commentato passopasso:
// Inclusione della libreria Encoder per gestire l'encoder rotativo
#include <Encoder.h>
// Definizione dei pin a cui sono collegati i segnali dell'encoder e il pulsante
#define DT_PIN 2 // Pin per il segnale DT dell'encoder
#define CLK_PIN 3 // Pin per il segnale CLK dell'encoder
#define BUTTON_PIN 4 // Pin per il pulsante
// Creazione dell'oggetto encoder utilizzando i pin definiti sopra
Encoder encoder(DT_PIN, CLK_PIN);
// Variabili per memorizzare lo stato precedente dell'encoder e del pulsante
int lastEncoderValue = 0;
int lastButtonState = LOW;
void setup() {
Serial.begin(115200); // Inizializzazione della comunicazione seriale a 115200 baud
// Imposta il pulsante come input con resistenza di pull-up interna
pinMode(BUTTON_PIN, INPUT_PULLUP);}
void loop() {
// Legge il valore attuale dell'encoder e lo divide per 4 per ottenere un conteggio più stabile
int encoderValue = encoder.read() / 4;
// Controllo per limitare il valore tra 0 e 255
if (encoderValue < 0) {
encoder.write(0); // Se il valore è inferiore a 0, lo imposta a 0
encoderValue = 0;
}
else if (encoderValue > 255) {
// Se il valore supera 255, lo imposta al massimo (255 * 4 per adattarlo alla scala dell'encoder)
encoder.write(255 * 4); encoderValue = 255;
}
// Se il valore dell'encoder è cambiato, lo stampa sulla seriale
if (encoderValue != lastEncoderValue) {
Serial.println("Encoder: " + String(encoderValue));
}
lastEncoderValue = encoderValue; // Aggiorna la variabile con il nuovo valore dell'encoder
// Lettura dello stato del pulsante (invertito perché usiamo INPUT_PULLUP)
int buttonState = !digitalRead(BUTTON_PIN);
// Controlla se il pulsante è stato premuto (cambio di stato da LOW a HIGH)
if (buttonState != lastButtonState && buttonState == HIGH) {
encoder.write(0); // Resetta il valore dell'encoder a 0
lastEncoderValue = 0; // Aggiorna la variabile di controllo
Serial.println("Encoder resettato a 0"); // Messaggio sulla seriale
delay(200); // Piccola pausa per evitare rimbalzi del pulsante
}
lastButtonState = buttonState; // Aggiorna lo stato precedente del pulsante
} |
Spiegazione del funzionamento
-
Librerie e definizioni:
-
Creazione dell'oggetto encoder:
-
Setup:
-
Loop principale:
-
Leggiamo il valore dell'encoder e lo dividiamo per 4 per rendere il conteggio più stabile.
-
Se il valore è inferiore a 0, lo forziamo a 0.
-
Se il valore supera 255, lo forziamo a 255.
-
Se il valore è cambiato rispetto all'ultima lettura, lo stampiamo sulla seriale.
-
Gestione del pulsante:
-
Controlliamo se il pulsante è stato premuto (da HIGH a LOW).
-
Se viene premuto, resettiamo l'encoder a 0 e stampiamo un messaggio sulla seriale.
-
Aggiungiamo un piccolo ritardo di 200 ms per evitare che il pulsante venga rilevato più volte per un singolo click.
Ora il codice permette di:
✔ Contare gli impulsi dell'encoder, mantenendo i valori tra 0 e 255.
✔ Stampare il valore solo quando cambia.
✔ Resettare il valore a 0 premendo il pulsante.
|