bonjour,
je suis entrain de programmer les sequences pour la marche de mon robot hexapode constitué de 12 servos.
J'ai acheté la carte "DEV21" afin de rendre completement transparent la gestion des servomoteur.
On peut trouver la doc ici: http://www.robot-electronics.co.uk/htm/sd21tech.htm
J'utilise les registres 8bits (63-83 inclusive) etant donné que je n'est pas besoin d'une grande precision.
J'ai crée une fonction pour pouvoir bouger simplement un servo à un position donnée (compilateur CCS):#define device_address 0xc2
#define servo1_speed 0
#define servo1 63
#define servo2_speed 3
#define servo2 64
#define servo3_speed 6
#define servo3 65
#define servo4_speed 9
#define servo4 66
etc...
De cette façon, il me suffit d'ecrirevoid move_servo(unsigned char registre, unsigned char position)
{
i2c_start();
i2c_write(device_address); //device address 0xC2
i2c_write(registre);//device register
i2c_write(position);//position
i2c_stop();
delay_ms(100);
}
pour bouger le servo4 en position centrale.move_servo(servo4, 128);
j'utilise un pic 18f2550 cadencé à 4MHz en tant que maitre, qui dialogue avec la DEV21 via un bus I2C.
Ma liaison I2c est definie comme tel:
L'alimentation des servos se fait via une pile de 9Volts, et celle de la "logique" se fait via mon ICD2 qui alimente mon 18f2550 (maitre) et le pic de la carte (sur les broches vcc et gnd dediées à I2C)#use i2c(Master,Fast,sda=PIN_B0,scl =PIN_B1)
Maintenant que vous avez les éléments, mon probléme est que ma fonction marche trés bien lorsque j'ecris par exemple:
Cela ne marche que pour 1,2 ou 3 servos. A partir de 4 sa se gatte et j'ai quelques sursauts.while(1)
{
move_servo(servo1, 128);
move_servo(servo2, 128);
move_servo(servo3, 128);
move_servo(servo4, 128);
delay_ms(2000);
move_servo(servo1, 0);
move_servo(servo2, 0);
move_servo(servo3, 0);
move_servo(servo4, 0);
delay_ms(2000);
}
Je n'est pas essayé avec servos 5, mais avec 12 servos la carte ne repond carrement plus et fait n'importe quoi.
Même si mon code n'utilise que un ou deux servomoteur, si je branche les 12, il m'est impossible d'en controller un seul !
J'ai essayé de mettre un delay de 2s entre chaque move_servo mais rien n'y fait, la carte fait toujours n'importe quoi.
Je trouve cela trés curieux, d'autant plus que je n'est aucun probléme pour l'asservissement de position pour un, deux ou trois servos branchés (s'il y'en a plus de branchés sur la carte, ca bug..)
Avez vous une idée d'où vient le probléme ?
-----