Bonjour,
Je n'ai pas trouvé de forum consacré à l'utilisation de micropython, mais je n'ai peut être pas bien cherché...
En vue de la prochaine rentrée scolaire, je me suis lancé dans la programmation de robots avec micropython (mu editor) et, sur les exemples que je lis, je vois beaucoup de programmes basés sur une boucle infinie
Cela me perturbe car, jusqu'à maintenant, on m'avait toujours appris qu'il ne fallait jamais avoir une boucle dont on ne sort jamais (cas très classique de programme qui plante).
Code : Sélectionner tout - Visualiser dans une fenêtre à part While True:
J'ai essayé d'écrire des petits programmes en utilisant une boucle While qui s'arrête lorsqu'une condition est remplie. En voici un qui permet normalement de suivre une ligne noire jusqu'au premier carrefour rencontré.
Le robot est piloté par une carte micro:bit. Il possède 2 capteurs de ligne espacés de près de 3 cm qui enjambent une ligne noire de 15 mm de largeur
Dans ce programme, le robot (Bit:Bot de 4Tronix) n'avance pas. Pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 from microbit import * import neopixel np = neopixel.NeoPixel(pin13, 12) moteurG = pin0 moteurD = pin1 ligneG = pin11 ligneD = pin5 def allumer(rouge, vert, bleu): for numero in range(0, 12): np[numero] = (rouge, vert, bleu) np.show() def avancer(vitesse): pin12.write_digital(0) # moteur D marche avant pin8.write_digital(0) # moteur G marche avant carrefour = False allumer(0, 0, 0) while not carrefour: gauche = ligneG.read_digital() droite = ligneD.read_digital() # fond noir - blanc if ((gauche == 1)and(droite == 0)): # tourner à gauche allumer(0, 50, 0) # allumer en vert moteurD.write_analog(vitesse) moteurG.write_analog(0) while ((ligneG.read_digital() == 1) and (ligneD.read_digital() == 0)): pass # fond blanc - noir elif ((gauche == 0)and(droite == 1)): # tourner à droite allumer(0, 0, 50) # allumer en bleu moteurD.write_analog(0) moteurG.write_analog(vitesse) while ((ligneG.read_digital() == 0)and (ligneD.read_digital() == 1)): pass elif ((gauche == 0)and(droite == 0)): # fond blanc - blanc allumer(50, 50, 50) # allumer en blanc moteurD.write_analog(vitesse) # avancer tout droit moteurG.write_analog(vitesse) while ((ligneG.read_digital() == 0)and (ligneD.read_digital() == 0)): pass else: # fond noir - noir carrefour = True allumer(0, 0, 0) moteurG.write_analog(0) moteurD.write_analog(0) avancer(300) allumer(50, 0, 50) # allumer en violet
En fait dès que j'allume le robot (après avoir flashé le programme dans sa mémoire), il reste immobile et les leds s'allument en violet. Autrement dit, il n'effectue pas la procédure "avancer" (ou il en sort immédiatement)
J'ai essayé d'ajouter une instruction break, mais rien n'y fait. Je cherche depuis plus d'une semaine en vain. Merci de m'aider ou de me donner une piste.
Partager