-
14/04/2012 - 00h47 nasef
Programmation capteur d'obstacle
Bonjours, alors voilà depuis un moment je travaille sur un robot qui permet la surveillance d'un lieu.
Nous l'étudions en cours et je fais face à un problème. Je suis sensé programmer le robot grâce à ces
4 capteurs d'obstacle, le but et tant qu'il retourne jusqu’à sa base afin qu'il puisse recharger, donc pour cela J’ai créé une carte avec des leds a émission infrarouge, j'ai programmé de façon à ce que lorsque le robot détecte le moindre rayonnement infrarouge
il se dirige vers celle-ci, sauf qu'il ne s'arrête jamais. J'ai donc essayé toute les solutions possible et inimaginable mais je n'arrive vraiment pas. Le capteur d'obstacle détecte une valeur entre 1 et 255, le problème et que quand je dis au capteur d'obstacle, si capteur d'obstacle>10 alors avancer, je n'arrive pas à lui dire si tu es a 235 alors arrête toi. J'ai pensais a créé deux variable différente dont celle-ci sont égal a la valeur que le capteur renvoi, donc j'utilise une variable pour le faire avancer jusqu'à la base, et une autre afin de le faire arrêter sachant que c'est deux variable renvoir toute les deux les valeur que des capteur, mais même comme cela je ne comprends pas pourquoi ça ne marche pas. J'ai vraiment besoin d'aide je passe un examen de bac et je dois présenter cela, si quelqu’un pouvais m'aider je lui serais vraiment reconnaissant.
-
14/04/2012 - 18h24 umfred
Re : Programmation capteur d'obstacle
le bout de code de cette fonction et de la façon dont est mesuré "capteur d'obstacle" pourrait aider à trouver ton problème (avec éventuellement le nom du compilateur , etc etc).
Parce que là, je ne vois pas trop le problème:
tu dois avoir une boucle dans laquelle tu fais ta mesure et en sortie tu testes cette valeur et tu agis en conséquence.
ça pourrait donner un truc du genre: Code: while(1)
{
....
capture_obstacle=mesure();
if(capture_obstacle < 10)
{
// on fait rien
}
if(capture_obstacle >= 10 & capture obstacle < 235)
{
//le robot avance
}
if(capture_obstacle >= 235)
{
//on arrête le robot
}
...
} -
14/04/2012 - 22h28 nasef
Re : Programmation capteur d'obstacle
Merci pour ta réponses, en faite j'ai déjà testé cette solution mais d'une façon différente, et ça n'avait pas marché mais je comprends mon erreur maintenant, mais j'aimerai savoir si sa reviens a la même chose si je dis
while(1)
{
if(10<capteur d'obstacle<235)
{
// Avancer ;
}
else if(capteur d'obstacle>235)
{
Arrêt ;
}
}
J'avais une autre question lorsque tu me dis capteur d’obstacle=mesure, mesure est une variable ou bien c'est juste pour me dire que l'on veut faire un test de mesure. Parce que si c une variable je ne vois pas elle sert à quoi. En tous cas merci de m’aider c’est vraiment gentille.
-
15/04/2012 - 09h53 Jack
Re : Programmation capteur d'obstacle
@nir92
Merci de lire et respecter les règles participatives de ce forum à l'avenir ! Règles participatives pour ce nouveau forum -
15/04/2012 - 13h54 umfred
Re : Programmation capteur d'obstacle
 Envoyé par nasef if(10<capteur d'obstacle<235) ce genre de test va faire une erreur de compilation à mon avis
mais la structure en if .. else if .. marche aussi
J'avais une autre question lorsque tu me dis capteur d’obstacle=mesure, mesure est une variable ou bien c'est juste pour me dire que l'on veut faire un test de mesure. Parce que si c une variable je ne vois pas elle sert à quoi.
Si tu relis j'ai marquer capteur_obstacle=mesure();. donc les parenthèses indique que mesure() est une fonction, et cette fonction dans mon exemple sert à lire la valeur du convertisseur analogique/numérique provenant de ton capteur d'obstacle.
-
15/04/2012 - 18h22 nasef
Re : Programmation capteur d'obstacle
Merci umfred, j’ai très bien compris ce que tu m’as dit, mais en faite pour la ligne de code
Capteur_d’obstale= mesure, je crois pas que cela soit nécessaire parce que j’ai déjà des fonction prédéfini qui me permette de renvoyer la valeur que le convertisseur analogique numérique donne, en réalité j’ai 4 capteur, à l’avant, c’est 4 capteur ont pour fonction
SEN_OBS_ANALOG(OBS_SIDE_L), ce qui correspond à capteur gauche
SEN_OBS_ANALOG(OBS_CENTER_L), ce qui correspond à capteur centre gauche
SEN_OBS_ANALOG (OBS_SIDE_R), capteur droit
SEN_OBS_ANALOG(OBS_CENTER_R), capteur centre droit. Donc lorsque je dis par exemple
if(SEN_OBS_ANALOG(OBS_SIDE_L)> 10)
{
MOT_STR(100,FWD,DISTANCE,150); // correspond à la fonction avancer.
}
Mon robot comprend très bien est dès qu’il capte un rayonnement supérieure a 10 il avance, donc si je comprends bien une mesure est bien faite au niveau de la sortit du convertisseur.
Par rapport la ligne de code if(10<SEN_OBS_ANALOG(OBS_SIDE_ L)<235), je les compiler, et il n’y a pas de souci, donc peut être que le robot ne comprendra pas ce que cela veux dire, mais au pire des cas je prends la ligne de code que tu ma donnée. En tout cas merci beaucoup pour ton aide et tien moi au courant par rapport à la ligne de code capteur d’obstacle = mesure() ; .
-
15/04/2012 - 18h27 umfred
Re : Programmation capteur d'obstacle
c'était un exemple d'ordre général
mais pour ton robot, j'espere que tu as pris en considération tes 4 capteurs pour le faire ou avancer ou reculer ou tourner ou arrêter.
-
15/04/2012 - 18h41 Xoxopixo
Re : Programmation capteur d'obstacle
Bonjour,  Envoyé par Nasef if(10<SEN_OBS_ANALOG(OBS_SIDE_ L)<235), Selon le compilateur, ce type de code peut être compilé, mais ne donnera probablement pas le résultat attendu. (soit la vérification que la valeur variable soit compris entre 10 et 235)
Il s'agit ici d'une expression logique.
Donc si le compilateur commence l'évaluation de l'expression à gauche, il va faire le premier test :
10<SEN_OBS_ANALOG(OBS_SIDE_L)
Ce qui va donner le résultat 0 ou 1 (valeurs de faux ou vrai)
Ensuite cette valeur va être testée avec 235 soit :
0<235 ou 1<235
Le résultat final sera donc toujours égal à 1 (vrai).
Si le compilateur commence l'évaluation de l'expression à droite :
Le premier test sera SEN_OBS_ANALOG(OBS_SIDE_L)<235
Ce qui va donner le résultat 0 ou 1 (valeurs de faux ou vrai)
Ensuite cette valeur va être testée avec 10 soit :
10<0 ou 10<1
Le résultat final sera donc toujours égal à 0 (faux).
En bon vivant, rien ne vaut un bonne logique ternaire. -
15/04/2012 - 18h51 nasef
Re : Programmation capteur d'obstacle
Ha, merci je comprends, parce que maintenant que j’y pense j'avais déjà essayé cette solution mais elle ne marche pas. Donc je vais essayer ta solution. Apres par rapport à mon programme il marche très bien, il arrive jusqu'à la base, c'est juste qu'il ne s'arrête pas. En tout cas merci mon ton aide précieuse, je te tiens au courant si j'ai problème.
-
06/05/2012 - 23h22 nasef
Re : Programmation capteur d'obstacle
Bonjours, je me permets de vous recontacter parce que j'ai modifié le programme comme vous m'aviez dit, c'est à dire avec
Capteur d'obstacle>10 & capteur d'obstacle < 235 mais lorsque mon robot arrive à proximité de la base, il ne veut pas s'arrêter il avance tous droit. En réalité nous sommes plusieurs à travailler sur cela et somme même pas foutu de y arriver ^^. Je vous mets donc le programme que J’ai réalisé afin que peux afin que si vous le voulais bien, essayer de m’aider. Merci à vous.
/*** Le code exécutable commence ici ***/
void main()
{
SEN_CONFIG();
MOT_CONFIG();
LED_TOP_RED_OFF();
LED_TOP_GREEN_ON();
while(1)
{
if((SEN_OBS_ANALOG(OBS_SIDE_L) >10)&(SEN_OBS_ANALOG(OBS_SIDE_ L)<235)|(SEN_OBS_ANALOG(OBS_CE NTER_L)>10)&(SEN_OBS_ANALOG(OB S_CENTER_L)<235))
{
MOT_ROT(100,FWD,WHEEL,LEFT,ANG LE,4); // TOURNE A GAUCHE DE 10° A VITESE 100%
while(!MOT_END){};
MOT_STR(100,FWD,DISTANCE,150);// avancé a une vitesse de 100% DEVANT AVEC DISTANCE DE 15 CM.
while(!MOT_END){}; // ARRET DU ROBOT
}
while((SEN_OBS_ANALOG(OBS_SIDE _R)>10)&(SEN_OBS_ANALOG(OBS_SI DE_R)<235)|(SEN_OBS_ANALOG(OBS _CENTER_R)>10)&(SEN_OBS_ANALOG (OBS_CENTER_R)<235)) // side R = droite, side L = gauche
{
MOT_ROT(100,FWD,WHEEL,RIGHT,AN GLE,4);
while(!MOT_END){};
MOT_STR(100,FWD,DISTANCE,150);
while(!MOT_END){};
}
if(SEN_OBS_ANALOG(OBS_SIDE_R)> 235)
{
while(!MOT_END){};
}
if(SEN_OBS_ANALOG(OBS_CENTER_R )>235)
{
while(!MOT_END){};
}
if(SEN_OBS_ANALOG(OBS_CENTER_L )>235)
{
while(!MOT_END){};
}
if(SEN_OBS_ANALOG(OBS_SIDE_L)> 235)
{
while(!MOT_END){};
}
}
| | |