Indice

Encoder e arduino

Shield Arduino con controllo motore DC (PWM), misura della velocità con encoder e visualizzazione su display LCD.

Riferimenti

Interrupt

// pin col segnale rettangolare dell'encoder (TTL 0-5 Volt squadrato con porta NOT triggerata)
int encoder = 2;
// variabile globale che conta gli impulsi dell'encoder
volatile unsigned int contatore = 0;
// velocità in giri al minuto
int vel;
// risoluzione in impulsi per giro
int risoluzione = 72;
// tempo trascorso dall'avvio
unsigned long tempoTrascorso;
// tempo dell'ultimo azzeramento del contatore
unsigned long tempoReset = 0;
 
void setup() {
  // pin encoder impostato come input
  pinMode(encoder, INPUT_PULLUP);
  // imposto l'interrupt sul pin dell'encoder e assegno la funzione da chiamare 
  // quando è presente un fronte di salita
  attachInterrupt(digitalPinToInterrupt(encoder), incrementa, RISING);
  // comunicazione seriale col PC per il debug
  Serial.begin(9600);
}
 
void loop() {
  // ogni secondo
  tempoTrascorso = millis();
  if((tempoTrascorso - tempoReset) > 1000){
    // reimposto tempoReset
    tempoReset = tempoTrascorso;
    // calcolo la velocità
    vel = (contatore * 60) / risoluzione;
    Serial.print("velocita': ");
    Serial.print(vel);
    Serial.println(" giri/min");   
    // azzero il contatore
    contatore = 0;
  }
}
 
// funzione che incrementa il contatore ad ogni interrupt
void incrementa() {
  contatore += 1;
}