bonjour
je m'appelle benjamin et je suis actuellement en T SI.
j’espère avoire posté au bonne endroit sinon merci de bien me redirigé, je fait pour un bien.
je m’excuse avance pour mon orthographe que je sait déplorable.
mon projet de robotique est un robot autonome.
autonome notamment dans ces déplacement qui luis son prés programmé,
il devras également s’arrêter obstacle imprévus tout en se rapprochant au maximum des obstacles connues. les autres fonctions viendront plus tard une chose à la fois.
pour l'instant aucun moteur aucun capteur je m’occupe de la gestion spatiale.
donc de la lecture de la trajectoire demandé, du calcule de la position théorique de mon robot en x y
et angle, et d'en déduire les moteurs concerné en fonction de tout cela.
évidemment je demande pas que l'on me mâche le travaille, je suis ici avant tout pour comprendre
mes erreurs. je ne suis pas venus les mains vident voici mon programme sur arduino évidement. avec les ligne d'erreur que je n’arrive pas à résoudre.
// INITIALISATION DES VARIABLEs
int vmaxrec = 10;// vitesse max sur sol plat
int vmaxcirc = 10;//vitesse max circulaire sur sol plat
long unsigned int tempreel = 0;//temps réel
long unsigned int tempprog = 0;// ?temps soustrayant les poses du aux arrets imprévus sur le parcour, permet le repére dans les etapes de parcours sans bug de saut d'étape
enum orientation {sud,est,nord,ouest,horaire,trigo,stops}; // direction d'angle ou de mouvement réctiligne demandé
float degrereel = 0; //direction de la tête du robot dans le repére x y en radiant au démarage à droite à l'est
float x = 0; // position d'origine en x (nb: verifier le set utilisé)
float Y = 0; // position d'origine en y
int contact = 0; // varible on off coup d'envois
int danger = 0;// détection d'un obstacle imprévus arrêt du véicule
int margesecu = 20;// distance maximal entre le robot et un obstacle inconu (unitée à vérifier)
int margemur = 10; // distance maximal entre le robot et un obstacle de l'environnement connue (unitée à vérifier)
long unsigned int ecartp = 0; //tempreel-tempprog
long unsigned int finjeu = 100000; // temps de fin de jeux en mili seconde
long unsigned int calcutemp = 0; //variable de comparaison du tempprograme
long unsigned int a = 0; //retard du milisse avant début du programe
//SETUP
void setup() {
// déterminé l'itinéraire près programmés
int parcour [2][7]{{500,400,600,200,90,180,400}, // déterminé la distance ou l'angle en mm et en degrés
{nord,sud,est,ouest,horaire,trigo,stops}};//déterminé le sens la direction
}
// BOUCLE
void loop() {
// detection du coup d'envois
//lire on off et assigner 1 à contact si ON ( à ajouté)
if ((contact == 1)&&(tempreel == 0)){
a = millis;
tempreel =millis-a;
}
// aprés coup d'envois
if (tempreel != 0){
//prise valeur capteur..... (à ajouté)
// si x y proche murs alors réduire marge de sécurité sur côté concerné, variable(x,y,margemur; margesecu;non cpateur)
// si capteurs inférieur à marge alors danger = 1 sinon danger = 0
if ((danger== 1)||(tempreel == finjeu)){ ecartp = ecartp+tempreel-(millis-a);// commencer à calculer l'écart temporelle
//alor tout moteur = low (à ajouté)
}
if (danger == 0){
tempreel = millis-a;
tempprog = tempreel-ecartp;
calcutemp =0;
for (int i=1; calcutemp <= tempprog; i++){calcutemp = calcutemp + (parcour[1][i])/vmaxrec; //(unité à faire ?)
int b = i;}
orientation = parcour [2][b] //(unité à faire ?)
if(orientation == sud){// pour aller à haut
x = x - sin(degrereel)*(tempprog-calcutemp)*vmax; //calculés x y théorique (unité à faire ?)
y = y - cos(degrereel)*(tempprog-calcutemp)*vmax;
switch((cos(degrereel)>-sqrt(2)/2)&&(cos(degrereel)<=sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si sa pointe vers le bas
;} //alors allumer tel moteurs
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si pointe vers le haut ...
;}
case((cos(degrereel)>=-1)&&(cos(degrereel)<=-sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<sqrt(2)/2)){
;} // si pointe vers la gauche ...
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<=1)&&(sin(degrereel)>-sqrt(2)/2)&&(sin(degrereel)<=sqrt(2)/2)){
;} // si pointe vers la droite ....
}
if(orientation == est){//pour aller à droite
x = x + cos(degrereel)*(tempprog-calcutemp)*vmax;//calculé x y théorique (unité à faire ?)
y = y + sin(degrereel)*(tempprog-calcutemp)*vmax;
switch((cos(degrereel)>-sqrt(2)/2)&&(cos(degrereel)<=sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si sa pointe vers le bas
;} //alors allumer tel moteurs
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si pointe vers le haut ...
;}
case((cos(degrereel)>=-1)&&(cos(degrereel)<=-sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<sqrt(2)/2)){
;} // si pointe vers la gauche ...
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<=1)&&(sin(degrereel)>-sqrt(2)/2)&&(sin(degrereel)<=sqrt(2)/2)){
;} // si pointe vers la droite ....
}
if(orientation == nord){ //pour aller en bas
x = x + sin(degrereel)*(tempprog-calcutemp)*vmax; //calculé x y théorique (unité à faire ?)
y = y + cos(degrereel)*(tempprog-calcutemp)*vmax;
switch((cos(degrereel)>-sqrt(2)/2)&&(cos(degrereel)<=sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si sa pointe vers le bas
;} //alors allumer tel moteur
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si pointe vers le haut ...
;}
case((cos(degrereel)>=-1)&&(cos(degrereel)<=-sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<sqrt(2)/2)){
;} // si pointe vers la gauche ...
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<=1)&&(sin(degrereel)>-sqrt(2)/2)&&(sin(degrereel)<=sqrt(2)/2)){
;} // si pointe vers la droite ....
}
if(orientation == ouest){ //pour aller à gauche
// allumer les moteurs conscernés et éteindre les autres calculés (à faire)
x = x - cos(degrereel)*(tempprog-calcutemp)*vmax; //calculé x y théorique (unité à faire ?)
y = y - sin(degrereel)*(tempprog-calcutemp)*vmax;
switch((cos(degrereel)>-sqrt(2)/2)&&(cos(degrereel)<=sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si sa pointe vers le bas
;} //alors allumer tel moteurs
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1)){// si pointe vers le haut ...
;}
case((cos(degrereel)>=-1)&&(cos(degrereel)<=-sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<sqrt(2)/2)){
;} // si pointe vers la gauche ...
case((cos(degrereel)>=-sqrt(2)/2)&&(cos(degrereel)<=1)&&(sin(degrereel)>-sqrt(2)/2)&&(sin(degrereel)<=sqrt(2)/2)){
;} // si pointe vers la droite ....
}
if(orientation == horaire){
// allumé les moteurs conscernés et éteindre les autres (a faire)
degrereel = degrereel - vmaxcirc * (tempprog - calcutemp); // calculé degrés théorique (unité à faire ?)
}
if(orientation == trigo){
// allumer les moteurs conscernés et éteindre les autres (a faire)
degrereel = degrereel + vmaxcirc * (tempprog - calcutemp); //calculés degrés théorique (unité à faire ?)
}
if(orientation == stops){//éteindre tout les moteurs
}
}
}
}
le principal problème semble concerné une assignation de variable qui rentre en conflit avec le millis
dois'je changé l'assignation de tout mes variable concernant le temps si oui en quoi
puis une erreur de parenthèse d'ont je ne vois pas l'origine
et enfin une varible qui mes dit non déclaré alors qu'il me semble l'avoir bien fait.
merci d'avance pour votre aide.