Aller au contenu


Photo
- - - - -

Robot autonome

Robot autonome

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

#1 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 06 mai 2017 - 05:13

Bonjour à tous, 
 
Je souhaite réaliser un robot autonome. J'ai une formation électronique mais je galère un peu en programmation  :dvgmax_01: 
 
Sur mon robot je souhaite mettre un capteur ultrason (HC-SR04) monté sur un servomoteur (Tower Pro SG90)  de type radar (oscille de 20° à 160°). 
 
J'ai déjà écrit un programme pour le capteur ultrason avec un système de LED RGB qui fonctionne bien : 
 
 


void loop() {

  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 25) {  // Limite 25 cm ;


   delay(10);
      if (distance < 10) {        // Limite 10 cm ;
      digitalWrite(led,HIGH);     // Led Rouge
      digitalWrite(led2,HIGH);
      digitalWrite(led3,LOW);
}
     else {
      digitalWrite(led,LOW);      // Led Bleu
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
        }
}    
    else {
    digitalWrite(led,LOW);        // Led White
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    }
    
  if (distance >= 200 || distance <= 0){
    Serial.println("Hors limite");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

 
 
Et je voudrais l'améliorer avec le servomoteur, mais je n'arrive pas à combiner le capteur ultrason (détection de l'obstacle) et le servomoteur (oscillation entre 20° et 160°)
 
J'ai commencé mais ça ne fonctionne pas  :dash2:
 

void loop(){
 long duration,distance;
 int i = 20;
 int augmente =1;
 int automatic = 1;
 
 while( automatic = 1){
  if(augmente)i=i+5;         // Si "augmente" n'est pas nul / on incrémente "pos"
  if(!augmente)i=i-5;         // Si "augmente" est nul / on décrémente "pos"
  if(i>160)augmente =0;     // si "pos" vaut plus que 160 / Augmente = 0
  if(i<20)augmente =1; 
  servo.write(i); 
  delay(20);
 
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  Serial.println(duration);
  
  }  
}

 
Merci d'avance pour votre aide, je ne suis encore qu'un jeune padawan  :thank_you:



#2 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 4 880 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

Posté 06 mai 2017 - 05:42

J'ai édité ton post pour mettre les balises de code, la prochaine fois n'oublies pas les balises ou utilise l'outil disponible sur le forum.

Le code est beaucoup plus lisible. ;)

 

 

Edit : et un petit passage par la case présentation STP


https://www.facebook.com/Exploration-Robotisée-de-notre-patrimoine-564661773904152/

 

Objectif : Explora85 doit rouler dans l'été et une exploration avant la fin de l'année 2020.


#3 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 06 mai 2017 - 06:17

Salut Levend, 

 

Désolé pour le manque de politesse et les balises.  :Alex_03:  



#4 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 4 880 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

Posté 06 mai 2017 - 06:53

Pas de soucis...

Pour le code tu peux utiliser les balises comme j'ai mis (moins lourd à charger) ou utiliser l'outil disponible sur le site, chaque solution a ses avantage et ses inconvénients alors je te laisse choisir.

 

La programmation c'est pas compliqué mais comme je ne connais pas le fonctionnent des servo (en programmation), je ne peux pas trop t'aider.


https://www.facebook.com/Exploration-Robotisée-de-notre-patrimoine-564661773904152/

 

Objectif : Explora85 doit rouler dans l'été et une exploration avant la fin de l'année 2020.


#5 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 185 messages
  • Gender:Male
  • Location:Autriche

Posté 06 mai 2017 - 09:25

Petit conseil de mon expérience avec Froggy si tu peux : utilise plutôt deux capteurs fixes qu'un capteur sur servo pour avoir la distance aux obstacles dans deux directions.

Pour le code de ton servo, je t'invite à tester l'exemple Sweep : https://www.arduino..../tutorial/sweep(aussi accessible dans "Fichier > Exemples > Servo") qui utilise Servo.h.

 

Dans le code d'essai que tu présentes, tu créés une boucle infinie avec ton while ( automatic = 1 ). Le premier problème, c'est que la condition que tu as mise n'en est pas une : tu as confondu (ou oublié) l'assignation de valeur à une variable ( a  = 1 : a vaut 1 ) et le test d'égalité ( a == 1 : a vaut-il 0 ? ). Le second "problème", c'est que tu n'as pas besoin de cette boucle. La fonction "loop" se comporte elle-même comme une boucle. Comme tu ne modifies nulle part "automatic" pour provoquer une sortie de boucle (et ça ne marcherait pas à cause du premier problème), cette boucle est inutile, et dans le but de faire le code le plus propre et efficace, mieux vaut l'enlever.


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#6 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 874 messages
  • Gender:Male

Posté 07 mai 2017 - 06:01

Pour le code tu peux utiliser les balises ...

J'ai jamais trouvé ! Je dois être bien nul !

#7 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 4 880 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

Posté 07 mai 2017 - 12:19

Chacun son tour :D, c'est le bouton <>  au dessus de la zone de texte pour écrire ton message, à côté du bouton pour faire des citations .


https://www.facebook.com/Exploration-Robotisée-de-notre-patrimoine-564661773904152/

 

Objectif : Explora85 doit rouler dans l'été et une exploration avant la fin de l'année 2020.


#8 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 718 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 07 mai 2017 - 12:48

Quand tu dis que ça ne fonctionne pas, que se passe t-il vraiment ?



#9 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 07 mai 2017 - 01:45

Quand tu dis que ça ne fonctionne pas, que se passe t-il vraiment ?

Mon capteur ultrason oscille bien,le servomoteur fonctionne entre 20° et 160°. 

Par contre le capteur ultrason n'affiche aucune valeur sur le moniteur série. J'ai l'impression que le TripPin,HIGH n'est pas effectué, donc rien sur EchoPin.

Ou le servomoteur fait trop de bruit et brouille le signal mais je doute. 

Merci pour ton aide.



#10 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 07 mai 2017 - 01:53

Petit conseil de mon expérience avec Froggy si tu peux : utilise plutôt deux capteurs fixes qu'un capteur sur servo pour avoir la distance aux obstacles dans deux directions.

Pour le code de ton servo, je t'invite à tester l'exemple Sweep : https://www.arduino..../tutorial/sweep(aussi accessible dans "Fichier > Exemples > Servo") qui utilise Servo.h.

 

Dans le code d'essai que tu présentes, tu créés une boucle infinie avec ton while ( automatic = 1 ). Le premier problème, c'est que la condition que tu as mise n'en est pas une : tu as confondu (ou oublié) l'assignation de valeur à une variable ( a  = 1 : a vaut 1 ) et le test d'égalité ( a == 1 : a vaut-il 0 ? ). Le second "problème", c'est que tu n'as pas besoin de cette boucle. La fonction "loop" se comporte elle-même comme une boucle. Comme tu ne modifies nulle part "automatic" pour provoquer une sortie de boucle (et ça ne marcherait pas à cause du premier problème), cette boucle est inutile, et dans le but de faire le code le plus propre et efficace, mieux vaut l'enlever.

Merci pour tes conseils,mais je veux vraiment mettre un capteur sur un servo par rapport à mon projet. J'aime me compliquer la vie.

 

J'ai déjà fait le tuto et il fonctionne bien mais je n'arrive pas à combiner les 2 en même temps.

 

Ok,on peut enlever la condition while car je ne modifie pas "a". 

 

En modifiant le programme, le capteur ultrason me donne aucune valeur.



#11 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 493 messages
  • Gender:Male
  • Location:Paris

Posté 07 mai 2017 - 01:56

Fais un tuto pour le servo tout seul, fais un 2eme tuto pour le capteur tout seul aussi.

A partir de là, ça viendra tout seul.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#12 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 718 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 07 mai 2017 - 04:52

tu dis que ça marche chaque fonction séparément, mais quand tu les regroupes, ton servo et ton capteur utilisent-ils les même broches ? 

As-tu un schéma à nous montrer (tu peux le faire avec https://circuits.io/)



#13 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne
  • Interests:La vie sous les tropiques

Posté 08 mai 2017 - 04:03

Petit conseil de mon expérience avec Froggy si tu peux : utilise plutôt deux capteurs fixes qu'un capteur sur servo pour avoir la distance aux obstacles dans deux directions.


Bonjour.

De ton expérience de capteur US monté sur servo , quel est le problème , que le robot soit en mouvement ?

Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#14 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 185 messages
  • Gender:Male
  • Location:Autriche

Posté 08 mai 2017 - 05:13

De ton expérience de capteur US monté sur servo , quel est le problème , que le robot soit en mouvement ?

En effet.

Pour les contrôleurs réactifs que je testais, l'idée est d'avoir des mises à jour des commandes motrices en continu à chaque tour de boucle. En gros, les deux mesures de distance dans chaque direction (+/- 45° par rapport à l'avant du robot) déterminent directement la valeur de vitesse des moteurs (voir véhicules de Braitenberg). Le problème d'utiliser un servo qui tourne, c'est qu'on introduit un délai supplémentaire entre les deux mesures, et pendant que le robot bouge, la première mesure devient "obsolète" le temps que l'on tourne et on mesure dans l'autre direction. Ce genre de système fonctionne mieux avec deux capteurs US qui mesurent quasiment en parallèle (juste le temps de faire une mesure puis l'autre, ce qui est négligeable face à la dynamique du robot). Plus généralement, à moins de tourner très vite (comme sur les lasers Hokuyo) par rapport à la vitesse du robot, orienter le servo réduit la qualité des mesures.

Par contre, si le robot s'arrête entre deux mesures, pas de soucis, mais ça n'était pas le but recherché.


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#15 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 09 mai 2017 - 09:58

Bonjour à tous, 

 

Merci pour vos conseils, je refais un point sur mes montages et mes programmes ce soir. 

 

J'étudie le fait de mettre 2 capteurs ultrasons et vous fait un retour. 



#16 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 11 mai 2017 - 08:08

Bonjour, 

 

Désolé de répondre tardivement mais beaucoup de travail en ce moment. 

 

J'ai réussi à programmer le servomoteur et le capteur ultrason (type radar). 

 

J'ai fais 2 erreurs : 

 

  • mauvaise connexion des broches (merci au conseil de Arobasseb) 
  • ma boucle if ne fonctionnait pas correctement, j'ai donc changé de méthode.

Ce qui nous donne : 

#include<Servo.h>

Servo myservo;
int pos = 0;
#define trigPin 13
#define echoPin 12
#define led A5
#define led2 A4
#define led3 A3


void setup()
{
  Serial.begin(9600);
  myservo.attach(3);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

void loop(){
     
  for(pos = 20; pos < 160; pos += 2)   
  {                                   
  myservo.write(pos);               
  delay(10);                       
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  delay(10);
  
      if (distance < 20) {        // Limite 20 cm ;
        if ( pos <= 90) {
        digitalWrite(led,HIGH);     // Led Rouge
        digitalWrite(led2,HIGH);
        digitalWrite(led3,LOW);
        delay(10);}   
        else {
        digitalWrite(led,LOW);        // Led White
        digitalWrite(led2,LOW);
        digitalWrite(led3,LOW);
        delay(10);
        }
        }
      else {
        digitalWrite(led,HIGH);        // Led White
        digitalWrite(led2,HIGH);
        digitalWrite(led3,HIGH);
        delay(10);
        }
  } 
  for(pos = 160; pos>=20; pos-=2)      
  {                                
  myservo.write(pos);              
  delay(10);                       
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  delay(10);

      if (distance < 20) {        // Limite 20 cm ;
        if ( pos <= 90) {
        digitalWrite(led,HIGH);     // Led Rouge
        digitalWrite(led2,HIGH);
        digitalWrite(led3,LOW);
        delay(10);}   
        else {
        digitalWrite(led,LOW);        // Led White
        digitalWrite(led2,LOW);
        digitalWrite(led3,LOW);
        delay(10);
        }
        }
      else {
        digitalWrite(led,HIGH);        // Led White
        digitalWrite(led2,HIGH);
        digitalWrite(led3,HIGH);
        delay(10);
        }  
}
}


#17 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 171 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 11 mai 2017 - 07:34

Et le résultat fonctionne? 


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#18 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 12 mai 2017 - 08:00

Et le résultat fonctionne? 

Oui très bien. 



#19 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 12 mai 2017 - 12:47

Proposition : traiter l'aller et le retour dans la même boucle For(...) ajouterait une légère touche d'élégance :ok:



#20 Roms

Roms

    Nouveau membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne
  • Interests:Electronique,cinéma, sport

Posté 12 mai 2017 - 12:58

Proposition : traiter l'aller et le retour dans la même boucle For(...) ajouterait une légère touche d'élégance :ok:

Pourquoi pas par contre quel est le principe ? 

 

Je ne vois pas comment faire. 







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

0 members, 0 guests, 0 anonymous users