Pages: 1 [2] 3   Go Down
Author Topic: help code robot autonome  (Read 1886 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai essayé mais çà ne change rien...
Merci pour ton aide en tout cas...
Logged

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Il faudrait peut être repartir de zero. Commencer par une serie de déplacement simple et en intégrant les US l'un aprés l'autre.

Je sèche pour ma part  smiley-mr-green

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ben le problème c'est que c'est exactement comme j'ai fait.
J'ai d'abord ordonné à mon robot de se déplacer pour voir si tout les mouvements programmés étaient bon et çà fonctionnait.
Ensuite j'ai programmé les capteurs et j'ai vérifié grâce au serial monitor que les valeurs renvoyées correspondaient à celles mesurées et c'était le cas.
Et là j'assemble les 2 et sa fonctionne plus  smiley-mad
Mais j'imagine que çà doit pas être facile de trouver la solution sans le robot en débarquant dans un code pas très bien rédigé :S C'est pour çà que j'avais essayé de commenter.
Merci quand même pour ton aide
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Essaye ça pour voir :
Code:
//capteurs US
const int capteurdroit = 7;
const int capteurgauche = 8;

//Moteurs
#define E1 5
#define E2 6
#define M1 4
#define M2 7


void setup() {
  Serial.begin(9600);

  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
}

void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit

  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
}

unsigned long mesure_distance(int 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);

  pinMode(capteur, INPUT);
  unsigned long duree = pulseIn(capteur, HIGH);

  return duree / 58;
}

void avancer(byte a, byte 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(byte c, byte d) //reculer
{
  analogWrite(E1, c); //PWM Speed Control
  digitalWrite(M1, LOW); //M1 recule
  analogWrite(E2, d);
  digitalWrite(M2, LOW); //M2 recule
}

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

void gauche(byte g, byte h) //tourner à gauche
{
  analogWrite (E1, g); //PWM Speed Control
  digitalWrite(M1, LOW);
  analogWrite (E2, h);
  digitalWrite(M2, HIGH);
}
J'ai juste viré les variables global, remplacer quelques const par des define et changer les char en byte (+ des int en unsigned long).
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ton aide,
J'ai essayé mais çà ne fonctionne pas le robot continu à tourner sur lui même.
Je ne vois vraiment pas d'où çà peut venir sachant que mes fonction avancer reculer droite gauche fonctionnent et que les capteurs renvoient les bonnes valeurs.
J'aimerai bien tout recommencer à zéro mais je ne vois pas ce que je programmerai différemment...
merci
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Au fait je ne pense pas que çà changera quelque chose étant donné qu'elle se programme de la même façon mais j'ai une carte romeo pas une arduino. Elle permet juste d'avoir des moteurs CC car on peut les alimenter indépendamment avec une tension supérieur à 5v
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu pourrait rajouter deux Serial.print dans loop pour avoir un idées des valeurs de distancegauche et distancedroite ?
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Justement c'est çà qui est bizarre c'est qu'en rajoutant:

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

J'obtiens:
Si le robot est au milieu de mon appartement:
capteur droit:
268
capteur gauche:
157

Et si je met mes mains devant
capteur droit:
4
capteur gauche:
5

Donc pas de problème de ce côté là :S

Et le plus bizarre c'est que si je remplace que par des "avancer dans mon if comme celà:

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

Et ben le robot tourne quand même sur lui même....
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3025
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si tu fais avancer(130,130) pendant un certain temps, ton robot il va bien droit.
Parce que bon, ton système il fonctionne en boucle ouverte. Rien ne vérifie que les 2 roues tournent exactement à la même vitesse par conséquent ce n'est pas très étonnant s'il tourne. Pour être certain de le faire aller droit, il faudrait avoir des encodeurs sur les roues, compter les impulsions et corriger la vitesse des moteurs en conséquence.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ben çà marche si je fais pas en fonction des valeurs retournées par les capteurs mais si j'en tiens pas compte alors ou il avance mais moi je veux le faire en fonction des capteurs pas en fonction de roues codeuses... je comprend pas j'ai des valeurs retournées par des capteurs et je le fait aller tout droit sauf si il y a un obstacle, je comprend pas ce qu'il y a de compliqué à çà pourquoi çà marche pas et pourquoi je bloque dessus depuis 3 semaines^^
Logged

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Comme ton robot tourne à droite par defaut, je dirais comme çà que le programme prend en compte la première condition. Donc ta valeur mesurée est inférieure à 20.

Reprends le code de skywodd et ajoutes des Serial.print pour vérifier les valeurs retournées pas tes US.

Code:
void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche);

  Serial.println(distancedroite); Serial.println(distancegauche);
...

Petite question : Quelles sont les délais relatifs ou normatifs pour le retour des US ??? Si la fonction mesure_distance ne retourne rien sous les delais imposés, la valeur retournée sera zero, non ???
Dans ce cas, peut être prévoir un intervalle :

Code:
if ((distancegauche > 0) && (distancegauche < 20)) { }
etc...

@+

Zoroastre.
« Last Edit: January 18, 2012, 11:48:13 am by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Essaye de rajouter un Serial.print("droite"); "gauche" "centre" ... pour voir si les if sont bien pris en compte :
Code:
//capteurs US
const int capteurdroit = 7;
const int capteurgauche = 8;

//Moteurs
#define E1 5
#define E2 6
#define M1 4
#define M2 7


void setup() {
  Serial.begin(9600);

  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
}

void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit

  Serial.print("Dist D : ");
  Serial.println(distancedroite, DEC);
  Serial.print("Dist G : ");
  Serial.println(distancegauche, DEC);

  if(distancegauche < 20) //si un obstacle se presente à gauche
  {
    Serial.println("Go D");
    droite(100, 100); //on tourne à droite
    delay(400); //pendant 0,4 secondes
  }
  else if(distancedroite < 20) //si un obstacle se presente à droite
  {
    Serial.println("Go G");
    gauche(100, 100); //on tourne à gauche
    delay(400); //pednant 0,4 secondes
  }
  else {
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
  }
}

unsigned long mesure_distance(int 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);

  pinMode(capteur, INPUT);
  unsigned long duree = pulseIn(capteur, HIGH);

  return duree / 58;
}

void avancer(byte a, byte 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(byte c, byte d) //reculer
{
  analogWrite(E1, c); //PWM Speed Control
  digitalWrite(M1, LOW); //M1 recule
  analogWrite(E2, d);
  digitalWrite(M2, LOW); //M2 recule
}

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

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci pour votre aide...

Voilà les résultats dans le serial monitor qui prouvent que tout va bien pourtant...(j'ai mis mes mains devant le capteur quand les mesures sont faibles...)

Dist D : 134
Dist G : 252
Go C
Dist D : 136
Dist G : 252
Go C
Dist D : 8
Dist G : 252
Go G
Dist D : 5
Dist G : 6
Go D
Dist D : 5
Dist G : 7
Go D
Dist D : 191
Dist G : 252
Go C
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Woo! Strange donc ce serais un probléme au niveau de la gestion des moteurs !? Je comprend plus rien ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est dingue j'ai même essayé çà et çà marche pas:

Code:
if((distancegauche>0)&&(distancegauche < 20)) //si un obstacle se presente à gauche
  {
    Serial.println("Go D");
    droite(100, 100); //on tourne à droite
    delay(5000); //pendant 0,4 secondes
  }
  else if((distancedroite>0)&&(distancedroite < 20)) //si un obstacle se presente à droite
  {
    Serial.println("Go G");
    gauche(100, 100); //on tourne à gauche
    delay(5000); //pednant 0,4 secondes
  }
  else if ((distancedroite>20)&&(distancegauche>20)){
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
    delay(5000);
  }
  else if ((distancedroite==00)&&(distancegauche==0)){
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
    delay(5000);
  }
Logged

Pages: 1 [2] 3   Go Up
Jump to: