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);
}