Παρακάτω έχω κάποιες ρουτίνες που χρησιμοποιώ σε ένα δικό μου αυτοκινητάκι και λειτουργούν καλά (όχι με ακρίβεια χιλιοστού).
ΔΕΝ είναι τελειωμένο πρόγραμμα έχω απομονώσει τις σχετικές ρουτίνες, εσύ απλά θα πρέπει να τις ενσωματώσεις στο δικό σου πρόγραμμα με το οποίο κινείς μπρος πίσω το αυτοκινητάκι σου.
Ελπίζω να βοηθηθείς.
Κώδικας:
enum RoboCommand {
rcBackward,
rcForward,
rcStop,
rcLeft,
rcRight
};
RoboCommand rcmd; //για να ξέρουμε που πηγαίνουμε
RoboCommand lastrcmd;
volatile int mydist=0; //οι διακοπές που μετρήσαμε
int lastdist=0; //οι διακοπες στο τελευταίο stop
int distanceTravelled=0; //η απόσταση που διανηθηκε
//η διακοπή
void speedencint()
{
if (rcmd==rcForward) mydist++; //εαν πάμε μπροστά αυξάνουμε
if (rcmd==rcBackward) mydist--; //αλλιώς μειώνουμε
}
void setup()
{
pinMode (speedenc, INPUT) ;
attachInterrupt(speedint, speedencint, CHANGE); //εγκατάσταση διακοπής
}
//εαν πρέπει να σταματήσουμε
boolean moveIsUpCM(){
return (rcmd==rcForward || rcmd==rcBackward) && isDistanceReached();
}
boolean isDistanceReached(){
return (abs(distanceNowCM())>=stepMoveinCm); //ποσο θέλουμε να προχωρήσουμε σε εκατοστά
}
//η τρέχουσα απόσταση
int distanceNowCM(){
return inCM(mydist-lastdist);
}
void clearDistance(){
mydist=0;
distanceTravelled=0;
}
//μετατροπή διακοπών σε εκατοστά
float inCM(int dist){
return mydist/0.87; //αλλάζουμε ανάλογα
}
//σταμάτημα μοτερ
void Stop(){
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
distanceTravelled=mydist-lastdist;//απόσταση που διανύθηκε
lastdist=mydist; //οι διακοπές μέχρι στιγμής
rcmd=rcStop;//τρέχουσα κατάσταση
}
//πισω
void DESP_Robot::Backward(){
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
rcmd=rcBackward;
lastrcmd=rcmd;
}
//μπρος
void DESP_Robot::Forward(){
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
rcmd=rcForward;
lastrcmd=rcmd;
}