





3) BRIEL : Calibration des servomoteurs et montage de la première jambe
Posté par Mike118,
22 mai 2018
·
7 446 visite(s)
Servo Calibration
Maintenant que l'électronique est prête, avant d'assembler votre bipède il vous faudra calibrer les valeurs pour chacun de vos servomoteurs.
Pour cela on va commencer par calibrer les 5 servomoteurs pour tester la première jambe complète.
Puisqu'on utilise un driver de servomoteur pour piloter nos servomoteurs :
N'hésitez pas à jeter un oeil au sujet dédié au test de ce driver pour en savoir un peu plus sur son utilisation et par ici pour beaucoup plus de détails sur le fonctionnement du driver.
Nous allons partir du code de base suivant :
Il faudra trouver les valeurs réelles pour chaque servomoteurs afin que le servomoteur passe bien par les 3 positions
0° 90° et -90°.
Pour cela on va ajouter au fur et à mesure des #define pour chaque servomoteur. Cela permet de plus facilement éditer les valeurs.
Voilà mon code après calibration :
Comme vous pourrez le constater, en plus de faire un mouvement de 180° complet, les palonniers sont mis de tel sortes à ce que les trous de fixations des palonniers soient bien "alignés" lorsque le servomoteur est en position 0° 90° et -90°.
Il est important de bien placer le palonnier des servomoteurs comme sur la vidéo pour le montage.
Maintenant on va pouvoir monter la première jambe.
Pour cela on va mettre tous les servomoteurs à la position "Zéro " en utilisant ce code :
Oura ! On a une première jambe de montée avec des servomoteurs dont les valeurs 0° + 90° et -90° sont calibrées!
On va maintenant pouvoir s'intéresser à faire bouger cette jambe !
Pour cela on va commencer par calibrer les 5 servomoteurs pour tester la première jambe complète.
Puisqu'on utilise un driver de servomoteur pour piloter nos servomoteurs :
N'hésitez pas à jeter un oeil au sujet dédié au test de ce driver pour en savoir un peu plus sur son utilisation et par ici pour beaucoup plus de détails sur le fonctionnement du driver.
Nous allons partir du code de base suivant :
//Bibliothèques : #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define NBSERVO 5 //Driver : Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define PAUSE 5000 uint8_t servomoteur[NBSERVO] = {0, 1, 2, 3, 5}; // défini sur quelle voie du driver sera branché chaque servomoteurs //Servos : //Liste des longueurs minimum d'impulsions pour - 90° modifier la valeurs 120 par les valeurs réelles pour chaque servo uint16_t servomoins90[NBSERVO] = {120, 120, 120 , 120, 120}; //Liste des longueurs minimum d'impulsions pour + 90° modifier la valeur 450 par les valeurs réelles pour chaque servo uint16_t servoplus90[NBSERVO] = {450, 450, 450, 450, 450}; void setup() { pwm.begin(); pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques } void loop() { for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, 0); } delay(PAUSE); for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, 90); } delay(PAUSE); for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, -90); } delay(PAUSE); } void writeServo(uint8_t i, int16_t degree) { uint16_t x = map(degree,-90, 90, servomoins90[i], servoplus90[i]); pwm.setPWM(servomoteur[i],0,x); }Dans le code ci dessus les valeurs 120 et 450 sont mises arbitrairement.
Il faudra trouver les valeurs réelles pour chaque servomoteurs afin que le servomoteur passe bien par les 3 positions
0° 90° et -90°.
Pour cela on va ajouter au fur et à mesure des #define pour chaque servomoteur. Cela permet de plus facilement éditer les valeurs.
Voilà mon code après calibration :
//Bibliothèques : #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define NBSERVO 5 //Driver : Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define PAUSE 5000 uint8_t servomoteur[NBSERVO] = {0, 1, 2, 3, 5}; // défini sur quelle voie du driver sera branché chaque servomoteurs // Jambe1 #define MIN0 93 #define MAX0 450 #define MIN1 96 #define MAX1 451 #define MIN2 101 #define MAX2 451 #define MIN3 105 #define MAX3 440 #define MIN4 111 #define MAX4 440 //Servos : //Liste des longueurs minimum d'impulsions pour - 90° uint16_t servomoins90[NBSERVO] = {MIN0, MIN1, MIN2, MIN3, MIN4}; //Liste des longueurs minimum d'impulsions pour + 90° uint16_t servoplus90[NBSERVO] = {MAX0, MAX1, MAX2, MAX3, MAX4}; void setup() { pwm.begin(); pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques } void loop() { for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, 0); } delay(PAUSE); for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, 90); } delay(PAUSE); for(uint8_t i = 0; i< NBSERVO; i++) { writeServo(i, -90); } delay(PAUSE); } void writeServo(uint8_t i, int16_t degree) { uint16_t x = map(degree,-90, 90, servomoins90[i], servoplus90[i]); pwm.setPWM(servomoteur[i],0,x); }Le résultat en vidéo :
Comme vous pourrez le constater, en plus de faire un mouvement de 180° complet, les palonniers sont mis de tel sortes à ce que les trous de fixations des palonniers soient bien "alignés" lorsque le servomoteur est en position 0° 90° et -90°.
Il est important de bien placer le palonnier des servomoteurs comme sur la vidéo pour le montage.
Maintenant on va pouvoir monter la première jambe.
Pour cela on va mettre tous les servomoteurs à la position "Zéro " en utilisant ce code :
//Bibliothèques : #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define NBSERVO 5 //Driver : Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define PAUSE 5000 uint8_t servomoteur[NBSERVO] = {0, 1, 2, 3, 5}; // défini sur quelle voie du driver sera branché chaque servomoteurs // Jambe1 #define MIN0 93 #define MAX0 450 #define MIN1 96 #define MAX1 451 #define MIN2 101 #define MAX2 451 #define MIN3 105 #define MAX3 440 #define MIN4 111 #define MAX4 440 //Servos : //Liste des longueurs minimum d'impulsions pour - 90° uint16_t servomoins90[NBSERVO] = {MIN0, MIN1, MIN2, MIN3, MIN4}; //Liste des longueurs minimum d'impulsions pour + 90° uint16_t servoplus90[NBSERVO] = {MAX0, MAX1, MAX2, MAX3, MAX4}; void setup() { pwm.begin(); pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques zeroJambeDroite(); } void loop() { //Do nothing } void writeServo(uint8_t i, int16_t degree) { uint16_t x = map(degree,-90, 90, servomoins90[i], servoplus90[i]); pwm.setPWM(servomoteur[i],0,x); } void zeroJambeDroite() { for(uint8_t i = 0; i< 5; i++) { writeServo(i, 0); } }Puis monter chacun des servomoteurs de la jambe afin d'obtenir ce résultat en position zéro de la jambe :

Oura ! On a une première jambe de montée avec des servomoteurs dont les valeurs 0° + 90° et -90° sont calibrées!
On va maintenant pouvoir s'intéresser à faire bouger cette jambe !
- Oracid, Oliver17 et ZikaChoreGW aiment ceci
Salut Mike, j'ai une tite question pour les #define max et min puis la déclaration des tableaux ne peut on pas mettre ça dans un .h ??
Car là tu tests tes servos mais plus tard ton code va prendre de l'ampleur j'imagine et donc pour que ce soit plus lisible est il donc possible de placer ça ailleurs ?
Merci ^^