11. Calibration de la Vitesse

Lors de la mise en mouvement de la voiture, vous pourriez constater que la voiture ne se déplace pas en ligne droite. Cela est dû au fait que les deux moteurs peuvent ne pas avoir la même vitesse en sortie d’usine. Mais nous pouvons écrire un décalage aux deux moteurs pour faire converger leurs vitesses de rotation.

Dans ce projet, nous apprendrons à stocker le décalage dans EEPROM. L’intérêt est que, après chaque calibration, tous les projets peuvent obtenir directement la valeur de décalage depuis l’EEPROM, afin que la voiture puisse avancer en ligne droite de manière fluide.

Câblage

Ce projet a le même câblage que 2. Mouvement par Code.

Comment jouer ?

  1. Ouvrez le fichier 11.speed_calibration.ino situé dans le dossier 3in1-kit\car_project\11.speed_calibration. Ou copiez ce code dans Arduino IDE.

  1. Après le téléchargement réussi du code, connectez la voiture avec une batterie 9V, posez-la sur le sol et laissez-la avancer pour voir de quel côté elle se décale.

  • Si la voiture se déplace vers l’avant gauche, cela signifie que la vitesse du moteur droit est trop rapide et doit être réduite.

    EEPROM.write(1, 100) // 1 means the right motor, 100 means 100% speed, can be set to 90, 95, etc., depending on the actual situation.
    
  • Si la voiture se déplace vers la droite, cela signifie que la vitesse du moteur gauche est trop rapide et doit être réduite.

    EEPROM.write(0, 100) // 0 means the right motor, 100 means the speed is 100%, can be set to 90, 95, etc., depending on the actual situation. 3.
    
  1. Après avoir modifié le code, téléchargez le code sur la carte R3 pour voir l’effet. Répétez les étapes ci-dessus jusqu’à ce que la voiture soit presque droite.

  2. Ce décalage sera enregistré dans EEPROM, vous n’avez besoin de lire ce décalage que lorsque vous l’utilisez dans d’autres projets, prenez 5. Jouer avec le module d’évitement d’obstacles comme exemple.

#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);
}