Aller au contenu


Photo
- - - - -

[ARDUINO] Robot suiveur de ligne


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

#1 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 29 mars 2011 - 10:45


Bonjour
Je suis actuellement en train de faire un robot suiveur de ligne et je n'ai aucune connaissance en programmation!C'est pour cela que je demande votre aide!pouvez vous m'aider à la programmation de la carte Arduino.Pour l'instant j'ai juste réussie à faire fonctionner un servo-moteur et je vous demande de l'aide pour faire fonctionner les autres composants tels que les capteurs.
Merci d'avance




#2 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 29 mars 2011 - 11:07

Bonjour NoVa.

Tu dois nous montrer ce que tu as déjà fait comme code, nous montrer que tu as déjà cherché, nous expliquer plus en détail ce que tu veux arriver à faire, nous donner plus d'informations sur les capteurs, etc...

Tel quel, ton post ne sert à rien parce qu'il ne nous permet pas de t'aider.

#3 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 29 mars 2011 - 12:47

Le robot doit suivre une ligne. Il y a 3 capteurs : 1 capteur d'objets à distance, 2 capteurs d'objets à contact et un capteur IR pour la ligne.
Les servos sont des Servomoteurs Hitec à rotation continue (débridés)


Voici le programme pour contrôler un servomoteur :
 
 

// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
servo1.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
servo1.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos=360; pos+=1) // goes from 180 degrees to 360 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}

Problème, avec ce prog je n'arrive pas à faire varier la vitesse de rotation du servomoteur (même en changeant le delay)

J'ai regardé le prog utilisé pour le Roby, mais je ne le comprend pas. notamment, cette partie là :

void handleS(int s, int speed)

{

//Vitesse :

// 0 -> 0; 1 -> 1; 2 -> 3; 3 -> 8; 4 -> 10; v => 5 -> 30

int tab[6] = {0,1,3,8,10,30};

int pos = getNeutral(s);

 


Après, on voudrait mettre en place un test, brancher un servo et un capteur à contact NO( normalement ouvert) sur la carte. Puis, faire tourner le moteur dans seulement un seul sens en faisant varier la vitesse.
Mais je ne sais pas comment faire. J'aimerais savoir si déjà, il existe des fonctions toutes prêtes pour les capteurs.

Une autre question : est il conseillé d'alimenter les 2 servomoteurs indépendamment de l'Arduino ?



#4 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 29 mars 2011 - 12:48

Bonjour,

Oui nous pouvons t'aider.

Pour suivre la ligne, il faut que tu commandes les moteurs ensemble, avec un biais et une vitesse moyenne. A biais zéro, le robot doit avancer droit, les deux moteurs recevant la vitesse moyenne. Selon le capteur que tu utilises, tu calculeras une valeur pour le biais, ce qui devra faire tourner le robot à droite ou à gauche.

Ainsi si Vm = vitesse moyenne et B = biais, alors Vg = Vm - biais et Vd = Vm + biais où Vg et Vd sont les vitesses des moteurs gauche et droit. Cela signifie d'abord que tu dois savoir donner une vitesse à tes moteurs.

Si tu utilises des servomoteurs à rotation continue montés l'un en face de l'autre, il faut que tu convertisses les consignes de vitesse en commandes de servomoteur. Par exemple la vitesse nulle peut être une commande de 75 pour le moteur gauche et 78 pour le moteur droit, et en plus les vitesses peuvent être inversées : la vitesse max peut être 45 pour le moteur gauche et 99 pour le moteur droit, etc...

Donc tu as déjà plusieurs étapes à réaliser :

1) lire le capteur et calculer son biais
2) tester les vitesses des moteurs pour avancer droit quelle que soit la vitesse moyenne
3) ajouter le biais à la vitesse moyenne

Tu auras alors un suiveur de ligne très simple mais efficace selon les valeurs de biais et de vitesse moyenne que tu auras testées.

Concernant l'alimentation des servomoteurs : il est parfois conseillé de les alimenter à part de l'Arduino, mais perso je l'ai toujours fait (même avec quatre servos) sans problème.

Concernant le code pour les capteurs : il existe des exemples de code dans le logiciel Arduino lui-même, cela devrait te suffire.

Pour la gestion de servomoteurs pour un robot avec Arduino, il y a plein d'exemples un peu partout (sur le site Pobot par exemple). Par exemple cet article (http://www.pobot.org/Trouver-le-neutre-d-un-servomoteur.html) qui fournit un code qui te permet d'envoyer différentes consignes de vitesses sur le servo en utilisant la saisie dans la console : taper un chiffre, valider par envoi, constater la prise en compte par l'Arduino, attendre que le servo ait changé (1 seconde) puis essayer une autre. Cela te permettra de trouver la position où le servomoteur modifié ne tourne plus.

#5 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 29 mars 2011 - 12:56

C'est déjà beaucoup mieux comme explications ! ;)
Je te laisse avec Luj, c'est un pro de l'arduino.

#6 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 29 mars 2011 - 01:06

Pour faire varier la vitesse du servo :



Il faut donc que :

  •  
  • Trouver le neutre ?




    #include
    
    
    
    
    
    Servo servo;
    
    
    
    
    
    void setup()
    
    
    
    {
    
    
    
    servo.attach(10); // On attache le servomoteur à la patte 10 de l'arduino
    
    
    
    Serial.begin(9600); // On va envoyer des informations à l'ordinateur grâce à ce port
    
    
    
    }
    
    
    
    
    
    
    
    void loop()
    
    
    
    {
    
    
    
    int i = 0;
    
    
    
    while(i <= 180)
    
    {
    
    
    
    servo.write(i); //On fait avancer le servomoteur de 5 en 5, de 0 jusqu'à 180
    
    
    
    Serial.println(i); //On affiche la valeur en cours de l'angle
    
    
    
    delay(1000); // On attend une seconde pour avoir le temps de lire la valeur qui nous interesse
    
    
    
    
    
    
    
    i = i+5;
    
    
    
    }
    
    
    
    while(i >= 180)
    
    
    
    {
    
    
    
    servo.write(i); //on fait reculer ensuite le servomoteur
    
    Serial.println(i);
    
    delay(1000);
    
    
    
    i = i-5;
    
    
    
    }
    
    
    
    
    
    
    
    }
    
    
    
    





     

Si j'ai bien compris cette ligne:



#7 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 07 avril 2011 - 09:27

Désolé pour le double post, mais j'en profite pour up.

J'essaie de faire en sorte que lorsque que j'enclenche un capteur de contact (NO), le servomoteur se mette à tourner
La stucture du code serait donc de ce type :
 
#include
#define UPDDG 3 // On attache le capteur à la patte 3 de l'arduino

Servo servo;
void setup()
{
servo.attach(9); // On attache le servomoteur à la patte 9 de l'arduino
Serial.begin(9600); // On va envoyer des informations à l'ordinateur grâce à ce port
pinMode(UPDDG, INPUT);
}
void handleUPDD(int updd)
{
if(digitalRead(updd) == HIGH) //Si le capteur est enclenché
{


if (updd == UPDDG) // Puis on tourne dans le sens inverse du capteur détecté...
{
XXXXXXXX

}
}

Le problème c'est que lorsque je met à la place des XXXX quelque chose du genre :
{
int i = 0;
while(i <= 10)
{
servo.write(i); //On fait avancer le servomoteur de 5 en 5, de 0 jusqu'à 180
Serial.println(i); //On affiche la valeur en cours de l'angle
delay(1000); // On attend une seconde pour avoir le temps de lire la valeur qui nous interesse

i = i-10;
}
} [/code]

J'ai une erreur en compilant : sansrem.jpg

Je voudrais également faire la même chose, mais en sens inverse (le servo tourne et il s’arrête quand le capteur s'active). Je peux utiliser pour cela la fonction detach ?

#8 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 07 avril 2011 - 09:49

Ta capture d'écran est illisible... Essaye de faire un copié/collé, ça sera sans doute plus simple.
Je n'ai pas beaucoup le temps de me pencher sur tout le code mais j'ai deux trois remarques.

Premièrement, je ne pense pas que tu puisses mettre la fonction "void loop" à l'intérieur de la fonction void handleUPPD". Ensuite, il me semble en regardant rapidemment qu'il y a des variables que tu ne déclares pas.
Après ça, il y a aussi des soucis d'indentation, ça serait bien que tu fasses un effort à ce niveau là pour la lisibilité.

{
servo.write(i); //On fait avancer le servomoteur de 5 en 5, de 0 jusqu'à 180
Serial.println(i); //On affiche la valeur en cours de l'angle
delay(1000); // On attend une seconde pour avoir le temps de lire la valeur qui nous interesse

i = i-10;
} [/code]

Tu ne sortiras jamais de cette boucle. Tu dis de continuer tant que i est inférieur ou égal à 10. Tu l'initialises à 0 et puis tu ne fais que lui soustraire 10...

Il y a sans doute encore des choses que je n'ai pas vues.

#9 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 07 avril 2011 - 10:26

Mon but est que la boucle soit infinie pour le servo ne s’arrête pas de tourner. Après c'est vrai que ce n'est pas très élégant.


#10 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 08 avril 2011 - 06:34

Si tu fais un "while(1){ ... }" ça marche aussi et c'est beaucoup moins moche.

[edit : Mais je ne suis pas sûr de comprendre l'intérêt de faire une boucle infinie dans une autre boucle infinie.
Void loop est déjà une boucle infinie, pourquoi ne pas l'utiliser ?

#11 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 12 avril 2011 - 09:48

J'ai beau chercher, je ne trouve pas comment stopper le servo seulement et seulement si le capteur est enclenché.

#12 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 13 avril 2011 - 07:19

Tu dois faire un "if(capteur==1) { ... }".

En gros, si ton capteur détecte quelque chose, tu peux couper l'alimentation de ton servomoteur ou ne plus rien lui envoyer comme angle à atteindre...

#13 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 13 avril 2011 - 09:32

Oui, c'est ce à quoi j'ai pensé :


#define UPDD 3 // On attache le capteur à la patte 3 de l'arduino

Servo servo;
void setup()
{
servo.attach(9); // On attache le servomoteur à la patte 9 de l'arduino
Serial.begin(9600); // On va envoyer des informations à l'ordinateur grâce à ce port
pinMode(UPDD, INPUT);
}

void loop() {} //le moteur tourne sans arrêt

void handleUPDD(int updd)
{
if(digitalRead(updd) == HIGH) //Si le capteur est enclenché
{
servo.detach() ; //on n'alimente plus le servo
}

}[/code]

Je sais pas si le code est correct, mais je n'ai aucune réaction quand le capteur est enclenché


#14 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 13 avril 2011 - 09:38

ou tu peux le mettre au neutre, c'est en effet le but de trouver le neutre car normalement si tu es au neutre, le servo ne bouge plus. Au dessus il tourne dans un sens en dessous dans l'autre et plus tu t'éloigne de la valeur plus il va vite.

#15 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 13 avril 2011 - 09:47

J'ai un doute : est ce que mon capteur est bien branché. C'est un Normalement ouvert (NO) et il a deux fils un rouge et un blanc. J'ai mis le blanc sur la sortie 2 de la carte et le rouge sur la 3.3V. C'est bon?

Parce que normalement si après le if(capteur== 1) je met l'angle à 92* (c'est mon neutre), le servo doit se stopper , or ce n'est pas du tout le cas.

* {



int i = 92;
servo.write(i);


}[/code]

#16 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 13 avril 2011 - 10:09

[quote"NoVa"] J'ai mis le blanc sur la sortie 2 de la carte et le rouge sur la 3.3V. C'est bon?

#define UPDD 3 // On attache le capteur à la patte 3 de l'arduino

[/quote]

L'erreur vient peut etre de la ? Ou alors c'est juste une erreur de frappe dans ce que tu viens de dire ?
De plus, j'aurais plutot branché au 5V, et non au 3.3V

#17 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 14 avril 2011 - 06:47

De plus, si tu fais un "#define UPDD ..", tu dois aussi utiliser UPDD en majuscule dans le code.

#18 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 14 avril 2011 - 09:02

Et surtout, ta fonction "handleUPDD" n'est jamais appellée.
Je pense que tu devrais deja relire un peu les tutoriaux sur le C que l'on trouve sur internet.

#19 NoVa

NoVa

    Nouveau membre

  • Membres
  • 14 messages

Posté 14 avril 2011 - 03:03

[quote"Jbot"]Et surtout, ta fonction "handleUPDD" n'est jamais appellée.
Je pense que tu devrais deja relire un peu les tutoriaux sur le C que l'on trouve sur internet.[/quote]

Oui, erreur de frappe...

[quote"Esprit"]De plus, si tu fais un "#define UPDD ..", tu dois aussi utiliser UPDD en majuscule dans le code.[/quote]
J'ai remplacé partout sauf dans :"void handleUPDD(int updd)" . Parce que sinon j'ai une erreur

#20 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 15 avril 2011 - 12:31

[quote"NoVa"][quote"Esprit"]De plus, si tu fais un "#define UPDD ..", tu dois aussi utiliser UPDD en majuscule dans le code.[/quote]
J'ai remplacé partout sauf dans :"void handleUPDD(int updd)" . Parce que sinon j'ai une erreur [/quote]

Normal, c'est une fonction, ça n'a rien à voir...
Je pense que Jbot a raison, tu as des lacunes au niveau du C. Tes soucis n'ont rien à avoir avec l'arduino mais avec le langage de programmation...




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

0 members, 0 guests, 0 anonymous users