Pages: [1]   Go Down
Author Topic: Commande servo via potentiometre pour bateau  (Read 1419 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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
« Last Edit: January 07, 2013, 11:05:05 am by patg_ » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).


* Image 4.png (39.16 KB, 506x349 - viewed 21 times.)
Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 )
Logged


France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est la méthode qui marche ! smiley-wink
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 ! smiley-grin)

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 ?
« Last Edit: January 10, 2013, 12:44:23 pm by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  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).
Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Pages: [1]   Go Up
Jump to: