Go Down

Topic: Commande servo via potentiometre pour bateau (Read 1 time) previous topic - next topic

andrea73

Bonjour,

Dans le cadre de la fabrication de mon bateau rc, j'ai besoin de piloter un servo à l'aide d'un potentiomètre logé dans le mat de mon bateau.
Conditions de bases:-si le potar est a 90 degrés alors la voile est bordé à fond
                           -si le potar est a 135 degres alors la voile est a moitié bordé
                           -si le potar est a 190 degres la voile est complètement bordé
Pareil si la voile est de l'autre sens: potard a 45 degrés alors voile a moitié bordé, etc,......
L'idée est que pour différente positions de la voile, le servo tourne de quelques degrés ( il y aurais un rapport: exemple: 10 degrés de potard fait tourner le servo de 1 degrés). La commande doit être " symétrique" car les mouvement du servo qui seront effectué de 0 a 90 degrés du potentiomètre seront exactement les mêmes que pour 90 a 180 degrés du potentiomètre. J'espère que vous avez compris ce que je voulais dire!

Je ne sais pas trop comment mettre en oeuvre le programme, j'ai vraiment que les bases de la programmation et j'aurais voulu avoir un coup de main!

Merci d'avance.

Andrea

patg_

Bonjour,
-D'abord il faudrait brancher le potentiomètre en pont diviseur de tension, sur une entrée analogique (une broche à +Vcc, l'autre à GND et le curseur sur l'entrée analogique).
-Ensuite avec analogRead(PIN_ID) tu vas lire une valeur entre 0 et 1024 selon la position du potard.
-Avec une règle de trois (ou bien la fonction map()), tu détermines la position à demander au servo en fonction de celle du potard
-Reste à utiliser la librairie servo pour positionner ton servo : servo.write(position);

Voilà pour le principe.
Après on peut compliquer (utiliser un asservissement de type PID par exemple) mais c'est pas toujours nécessaire. Sur mon projet actuel je me contente du principe ci-dessus et ça marche pas trop mal pour ce que j'ai à faire.

Mes Arduineries: http://breizhmakers.over-blog.com/

andrea73

Merci pour les infos! J'avais déja réalisé ce circuit pour m'entrainer.
Je veux au fait rajouter une autre petite difficulté:

Par exemple pour des angles compris entre 80 et 90 degrés du potentiomètre: je tourne de 0,1 degrés mon servo par degrés de potard
                                                   entre 70 et 80 degrés du potentiomètre: je tourne de 0,3 degrés mon servo par degrés de potard
Je pense qu'il faut utiliser le même principe que tu as explique mais en mettant des intervalles. Or je ne sais pas faire......

Merci!

patg_

#3
Jan 07, 2013, 05:00 pm Last Edit: Jan 07, 2013, 05:05 pm by patg_ Reason: 1
Ton problème semble plutôt donc être côté programmation.
Regarde du côté de l'utilisation des structures conditionnelles (if, else).
Si par exemple tu as dans "in" la valeur de ton potard, calibrée en degrés et "pos" la position souhaitée du servo:

Code: [Select]
if(in >= 70 && in < 80)
{
pos = 0.3 * in;
}else
{
 if(in >= 80 && in < 90)
 {
  pos = 0.1 * in;
  }
}

servo.write((int)pos);


Pour calibrer la valeur de in, tu mesures les valeurs lue par analoRead() pour les positions extrèmes du potard et tu appliques un truc genre:
Code: [Select]

in = map(analogRead(PIN_POTARD), VAL_MIN_LUE, VAL_MAX_LUE, ANGLE_POTARD_MIN, ANGLE_POTARD_MAX);


Entre 79 et 80 degrés tu vas avoir une discontinuité puisque le servo va passer de 23° à 8°
C'est peut-être voulu, ou alors j'ai mal compris la question  :smiley-mr-green:
Mes Arduineries: http://breizhmakers.over-blog.com/

andrea73

Oui c'est ce que je veux! Il y aura une discontinuité pour chaque intervalle de degrés du potard. Le but étant de régler l'aileron d'une voile rigide. Il y a un angle a respecter pour chaque position de la voile.
Par exemple pour un angle de 20 a 40 degres du potentiometre il faudra que le servo soit a 30 degres et pour un angle du potard de 40 a 60 il faudra que le servo soit a 20 degres pour une vitesse optimale du bateau.
Je veux pourvoir régler l'angle du servo en fonction d'un intervalle du potard.
merci de l'aide!

andrea73

Bonsoir,

Si vous aviez une proposition de shéma a me propose! Je bloque depuis cet aprem, je n'ai toujours pas trouvé ce qu'il fallait faire!
Merci d'avance

numero_744

Salut, un schéma comme ça ?
Bien-sur, les fils orange et jaune sont déplaçables, le orange doit cependant rester sur une broche analogique et le jaune sur une broche PWM (dites-le moi si il y a une erreur).
- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

andrea73

Un bout de code je voulais dire, les grandes lignes.....Merci

patg_

Je pense que tu devrais commencer par les tutoriels Arduino pour apprendre les bases.
Ensuite tu enrichis peu à peu pour arriver à implémenter ce dont tu as besoin.

Je pratique ainsi avec chaque nouveau framework ou langage que j'aborde (je développe depuis presque 30 ans  :smiley-mr-green: )
Mes Arduineries: http://breizhmakers.over-blog.com/

numero_744

#9
Jan 07, 2013, 10:10 pm Last Edit: Jan 10, 2013, 06:44 pm by numero_744 Reason: 1
C'est la méthode qui marche ! ;)
Sinon, on va trop vite et on se plante car on avais pas réalisé qu'on avais pas compris un truc indispensable.
(Je speak la France like an española vaca ! :D)

Sinon, comment réagira un servo 90° à la librairie servo qui est faite pour des servos de 180° si l'on laisse les paramètres par défaut ?
- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

andrea73

Bonjour,

J'ai essaye d'écrire un code mais sans succès. Je ne vois pas ou sont mes erreurs.
J'ai definis 3 intervalles (l'intervalles correspond a des positions de potentiomètre, par exemple de 30 a 60 degrés),et pour chacun de ces intervalles, il faut faire mettre le servo à une position donnée.

Mon code
Code: [Select]
#include <Servo.h>
#define potentiometre 0

Servo myservo;

int position = 0 ;  // Initialisation de position
int pot;

void setup()
{
 myservo.attach(9);  // Servo connecte a la sortie 9
 myservo.write(position);  // Servo positionne a o degres
}

void loop()
{
 pot = analogRead(potentiometre);
 position = map(pot, 0, 1023, 0, 179);
 if(pot >= 0 && pot < 250)  
 {
   myservo.write(10);   // servo tourne de 30 degres
   delay(200);
 }
 else
 {
   if(pot >= 250 && pot < 500)
   {
   myservo.write(20);   // servo tourne de 40 degres
   delay(200);
 }
 else
 {
   if(pot >= 500 && pot< 1023)
   {
   myservo.write(30);   // servo tourne de 50 degres
   delay(200);
   }
 }
 }
}


Merci de votre aide!

Andrea

patg_

Ca a l'air correct.
Quel est le problème exactement?

Tu devrais utiliser Serial.println() pour envoyer les valeurs calculées sur le moniteur série, ça aide à voir vraiment ce qui se passe.

Est-ce qu'avec un sketch minimal ton servo tourne bien de la valeur voulue?
Mes Arduineries: http://breizhmakers.over-blog.com/

andrea73

Non, il ne tourne pas du tout, il n'emet meme aucun bruit. Pourtant il me semble que les branchements soient bon!

andrea73

Finalement sa marche, mais j'aurais voulu avoir la conversion des donnes du potentiomètre en degrés pour que ce soit plus simple que d'utiliser l'intervalle entre 0 et 1023.

numero_744

Code: [Select]

  PotDeg = analogRead(Potar) * 180
  Pot deg /= 1023;
//PotDeg = analogRead(Potar) * (angle max) / 1023;

Perso, c'est ce que je ferais...
/!\ : Bien mettre la division après la multiplication afin d'avoir une meilleure précision (il me semble que la carte arrondit à l'unité s'il y a des décimales et que la variable n'est pas de type variable à virgule).
- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Go Up