Il y a quelques jours, je vous ai proposé la réalisation d'un robot suiveur de ligne basé sur un Raspberry Pi.
Le robot que je vous présente aujourd'hui se comporte de la même façon: grâce à une paire de photorésistances, il peut faire la différence entre une surface claire et une surface sombre, ce qui lui permet de se déplacer en suivant fidèlement une ligne sinueuse sur le plancher.
La version que je vous présente aujourd'hui a pour cerveau une carte Arduino Uno.
Le principe de fonctionnement du capteur est le suivant: une LED éclaire la surface du plancher, et une photorésistance capte la lumière réfléchie par le plancher. Si la surface éclairée est blanche, la quantité de lumière réfléchie est plus grande que si la surface est noire. La résistance de la photorésistance ne sera donc pas la même si celle-ci se trouve au-dessus d'une surface blanche ou d'une surface blanche.
Le capteur est donc constitué de deux LEDs blanches, situées de part et d'autre de la ligne qui sera suivie par le robot, et de deux photorésistances, également situées de part et d'autre de la ligne.

Chaque photorésistance est branchée en série avec une résistance fixe de façon à former un diviseur de tension. Pour déterminer la valeur optimale de la résistance fixe (celle qui provoquera le plus grand écart de tension entre la surface blanche et la surface noire), mesurez la résistance de la photorésistance lorsque la LED éclaire la surface blanche (Rmin) ainsi que sa résistance lorsque la LED éclaire la surface noire (Rmax).

Rfixe = (Rmin + Rmax )1/2
Chacun des deux diviseurs de tension constitués d'une photorésistance et d'une résistance fixe est alimentée par la sortie 5 V de l'Arduino.
Le signal du capteur de gauche est acheminé à l'entrée analogique A0 de l'Arduino, alors que celui du capteur de droite est branché à l'entrée A1.
Ce double capteur doit être installé à l'avant du véhicule robotisé de façon à éclairer le plancher. Vous obtiendrez de meilleurs résultats en plaçant un petit écran opaque entre la LED et la photorésistance, afin que cette dernière reçoive uniquement la lumière réfléchie par le plancher (et non celle qui provient directement de la LED).
Branchement des moteurs
Le véhicule robotisé est constitué de deux roues motrices, chacune d'entre elles étant actionnée par un moteur à courant continu. Il est très important que ces moteurs comportent une boîte d'engrenage pour diminuer leur vitesse de rotation: un moteur à courant continu directement relié à la roue, sans boîte d'engrenage, produirait un bolide beaucoup trop nerveux pour suivre la ligne.
Comme intermédiaire entre la carte Arduino et les moteurs, j'ai utilisé un module L298N. D'autres options auraient fait l'affaire, surtout que je n'ai pas besoin de mettre les moteurs en marche arrière dans ce projet (mais c'était pratique d'utiliser le même matériel et les mêmes connexions que pour mon robot préprogrammé et mon robot éviteur d'obstacles).
Le module L298N est branché de la façon suivante:
- Sorties OUT1 et OUT2 du L298N: premier moteur
- Sorties OUT3 et OUT4 du L298N: deuxième moteur
- Entrées +12 V et GND du L298N: alimentation des moteurs
- Broche ENA du L298N: broche 9 de l'Arduino
- Broche IN1 du L298N: broche 3 de l'Arduino
- Broche IN2 du L298N: broche 4 de l'Arduino
- Broche IN3 du L298N: broche 5 de l'Arduino
- Broche IN4 de L298N: broche 6 de l'Arduino
- Broche ENB du L298N: broche 10 de l'Arduino
Sketch
Au démarrage du programme, le robot doit être correctement positionné, avec un capteur de chaque côté de la ligne. Deux secondes après le démarrage du programme, la valeur initiale de chaque capteur est mise en mémoire.
On fait ensuite avancer le robot en comparant périodiquement l'état de chaque capteur à sa valeur initiale. Si la valeur mesurée par un capteur est significativement différente de la valeur initiale, on suppose qu'il se trouve au-dessus de la ligne et on le fait tourner pour éviter qu'il ne la traverse.
Il sera peut-être nécessaire de modifier la valeur des variables globales "sensibilite" et "vitesse".
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Robot suiveur de ligne à base d'Arduino Uno. | |
Pus d'informations: | |
https://electroniqueamateur.blogspot.com/2020/04/robot-suiveur-de-ligne-version-arduino.html | |
*/ | |
// définition des broches | |
#define capteurGauche A0 | |
#define capteurDroite A1 | |
#define brocheMoteur1a 3 // Premier moteur | |
#define brocheMoteur1b 4 // Premier moteur | |
#define brocheEnable1 9 // broche enable du L298N pour le premier moteur | |
#define brocheMoteur2a 5 // Deuxième moteur | |
#define brocheMoteur2b 6 // Deuxième moteur | |
#define brocheEnable2 10 // broche enable du L298N pour le deuxième moteur | |
const int sensibilite = 50; // écart admissible par rapport à la valeur initiale | |
int initialDroite; // état initial du capteur de droite | |
int initialGauche; // état initial du capteur de gauche | |
int vitesse = 600; // 0 à 1023 PWM qui contrôle la vitesse des moteurs | |
void setup() { | |
// réglage des sorties | |
pinMode(brocheMoteur1a, OUTPUT); | |
pinMode(brocheMoteur1b, OUTPUT); | |
pinMode(brocheEnable1, OUTPUT); | |
pinMode(brocheMoteur2a, OUTPUT); | |
pinMode(brocheMoteur2b, OUTPUT); | |
pinMode(brocheEnable2, OUTPUT); | |
// on demeure immobile pour l'instant | |
digitalWrite(brocheEnable1, 0); | |
digitalWrite(brocheEnable2, 0); | |
// réglage en marche avant | |
digitalWrite(brocheMoteur1a, HIGH); | |
digitalWrite(brocheMoteur1b, LOW); | |
digitalWrite(brocheMoteur2a, HIGH); | |
digitalWrite(brocheMoteur2b, LOW); | |
delay(2000); // on se donne le temps de placer le robot à son point de départ | |
// lecture des valeurs initiales (on suppose que les capteurs sont de part et d'autre de la ligne) | |
initialDroite = analogRead(capteurDroite); | |
initialGauche = analogRead(capteurGauche); | |
} | |
void loop() { | |
int valeurDroite, valeurGauche; | |
valeurDroite = analogRead(capteurDroite); | |
valeurGauche = analogRead(capteurGauche); | |
if ((abs(valeurDroite - initialDroite) < sensibilite) && (abs(valeurGauche - initialGauche) < sensibilite)) { | |
// on continue tout droit | |
analogWrite(brocheEnable1, vitesse); | |
analogWrite(brocheEnable2, vitesse); | |
} | |
else if ((abs(valeurDroite - initialDroite) < sensibilite) && (abs(valeurGauche - initialGauche) >= sensibilite)) { | |
// on tourne à gauche | |
digitalWrite(brocheEnable1, 0); | |
analogWrite(brocheEnable2, vitesse); | |
} | |
else if ((abs(valeurDroite - initialDroite) >= sensibilite) && (abs(valeurGauche - initialGauche) < sensibilite)) { | |
// on tourne à droite | |
analogWrite(brocheEnable1, vitesse); | |
digitalWrite(brocheEnable2, 0); | |
} | |
else { | |
// on s'arrête | |
digitalWrite(brocheEnable1, 0); | |
digitalWrite(brocheEnable2, 0); | |
} | |
delay(100); | |
} |
À lire aussi
- Un robot suiveur de ligne basé sur le Rabperry Pi.
- D'autres robots Arduino: robot sans capteur (mouvement programmé à l'avance), véhicule téléguidé, robot éviteur d'obstacles.
Yves Pelletier (Twitter, Facebook)
version sur esp8266
RépondreSupprimerhttps://github.com/arnaudrco/festisol/blob/main/voiture/read-me-voiture.pdf
la taille frero
RépondreSupprimer