Aller au contenu


Photo
- - - - -

Code pour controler un servo a l'aide d'un sonar


20 réponses à ce sujet

#1 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 18 janvier 2017 - 04:55

Bonjour/Bonsoir,

 

Voici arrivé le mois de Janvier bientôt Février  moi et mon binôme avons terminé (ou presque) notre TPE avec comme grand axe "Comment les appareils de mesurent parviennent a rendre nos avions plus sur". Nous avons présenté une courte histoire de l'aviation (les frères Wright etc), les différente forces, l'importances des ailes.. En seconde partie différent appareils rendant les avions plus sur comme le transpondeur, l'altimètre ou le compas magnétique, nous avons fait notre conclusion.

Ayant fait 80% de notre TPE nous devons produire une réalisation en rapport avec notre TPE, ayant envisager plusieurs possibilité nous nous sommes tournés vers le contrôle de la gouverne de direction (grâce a un servo moteur, l'avantage étant qu'il puisse rester a une position fixe) en fonction de l'altitude (prise grace a un capteur a ultra son). Arriver sur circuits.io on réalise le montage mais un problème arrive on ne sait pas quoi utiliser comme code afin que le servo:

-reste en position initial (pour faire en sorte que la gouverne de profondeur soit a l'horizontal) si la maquette est comprise entre 100 et 120cm d'altitude

-effectue une rotation d'environ 15° vers le bas (les valeur précise sont a définir suivant la maquette que nous allons avoir) si le capteur a ultra son détecte que la maquette est a plus de 120cm d'altitude (afin de simuler un réajustement de l’altitude).

-effectue une rotation d'environ 15° vers le haut (valeur précise a définir aussi) si la maquette est en dessous de 100cm d'altitude.

 

Étant dans un lycée plutôt bien équipé nous avons une multitude de composants, circuit, capteurs.. Mais aussi des imprimantes 3D afin de réaliser les charnières de notre gouverne si nous en avons besoins.

 

 

Merci de l'aide et bonne journée

 

Cordialement, Hugo



#2 Path

Path

    Made By Humans

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

Posté 18 janvier 2017 - 07:52

Bonjour Hugo,

 

Avant toute chose, nous te prions de bien vouloir passer par la case présentation :) C'est toujours plus sympathique de savoir à qui on parle. TPE aéronautique, c'est un peu juste.

 

Pour ton problème, si tu arrive à l'expliquer clairement avec des mots, tu auras fait la moitié du chemin.



#3 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 18 janvier 2017 - 10:23

J'ai édit :)



#4 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 18 janvier 2017 - 10:23

Bonjour/Bonsoir,

 

Dans le cadre de mon TPE sur l'aéronautique j'aimerai faire une réalisation. A l'aide d'une arduino, d'un sonar et un servo j'aimerai contrôler la gouverne de profondeur d'un "avion" (juste la partie avec la gouverne il ne volera pas). Mon prof est en mesure de me fournir le matos nécessaire cependant je n'ai aucun idée de comment réalisé le code.

Par exemple:

Si le sonar mesure -95cm faire en sorte que le servo tourne de 15°

Si il mesure entre 95cm et 1m05 il reste/revient en position initial

Si il mesure +1m05 il tourne de -15°

 

Je m'explique peut être mal mais je suis sur que vous voyez :)

 

Merci de l'aide et bonne journée

 

Cordialement, Hugo

Salut Hugo,

 

je vais être un peu taquin : -95cm ? Une distance négative ? C'est un peu tard pour l'avion, qui doit être profondément dans le sol, non ?

Pour le code : je t'invite à regarder https://www.arduino....torial/HomePageou à faire "Fichier > Exemples" pour voir la base de la programmation Arduino. Les tutoriels sont vraiment bien pour acquérir le minimum (et le code est fourni). À partir de ça, tu peux essayer d'assembler des bouts d'exemples pour faire marcher ta maquette.

Les exemples que tu donnes représentent différents cas que tu dois gérer. Indice : if ... else est ton ami.

N'hésites pas à poster tes essais de code commenté pour pour qu'on puisse t'aider.


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

#5 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 18 janvier 2017 - 10:27

D'accord je vais aller jeter un œil :) J'ai quelques connaissances en java avec les boucles if else etc je suppose que cela reste fondamentalement semblable.

 

PS: jai refais mon poste j'avoue qu'il était court et peu détaillé



#6 Mike118

Mike118

    Staff Robot Maker

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

Posté 18 janvier 2017 - 11:21

En fait je suppose qu'il voulait dire - de 95 cm à ce moment là mais bon le sujet a été édité ;)

Pour compléter la réponse de R1D1 : 

Si tu veux faire simple : tu peux en effet utiliser une arduino comme " cerveau" pour ton montage.  Comme le dit R1D1 l'avantage c'est qu'il y a de nombreux exemple tout près qui permettent de facilement piloter un servomoteur.  ( par contre ça serait tout aussi possible de faire la même chose avec d'autres moyens :)  ) 

Ensuite il suffit de procéder par étape : 

  • apprendre à piloter le servomoteur  ( voir tutoriel et code d'exemple  : très rapide ) 
  • apprendre à utiliser le capteur  si tu prends le HCSR04  ( code très rapide là aussi exemple  avec la librairie newping
  • Mélanger les deux codes et utiliser des conditions pour faire le mouvement adéquate.  

    Si jamais tu as du mal, ou si c'est la première fois que tu utilise une arduino tu passes par cet ouvrage, et tu auras toutes les explication pour installer le logiciel, faire tes premiers programmes, utiliser des librairies , mélanger des programmes ... 

N'hésite pas à poster tes avancés pour la suite je compte sur toi ;) 


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  

 

 

 


#7 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 19 janvier 2017 - 09:25

D'accord merci des conseils et oui le capteur de mon prof est le HCSR04, je vais lire attentivement tout ca et je vous posterai le résultat a la fin.



#8 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 25 janvier 2017 - 07:39

Bonsoir, alors j'ai regarder quelques tutos, les codes du capteur a ultrason et du servo et j'ai bidouiller ce code :

#include <Servo.h>
int trig = 11;
int echo = 11;
long lecture_echo;
long cm;
int pos = 0;
Servo myservo;
void setup()
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);
  myservo.attach(9);
}

void loop()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
  delay(1000);
  if (cm < 100){
    for(pos = 90; pos < 75; pos += 1)   
    {                                  
      myservo.write(pos);              
     delay(15);                       
    }
  }
  if (cm > 120){
    for(pos = 90; pos > 105; pos-=1)     
    {                                
    myservo.write(pos);              
    delay(15);                       
    }
  }
  else (cm > 100 && cm < 120);{
      for(pos = 90; pos < 90; pos = 0)  
    {                                  
      myservo.write(pos);              
     delay(15);  
    }
  }
}

L'IDE Arduino compile bien le code cependant sur circuit.io le capteur a ultra son ne possède pas 2 entrée ( trig et echo ) mais seulement un "SIG" j'ai donc mit les 2 entrée dessus. Après ça j’ai essayer mon code avec ce montage sur circuit.io mais le servo se bloque a 90° lorsque je met le "point" de l'ultra son a plus de 120cm rien ne se passe et a moins de 100cm aussi, pourquoi mon code ne fonctionne pas ?

 

Screen de mon montage sur circuit.io:

http://image.noelshack.com/fichiers/2017/04/1485369417-ggggg.jpg

 

Merci pour l'aide, cordialement, Hugo.



#9 Path

Path

    Made By Humans

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

Posté 25 janvier 2017 - 08:19

Petite remarque, si cm vaut 100 ou 120 ? :)



#10 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 08:24

La prochaine fois utilises les balises pour le code, c'est bien plus lisible, merci.

J'ai édité ton post.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#11 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 08:34

Quelqu'un peut m'expliquer ça :

for(pos = 90; pos < 75; pos += 1)

Edit : soit je l'interprète mal, soit ça ne fonctionnera jamais (comme les deux autres boucles "for").


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#12 Path

Path

    Made By Humans

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

Posté 25 janvier 2017 - 09:07

Effectivement, pos va augmenter, il ne sera jamais < 75. 

 

Je ne comprends pas non plus :)

for(pos = 90; pos < 90; pos = 0)


#13 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 25 janvier 2017 - 09:07

Excusez moi pour les balises, je crois avoir compris l'erreur, est-ce mieux ? Je voudrai dire, "si cm est compris dans l'intervalle [0;100[ la position du servo tourne de +15°. Comment faire pour que le servo soit de base a 90° ?

#include <Servo.h> 
int trig = 11;
int echo = 11;
long lecture_echo;
long cm;
int pos = 0;
Servo myservo;

void setup()
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);
  myservo.attach(9);
}

void loop()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
  delay(1000);
 
 for(cm = 0; cm < 100; pos = +15)   
    {                                  
      myservo.write(pos);              
     delay(15);                       
    } 
  for(cm = 100; cm <= 120; pos = +0)     
    {                                
    myservo.write(pos);              
    delay(15);                       
    } 
  for(cm = 120; pos < 500; pos = -15)  
    {                                  
      myservo.write(pos);              
     delay(15);  
    }
  }
}


#14 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 09:12

Je crois que tu n'as pas compris comment fonctionne une boucle "for", et je pense que c'est pour ça que ton programme ne fonctionne pas.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#15 Path

Path

    Made By Humans

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

Posté 25 janvier 2017 - 09:14

C'est pos += 15 ou pos -=15

Cela revient à pos = pos + 15 ou pos = pos - 15.

Par contre,

pos = +0 n'a aucun sens dans un for :)



#16 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 09:18

En fait, je pense même que la boucle "for" n'a rien à faire ici, mais plutôt un "if", si j'ai bien suivi l'explication de départ.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#17 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 25 janvier 2017 - 09:27

J'ai donc ceci, comment faire pour dire que 90° est la position initial ? Si mon cm est compris dans [100;120] comment lui dire de revenir en position initial ?

EDIT: je vais essayer avec un if.

#include <Servo.h> 
int trig = 11;
int echo = 11;
long lecture_echo;
long cm;
int pos = 0;
Servo myservo;
void setup()
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);
  myservo.attach(9);
}

void loop()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
  delay(1000);
  for(cm = 0; cm < 100; pos += 15)   
    {                                  
      myservo.write(pos);              
     delay(15);                       
    } 
  for(cm = 120; pos < 500; pos += 15)  
    {                                  
      myservo.write(pos);              
     delay(15);  
    }
  }



#18 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 09:28

Je verrais plus quelque chose comme ça :

#include <Servo.h>
int trig = 11;
int echo = 11;
long lecture_echo;
long cm;
int pos = 90;
Servo myservo;

void setup()
{
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
myservo.attach(9);
}

void loop()
{
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
delay(1000);

if (cm => 0 & cm < 100)
{
pos=105;
}
if ( cm => 100 & cm <= 120)
{
pos=90;
}
if (cm > 120 & cm < 500)
{
pos=75;
}
myservo.write(75)
delais(15);
}
}

En admettant que la valeur passée dans myservo.write() est l'angle auquel doit se positionner le servo et que 90° correspond à un vol horizontal.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#19 Ichmer

Ichmer

    Membre

  • Membres
  • 11 messages

Posté 25 janvier 2017 - 09:34

Merci beaucoup pour l'aide cependant esque l'unique sortie du capteur sur circuit.io et le fait qu'on utilise dans le code la même voie pour le trig et pour l'echo et grave ?

 

Cordialement, Hugo.



#20 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2017 - 09:42

Là, je ne pourrai pas t'aider, je ne connais pas le capteur.

 

Pour apprendre à programmer l'arduino, je te conseille de regarder l'ouvrage de Jekert , tu y liras des exemple pour les boucles qui semble te poser problème.

Mon programme n'est pas du tout optimisé mais il te permet voir les conditions telles que tu les voulais.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega



Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users