Aller au contenu


Photo
- - - - -

Arduino - Sharp sur micro servo


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

#1 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 05 mars 2013 - 02:59

salut a tous ,

voila j'ai un capteur sharp GP2Y0A02YKOF et un micro servo 9g.
Je voudrais savoir comment faire pour que les servo sert de balayage au capteur et que quand le capteur detecte un objet il le suit. (tracking object) j'ai chercher des petits tutos sur google , mais rien ! :o

j'ai un code qui fait tourner le servo de gauche a droite(balayage) avec le capteur dessus et quand il detecte un obstacle tout s'arrête , quand il n'y a plus d'obstacles le servo continu a tourner de gauche a droite.

mais je ne sais pas comment faire pour qu'au lieu qu'il s'arrête , eh bien il suit l'objet.
voila le code en question
#include <Servo.h> 

#define sensorIR 15
Servo myservo;  // Creates a servo object
int pos = 0;    // Variable to store the servos angle 
volatile float inches;
 
void setup()
{ 
  myservo.attach(2);  
  Serial.begin(9600);
} 
 
void loop()
{ 
  search();
}
 
//This function sweeps the servo searching the area for an object within range
void search()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    sensorPrint(analogRead(sensorIR));
    if (inches < 10) follow();
  } 
  for(pos = 180; pos>=1; pos -= 1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    sensorPrint(analogRead(sensorIR));
    if (inches < 10) follow();
  }   
}
 
//This function determines the distance from the servo and prints it to the SMonitor
void sensorPrint(float sensorValue)
{
  inches = 4192.936 * pow(sensorValue,-0.935) - 3.937; //algorithm from last post
  //cm = 10650.08 * pow(sensorValue,-0.935) - 10; //if you use cm instead of in
  Serial.print("Inches: ");
  Serial.println(inches);
}
 
//This function only determines the distance from the servo without printing
void noPrint(float sensorValue)
{
  inches = 4192.936 * pow(sensorValue,-0.935) - 3.937; //algorithm from last post
  //cm = 10650.08 * pow(sensorValue,-0.935) - 10; //if you use cm instead of in
}
 
//This function keeps the servo locked on the object until it moves out of range
void follow()
{
  while (inches < 10)
  {
    noPrint(analogRead(sensorIR)); //we want to find the distance but not print it
    Serial.print("Angle: ");       //Current angle of the servo between 0 to 180
    Serial.println(pos);
  }
}

Merci a tous
Cordialement Dylan.

#2 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 05 mars 2013 - 07:13

while (inches < 10){.....}

Ton programme est prévu pour se verrouiller sur sa cible tant que l'objet reste proche (10 inch).
Il ne redémarre que si l'objet s'éloigne à plus de 10".

Tu peux remplacer complètement cette boucle par des petites oscillations de gauche à droite du capteur IR (+ et - 15° par ex par rapport à sa position précédente) pour se recaler en continu sur le bon angle.
Christian

#3 skyhack

skyhack

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 885 messages
  • Gender:Male
  • Location:Racourt et Flaba (08)

Posté 06 mars 2013 - 12:56

Quand je faisais encore de la robotique à proprement parlé j'avais réalisé une technique simple pour le tracking avec un système à double capteur.

Le principe est le suivant :

- On veut suivre la boule rouge en face du robot (important).
- Le capteur gauche balaye son côté gauche jusqu'à trouver l'objet et s'arrête en se décalant de l'objet afin de voir à l'infini.
- Le capteur de droite en fait de même mais du coté droit.
- Si la boule avance à droite :
- Le capteur gauche ne reçoit pas.
- Le capteur droit reçoit.
- Le capteur droit doit tourner afin de revenir au flan droit de l'objet afin de voir de nouveau l'infini.
- Le capteur gauche doit maintenant chercher l'objet à droite, puis s'arrêter en se décalant afin de voir à l'infini.
- etc.

On peut prendre un autre système équivalent mais cependant plus compacte que le précédent en incluant dans les deux supports de capteur un engrenage.
On fait engrener les deux supports de capteur entre eux et on permet la rotation du groupe de capteur à 180° via un second servo placé en dessous du groupe de capteur.
Ainsi on forme un " cône " virtuel dans lequel l'objet à tracker doit se trouver, les servos ajustent leur position afin que chaque capteur voit l'objet sur ses flans.

Je n'ai pas modélisé la seconde solution (il se fait tard tout de même) mais bon si ça vous tente de voir comment ça rend il n'y a pas de problème.

skyhack.

Fichier joint  1.png   116,85 Ko   35 téléchargement(s)

Fichier joint  2.png   111,13 Ko   21 téléchargement(s)
" Monsters are real. Ghosts are real too.
They live inside us and sometimes they win."
-------------Stephen King.------------------

" le fait que les extraterrestres étaient amis avec les Mayas ne signifie pas qu'ils sont nos amis ... "
-------------------------------------Stephen Hawking----------------------------------------------------

#4 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 06 mars 2013 - 12:57

Tu peux également jeter un oeil au site de Black Templar, article "Implémenter un PID pour les nuls" avec comme consigne l'angle correspondant à l'obstacle. Si le PID converge assez vite, ça devrait marcher correctement.

À réfléchir mais je suis assez sûr qu'il y a moyen de faire un contrôleur style Braitenberg pour orienter correctement le sharp.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#5 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 06 mars 2013 - 08:58

Je comprends ton idee shyhack , mais je n'ai qu'un servo et qu'un capteur :S

je ne peu pas en ce moment acheter de nouveaux composant , car ces dernieres semaines j'ai depenser a peu pres 200 euros (je n'ai que 17 ans et je ne travaille pas), ce qui est beaucoup pour moi. Je chercher donc comment faire avec un capteur et un servo. Vous n'avez pas une idee ?

En tout cas merci de vos reponses.
Merci a tous
Cordialement Dylan.

#6 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 06 mars 2013 - 10:35

(...) Je chercher donc comment faire avec un capteur et un servo. Vous n'avez pas une idee ?


Asservis ton servo en angle sur selon la direction de l'obstacle (que tu es capable de détecter). La théorie est plutôt niveau Bac+1 -> Bac+3, mais avec un peu de documentation et le lien vers le site de Black Templar, tu devrais pouvoir y arriver.

PID sur Wikipedia

Une autre idée - qui si on la creuse un peu doit rejoindre celle du PID - est de se baser sur les concepts de comportements de Valentino Braitenberg : la présence d'un obstacle est attractive pour la commande du servo moteur. J'y réfléchis, je teste et je vois si c'est faisable facilement ou si ça revient à se compliquer la vie (un simple PID devrait marcher - en simplifiant, garder en mémoire les mesures lors d'un balayage et faire la différence entre deux balayages successifs peut marcher aussi).
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2013 - 01:54

Hello !

Je ne vois pas l'utilité d'un asservissement dans ce cas.
La question à se poser : essayes-tu de suivre ton obstacle avec le capteur ou alors avec le robot ? (dans ce dernier cas, oui l'asservissement est intéressant)
Sinon, la méthode de Skyhack est bien, il suffit de l'adapter à un seul capteur.


Tu as ton capteur IR qui balayer l'environnement. (champs de vison large)
Dès que tu rencontres un obstacle (distance < constante), tu balayes l'environnement jusqu'à ce que l'obstacle disparaisse.
Quand l'obstacle disparaît, tu mémorises la position du capteur et tu balayes dans l'autre sens, l'obstacle réaparaît puis redisparaît.
Tu fais la moyenne entre l'extrémité gauche et droite de l'obstacle. Tu obtiens ainsi la position du "centre" de l'objet tracké.
Tant que l'objet est tracké par ton capteur, celui-ci ne balaye qu'une petite partie de l'environnement (la partie contenant l'obstacle). (le champ de vision est réduit et focalisé sur l'obstacle).
Le capteur est ainsi capable de suivre l'obstacle, même si celui-ci est en mouvement.


++
Black Templar


EDIT : En fait, c'est la méthode qu'a proposé ChristianR en remplaçant les petites oscillations de +/-15° par des oscillations qui s'adaptent à la taille de l'objet.
Ainsi, on prend en compte la taille de l'objet afin de calculer son centre.

Mon site internet : http://ferdinandpiette.com/


#8 skyhack

skyhack

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 885 messages
  • Gender:Male
  • Location:Racourt et Flaba (08)

Posté 06 mars 2013 - 02:30

C'est dommage que tu n'ai pas deux capteurs et deux servos parce que la deuxième version claque !

J'ai un capteur sharp qui traine depuis longtemps dans mes tiroirs ainsi que plusieurs servo micro si ça te dit.

skyhack.

Fichier joint  1.png   134,8 Ko   43 téléchargement(s)

Fichier joint  2.png   95,81 Ko   48 téléchargement(s)

Fichier joint  3.png   133,51 Ko   37 téléchargement(s)

Fichier joint  4.png   114,34 Ko   32 téléchargement(s)
" Monsters are real. Ghosts are real too.
They live inside us and sometimes they win."
-------------Stephen King.------------------

" le fait que les extraterrestres étaient amis avec les Mayas ne signifie pas qu'ils sont nos amis ... "
-------------------------------------Stephen Hawking----------------------------------------------------

#9 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2013 - 02:34

Tiens, d'ailleurs, si tu mémorises la position (angle) du sevo pour les deux extrémités de l'obstacle ainsi que les distances capteurs/obstacles de ces extrémités, tu peux calculer la largeur de l'obstacle Image IPB

Si à la position extrême gauche, ton servo est à 15°(=a1) et que la distance de l'obstacle est de 60cm (=d1).
Si à la position extrême droite, ton servo es à 45°(=a2) et que la distance de l'obstacle est de 40cm(=d2).
Dans ce cas, la longueur de l'objet s'obtient par la formule racine_carré(d1²+d2²-2.d1.d2.cos(valeur_absolue(a2-a1)))

Dans ce cas sqrt(60²+40²-2.40.60.cos(30°)) soit 20 cm Image IPB

Mon site internet : http://ferdinandpiette.com/


#10 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 06 mars 2013 - 03:01

salut ,

en fait je ne fais pas encore de robot , c'est juste pour avoir un aprecu. Et pourquoi pas faire plus tard un genre de "MR.General";)

En fait j'ai fixer mon servo avec des elastique sur ma plaque d'essais et avec du double face j'ai fixer mon capteur dessus.

Moi tout ce que je voulais c'etait d'utiliser un capteur et un servo et faire en sorte que le capteur suive des objets.

donc le mieux dans mon cas est d'utiliser distance < constante ??
Merci a tous
Cordialement Dylan.

#11 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2013 - 03:07

Moi tout ce que je voulais c'etait d'utiliser un capteur et un servo et faire en sorte que le capteur suive des objets.
donc le mieux dans mon cas est d'utiliser distance < constante ??


Dans ce cas, oui, tu peux essayer de mettre en place ce que j'ai décrit au post#7
distance < constante, c'est juste un moyen de détecter un obstacle. (par exemple si je détecte quelque chose à moins d'un mètre, alors, c'est forcement un obstacle)

Mon site internet : http://ferdinandpiette.com/


#12 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 06 mars 2013 - 03:16

et comment faire pour qu'il le suit apres ?
Merci a tous
Cordialement Dylan.

#13 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2013 - 03:28

et comment faire pour qu'il le suit apres ?


Je l'ai expliqué ici :

Tu as ton capteur IR qui balayer l'environnement. (champs de vison large)
Dès que tu rencontres un obstacle (distance < constante), tu balayes l'environnement jusqu'à ce que l'obstacle disparaisse.
Quand l'obstacle disparaît, tu mémorises la position du capteur et tu balayes dans l'autre sens, l'obstacle réaparaît puis redisparaît.
Tu fais la moyenne entre l'extrémité gauche et droite de l'obstacle. Tu obtiens ainsi la position du "centre" de l'objet tracké.
Tant que l'objet est tracké par ton capteur, celui-ci ne balaye qu'une petite partie de l'environnement (la partie contenant l'obstacle). (le champ de vision est réduit et focalisé sur l'obstacle).
Le capteur est ainsi capable de suivre l'obstacle, même si celui-ci est en mouvement.


Il y a des choses que tu ne comprends pas là dedans ?

C'est le fait de balayer l'objet avec le capteur qui t'assures le tracking.
Au démarrage, tu ne connais pas l'objet, tu balayes large.
Une fois que tu détectes l'objet, tu balayes localement pour déterminer les extrémités de l'objet.
Lors de ces micro-balayages, tu es sur de suivre ta cible.

EDIT : si tu veux, je te ferai un dessin quand je rentrerai chez moi ?

Mon site internet : http://ferdinandpiette.com/


#14 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 06 mars 2013 - 03:59

En fait c'est comment faire dans mon programme arduino pour "balayer localement pour déterminer les extrémités de l'objet." ?
Merci a tous
Cordialement Dylan.

#15 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2013 - 04:42

En fait c'est comment faire dans mon programme arduino pour "balayer localement pour déterminer les extrémités de l'objet." ?


Par exemple, un code basique à adapter à tes besoins (je n'ai pas testé en vrai. Il faut que tu remplaces les variables et les fonctions par ce dont tu as besoin. Par exemple getDistance, c'est la fonction analogRead) :
bool detected = false;
bool left = true;
int position = 0;

void loop() {
  int distance = getDistance();
  if(distance < 100) {
	detected = true;
  }
  else if(detected) {
	detected = false;
	left = !left;
  }

  if(left) {
	position += 1;
  }
  else {
	position -= 1;
  }
  servo.write(position);
}

Mon site internet : http://ferdinandpiette.com/


#16 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 07 mars 2013 - 05:32

d'accord , merci pour le morceaux de code , je vais l'adapter et je le poste tout a l'heure ;)

bonne journée a tous !
Merci a tous
Cordialement Dylan.

#17 skyhack

skyhack

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 885 messages
  • Gender:Male
  • Location:Racourt et Flaba (08)

Posté 07 mars 2013 - 10:05

insomniaque ? :lazy2:
" Monsters are real. Ghosts are real too.
They live inside us and sometimes they win."
-------------Stephen King.------------------

" le fait que les extraterrestres étaient amis avec les Mayas ne signifie pas qu'ils sont nos amis ... "
-------------------------------------Stephen Hawking----------------------------------------------------

#18 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 07 mars 2013 - 02:54

:ignat_02: insomniaque non , je n'arrivais pas a dormir :P

bon je n'ai pas finis du tout mon code mais j'ai commence un peu , qu'en dites vous pour l'instant (regarder les commentaires)

//servomoteur
#include <Servo.h>//importation de la librairie Servo
Servo myservo;   // creation de l objet myservo
int pos = 0;     // variable qui enregistre la position de l'angle du servo
//capteur IR
#define sensorIR 0 // declaration du capteur IR sur la broche analogique 0
bool detected = false; 
bool left = true;
int position = 0;

void loop() {
  myservo.attach(2); // association du pin numerique 2 a myservo
  pinMode (sensorIR,INPUT); //sensor IR est en entree
  int distance = analogRead(); 
  if(distance < 100) { //si la distance est plus petit que 100 (100 cm , inch , mm ?) alors ...(bon apres il faut que je change cette mesure a mes besoins)
        detected = true;  //la je met ce qu'il doit faire , donc dans mon cas : suivre l'objet detecter
  }
  else if(detected) {   //sinon ...
        detected = false; //la je met comme quoi le servo continu de tourner(chercher)
        left = !left;  
  }

  if(left) {                
        position += 1;
  }
  else {
        position -= 1;
  }
  myservo.write(position);
}

Merci a tous
Cordialement Dylan.

#19 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 09 mars 2013 - 07:06

quelqu'un peut m'eclairer ici :

if(distance < 100) { //si la distance est plus petit que 100 (100 cm , inch , mm ?) alors ...(bon apres il faut que je change cette mesure a mes besoins)
        detected = true;  //la je met ce qu'il doit faire , donc dans mon cas : suivre l'objet detecter
  }

quel est la mesure utiliser (pour le nombre 100) ?
Merci a tous
Cordialement Dylan.

#20 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 09 mars 2013 - 11:45

quel est la mesure utiliser (pour le nombre 100) ?


Pour obtenir la distance, tu viens lire la valeur de la tension provenant du capteur à l'aide de la fonction analogRead(
Regarde la doc pour savoir comment ça marche

This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023


En gros, si tu lis 100, ça veut dire que la tension de sortie du capteur vaut 5V*100/1024 soit 0.49V

Ensuite, il faut que tu ailles voir la datasheet de ton capteur pour faire la correspondance Volt/distance (il y a une courbe : Fig3).
Ici, 0.5V, c'est soit que l'obstacle est à 3cm, soit à 130cm.

Mon site internet : http://ferdinandpiette.com/





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

0 members, 0 guests, 0 anonymous users