Buongiorno, ho una ruota con un diametro di circa 25 cm che gira grazie a un motore DC con encoder, i classici motori cinesi con il PCB rosso e la rutina magnetica che gira per intenderci.
Il motore viene controllato mediante il modulo Adafruit motorshield V2.
Per la lettura dei “passi” utilizzo solo un filo dell’encoder e leggo i valori mediante il comando attachInterrupt(digitalPinToInterrupt(encoderGA), updateXposition, RISING);
Il problema è che quando eseguo il void toall, la ruota parte dalla posizione toHome (currentXposition=0) e gira a step fermandosi a ogni step posizione 1 2 3 …, poi torna alla posizione toHome e da qui gira fino ad arrivare alla posizione 4, teoricamente dovrebbe fermarsi nella stessa posizione invece si ferma molto ma molto prima fate conte che perde circa 3 cm della circonferenza.
Ripeto più volte il tutto e tutto si ripete uguale.
Meccanicamente la ruota viene fatta girare mediane un ingranaggio accoppiato al motore che ha un ingranaggio a vite senza fine, ho controllato e i giochi meccanici non possono sbagliare di così tanto, anche perché gli step sono tutti sequenziali nella stessa direzione, vi sono solo degli stop.
Insomma chiedevo se per voi ho sbagliato in qualche parte del codice oppure è l’encoder del motore ad avere qualche problema?
Grazie a tutti
int posizione[] = { 1830, 2920, 3980, 5040, 6100, 9050, 10250, 11450, 12650, 13850 };
void toHome() {
Serial.println("Ruota verso home");
while (digitalRead(finecorsa) == 0) {
Ruota->run(BACKWARD); //rotazione senso orario
}
if (digitalRead(finecorsa) == 1) {
// Ruota STOP
Ruota->run(RELEASE);
delay(100);
currentXposition = 0;
lastencoderXstate = LOW;
return;
}
}
void updateXposition() {
if (RuotaForward) {
currentXposition++;
} else {
currentXposition--;
}
if (currentXposition < 0) {
currentXposition = 0;
}
}
void RuotaToPosition(int Xposition) {
attachInterrupt(digitalPinToInterrupt(encoderGA), updateXposition, RISING);
delay(20);// ho provato a togliere il ritardo ma niente
Serial.print("to Xposition:");
Serial.println(Xposition);
while (currentXposition != Xposition) {
if (currentXposition < Xposition) {
Ruota->run(FORWARD);
RuotaForward = true;
} else {
Ruota->run(BACKWARD);
RuotaForward = false;
}
}
// Fermo il motore quando raggiungo la posizione desiderata
Ruota->run(RELEASE);
detachInterrupt(digitalPinToInterrupt(encoderGA));
Serial.print("to Xposition:");
Serial.println(Xposition);
return;
}
void toall() {
Xposition = posizione[0];
RuotaToPosition(Xposition);
Serial.print("Xposition:");
Serial.println(currentXposition);
delay(5000);
// ci sono altri step posizione 1, 2, 3
Xposition = posizione[4];
RuotaToPosition(Xposition);
Serial.print("Xposition:");
Serial.println(currentXposition);
delay(5000);
//torno a casa e azzero encoder
toHome();
delay(5000);
Xposition = posizione[4];
RuotaToPosition(Xposition);
Serial.print("Xposition:");
Serial.println(currentXposition);
delay(5000);
return;
}