11. Geschwindigkeitskalibrierung

Beim Vorwärtsbewegen des Autos stellen Sie möglicherweise fest, dass das Auto nicht geradeaus fährt. Das liegt daran, dass die beiden Motoren möglicherweise ab Werk nicht die gleiche Geschwindigkeit haben. Wir können jedoch einen Ausgleich für die beiden Motoren schreiben, damit sich ihre Drehgeschwindigkeiten angleichen.

In diesem Projekt werden wir lernen, den Ausgleich in EEPROM zu speichern. Der Sinn dahinter ist, dass nach jeder Kalibrierung alle Projekte den Ausgleichswert direkt aus dem EEPROM abrufen können, damit das Auto reibungslos geradeaus fährt.

Verdrahtung

Dieses Projekt hat die gleiche Verdrahtung wie 2. Bewegung durch Code.

Wie spielt man?

  1. Öffnen Sie die Datei 11.speed_calibration.ino im Pfad 3in1-kit\car_project\11.speed_calibration. Oder kopieren Sie diesen Code in die Arduino IDE.

  1. Nachdem der Code erfolgreich hochgeladen wurde, verbinden Sie das Auto mit einer 9V-Batterie, stellen Sie es auf den Boden und lassen Sie es vorwärts fahren, um zu sehen, zu welcher Seite es verschoben ist.

  • Wenn das Auto nach links vorne fährt, bedeutet das, dass die Geschwindigkeit des rechten Motors zu hoch ist und reduziert werden muss.

    EEPROM.write(1, 100) // 1 bedeutet der rechte Motor, 100 bedeutet 100% Geschwindigkeit, kann je nach tatsächlicher Situation auf 90, 95 usw. gesetzt werden.
    
  • Wenn das Auto nach rechts fährt, bedeutet das, dass die Geschwindigkeit des linken Motors zu schnell ist und reduziert werden muss.

    EEPROM.write(0, 100) // 0 bedeutet der linke Motor, 100 bedeutet die Geschwindigkeit beträgt 100%, kann je nach tatsächlicher Situation auf 90, 95 usw. gesetzt werden.
    
  1. Nach der Code-Änderung laden Sie den Code auf das R3-Board hoch, um die Wirkung zu sehen. Wiederholen Sie die obigen Schritte, bis das Auto fast gerade fährt.

  2. Dieser Ausgleich wird in EEPROM aufgezeichnet. Sie müssen diesen Ausgleich nur abrufen, wenn Sie ihn in anderen Projekten verwenden, nehmen Sie 5. Mit dem Hindernisvermeidungs-Modul spielen als Beispiel.

#include <EEPROM.h>

float leftOffset = 1.0;
float rightOffset = 1.0;

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR = 7;
const int leftIR = 8;

void setup() {
    Serial.begin(9600);

    //motor
    pinMode(A_1B, OUTPUT);
    pinMode(A_1A, OUTPUT);
    pinMode(B_1B, OUTPUT);
    pinMode(B_1A, OUTPUT);

    //IR obstacle
    pinMode(leftIR, INPUT);
    pinMode(rightIR, INPUT);

    leftOffset = EEPROM.read(0) * 0.01;//read the offset of the left motor
    rightOffset = EEPROM.read(1) * 0.01;//read the offset of the right motor
}

void loop() {

    int left = digitalRead(leftIR);   // 0: Obstructed  1: Empty
    int right = digitalRead(rightIR);
    int speed = 150;

    if (!left && right) {
        backLeft(speed);
    } else if (left && !right) {
        backRight(speed);
    } else if (!left && !right) {
        moveBackward(speed);
    } else {
        moveForward(speed);
    }
}

void moveForward(int speed) {
    analogWrite(A_1B, 0);
    analogWrite(A_1A, int(speed * leftOffset));
    analogWrite(B_1B, int(speed * rightOffset));
    analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
    analogWrite(A_1B, speed);
    analogWrite(A_1A, 0);
    analogWrite(B_1B, 0);
    analogWrite(B_1A, speed);
}

void backLeft(int speed) {
    analogWrite(A_1B, speed);
    analogWrite(A_1A, 0);
    analogWrite(B_1B, 0);
    analogWrite(B_1A, 0);
}

void backRight(int speed) {
    analogWrite(A_1B, 0);
    analogWrite(A_1A, 0);
    analogWrite(B_1B, 0);
    analogWrite(B_1A, speed);
}