Aller au contenu


Photo
- - - - -

Arduino Capteur ultrason + servo


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

#1 Rather Be

Rather Be

    Nouveau membre

  • Membres
  • 5 messages

Posté 12 avril 2014 - 10:30

Bonjour à tous ,

Voila , je suis en pleine fabrication de mon robot "suiveur" mais je rencontre actuellement un probleme :

J'aimerais que mon servo tourne sur une plage ( 0° - 180° ) JUSQU'A ce que le capteur ultrason détecte une distance supérieure à "X" .

J'ai éssayé avec la fonction " while " + " random " , je m'explique :

while ( cm < 20 ) {
Mon_Servo.write( random(180 ));
}


Pour ceux qui voient de quoi je parle , vous vous doutez que cela ne fonctionne pas , je suppose que le " random " génere les nombres trop rapidement pour le servo .. Mais j'ai également remarqué un autre probleme .. Lorsque je cale ma boucle " while " dans mon programme , le capteur ultrason émet/recois qu'une seule fois .. Et il trouve 0 à chaque fois .
De ce fait , je reste enfermé dans ma boucle "while" ..

Je vous balancerai bien le code mais je ne l'ai pas enregistré :on_the_quiet:/>/>/>

Je le referai pour vous le montrer si il faut :ignat_02:/>/>/>


En résumé : Existe t'il une fonction pour que mon servo tourne continuellement sur une plage ( 0° - 180° ) JUSQU'A ce que le capteur ultrason détecte une distance supérieure à " X " ?

Pourquoi le capteur me détecte systématiquement 0 , lorsque je met ma boucle " while " ?


Merci d'avance pour votre aide ?
" Comme si j'étais le Roi de la pomme de terre , j'envoi la purée "

#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 13 avril 2014 - 01:46

Pourquoi de l'aléatoire ?
Essaye plutôt d'écrire dans ton code le balayage que tu veux.
ici un exemple avec une boucle for, mais tu peux écrire a peut près la même chose avec une boucle while...

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Rather Be

Rather Be

    Nouveau membre

  • Membres
  • 5 messages

Posté 13 avril 2014 - 09:15

Donc la solution serait :

void loop()
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(15);
}
}

J'ai beaucoup de mal avec la boucle " for " , c'est pour ca que j'ai pris " while " . Quand à pourquoi j'ai choisi random ? Simplement parce que c'etait la seule solution que je connaissais pour faire tourner le servo sur une plage . Biensur , ca ne me donnait pas le resultat attendu ..

Merci pour ton aide , je test ca dessuite !! :drag_02:
" Comme si j'étais le Roi de la pomme de terre , j'envoi la purée "

#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 13 avril 2014 - 11:48

Donc la solution serait :

void loop()
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(15);
}
}

J'ai beaucoup de mal avec la boucle " for " , c'est pour ca que j'ai pris " while " . Quand à pourquoi j'ai choisi random ? Simplement parce que c'etait la seule solution que je connaissais pour faire tourner le servo sur une plage . Biensur , ca ne me donnait pas le resultat attendu ..

Merci pour ton aide , je test ca dessuite !! :drag_02:/>


traduction en français de la ligne "for(pos = 0; pos < 180; pos += 1) "

On prend une variable qu'on appel "pos" (pour position ) que l'on initialise à 0 ( premier paramètre du for ) qu'on va incrémenter de 1 ( troisième argument du for ) a chaque fois jusqu'à ce que pos atteigne la valeur 180 ( 2 ème argument du for ).
Par contre à chaque fois que tu incrémente de 1 tu fais ce qui est dans les accolades du for ;)

Toi je suppose que tu veux bouger tant que tu as pas une valeur supérieur à 20cm ... donc vu que tu as un "tant que " quand tu explque en français ce que tu veux faire ça veut dire qu'il va te falloir un while.

donc tu commence bien avec ton

while (cm<20)
{

}

Et à l'intérieur de ton while tu dois faire une fonction qui s'inspire du for.

exemple :

...
int pos =0;
int augmente =1; 

while (cm<20)
{
if (augmente)
pos++;
if(!augmente)
pos--;
if(pos>180)
augmente =0;
if (pos<0)
augmente =1; 
myservo.write(pos); 
delay(15);
}


...

maintenant histoire de me montrer que tu as compris ce que j'ai écris explique moi à quoi servent les variable " augmente " "pos" et dis moi dans l'ordre qu'est ce qu'on fait dans le while que j'ai écris :)

En tout cas bonne continuation ;)

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#5 Rather Be

Rather Be

    Nouveau membre

  • Membres
  • 5 messages

Posté 13 avril 2014 - 03:29

Et dans le cas où j'ai rien comrpis , comment on fais ? :on_the_quiet:

La boucle " for " ne me pose plus de probleme , j'ai bien saisi . En revanche , je ne comprend pas ta variable " augmente " . J'essai de me traduire le code :


int pos =0; // On met une variable qui correspond à la position , jusqu'ici pas de soucis ..
int augmente =1; // On met une variable pour faire joli , pas de soucis ici non plus :on_the_quiet: Non , sérieusement , je ne comprend pas ici ..

while (cm<20)  // "While" donc fonction qui signifie "tant que" , pas de probleme non plus , tant que ma condition ( cm<20 ) est vraie , on execute le code entre les accolades et ...
{
if (augmente) // "If" donc , litéralement " si " augmente ... Si augmente ? Si augmente quoi ? Remplacons augmente par "add" . Si add ? Oui mais si add quoi ? Ici , je commence à me perdre ..
pos++;        // pos++ qui signifie que l'on ajoute 1 à la variable " pos " qui , initiallement égale 0 , à chaque boucle .
if(!augmente) // If ( !augmente ) Le " ! " signifie différent si je me souvient bien . Donc " Si augmente est différent . Différent de quoi ?
pos--;        // pos-- , à l'inverse , on enleve  à chaque boucle .
if(pos>180)   // If " pos " est supérieur à 180 
augmente =0;  // augmente égal 0 
if (pos<0)    // Bon la , pareil mais à l'inverse .. Cela n'empeche que je ne comprend pas pourquoi faire ca .
augmente =1;  // Idem .
myservo.write(pos); // Myservo.write , monservo.écrit la valeur de pos ( qui , ne dépasse pas 180 logiquement )
delay(15);  // Pause dans le programme de 15 millisecondes
}



En résumé , partout où il y a augmente je ne comprend pas , des explications seraient les bienvenues ;)


Edit : Quelles sont les balises pour écrire du code dans nos post ?
" Comme si j'étais le Roi de la pomme de terre , j'envoi la purée "

#6 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 13 avril 2014 - 04:33

{
if (augmente) // "If" donc , litéralement " si " augmente ... Si augmente ? Si augmente quoi ? Remplacons augmente par "add" . Si add ? Oui mais si add quoi ? Ici , je commence à me perdre ..
pos++; // pos++ qui signifie que l'on ajoute 1 à la variable " pos " qui , initiallement égale 0 , à chaque boucle .
if(!augmente) // If ( !augmente ) Le " ! " signifie différent si je me souvient bien . Donc " Si augmente est différent . Différent de quoi ?
pos--; // pos-- , à l'inverse , on enleve à chaque boucle .
}


Remplace augmente par "toto" si tu trouves que le sens du nom de la variable rend les choses confuses.
J'ai l'impression que ce que tu ne comprends pas, c'est le fonctionnement de "if" :

if ( < condition > ) alors { faire quelque chose } else { faire autre chose}
<condition> est un booléen : c'est le résultat d'un test qui est soit vrai, soit faux.
Par exemple, if(toto == 15) évalue l'expression pour savoir si la valeur toto est égale à 15. if(toto != 15) teste si toto vaut n'importe quoi, sauf 15.
Dans le premier cas, évaluer l'expression (toto == 15) renvoit true ou false, selon la valeur de toto. Le comportement de if est tel que si l'expression a renvoyé true, le segment de code entre les accolades qui suivent le if est exécuté, et si l'expression a renvoyé false, le segment de code entre les accolades de else est exécuté (ou rien n'est fait, il n'est pas obligatoire de définir un cas "else").

Maintenant, pour revenir à l'exemple de Mike, par convention, l'évaluation booléenne d'une variable de type entier est la suivante : si la variable vaut zéro (entier), alors son équivalent booléen est "false". Si la variable a une valeur non-nulle (1, mais aussi 2, -8, etc), l'équivalent booléen de la variable est "true". Écrire
if(toto)
c'est la même chose qu'écrire
if(toto != 0)

Ce qui donne :
int pos = 0;
int augmente = 1; 

while (cm<20) // tant que la valeur de la variable "cm" est inférieure à 20
{
if (augmente) // Si "augmente" n'est pas nul
pos++;        // on incrémente "pos"
if(!augmente) // Si "augmente" est nul
pos--;        // on décrémente "pos"
if(pos>180)    // si "pos" vaut plus que 180, ce qui est la même chose que "l'expression pos > 180 renvoie true"
augmente =0;   // ...
if (pos<0)
augmente =1; 
myservo.write(pos); 
delay(15);
}

Tu peux utiliser les balises [ code ] tout simplement pour poster ton code.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 Rather Be

Rather Be

    Nouveau membre

  • Membres
  • 5 messages

Posté 13 avril 2014 - 04:56

Le fonctionnement du If , je l'ai bel et bien aquis , j'ai fais plusieurs programme avec ect ... Changer le nom de " augmente " n'y fais rien , ce n'est pas ce qui me genait . Par contre , tu as touché dans le mille lorsque tu m'expliques :


Maintenant, pour revenir à l'exemple de Mike, par convention, l'évaluation booléenne d'une variable de type entier est la suivante : si la variable vaut zéro (entier), alors son équivalent booléen est "false". Si la variable a une valeur non-nulle (1, mais aussi 2, -8, etc), l'équivalent booléen de la variable est "true". Écrire
if(toto)


C'est la meme chose que d'écrire :
if(toto!=0)


Ce que je ne savais pas ! :drinks:/>/>/>/> Ducoup le code s'éclaircit . En revanche , je ne comprend toujours pas l'interet de " augmente " , quel son role dans le code ? On peut s'en passer non ?

Edit : J'dois me tromper vis à vis des balises , à l'aide :tatice_03:/>/>
" Comme si j'étais le Roi de la pomme de terre , j'envoi la purée "

#8 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 13 avril 2014 - 08:39

Ce que je ne savais pas ! :drinks:/>/>/> Ducoup le code s'éclaircit . En revanche , je ne comprend toujours pas l'interet de " augmente " , quel son role dans le code ? On peut s'en passer non ?

Edit : J'dois me tromper vis à vis des balises , à l'aide :tatice_03:/>

Dans l'exemple de Mike, ça permet de changer le sens dans lequel tu balayes (en allant de 0° à 180° ou l'inverse). Ca sert si tu veux pouvoir changer le sens au travers de ton code.
Pour les balises, il ne faut pas mettre d'espace : j'en ai mis, sinon le site les interprète et le nom de la balise ne s'affiche pas.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#9 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 13 avril 2014 - 10:36

Dans l'exemple de Mike, ça permet de changer le sens dans lequel tu balayes (en allant de 0° à 180° ou l'inverse). Ca sert si tu veux pouvoir changer le sens au travers de ton code.
Pour les balises, il ne faut pas mettre d'espace : j'en ai mis, sinon le site les interprète et le nom de la balise ne s'affiche pas.


exacement, la variable "augmente" est là pour savoir si on doit incrémenter la position dans le sens positif ( dans ce cas là augmente =1 ^^ ) ou dans le sens négatif (=> augmente = 0 )
essayez de faire la même chose sans enregistrer le sens de parcourt =) et de bien faire des allé retour pour voir et vous verrz si vous y arrivez ;)

pour les balise la deuxième doit être avec "/" avant "code" dans les crochets " [] " [/code]

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 





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

0 members, 0 guests, 0 anonymous users