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.


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:

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!

Go Up