Bonjour, nous sommes en terminale S en spécialité ISN et nous devons réaliser un programme pour notre projet de bac de cette spé. Nous avons choisi de programmer un robot NXT en langage NXC. Le programme ci-dessous devrait permettre au robot de suivre une ligne droite noire avec à la droite de cette ligne, une ligne rouge et à gauche, une ligne bleue. Notre programme se complique avec une fonction de contournement d'un obstacle situé sur la trajectoire. Le robot le contournerait par la gauche.
Nous disposons d'un capteur couleur (pour suivre la ligne), un capteur ultrason ( qui permet au robot de se repérer par rapport à l’obstacle) et un capteur toucher (qui détecte l'obstacle)
Notre problème se situe dans la fonction sub contourner. En effet, le robot n'effectue pas cette fonction sauf pour le début où il doit tourner juste après la détection par le capteur toucher.
Nous avons plus qu'une semaine devant nous, c'est pourquoi nous cherchons de l'aide. Merci d'avance pour vos réponses !
sub avancer ()
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
sub arret ()
{
Off(OUT_A);
Off(OUT_B);
}
sub tourner_gauche()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(300); // 0.3 = 10°
Off(OUT_A);
Off(OUT_B);
}
sub tourner_droite()
{
OnFwd(OUT_A, 50);
OnRev(OUT_B, 50);
Wait(300);
Off(OUT_A);
Off(OUT_B);
}
sub contourner ()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
int valueS1 = SENSOR_1;
while (valueS1 == 1)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
while (valueS1 != 1)
{
int valueS3 = SENSOR_3;
if (valueS3 <= 15)
{
avancer();
}
else if (valueS3>15 || valueS3==0)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(1000);
OnFwd(OUT_A, 50); // tourne à droite
OnRev(OUT_B, 50);
Wait(2500);
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
}
}
task main()
{
while (1)
{
SetSensor(S1,SENSOR_COLORFULL);
SetSensorTouch(S2);
SetSensorLowspeed(S3);
int valueS1 = SENSOR_1;
int valueS2 = SENSOR_2;
int valueS3 = SENSOR_3;
if (valueS1==1 & valueS2==0)
{
avancer();
}
else if (valueS1==5 & valueS2==0)
{
arret ();
tourner_gauche();
}
else if (valueS1==2 & valueS2==0)
{
arret ();
tourner_droite();
}
else if (valueS2==1)
{
arret ();
contourner();
}
}
}
Les tests en boucle comme while (valueS1 == 1) ne testent qu'une copie du SENSOR_1 qui aura constamment la même valeur. Il faut relire le capteur à chaque itération par while (SENSOR_1 == 1).
Idem pour les autres boucles.
Nous pensons avoir saisi le problème mais le robot se comporte toujours comme si la valeur du capteur ultrason n'était pas lu. Est-ce que ce sont les bonnes modifications ? Merci de votre aide !
sub avancer ()
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
sub arret ()
{
Off(OUT_A);
Off(OUT_B);
}
sub tourner_gauche()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(300); // 0.3 = 10°
Off(OUT_A);
Off(OUT_B);
}
sub tourner_droite()
{
OnFwd(OUT_A, 50);
OnRev(OUT_B, 50);
Wait(300);
Off(OUT_A);
Off(OUT_B);
}
sub contourner ()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
int valueS1 = SENSOR_1;
while (SENSOR_1 == 1)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
int valueS1 = SENSOR_1;
}
while (SENSOR_1 != 1)
{
int valueS3 = SENSOR_3;
if (SENSOR_3 <= 20)
{
avancer();
}
else if (SENSOR_3 > 20)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(1500);
OnFwd(OUT_A, 50); // tourne à droite
OnRev(OUT_B, 50);
Wait(2000);
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
}
}
task main()
{
while (1)
{
SetSensor(S1,SENSOR_COLORFULL);
SetSensorTouch(S2);
SetSensorLowspeed(S3);
SensorUS(S3);
int valueS1 = SENSOR_1;
int valueS2 = SENSOR_2;
int valueS3 = SENSOR_3;
if (valueS1==1 & valueS2==0)
{
avancer();
}
else if (valueS1==5 & valueS2==0)
{
arret ();
tourner_gauche();
}
else if (valueS1==2 & valueS2==0)
{
arret ();
tourner_droite();
}
else if (valueS2==1)
{
arret ();
contourner();
}
}
}
Nous nous demandions aussi, comme le capteur ultrason semble compliqué à manipuler, si il y avait un moyen, à l'aide du capteur couleur, de faire avancer le robot jusqu'à une ligne de couleur et qu'à cette dernière il tourne, autrement dit :
-Faire avancer le robot jusqu'à une ligne rouge
-Faire tourner le robot d'un quart de tour
-Faire avancer le robot dans sa nouvelle direction.
Merci encore pour votre aide.
3 terminales en détresse.
PS: Voici le programme que nous avions essayé mais qui est resté sans succès:
sub avancer ()
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
sub arret ()
{
Off(OUT_A);
Off(OUT_B);
}
sub tourner_gauche()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(300); // 0.3 = 10°
Off(OUT_A);
Off(OUT_B);
}
sub tourner_droite()
{
OnFwd(OUT_A, 50);
OnRev(OUT_B, 50);
Wait(300);
Off(OUT_A);
Off(OUT_B);
}
sub contourner ()
{
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
int valueS1 = SENSOR_1;
while (SENSOR_1 == 1)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
int valueS1 = SENSOR_1;
}
while (SENSOR_1 != 1)
{
int valueS3 = SENSOR_3;
if (SENSOR_3 <= 20)
{
avancer();
}
else if (SENSOR_3 > 20)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(1500);
OnFwd(OUT_A, 50); // tourne à droite
OnRev(OUT_B, 50);
Wait(2000);
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(2500);
}
}
task main()
{
while (1)
{
SetSensor(S1,SENSOR_COLORFULL);
SetSensorTouch(S2);
SetSensorLowspeed(S3);
SensorUS(S3);
int valueS1 = SENSOR_1;
int valueS2 = SENSOR_2;
int valueS3 = SENSOR_3;
if (valueS1==1 & valueS2==0)
{
avancer();
}
else if (valueS1==5 & valueS2==0)
{
arret ();
tourner_gauche();
}
else if (valueS1==2 & valueS2==0)
{
arret ();
tourner_droite();
}
else if (valueS2==1)
{
arret ();
contourner();
}
}
}
Je ferais plutôt :
-Faire avancer le robot jusqu'à une ligne rouge
-Faire tourner le robot d'un quart de tour
-Faire avancer le robot dans sa nouvelle direction.
Merci encore pour votre aide.
3 terminales en détresse.
PS: Voici le programme que nous avions essayé mais qui est resté sans succès:
task main()
{
SetSensor(S1,SENSOR_COLORFULL);
int valueS1 = SENSOR_1;
while (SENSOR_1 !=5)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
}
OnRev(OUT_A, 50);
OnFwd(OUT_B, 50);
Wait(1500);
}