Aller au contenu


Photo
- - - - -

code robot autonome


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 mopi

mopi

    Membre

  • Membres
  • 18 messages

Posté 15 janvier 2012 - 09:33

Bonjour,
Je suis en train de réaliser un robot à apprentissage automatique basé sur la régression linéaire (Le robot n'est à la base pas programmé pour se déplacer dans une pièce mais après l'avoir guidé avec une télécommande il comprend les tensions qu'il doit envoyé dans ses moteurs en fonction des valeurs retournées par ses capteurs.)
Bref, tout d'abord, il faut que je sache programmé le robot de façon à ce qu'il se déplace dans une pièce tout seul (comme roby) pour après passer à la partie intelligence artificielle.
Mais voilà je bloque. Je sais que mes fonctions avancer,reculer,droite,gauche sont juste (j'ai fait un programme ou le robot effectue les déplacements que je lui demande). Je sais aussi que les capteurs ultrasons sont programmés correctement puisque qu'avec le serial monitor j'ai vérifié que les valeurs retournées étaient justes.
C'est dans ma fonction "if" que j'ai des doutes...et j'ai peur aussi que je me trompe quand j'essaye de retourner les valeurs des capteurs obtenues dans les différentes fonctions. Pourtant j'ai vérifié qu'elles sont bien supérieurs à la valeur que je test mais le robot tourne sur lui même à droite.
Voilà le code si quelqu'un pouvait m'aider.
Merci beaucoup

/*--------------------------------------------------------*/
/** Déclaration des prototypes des fonctions **/
/*--------------------------------------------------------*/

// Capteurs US
void requete();
int mesure_distance(char capteur);
int mesure_reponse(char capteur);
void affichage();

//Déplacement
void avancer(char a,char B);
void reculer(char c,char d);
void droite(char e,char f);
void gauche(char g,char h);


/*--------------------------------------------------------*/
/** Déclaration des constantes et variables blobales **/
/*--------------------------------------------------------*/
//capteurs US
const int capteurdroit=7;
const int capteurgauche=8;
long duree;
int distance_cm;
int distancedroite, distancegauche;

//Moteurs
const int E1 = 5; // contrôle la vitesse du moteur 1 (gauche)
const int E2 = 6; // contrôle la vitesse du moteur 2 (droite)
const int M1 = 4; //contrôle la direction (avancer ou reculer) du moteur 1 (gauche)
const int M2 = 7; //contrôle la direction (avancer ou reculer) du moteur 2 (gauche)






/*--------------------------------------------------------*/
/** Début du programme - Setup **/
/*--------------------------------------------------------*/
void setup() {
Serial.begin(9600);

//direction robot
pinMode(M1, OUTPUT); //met la pin du moteur 1 en sortie
pinMode(M2, OUTPUT); //met la pin du moteur 2 en sortie
pinMode(E1, OUTPUT); //met la pin de E1 en sortie
pinMode(E2, OUTPUT); //met la pin de E2 en sortie
//direction robot
}

/*--------------------------------------------------------*/
/** Boucle principale du programme **/
/*--------------------------------------------------------*/
void loop()
{
distancedroite=mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
//Serial.println("capteur droit:");
//affichage(); //affiche cette distance

distancegauche=mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit
//Serial.println("capteur gauche:");
//affichage(); //affiche cette distance

if (distancegauche<20) //si un obstacle se presente à gauche
{
droite (100,100); //on tourne à droite
delay(400); //pendant 0,4 secondes
}

else if (distancedroite<20) //si un obstacle se presente à droite
{
gauche (100,100); //on tourne à gauche
delay(400); //pednant 0,4 secondes
}

else
{
avancer (130,130); //sinon on avance tout le temps
}
//delay(1000); //attend pour un affichage plus clair
}




/*--------------------------------------------------------*/
/** Fonctions relatives aux capteurs US **/
/*--------------------------------------------------------*/
int mesure_distance(char capteur)
{
requete(capteur); //envoie la demande au capteur
mesure_reponse(capteur); //recupere la distance mesurée
return distance_cm;
}


void requete(char capteur)
{
pinMode(capteur,OUTPUT);

digitalWrite(capteur, LOW);
delayMicroseconds(2); //delai d'attente au départ, au niveau 0
digitalWrite(capteur, HIGH);
delayMicroseconds(15); // delai de 15 uS, imposant un niveau '1' au capteur
digitalWrite(capteur, LOW);
}




int mesure_reponse(char capteur)
{
pinMode(capteur,INPUT);

duree=pulseIn(capteur,HIGH); // attend l'impulsion du capteur, et retourne sa durée en microseconde

//if(duree>30000) //test de la condition d'abscence d'obstacle
// duree=0;

distance_cm=duree/58;
return distance_cm;
}


void affichage()
{

// if(duree==0) // Si on a détécté precedemment qu'il n'y a pas d'obstacle, on l'affiche
// Serial.println("Pas d'obstacle!!!!!");

// else // Si non, on affiche la distance
// {
Serial.print(duree);
Serial.println("uS");

Serial.print(distance_cm);
Serial.println("cm");
// }
}



/*--------------------------------------------------------*/
/** Fonctions relatives aux moteurs **/
/*--------------------------------------------------------*/


void avancer(char a,char B) //avancer
{
analogWrite (E1,a); //PWM Speed Control a permet de changer la vitesse du moteur 1
digitalWrite(M1,HIGH); //M1 avance
analogWrite (E2,B);
digitalWrite(M2,HIGH); //M2 avance
}

void reculer(char c,char d) //reculer
{
analogWrite (E1,c); //PWM Speed Control
digitalWrite(M1,LOW); //M1 recule
analogWrite (E2,d);
digitalWrite(M2,LOW); //M2 recule
}

void droite(char e,char f) //tourner à droite
{
analogWrite (E1,e); //PWM Speed Control
digitalWrite(M1,HIGH);
analogWrite (E2,f);
digitalWrite(M2,LOW);
}

void gauche(char g,char h) //tourner à gauche
{
analogWrite (E1,g); //PWM Speed Control
digitalWrite(M1,LOW);
analogWrite (E2,h);
digitalWrite(M2,HIGH);
}

#2 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 15 janvier 2012 - 11:58

Salut mopi , ton robot tu le contrôle avec le serial monitor de logiciel Arduino , non ?????

#3 mopi

mopi

    Membre

  • Membres
  • 18 messages

Posté 16 janvier 2012 - 11:46

Salut
Merci pour ta réponse.
En fait le serial monitor je m'en sert seulement pour vérifier si les capteurs ultrasons renvoyaient bien les bonnes valeurs. Et ils renvoient bien une distance (il récupère 1 durée que je divise pour obtenir une distance comme c'est expliqué dans le datasheet des capteurs.)
Je pense vraiment que c'est dans mon "if" qu'il y a 1 problème?
Merci

#4 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 16 janvier 2012 - 12:26

En gros ton problème c'est quoi sur ton robot quesqu'il coince ???

Oui je c'est , c'est assé chiant de te faire répété , mais c'est pour que l'on comprenne bien , ton problème.

#5 mopi

mopi

    Membre

  • Membres
  • 18 messages

Posté 16 janvier 2012 - 02:08

C'est loin d'être chiant c'est moi qui vient demander de l'aide ^^
J'ai 2 capteurs ultrasons 1 à drotie l'autre à gauche du robot et je veux qu'il se balade dans une pièce donc il avance tout le temps sauf si il y a 1 obstacle qui se présente à gauche ou à droite ou dans ce cas là il tourne à droite ou à gauche.
Mais là je ne sais pas pourquoi mon robot tourne sur lui même comme si il y avait tout le temps un obstacle à gauche.
Pourtant les valeurs distance droite et distance gauche valent bien toujours plus de 150cm (j'ai mis mon robot au milieu de mon appartement.)
Merci pour ton aide.

PS: C'est marrant que ce soit toi qui me réponde depuis le début je m'inspire de ton robot j'ai la même base et j'ai acheté la télécommande IR que je vais programmé un peu comme toi dès que je règle le problème des capteurs ultrasons donc merci^^

#6 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 16 janvier 2012 - 03:37

PS: C'est marrant que ce soit toi qui me réponde depuis le début je m'inspire de ton robot j'ai la même base et j'ai acheté la télécommande IR que je vais programmé un peu comme toi dès que je règle le problème des capteurs ultrasons donc merci^^

Merci sa fait plaisir mopi , bon je vais voir se que je peux faire mes je garantie rien.

#7 inovasong

inovasong

    Membre

  • Membres
  • 56 messages

Posté 14 mai 2012 - 03:45

Bonjour,

Deux ou trois petites choses.
Je vais essayer de m'expliquer simplement

Déjà la mesure avec les capteurs US mes semble complexe non? Essaye déjà de simplifier car je ne suis pas sur que de déclarer duree et distance_cm en variable global soit bien nécessaire de plus trois fonctions pour arriver au même résultat, test ça je pense que ca devrais marcher

int mesure_distance(int sensorPin)
{
  int duree;
  pinMode(sensorPin, OUTPUT);
  digitalWrite(sensorPin, LOW);
  delayMicroseconds(2);
  digitalWrite(sensorPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(sensorPin, LOW);
  delayMicroseconds(20);
  pinMode(sensorPin, INPUT);
  duree = pulseIn(sensorPin, HIGH);  
  delay(5);
  return duree/58;

}

Pour la fonction daffichage de la distance pourquoi ne pas ajouter ça a ta fonction mesure_distance avec une condition exemple

Tu défini une variable debug que tu valide ou non
#define DEBUG_MESURE_DISTANCE true

Et tu ajoute ca à ta fonction
if(DEBUG_MESURE_DISTANCE{
  Serial.println(duree/58);
}


Et même aller plus loin avec une fonction qui mesure les deux capteurs l'un après l'autres et te renvoi en debug les deux valeurs exemple

// a definir en debut de programme
#define DEBUG_CAPTEUR_DISTANCE true
#define GAUCHE 0
1define DROITE 1
int distance_capteur[] = {0,0};



int mesure_distance(int sensorPin)
{
  int duree;
  pinMode(sensorPin, OUTPUT);
  digitalWrite(sensorPin, LOW);
  delayMicroseconds(2);
  digitalWrite(sensorPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(sensorPin, LOW);
  delayMicroseconds(20);
  pinMode(sensorPin, INPUT);
  duree = pulseIn(sensorPin, HIGH);  
  delay(5);
  return duree/58;

}

void distances_capteurs(){
  
  distance_capteur[GAUCHE] = mesure_distance(capteurgauche);
  distance_capteur[DROITE] = mesure_distance(capteurdroit);
  
  if(DEBUG_CAPTEUR_DISTANCE){
    Serial.print("Distance capteur Gauche :");
    Serial.print(distance_capteur[GAUCHE]);
    Serial.print("  Distance capteur Droite :");
    Serial.println(distance_capteur[DROITE]);   
  }
}


ensuite la ligne '//delay(1000); //attend pour un affichage plus clair"
Est de trop oui l'affichage est plus claire mais pendant 1s si un obstacle se présente devant le capteur rien ne ce passe je pense que tu devrais la retirer (la librairie <SimpleTimer.h> peux te permettre d'appeler une fonction a intervalle régulier comme l'affichage de variable sans interférer avec ton programme)

Les fonctions motrices aussi sont à simplifier pourquoi ne pas essayer autre chose de plus simple et aussi penser a utilisé des noms de variables plus claire


#define V_MOT_R 6  // contrôle la vitesse du moteur 1 (gauche)
#define V_MOT_L 5  // contrôle la vitesse du moteur 2 (droite)
#define SENS_R 7 //contrôle la direction (avancer ou reculer) du moteur 1 (gauche)
#define SENS_L 4 //contrôle la direction (avancer ou reculer) du moteur 2 (gauche)


void moteur_L(int V){
  if (V>=0){
    digitalWrite(SENS_L, HIGH);
  }
  else if (V<0){
    digitalWrite(SENS_L, LOW);
    V = V * -1;
  }
  if (V > 255) V=255;
  analogWrite(V_MOT_L, V);
}

void moteur_R(int V){
  if (V>=0){
    digitalWrite(SENS_R, HIGH);
  }
  else if (V<0){
    digitalWrite(SENS_R, LOW);
    V = V * -1;
  }
  if (V > 255) V=255;
  analogWrite(V_MOT_R, V);
}

Avec ces deux fonctions tu as un contrôle simple de tes moteurs maintenant
Tu continu avec tes fonctions de positionnement

void avancer(int V) //avancer
{
moteur_L(V);
moteur_R(V);
}

void reculer(int V) //reculer
{
moteur_L(-V);
moteur_R(-V);
}

void droite(int V) //tourner à droite
{
moteur_L(V);
moteur_R(-V);
}

void gauche(int V) //tourner à gauche
{
moteur_L(-V);
moteur_R(V);
}


Ensuite je pense que pour les capteurs tu devrais plutôt essayer ça

if (distancegauche<20){ //si un obstacle se presente à gauche
  droite(100); //on tourne à droite
  delay(400); //pendant 0,4 secondes
}
else{
  avancer (130); //sinon on avance tout le temps
}

if (distancedroite<20){ //si un obstacle se presente à droite
  gauche(100); //on tourne à gauche
  delay(400); //pednant 0,4 secondes
}
else{
  avancer (130); //sinon on avance tout le temps
}

if (distancedroite<20 && distancegauche<20){ //si un obstacle se presente à droite
  reculer(100); //on recule
  delay(400); //pednant 0,4 secondes
}
else{
  avancer (130); //sinon on avance tout le temps
}


J’espère que ca t'as aidé et hésite pas à nous informer




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users