Ma tête de robot a le torticolis.

Bonjour à tous.

J'ai réalisé pour mes petits enfants une sorte de tête de robot, réalisé avec deux canettes de soda (vides)
animés par deux servomoteurs. Il tourne la tête a droite puis à gauche et pour terminer il la baisse un peu.
Les yeux sont réalisés avec deux modules de 8X8 led.
Tout fonctionne correctement, sauf qu'a la mise en route les deux servo prennent une position incorrectes durant une demi seconde puis se placent dans la bonne position.

Je pense que j'ai du mal placer une ligne de variable quelque part mais je n'arrive pas a savoir où.

Si vous aviez une idée pour m'orienter dans mes recherches, je vous en serais reconnaissant.

Cordialement.

Je me suis servi d'un code déjà réalisé pour le mouvements des yeux que j'ai bricolé à ma façon surement peu académique, veuillez ne pas taper trop fort.

#include <Servo.h>       //Bibliothèque servo à installer

int DIN_pin = 8 ;
int CS_pin = 9 ;
int CLK_pin = 10 ;

// Mouvement des yeus.
int YO[8] = {0x00, 0x3c, 0x7e, 0x66, 0x66, 0x7e, 0x3c, 0x00} ;// Yeux ouverts devant.
int YD[8] = {0x00, 0x3c, 0x7e, 0x72, 0x72, 0x7e, 0x3c, 0x00} ;// Yeux ouverts à droite.
int YG[8] = {0x00, 0x3c, 0x7e, 0x4e, 0x4e, 0x7e, 0x3c, 0x00} ;// Yeux ouverts à gauche.
int YH[8] = {0x00,0x3c,0x66,0x66,0x7e,0x7e,0x3c,0x00}; //Yeux en haut.
int YB[8] = {0x00,0x3c,0x7e,0x7e,0x66,0x66,0x3c,0x00}; //Yeux en bas.

// Yeux qui se ferment à répetter dans le sens inverse.
int Y1[8] = {0x00,0x00,0x7e,0x66,0x66,0x7e,0x3c,0x00};
int Y2[8] = {0x00,0x00,0x00,0x7e,0x66,0x7e,0x3c,0x00};
int Y3[8] = {0x00,0x00,0x00,0x00,0x7e,0x7e,0x3c,0x00};
int Y4[8] = {0x00,0x00,0x00,0x00,0x00,0x7e,0x3c,0x00};
int Y5[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00};



void write_pix(int data) {
  digitalWrite(CS_pin, LOW) ;
  for (int i=0 ; i<8 ; i++) {
    digitalWrite(CLK_pin, LOW);
    digitalWrite(DIN_pin,data & 0x80);
    data = data << 1;
    digitalWrite(CLK_pin, HIGH);
  }
}

void write_line(int address, int data) {
  digitalWrite(CS_pin, LOW) ;
  write_pix(address); 
  write_pix(data); 
  digitalWrite(CS_pin, HIGH);
}

void write_matrix(int *tab) {
  for (int i=0 ; i<8 ; i++) write_line(i+1, tab[i]) ;
}

void Init_MAX7219(void) {
  write_line(0x09, 0x00);   //decoding :BCD
  write_line(0x0A, 0x01);   //brightness 
  write_line(0x0B, 0x07);   //scanlimit;8 LEDs
  write_line(0x0C, 0x01);   //power-down mode:0,normal mode:1
  write_line(0x0F, 0x00);   //test display:1;EOT,display:0
}

void clear_matrix(void) {
  int clean[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ;
  write_matrix(clean) ;
}

int intToHex(int x) {
  switch (x) {
    case 0 : return 0x01 ; break ;
    case 1 : return 0x02 ; break ;
    case 2 : return 0x04 ; break ;
    case 3 : return 0x08 ; break ;
    case 4 : return 0x10 ; break ;
    case 5 : return 0x20 ; break ;
    case 6 : return 0x40 ; break ;
    case 7 : return 0x80 ; break ;
    default : return 0x00 ; break ;
  }
}
  Servo monServomoteurH;
  Servo monServomoteurV;
  
 
void setup() {
  
  monServomoteurH.write(99);// Position au centre.
  monServomoteurV.write(99);
  
  monServomoteurH.attach(2);
  pinMode(2, OUTPUT); //Commande de servo horisontal branché sur pin 2.
  
  monServomoteurV.attach(3);
  pinMode(3,OUTPUT); // Commande de servo vertical branché sur pin 3.
  
  monServomoteurH.write(99);// Position au centre.
  monServomoteurV.write(99);

  
  Serial.begin(9600) ;
  pinMode(CLK_pin,OUTPUT);
  pinMode(CS_pin,OUTPUT);
  pinMode(DIN_pin,OUTPUT);
  delay(50);  
  
  Init_MAX7219() ;
  clear_matrix() ;
}

 
void loop() { 
  
  
  write_matrix(YO) ; // Yeux ouvert.
  delay(3000) ;
 
  //Yeux qui se ferment 2 fois.
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y5) ;
  delay(400) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(YO);
  delay(500);
  
  
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y5) ;
  delay(400) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(YO);
  delay(2000); // Attente de 2 secondes les yeux au centre.
  
  // Les yeux regardent à droite.
  write_matrix(YD);
  delay (500);
  // Le servo H tourne sur la droite 90°.
  for (int position = 99; position <= 149; position++) // Donne l'angle de rotation.
  {
    monServomoteurH.write(position);
    delay(15); // Vitesse de mouvement.
  }
  delay(2000);
  
  write_matrix(YG);// Les yeux regardent à gauche.
  
  // Le servo se replace au centre.
   for (int position = 149; position >= 99; position--) // Donne l'angle de rotation.
  {
    monServomoteurH.write(position);
    delay(15); // Vitesse de mouvement.
  }
  
  // Yeux ouverts au centre.
  write_matrix(YO); 
  delay(2000);
  
   //Yeux qui se ferment.
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y5) ;
  delay(400) ;
  write_matrix(Y4) ;
  delay(30) ;
  write_matrix(Y3) ;
  delay(30) ;
  write_matrix(Y2) ;
  delay(30) ;
  write_matrix(Y1) ;
  delay(30) ;
  write_matrix(YO);
  delay(500);
  
  write_matrix(YG);
  delay(500);
  
  
  for (int position = 99; position >= 49; position--) // Donne l'angle de rotation.
  {
    monServomoteurH.write(position);
    delay(15); // Vitesse de mouvement.
  }
  delay(2000);
  
  write_matrix(YD);
  
   for (int position = 49; position <= 99; position++) // Donne l'angle de rotation.
  {
    monServomoteurH.write(position);
    delay(15); // Vitesse de mouvement.
  }
  
  write_matrix(YO);
  delay(2000);
  
  //yeux en bas.
  write_matrix (YB);
  delay (1000);
  
   for (int position = 99; position <= 140; position++) // Donne l'angle de rotation.
  {
    monServomoteurV.write(position);
    delay(15); // Vitesse de mouvement.
  }
  delay(2000);
  
  write_matrix(YH);
  
   for (int position = 140; position >= 99; position--) // Donne l'angle de rotation.
  {
    monServomoteurV.write(position);
    delay(15); // Vitesse de mouvement.
  }
  
  write_matrix (YO);
  delay(2000);
  
  
  }

hello
as tu essayé, dans le setup de faire, dans cet ordre:
pinmode(2,OUTPUT);
digitalWrite(2,LOW);
monServomoteurH.attach(2);

Bonsoir.

Merci dfgh.
Je vais tester cela demain et je te tiens au courant des résultats.

Encore merci d'avoir pris de ton temps pour regarder mon problème.

Cordialement.

Bonjour.

Hélas après modification du programme les résultats sont identiques, mes servos, à la mise sous tension se mettent dans une drôle de position, toujours la même durant un bref moment puis se placent comme ils devraient être.
Je continue mes essais, si entre temps vous voyez une piste , je suis preneur.

Cordialement.

Bonjour les amis,
Ayant réalisé un petit robot incluant 12 servomoteurs, systématiquement à la mise sous tension il y a un petit transitoire le temps que le module d’asservissement se stabilise.
ATTENTION : Les appels de courant générés par ces tous petits moteurs sont virulents quand plusieurs doivent changer de position. Il importe de respecter les conseils techniques, en particulier si tu utilises un module de pilotage du commerce. C'est-à-dire une alimentation de l’ordre de 5Vcc à 6Vcc capable de fournir en impulsionnel des courants jusqu’à 5A !
Il faut également placer un condensateur « réservoir » de forte capacité le plus proche possible de la petite carte électronique qui pilote les moteurs.
Espérant avoir été utile : Nulentout.

balisto56:
Bonjour.

Hélas après modification du programme les résultats sont identiques, mes servos, à la mise sous tension se mettent dans une drôle de position, toujours la même durant un bref moment puis se placent comme ils devraient être.
Je continue mes essais, si entre temps vous voyez une piste , je suis preneur.

Cordialement.

Que font tes servos quand tu les mets sous tension sans rien d'autre?
C'est peut etre leur comportement par defaut. Certains servos "apprennent" ainsi leur position quand on les met sous tension.