Aller au contenu






- - - - -

3) BRIEL : Calibration des servomoteurs et montage de la première jambe

Posté par Mike118, 22 mai 2018 · 1 569 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 :

Image IPB

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 : 
 
20180506_140719.jpg
 
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 ! 
 




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 ^^

  • Signaler

Oui c'est exactement ça ! =) Pour le moment je met le code tel quel mais au fur et à mesure que le code grandit il faut l'organiser dans des .h et même des points C, créer des structures / faire des classes... 

Mais pour le moment je ne me concentre pas sur cette partie avec BRIEL =) Chaque chose en son temps je dirais ;) ça permettra de ne pas perdre le lecteur débutant =)

  • Signaler

Ok, oui c'est ce que je me suis dis, que tu y vas doucement pour que tout le monde suivent ^^

 

Mais dans le doute, étant débutant aussi je me posé la question, merci :)

 

Je vais pouvoir faire un .h avec tous mes #define concernant les servomoteurs ^^

 

Et à la place des .C on peut faire des .CPP j'imagine. ;)

  • Signaler

Mars 2020

L M M J V S D
      1
2345678
9101112131415
16171819202122
23242526272829
30 31     

Ma photo

utilisateur(s) actif(s)

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)

Rechercher dans le blog

Catégories

Derniers visiteurs

MyBlogLog

Twitter

Éléments Google partagés