Skip to main content

LineSensor

La classe LineSensor gère les 5 capteurs infrarouges de ligne d'Eliobot et fournit des fonctions de suivi de ligne et de calibration.

Positions des capteurs​

PositionIndexPin
Extrême gauche0IO10
Milieu gauche1IO11
Centre2IO12
Milieu droite3IO13
Extrême droite4IO14

Initialisation​

La classe LineSensor nécessite également une instance de Motors pour les méthodes de suivi et de calibration.

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

# Moteurs
AIN1 = pwmio.PWMOut(board.IO36)
AIN2 = pwmio.PWMOut(board.IO38)
BIN1 = pwmio.PWMOut(board.IO35)
BIN2 = pwmio.PWMOut(board.IO37)
vBatt_pin = analogio.AnalogIn(board.BATTERY)
motors = Motors(AIN1, AIN2, BIN1, BIN2, vBatt_pin)

# Capteurs de ligne
lineCmd = digitalio.DigitalInOut(board.IO33)
lineCmd.direction = digitalio.Direction.OUTPUT

lineInput = [
analogio.AnalogIn(board.IO10), # Capteur 0 — extrême gauche
analogio.AnalogIn(board.IO11), # Capteur 1 — milieu gauche
analogio.AnalogIn(board.IO12), # Capteur 2 — centre
analogio.AnalogIn(board.IO13), # Capteur 3 — milieu droite
analogio.AnalogIn(board.IO14), # Capteur 4 — extrême droite
]

line_sensor = LineSensor(lineInput, lineCmd, motors)

Méthodes​

get_line(line_pos)​

Retourne la valeur du capteur de ligne à la position donnée.

La mesure est calculée comme la différence entre la lumière ambiante et la lumière réfléchie — une valeur élevée indique la présence d'une ligne.

ParamètreTypeDescription
line_posintIndex du capteur (0 à 4)
valeur = line_sensor.get_line(2)  # Lecture du capteur central
print(valeur)

follow_line(threshold)​

Fait suivre la ligne à Eliobot en utilisant les 5 capteurs. Le robot avance si la ligne est sous le capteur central, et corrige sa trajectoire avec les autres capteurs.

ParamètreTypeDescription
thresholdintValeur seuil de détection de ligne
while True:
line_sensor.follow_line(threshold=5000)
Calibration

Utilise calibrate_line_sensors() pour calculer automatiquement le seuil adapté à ton environnement.

calibrate_line_sensors()​

Effectue une calibration automatique des capteurs de ligne :

  1. Fait pivoter Eliobot sur place en collectant 30 échantillons par capteur.
  2. Calcule un seuil optimal à partir des valeurs maximales et minimales.
  3. Sauvegarde le seuil dans le fichier config.json.
  4. Réaligne Eliobot sur la ligne (capteur central).
line_sensor.calibrate_line_sensors()

Le seuil calculé est sauvegardé dans config.json :

{ "line_threshold": 4823.5 }

update_sensor_values(all_values)​

Met à jour la liste des valeurs de tous les capteurs. Utilisé en interne par calibrate_line_sensors().

save_calibration_data(threshold) (méthode statique)​

Sauvegarde le seuil de calibration dans config.json.

LineSensor.save_calibration_data(5000)

calculate_median(data) (méthode statique)​

Calcule la médiane d'une liste de valeurs.

median = LineSensor.calculate_median([100, 200, 150, 300, 250])

Exemple complet — suivi de ligne avec calibration​

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

AIN1 = pwmio.PWMOut(board.IO36)
AIN2 = pwmio.PWMOut(board.IO38)
BIN1 = pwmio.PWMOut(board.IO35)
BIN2 = pwmio.PWMOut(board.IO37)
vBatt_pin = analogio.AnalogIn(board.BATTERY)
motors = Motors(AIN1, AIN2, BIN1, BIN2, vBatt_pin)

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

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

line_sensor = LineSensor(lineInput, lineCmd, motors)

# Calibration (à faire une seule fois, pose Eliobot sur la ligne)
line_sensor.calibrate_line_sensors()

# Lecture du seuil sauvegardé
with open("config.json") as f:
config = json.load(f)
threshold = config["line_threshold"]

# Suivi de ligne
while True:
line_sensor.follow_line(threshold)