Bonjour,
La création d'un programme permet de commander 4 actions avec les 4 flèches. Seulement 3 fonctionnent. Le dernier doit permettre au Thymio de suivre une ligne noire et de s'arrêter quand il y a un obstacle. Le message "VM Execution killed" apparaît systématiquement. Pourtant le mode bleu clair fonctionne.
Merci de votre aide.
Jean-Marc
Bonjour,
Pour que je puisse vous aider précisément il faudrait que vous partagiez votre code, sans ça il est difficile de débugger.
Vu le message il y a probablement une boucle trop longue / boucle infinie qui est interrompue automatiquement.
Aseba est basé sur les événements, il faut donc utiliser les événements, et non des boucles infinies.
Bonsoir et merci riedo,
ci-dessous le code.
Merci de votre aide.
var temps
var FlecheAvant
var FlecheArriere
var FlecheGauche
var i
var LedsCercle[8]
var i2
var i3
var i4
var i5
temps = 200
FlecheAvant = 0
FlecheArriere = 0
FlecheGauche = 0
timer.period[0] = 100
sub Feu
for i5 in 1:10 do
for i2 in 0:7 do
call sound.system(5)
LedsCercle[i2] = 32
for i3 in 1:200 do
call leds.circle(LedsCercle[0],LedsCercle[1],LedsCercle[2],LedsCercle[3],LedsCercle[4],LedsCercle[5],LedsCercle[6],LedsCercle[7])
call leds.top(32,LedsCercle[2],LedsCercle[4])
LedsCercle[i2] = 16
if i2 > 0 then
LedsCercle[(i2 - 1)] = 0
end
if i2 == 7 then
LedsCercle[i2] = 0
end
end
end
for i2 in 0:7 do
LedsCercle[i2] = 32
for i4 in 1:200 do
call leds.circle(LedsCercle[0],LedsCercle[7],LedsCercle[6],LedsCercle[5],LedsCercle[4],LedsCercle[3],LedsCercle[2],LedsCercle[1])
call leds.top(LedsCercle[7],LedsCercle[5],LedsCercle[3])
LedsCercle[i2] = 16
if i2 > 0 then
LedsCercle[(i2 - 1)] = 0
end
if i2 == 7 then
LedsCercle[i2] = 0
end
end
end
end
call leds.circle(0,0,0,0,0,0,0,0)
onevent button.forward
when button.forward == 1 do
FlecheArriere = 0
FlecheGauche = 0
FlecheAvant = 1
call leds.circle(32,0,0,0,0,0,0,0)
if prox.horizontal[2] < 1000 then
motor.left.target = 200
motor.right.target = 200
end
end
onevent timer0
if temps < 100 then
temps = temps + 1
if FlecheArriere == 1 then
if temps == 90 then
motor.left.target = 0
motor.right.target = 0
call leds.circle(0,0,0,0,0,0,0,0)
callsub Feu
FlecheArriere = 0
temps = 200
end
end
if FlecheAvant == 1 then
if temps == 12 then
motor.left.target = 0
motor.right.target = 0
call leds.circle(0,0,0,0,0,0,0,0)
FlecheAvant = 0
temps = 200
end
end
if FlecheGauche == 1 then
if temps == 13 then
motor.left.target = 50
motor.right.target = -50
for i in 1:1000 do
call leds.circle(0,0,0,0,0,0,0,0)
end
FlecheGauche = 0
motor.left.target = 0
motor.right.target = 0
temps = 200
end
end
end
onevent button.center
when button.center == 1 do
end
onevent button.left
when button.left == 1 do
FlecheArriere = 0
FlecheAvant = 0
FlecheGauche = 1
call leds.circle(0,0,0,0,0,0,32,0)
temps = 0
motor.left.target = -86
motor.right.target = 86
end
onevent button.right
when button.right == 1 do
FlecheArriere = 0
FlecheGauche = 0
FlecheAvant = 0
call leds.circle(0,0,32,0,0,0,0,0)
while not prox.horizontal[2] > 2000 do
if prox.ground.delta[0] > 450 then
motor.left.target = 300
motor.right.target = -300
else
motor.left.target = 200
motor.right.target = 200
end
if prox.ground.delta[1] > 450 then
motor.left.target = -300
motor.right.target = 300
else
motor.left.target = 200
motor.right.target = 200
end
end
motor.left.target = 0
motor.right.target = 0
call leds.circle(0,0,0,0,0,0,0,0)
end
onevent prox
when prox.horizontal[2] > 2000 do
if FlecheAvant == 1 then
temps = 0
motor.left.target = 190
motor.right.target = -190
elseif FlecheArriere == 1 then
temps = 0
motor.left.target = 100
motor.right.target = 100
elseif motor.left.speed < 5 and motor.right.speed < 5 then
motor.left.target = 0
motor.right.target = 0
end
end
onevent button.backward
when button.backward == 1 do
FlecheGauche = 0
FlecheAvant = 0
FlecheArriere = 1
call leds.circle(0,0,0,0,32,0,0,0)
motor.left.target = -195
motor.right.target = 195
end
Bonjour,
Alors j'ai testé votre code. Il y a 2 endroits qui le font "killer": la subroutine et la boucle while.
Comme je l'ai dit dans mon message précédent, les boucles trop longues ou infinies sont interrompues automatiquement.
Votre sous-routine a plusieurs for imbriqués les uns dans les autres. Je pense que vous voulez faire des effets lumineux; mais il faut se rendre compte qu'une instruction est très rapide, donc en l'état actuel vous n'auriez pas le temps de voir les effets, et la boucle générée est trop longue.
Aseba est un langage basé sur les événements. La boucle qui vérifie les capteurs, commande les moteurs, est implicite mais elle existe déjà derrière, il ne faut donc pas créer d'autre boucle longue qui empêche l'exécution des autres événements.
Par exemple, si vous écrivez quelque chose comme
var avance=0
onevent button.forward
avance= 100
onevent motor
while avance==0
motor speed=0
end
motor speed=500
ça ne marchera pas. l'exécution restera coincée dans le while, et l'événement button.forward ne peut pas etre exécuté.
Il faut plutot utiliser les événements, les variables et les timer.
Par exemple pour un effet lumineux chenille sur le cercle
var leds[8]=[0,0,0,0,0,0,0,0]
var anim=1
timer.period[0]=100 #chaque 10e de seconde
onevent timer0
anim +=1
if anim>7 then
anim=0
leds[anim]=32
leds[7]=0
call leds.circle(leds[0],leds[1],leds[2],leds[3],leds[4],leds[5],leds[6],leds[7])
else
leds[anim]=32
leds[anim-1]=0
call leds.circle(leds[0],leds[1],leds[2],leds[3],leds[4],leds[5],leds[6],leds[7])
end
De même pour réagir aux obstacles, pas de while, mais des if dans les événements de capteurs, et des commandes en vitesse.