Aller au contenu






- - - - -

4) BRIEL : Tests sur une Jambe !

Posté par Mike118, 23 mai 2018 · 388 visite(s)

Avant de faire du code pour pouvoir bouger la Jambe de Briel dans tous les sens il faut faire attention aux angles MIN et MAX de débattement ! 
 
Pour cela on va utiliser ce code : 
 
 
//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define NBSERVO 5

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

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



// Tableau qui attribue à chaque servo sa place sur le driver pour 16 servo
uint8_t servomoteur[NBSERVO] = {0, 1, 2, 3, 5};

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

#define PAUSE 5000

void setup() {
  
  pwm.begin();
  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques
  
}

void loop() {

  testSensJambeDroite();

}

void writeServo(uint8_t i, int8_t degree)
{
  uint16_t x = map(degree,-90, 90, servomoins90[i], servoplus90[i]);
  pwm.setPWM(servomoteur[i],0,x);
}


void testSensJambeDroite() {
   for(uint8_t i = 0; i< 5; i++) {
    writeServo(i, 0);
  }
  delay(PAUSE);
  for(uint8_t i = 0; i< 5; i++) {
    writeServo(i, 15);
  }
  delay(PAUSE);
}



Avec ce code on obtient le résultat suivant : 
 
[vidéo]
 
En observant comment s'orientent les servomoteurs dans le sens "positif", ( déplacement de +15° ) on va savoir comment sont orientés chacune des articulations. Le faible déplacement permet de garantir que quelque soit le sens de déplacement le servomoteur ne va pas rentrer en buté ! =)

Une fois le sens positif de chaque axe connu on va pouvoir définir si les valeurs maximum d'amplitude de chaque articulations de notre bipèdes sont -90° ou +90° afin de se mettre dans cette position :
 

limiteMax.JPG
 
 
Une fois les limite Max définies, on va les stocker dans un tableau, et on va pouvoir exécuter le code suivant permettant de tester un mouvement "fluide" alternant de 0 à 90° sur chacune des articulations : 
 
//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define NBSERVO 5

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

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



// Tableau qui attribue à chaque servo sa place sur le driver pour 16 servo
uint8_t servomoteur[NBSERVO] = {0, 1, 2, 3, 5};

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

// Position Max orienté des servomoteurs en degrés
int8_t limiteMax[NBSERVO] = { -90, -90, -90, -90,  90};

#define PAUSE 5000


void setup() {
  
  pwm.begin();
  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques
  
}

void loop() {

  test90JambeDroite();

}

void writeServo(uint8_t i, int8_t degree)
{
uint16_t x = map(degree,-90, 90, servomoins90[i], servoplus90[i]);
pwm.setPWM(servomoteur[i],0,x);
}

void test90JambeDroite() {
  for(uint8_t i =0 ;i=<255; i++ ){
    for(uint8_t j = 0; j < 5; j++) {
      writeServo( j, (limiteMax[j]*i)/255 );
    }
  }
  delay(PAUSE);
  for(uint8_t i =255 ; i>=0 ; i-- ){
    for(uint8_t j = 0; j < 5; j++ ) {
      writeServo(j, (limiteMax[j]*i)/255 );
    }
  }
  delay(PAUSE);
}


 


 
Vous remarquerez que le mouvement "fluide" est obtenu en décomposant le mouvement souhaité en plusieurs mouvements exécutés les uns à la suite des autres. 
Notre fonction "test90JambeDroite()" découpe l'ensemble de la plage d'amplitude 0 à 90° en 256 mouvements!  
 
Le résultat en vidéo : 
 
 
Maintenant qu'on a l'ensemble qui est bien calibré et qu'on connait les sens des servo et si on faisait un test de flexion sur une jambe ? 

Voici le code : 

On test la fonction comme ça 
Video de test
 
Oura ! La jambe semble faire la flexion souhaitée ! 
Comme ça a l'air de bien marcher on va monter l'électronique sur la jambe et refaire les essais. 

Vidéo de test :
 
Oups... Le robot semble pas bien droit ... Sans la charge pas de problème mais avec la batterie on voit apparaître un problème de jeu dans les servomoteurs! Oui... On rappel qu'on utilise des servomoteurs à moins de 7€50 pour ce projet... On ne pouvait pas s'attendre à quelque chose de parfait ... Mais rassurez vous le projet ne s'arrête pas là ! Ce résultat était attendu et il y a bien entendu une parade ! Il faut "contrer le jeu " . 

Nouveau code : 

Video . 


Et là ça va mieux! =) 




Zut, je voulais mettre "J'aime", mais comme il y a que la moitié du tuto et bien je met "J'ai",  lol :)

Cool, content de voir que Briel avance ;)

  • Signaler

Patience patience ... En fait BRIEL est bien plus avancée que ça =) (Il suffit de voir sa photo avec sa jupe pour s'en rendre compte ^^ )  C'est la rédaction du blog, et l'édit des vidéo qui prend du temps :)  Surtout que je suis sur d'autres projets plus urgents dont le char d'exploration de canalisation =)

  • Signaler

Janvier 2019

D L M M J V S
  12345
6789101112
13141516171819
202122 23 242526
2728293031  

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