Intro
Détecter le bord de la table
Dans cette leçon, tu vas apprendre à détecter le bord d’une table et à éviter qu’Eliobot ne tombe dans le vide.
Étape 1
Déclaration des entrées / sorties
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 2
Déclaration des capteurs
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.
Déclaration des moteurs
Pour déclarer les moteurs on va utiliser une bibliothèque qui se nomme « pwmio ».
import pwmio
Ensuite nous définissons chaque moteur, son sens et la batterie.
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)
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 3
Analyser les capteurs
Dans un premier temps, nous allons reprendre le programme de la dernière leçon, disponible ci-dessous :
while True:
print(lineSensor.get_line(3))
time.sleep(1)
Nous allons lancer ce programme et analyser ce qui se passe lorsque nous passons du vide à la table :
On peut voir qu’au début du programme, je suis dans le vide et la valeur renvoyée par le capteur est 0. Au moment où je passe sur la table, la valeur augmente et se stabilise autour de 47000. Je t’invite à reproduire l’expérience par toi-même pour obtenir ta propre valeur personnalisée.
Pour détecter le vide, nous choisirons ici une valeur seuil. Nous dirons que si la valeur du capteur passe en dessous de 40 000, alors nous sommes au bord de la table.
Étape 4
Éviter le vide
Nous plaçons dans une boucle une condition qui stipule que si la valeur du capteur passe en dessous de 40 000, alors nous reculons pendant une seconde et tournons à droite pendant une seconde pour changer de direction sinon on avance.
while True:
if lineSensor.get_line(2) < 40000:
motors.move_backward(100)
time.sleep(1)
motors.motor_stop()
motors.turn_right(100)
time.sleep(1)
motors.motor_stop()
else:
motors.move_forward(100)
Étape 5
Programme final
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
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)
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)]
motors = Motors(AIN1, AIN2, BIN1, BIN2, vBatt_pin)
lineSensor = LineSensor(lineInput, lineCmd, motors)
while True:
if lineSensor.get_line(2) < 40000:
motors.move_backward(100)
time.sleep(1)
motors.motor_stop()
motors.turn_right(100)
time.sleep(1)
motors.motor_stop()
else:
motors.move_forward(100)
Bravo !
Et voila, ton programme est fini ! Il ne te reste plus qu’à le Téléverser pour admirer le résultat