Problème de programmation NXC
Anagor
Messages postés
4
Statut
Membre
-
Anagor Messages postés 4 Statut Membre -
Anagor Messages postés 4 Statut Membre -
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 !
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:
- Problème de programmation NXC
- Application de programmation - Guide
- Télécharger le programme de pmu - Télécharger - Médias et Actualité
- Fermer un programme de force - Guide
- Comment lancer un programme automatiquement au démarrage de windows - Guide
- Programmation carte à puce vierge ✓ - Forum Matériel & Système
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);
}