Grazie intanto per le risposte.
Questo é il mio codice modificato:
#define encoder0PinA 2
#define encoder0PinB 5
#define pinmotorPWM 3
#define pinmotor 4
volatile unsigned int encoder0Pos = 0;
byte pwm=255;
unsigned long timecamp;
unsigned long currentTime;
unsigned long timeold;
float rpm;
//float spost;
void setup() {
Serial.begin (115200);
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
attachInterrupt(0, doEncoder, RISING); // encoder pin on interrupt 0 - pin 2
Serial.println("start"); // a personal quirk
timecamp=1000;
rpm=0.0;
spost=0.0;
}
void avanti() {
digitalWrite(4, HIGH);
analogWrite(3, (255-pwm));
}
void indietro() {
digitalWrite(4, LOW);
analogWrite(3,pwm);
}
void ferma() { //ferma i motori
digitalWrite(pinmotor, LOW);
digitalWrite(pinmotorPWM, LOW);
}
void loop(){
currentTime=millis();
if(currentTime-timecamp > 1000){
rpm=((encoder0Pos/16)/131.25)*60;
encoder0Pos=0;
Serial.println(rpm);
timecamp=millis();
}
}
void doEncoder() {
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
encoder0Pos++;
} else {
encoder0Pos--;
}
}
Ora riesco a vedere i giri/min e dividendo per il rapporto di riduzione ottengo i giri esatti.
L'altra domanda cruciale che vorrei porvi é come calcolare la distanza percorsa ad ogni giro (o anche meno di un giro) del motore. Ho pensato di usare la velocitá tangenziale: V=W x r dove ottengo lo spostamento in metri al secondo (o mm al secondo) attraverso il prodotto della velocitá angolare e del raggio della ruota.
Secondo voi sarebbe una buona soluzione? Avete delle alternative?
Grazie