Faire un petit programme en C après une interruption de plus de 25 ans, ce n'est pas la chose la plus facile, mais j'y suis quand même arrivé. Alzheimer attendra...
Voici donc un petit programme pour tester la cinématique "simultanée" de plusieurs servos. En clair, tous les servos semblent fonctionner de manière simultanée. Ce qui est faux, dans l'absolu.
J'en avais absolument besoin pour tester mon petit quadrupède. Si cela vous intéresse, vous pouvez facilement l'utiliser pour vos bipèdes ou autres hexapodes.
Les seules modifications à faire, sont le nombre de servos, l'affection des sorties des servos, la vitesse et bien entendu, les données qui doivent être inscrites dans un tableau.
Les lignes de données dans le tableau doivent avoir la même longueur. Si un des servos ne bouge pas, alors il faut répéter sa position pour le tableau soit complet.
Si vous utilisez les 2 lignes de déboguage, la vitesse sera fortement réduite. C'est incontournable.
Merci pour vos remarques et commentaires.
/*
* Ce programme permet de tester la cinématique "simultanée" de plusieurs servos.
*/
#include <Servo.h>
Servo mySrv[4]; // Indiquez ici le nombre de servos, dans le tableau
int nbSrv = sizeof(mySrv)/sizeof(Servo);
int Tablo[4][13]={{90,100,110,120,110,100,90,80,70,60,70,80,90}, // Indiquez ici les valeurs des angles
{120,110,100,90,80,70,60,70,80,90,100,110,120}, // que vos servos doivent parcourir.
{90,80,70,60,70,80,90,100,110,120,110,100,90}, // Le nombre de lignes de données doit être égal au nombre de servos.
{60,70,80,90,100,110,120,110,100,90,80,70,60}}; // La longueur des lignes doit être égale au nombre de valeurs et doit être constante.
int lgTablo = sizeof(Tablo[1])/sizeof(int);
int Vits = 15; // Indiquez ici la vitesse de la cinématique
void setup() {
Serial.begin(9600); // open a serial connection to your computer
mySrv[0].attach(6); // Affectez une sortie à chacun de vos servos
mySrv[1].attach(5);
mySrv[2].attach(11);
mySrv[3].attach(10);
mySrv[0].write(90); // Initialisez les servos à une position définie
mySrv[1].write(90); // Non obligatoire
mySrv[2].write(90);
mySrv[3].write(90);
delay(3000);
}
void loop() {
Cinematique(&lgTablo, Tablo[0], &nbSrv, &Vits );
}
void Cinematique(int *lg, int *tb, int *nsrv, int *vits){
for( int i=0; i < (*lg-1); i++){
for( int k = 0; k < *nsrv; k++){
if ( *(tb+(k*(*lg))+i) >= *(tb+(k*(*lg))+i+1) ){
for( int j = *(tb+(k*(*lg))+i); j >= *(tb+(k*(*lg))+i+1); j-- ){
mySrv[k].write(j);
delay(*vits);
// Serial.print("Tablo pos = ");Serial.print(i);Serial.print(" srvo = ");Serial.print(k);Serial.print(" srvo pos = ");Serial.print(j);Serial.print(" Valeur cible = ");Serial.println(*(tb+(k*(*lg))+i+1));
}
}
else{
for( int j = *(tb+(k*(*lg))+i); j <= *(tb+(k*(*lg))+i+1); j++ ){
mySrv[k].write(j);
delay(*vits);
// Serial.print("Tablo pos = ");Serial.print(i);Serial.print(" srvo = ");Serial.print(k);Serial.print(" srvo pos = ");Serial.print(j);Serial.print(" Valeur cible = ");Serial.println(*(tb+(k*(*lg))+i+1));
}
}
}
}
}