Problème de servo

Bonjour à tous !
(ca fait longtemps)
je dois dépanner rapidement un spectacle cette semaine, et j'ai besoin d'occulter le faisceau d un video projecteur avec une pale légere.

j utilise un jeenode et un servo hs 422.

j ai le même souci avec les servos que j ai à la maison( hs 422, gws NARO*F H/BB):

le moteur vibrillonne en continu. le bruit et le mouvement sont très embêtants.

j ai essayer de bouger le moteur en write et en writemicroseconds, avec les memes resultats. ca fait du jitter....
que je touche au delay dans la boucle ou pas, même résultat, que j'écrive le moteur à réception de paquet ou hors réception (comme ici):

#include <JeeLib.h>
#include <Servo.h>

Servo myservo;
int val_servo=0;
int old_val_servo=-1;

void setup () {
  
rf12_initialize(2,RF12_868MHZ, 212);//initialisation jeenode


//P1
pinMode(4,OUTPUT);
pinMode(14,OUTPUT);
//P2
//pinMode(5,OUTPUT);
pinMode(15,OUTPUT);
 myservo.attach(5);
//P3
pinMode(6,OUTPUT);
pinMode(16,OUTPUT);
//P4
pinMode(7,OUTPUT);
pinMode(17,OUTPUT);

  }

void loop () 
{
 
  if (rf12_recvDone() && rf12_crc == 0)
    {
    
                val_servo=rf12_data[2]-1;

                if(val_servo!=old_val_servo)
                {
                digitalWrite(15,HIGH); //temoin led
                old_val_servo=val_servo;
                delay(15);
                digitalWrite(15,LOW); 
                }  
    }
     int val = map(val_servo, 254, 0, 1000, 2000);                  
     myservo.writeMicroseconds(val);         
      delay(10);
}

quelqu un a t il une idée pour régler très rapidement ce problème ? ou est ce du fondamentalement au fait que ce soit un servo peu cher ?

merci !!!

bonjour,
teste ca

 if (rf12_recvDone() && rf12_crc == 0)
    {
   
                val_servo=rf12_data[2]-1;

                if(val_servo!=old_val_servo)
                {
                digitalWrite(15,HIGH); //temoin led
                old_val_servo=val_servo;
                delay(15);
                digitalWrite(15,LOW);
  int val = map(val_servo, 254, 0, 1000, 2000);                 
     myservo.writeMicroseconds(val);         
      delay(10);
                } 
    }

Merci infoembarquee, mais c est ce que je disais dans mon post: que ce soit a reception ou hors reception c est le meme probleme.
:o

Bonjour,

Et si tu fais ça est ce que ça vibre?

void loop () 
{
     myservo.writeMicroseconds(1500);         
     delay(10);
}

Auquel cas il faut voir du coté du servo.

karistouf:
Merci infoembarquee, mais c est ce que je disais dans mon post: que ce soit a reception ou hors reception c est le meme probleme.
:o

bonjour Christoph

a tu essayé la lib VarSpeedServo ?
si ça vibre en position "stable" , une methode bourrin mais efficace (si tu dispose d'un pin en sortie)
tu colle un mosfet dans la ligne d'alim que tu gere en complement (position stable = servo OFF)
evidemment il faut que la charge sur le servo soit faible pour ne pas entrainer de rotation.

Bonsoir kamill, je vais tester ce soir et te dis.

Merci artouste, je vais essayer cette lib ce soir.
J avais tenté une alimentation/desalimentation en utilisant un digital write et en prenant un digital pour alimenter mais ca ne marchait pas.

Mais est ce normal? J avais rencontre ces meme problemes sur une uno il y a quelques annees et du coup je m etonnes: cette vibration est habituelle?

karistouf:
J avais tenté une alimentation/desalimentation en utilisant un digital write et en prenant un digital pour alimenter mais ca ne marchait pas.

Tu alimente ton servo comment (par quoi ?)

Par le port power du jeenode, le tout en sortie usb ordi. Si je passe par un transfo cc 5v c est la memz chose

karistouf:
Par le port power du jeenode, le tout en sortie usb ordi. Si je passe par un transfo cc 5v c est la memz chose

ok
à ce niveau teste déjà la lib
et teste aussi la coupure d'alim par mosfet (si tu avais essayé d'alimenter le servo directement par un pin en sortie, tu a du bol de pas avoir cuit ta sortie 8) )

Le servo peut vibrer si la valeur passée en argument à writemicroseconds() est trop grande ou trop petite pour le servo. Le servo n'arrive pas à atteindre la consigne et il vibre.
La plage 1000 à 2000 est une plage théorique.

ok, étape N°1:

void loop () 
{
     myservo.writeMicroseconds(1500);         
     delay(10);
}

le servo ne vibrillone pas, donc ce n'est pas un pb de servo

ok, étape N°2, avec la lib qu'Artouste a conseillé, çà marche nettement mieux ( bravo et merci )

  • l'écriture servo doit impérativement être hors de la condition de réception de paquets.

  • il faut après l'exécution du write un temps de delay

  • la stabilité du moteur dépend de la durée du temps de delay le temps que le servo se place

A noter que la fonction write dans VarSpeedServo ne fonctionne pas en angles, mais sur la plage 1000 - 2000.

Cependant:
Je continues d'avoir un petit frétillement, mais discret et par intermittence (on est loin de la cata qu'il y avait avant de changer de lib).
Je n'arrive pas à trouver la solution en changeant les valeurs de map. Faut il ajouter un tore autour du cable du servo pour éviter d'éventuelles interférences ?

#include <JeeLib.h>
#include <VarSpeedServo.h>

VarSpeedServo myservo;
int val_servo=0;
int old_val_servo=-1;

void setup () {
  
rf12_initialize(2,RF12_868MHZ, 212);//initialisation jeenode

//P1
//pinMode(4,OUTPUT);
//pinMode(14,OUTPUT);
//P2
//pinMode(5,OUTPUT);
myservo.attach(5);
pinMode(15,OUTPUT);
//P3
//pinMode(6,OUTPUT);
//pinMode(16,OUTPUT);
//P4
//pinMode(7,OUTPUT);
//pinMode(17,OUTPUT);

}

void loop () 
{
 
  if (rf12_recvDone() && rf12_crc == 0)
    {
      //Shutter sur Jee_P2_D = pin 5
                val_servo=rf12_data[2]-1;
                if(val_servo!=old_val_servo)
                {
                digitalWrite(15,HIGH); //temoin led
                old_val_servo=val_servo;
                delay(15);
                digitalWrite(15,LOW); 
                }  
    }
    //l'écriture servo doit être hors de la boucle
    int val = map(val_servo, 254, 0, 1000, 1990);     
    myservo.writeMicroseconds(val); 
    delay(30);//jouer sur le temps de délai pour enlever le fértillement
    //attention le délay dans la réception de donnée joue aussi

}

karistouf:
...
Je n'arrive pas à trouver la solution en changeant les valeurs de map. Faut il ajouter un tore autour du cable du servo pour éviter d'éventuelles interférences ?

je ne pense pas qu'un tore soit là tres utile (mais bon ça ne peut pas nuire)
je mettrais pour test au plus pres du servo plutot un bon gros condo chimique avec en // un non polarisé
(dans l'ideal le NP devrait etre soudé sur les bornes du moteur DC du servo )

Bonsoir artouste
Tu veux dire stabiliser l alim du servo?

karistouf:
Bonsoir artouste
Tu veux dire stabiliser l alim du servo?

En gros oui 8)
mettre un chimique ( faible ESR si possible) au plus pres de l'utilisation

un peu moins de déclenchements intempestifs avec 2 condos en reprenant l'alim 5v.
par contre je n ai pas la place de mettre un mosfet :frowning:

j ai donc des petits mouvements de temps en temps

karistouf:
un peu moins de déclenchements intempestifs avec 2 condos en reprenant l'alim 5v.
par contre je n ai pas la place de mettre un mosfet :frowning:

j ai donc des petits mouvements de temps en temps

bonjour christoph
tu n'a pas la place physique ou tu n'a plus de pin dispo ?
une idée en passant : "detacher" detach() entre les deplacements servo ?

Le servo présente la même instabilité à vide (sans la pale)?

bonjour !
non je n'ai pas la place en termes d'espaces. il faudrait que je change de boite et je n'en ai plus sous le coude ici.
les tréssautements sont en effet toujours pale à vide, et un petit peu moins qu avant les condos. mais c est assez aléatoire... je vais essayer le détach, bonne idée !

Bonjour Artouste et tout le monde, donc attach detach est LA solution !

merci beaucoup ! enfin !!!

je ne comprends pas que les sketchs d'exemple n'y fassent pas appel.

#include <JeeLib.h>
#include <VarSpeedServo.h>

VarSpeedServo myservo;
int val_servo=0;
int old_val_servo=-1;

void setup () {
  
rf12_initialize(2,RF12_868MHZ, 212);//initialisation jeenode

pinMode(15,OUTPUT);//led temoin
}

void loop () 
{
 
  if (rf12_recvDone() && rf12_crc == 0)
    {
      //Shutter sur Jee_P2_D = pin 5
                val_servo=rf12_data[2]-1;
                if(val_servo!=old_val_servo)
                {
                digitalWrite(15,HIGH); //temoin led
                old_val_servo=val_servo;
                delay(15);
                digitalWrite(15,LOW); 
                }  
    }
    //l'écriture servo doit être hors de la boucle de réception jeenode
    myservo.attach(5);
    int val = map(val_servo, 254, 0, 1000, 2000);     
    myservo.writeMicroseconds(val);
    delay(30);//delay nécessaire au positionnement du servo
    myservo.detach(); 
}