Suivre une ligne – Version avancée

Intro

Dans cette leçon tu vas apprendre à utiliser les capteurs de Eliobot pour le guider en suivant une ligne.

Étape 1

Eliobot adore les lignes noires sur un fond clair, tu pourras trouver son bonheur au dos de sa notice d’assemblage.

Si tu as perdu la notice ou que tu veux faire un parcours plus grand, tu peux utiliser du scotch d’électricien sur un sol ou une table claire. Tu en trouveras dans toutes les boutiques de bricolage, ainsi que dans notre boutique.

Étape 2

Nous allons commencer notre code en intégrant quelques bibliothèques. Ce sont des ensembles de codes déjà écrits nous permettant de rajouter des fonctions facilement.

La première s’appelle “board” et est spécifique à CircuitPython. C’est grâce à elle que nous allons pouvoir expliquer à notre programme comment sont connectés les éléments au microcontrôleur (le cerveau de Eliobot)

Pour l’intégrer dans notre programme on utilise la ligne suivante :

import board

Cela nous permet d’appeler les entrée / sorties de la cartes en utilisant le numéro de la broche.

board.IO10

Étape 3

Pour déclarer les capteurs on va utiliser la bibliothèque « analogio » et « digitalio »

import analogio
import digitalio

Ensuite nous définissons chaque capteur.

lineCmd = digitalio.DigitalInOut(board.IO33)
lineCmd.direction = digitalio.Direction.OUTPUT

lineInput = [analogio.AnalogIn(pin) for pin in
               (board.IO10, board.IO11, board.IO12, board.IO13, board.IO14)]

Les capteurs de ligne sont placés en ligne de 0 à 4, 0 étant tout à gauche et 4 tout à droite.

Pour déclarer les moteurs on va utiliser une bibliothèque qui se nomme « pwmio ».

import pwmio

Ensuite nous définissons chaque moteur et son sens.

AIN1 = pwmio.PWMOut(board.IO36)
AIN2 = pwmio.PWMOut(board.IO38)
BIN1 = pwmio.PWMOut(board.IO35)
BIN2 = pwmio.PWMOut(board.IO37)

Pour nous faciliter la tâche on va utiliser la bibliothèque « elio ».

from elio import Motors, LineSensor

Ensuite on définit les moteurs et capteur de lignes.

motors = Motors(AIN1, AIN2, BIN1, BIN2, vBatt_pin)
lineSensor = LineSensor(lineInput, lineCmd, motors)

Étape 4

Pour obtenir la sensibilité avec laquelle on détecte la ligne, nous allons utiliser la fonction « calibrate_line_sensors() ».

lineSensor.calibrate_line_sensors()

Il faut poser le robot à l’horizontal en plaçant tous les capteurs sur la ligne que l’on souhaite suivre, puis démarrer Eliobot. Une fois que le robot a fait ses trois aller-retour et qu’il ne bouge plus, nous pouvons le récupérer et le reconnecter à son ordinateur.

Étape 5

Nous allons d’abord récupérer la valeur de seuil qui se trouve dans le fichier config.json après avoir calibré notre ligne :

On importe la bibliothèque « json »

import json

Et on récupère la valeur de seuil

with open("config.json", "r") as f:
    calibration = json.load(f)

seuil = calibration["line_threshold"]

Étape 6

La logique de suivi de ligne repose sur l’analyse des signaux de chaque capteur pour détecter les changements par rapport à un seuil prédéfini. Voici comment cela fonctionne : chaque capteur vérifie si la valeur mesurée dépasse le seuil établi, indiquant ainsi la présence ou l’absence d’une ligne. Par exemple, si le capteur de gauche détecte que la valeur seuil est dépassée, cela signifie que la ligne se trouve plutôt à droite du robot. En réponse, Eliobot ajuste sa trajectoire pour revenir vers la ligne, corrigeant ainsi son positionnement.

Traduisons tout cela en code :

if lineSensor.get_line(2) < seuil:
    motors.move_forward(speed)

elif lineSensor.get_line(0) < seuil:
    motors.motor_stop()
    motors.spin_right_wheel_forward(speed)
    time.sleep(0.1)

elif lineSensor.get_line(4) < seuil:
    motors.motor_stop()
    motors.spin_left_wheel_forward(speed)

elif lineSensor.get_line(1) < seuil:
    motors.motor_stop()
    motors.spin_right_wheel_forward(speed)

elif lineSensor.get_line(3) < seuil:
    motors.motor_stop()
    motors.spin_left_wheel_forward(speed)
    time.sleep(0.1)
else:
    motors.motor_stop()
  • Avancer : Si le capteur central détecte la ligne, le robot avance.
  • Corriger à droite : Si le capteur extrême gauche détecte la ligne, le robot pivote à gauche pour se réaligner.
  • Corriger à gauche : Si le capteur extrême droite détecte la ligne, le robot pivote à droite.
  • Ajustements mineurs : Si les capteurs à gauche ou à droite du centre détectent la ligne, le robot effectue de petits ajustements dans la même direction.
  • Arrêt : Si aucun capteur ne détecte la ligne, le robot s’arrête.

Etape 7

Pour que toutes les vérifications et les ajustement se fasse on doit créer une boucle qui va refaire les vérification indéfiniment.

while True:
    if lineSensor.get_line(2) < seuil:
        motors.move_forward(speed)

    elif lineSensor.get_line(0) < seuil:
        motors.motor_stop()
        motors.spin_right_wheel_forward(speed)
        time.sleep(0.1)

    elif lineSensor.get_line(4) < seuil:
        motors.motor_stop()
        motors.spin_left_wheel_forward(speed)

    elif lineSensor.get_line(1) < seuil:
        motors.motor_stop()
        motors.spin_right_wheel_forward(speed)

    elif lineSensor.get_line(3) < seuil:
        motors.motor_stop()
        motors.spin_left_wheel_forward(speed)
        time.sleep(0.1)

    else:
        motors.motor_stop()

Étape 8

Voici le programme final que l’on va pouvoir exécuter ▶️ :

from elio import Motors, LineSensor
import board
import time
import analogio
import digitalio
import pwmio
import json

AIN1 = pwmio.PWMOut(board.IO36)
AIN2 = pwmio.PWMOut(board.IO38)
BIN1 = pwmio.PWMOut(board.IO35)
BIN2 = pwmio.PWMOut(board.IO37)

lineCmd = digitalio.DigitalInOut(board.IO33)
lineCmd.direction = digitalio.Direction.OUTPUT

lineInput = [analogio.AnalogIn(pin) for pin in
            (board.IO10, board.IO11, board.IO12, board.IO13, board.IO14)]

with open("config.json", "r") as f:
    calibration = json.load(f)

seuil = calibration["line_threshold"]

motors = Motors(AIN1, AIN2, BIN1, BIN2, vBatt_pin)
lineSensor = LineSensor(lineInput, lineCmd, motors)

while True:
    if lineSensor.get_line(2) < seuil:
        motors.move_forward(speed)

    elif lineSensor.get_line(0) < seuil:
        motors.motor_stop()
        motors.spin_right_wheel_forward(speed)
        time.sleep(0.1)

    elif lineSensor.get_line(4) < seuil:
        motors.motor_stop()
        motors.spin_left_wheel_forward(speed)

    elif lineSensor.get_line(1) < seuil:
        motors.motor_stop()
        motors.spin_right_wheel_forward(speed)

    elif lineSensor.get_line(3) < seuil:
        motors.motor_stop()
        motors.spin_left_wheel_forward(speed)
        time.sleep(0.1)

    else:
        motors.motor_stop()

Bravo !

Et voila, ton programme est fini ! Il ne te reste plus qu’à le Téléverser pour admirer le résultat

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut