Problème de programmation NXC

Fermé
Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016 - Modifié par jipicy le 22/05/2016 à 19:35
Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016 - 23 mai 2016 à 19:53
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();
}
}
}
A voir également:

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
22 mai 2016 à 19:29
Bonjour,

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.
0
Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016
22 mai 2016 à 21:12
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();
}
}
}
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016
22 mai 2016 à 21:18
si on veut reaffecter une variable, in faut pas en recreer une autre.
Je ferais plutôt :
int valueS1 = SENSOR_1; 
while (SENSOR_1 == 1)
{
OnFwd(OUT_A, 50);
OnFwd(OUT_B, 50);
valueS1 = SENSOR_1;
}
0
Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016
22 mai 2016 à 21:23
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:

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);
}
0
Anagor Messages postés 4 Date d'inscription dimanche 22 mai 2016 Statut Membre Dernière intervention 23 mai 2016
23 mai 2016 à 19:53
Nous avons appliqué ce deuxième conseil malheureusement cela ne fonctionne toujours pas... Une autre idée ? Merci beaucoup de votre aide !
0