Aller au contenu


Photo

Caliban Midi - E-Bunny

bipède Toulouse robot race

  • Veuillez vous connecter pour répondre
47 réponses à ce sujet

#41 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 207 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 24 juillet 2020 - 11:02

Impossible de trouver l'énergie de s'y remettre pendant le confinement... mais les chaleurs estivales m'ont remotivées, tant mieux !

L'occasion d'upgrader e-bunny avec les capteurs d'effort sous les pieds pour une version II.

La version I avait une Raspberry Pi avec le gyroscope branché direct en I²C, les capteurs de contact sous les pieds (des switch) et le dispositif de départ (un switch ILS avec un aimant).

Pour cette version, j'ai décidé de reporter la partie capteurs sur une Arduino Nano every avec donc 4 capteurs d'efforts sous les pieds, le gyroscope MPU6050, le switch de départ et une sortie de contrôle de LED NeoPixel.

Le but étant de voir l'état des capteurs en un coup d'oeil via les LED NeoPixel sur le robot sans forcément utiliser le PC.

Cela permet aussi de plonger un peu plus sur la manière de travailler avec un duo Raspberry Pi/Arduino.

Voici le code de la carte capteur : https://github.com/T...on/shoeFirmware

Que je recopie dessous. J'essaie de mettre toute la doc dans le code lui-même, sans artifice. Les PINOUT d'Arduino en ASCII Art, c'est vachement pratique !!

C'est une première version en mode "voir si ça marche", reste à mettre au propre.

#include "HX711.h"
#include <MPU6050_tockn.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#define NUM_LEDS 11
#define NEOPIXEL_PIN 5

/*
Description :
Ce firmware a pour rôle de récuperer les valeurs de l'ensemble des capteurs sur demande
via port série quand la lettre "A" est demandée.
La réponse est envoyée en format json.
Voici le schema électrique de la carte :
                      +-----+
         +------------| USB |------------+
         |            +-----+            |
         | [ ]D13            MISO/D12[ ] |    
         | [ ]3.3V           MOSI/D11[ ]~|   
         | [ ]V.ref     ___    SS/D10[ ]~|   
 RB_DOUT | [ ]A0/D14   / N \       D9[ ]~| LF_DOUT
  RB_SCK | [ ]A1/D15  /  A  \      D8[ ] | LF_SCK
 RF_DOUT | [ ]A2/D16  \  N  /      D7[ ] | LB_DOUT
  RF_SCK | [ ]A3/D17   \_0_/       D6[ ]~| LB_SCK
     MPU | [ ]A4/D18/SDA           D5[ ]~| NEOPIXEL
     MPU | [ ]A5/D19/SCL           D4[ ] |   
         | [ ]A6                   D3[ ]~|   
         | [ ]A7                   D2[ ] | ILS  
         | [ ]5V                  GND[ ] |     
         | [ ]RST                 RST[ ] |   
         | [ ]GND                 RX1[ ] |   
         | [ ]Vin                 TX1[ ] |   
         |                               |
         |                               |
         | NANO EVERY                    |
         +-------------------------------+
*/         

//Description des I/O et declarations
//Lecteurs de force sous les pieds
// capteur droit avant (jaune)
const int FOOT_RF_DOUT_PIN = 16;
const int FOOT_RF_SCK_PIN = 17;
// capteur droit arrière (noir)
const int FOOT_RB_DOUT_PIN = 14;
const int FOOT_RB_SCK_PIN = 15;
// capteur gauche avant (rouge)
const int FOOT_LF_DOUT_PIN = 9;
const int FOOT_LF_SCK_PIN = 8;
// capteur gauche arrière (bleu)
const int FOOT_LB_DOUT_PIN = 7;
const int FOOT_LB_SCK_PIN = 6;

//Bouton ILS pour démarrage
const int ILS_PIN = 2;

// declaration des capteurs de force
HX711 foot_rf;
HX711 foot_rb;
HX711 foot_lf;
HX711 foot_lb;

// declaration du MPU
MPU6050 mpu6050(Wire);

Adafruit_NeoPixel pixels(NUM_LEDS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

// declaration des variables
long force_rf=0;
long force_rb=0;
long force_lf=0;
long force_lb=0;
int  ready_rf=0;
int  ready_rb=0;
int  ready_lf=0;
int  ready_lb=0;
int test = 0;

void setup() {
  pixels.begin();
  pixels.clear();
  pixels.setBrightness(50);
  pixels.setPixelColor(5, pixels.Color(255, 0, 0));
  pixels.show();
  pinMode(ILS_PIN, INPUT);
  Serial.begin(115200);
  Serial1.begin(115200);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);
  pixels.setPixelColor(5, pixels.Color(0, 0, 255));
  pixels.show();
  foot_rf.begin(FOOT_RF_DOUT_PIN, FOOT_RF_SCK_PIN);
  foot_rb.begin(FOOT_RB_DOUT_PIN, FOOT_RB_SCK_PIN);
  foot_lf.begin(FOOT_LF_DOUT_PIN, FOOT_LF_SCK_PIN);
  foot_lb.begin(FOOT_LB_DOUT_PIN, FOOT_LB_SCK_PIN);
  pixels.setPixelColor(5, pixels.Color(255, 255, 0));
  pixels.show();
}

void loop() {
  // lecture des capteurs
  mpu6050.update();
  if (foot_rf.is_ready()){
    force_rf = -(foot_rf.read()-89287)/1000;
    ready_rf = 1;
  }else{
    ready_rf = 0;
  }
  if (foot_rb.is_ready()){
    force_rb = -(foot_rb.read()+41736)/1000;
    ready_rb = 1;
  }else{
    ready_rb = 0;
  }
  if (foot_lf.is_ready()){
    force_lf = -(foot_lf.read()-124089)/1000;
    ready_lf = 1;
  }else{
    ready_lf = 0;
  }
  if (foot_lb.is_ready()){
    force_lb = -(foot_lb.read()-17528)/1000;
    ready_lb = 1;
  }else{
    ready_lb = 0;
  }

  // led
  pixels.clear();
  if(force_rf+force_rb+force_lf+force_lb>40){
    pixels.setPixelColor(10*(force_rf+force_rb)/(force_rf+force_rb+force_lf+force_lb), pixels.Color(0, 0, 150));
  }
 
 
  if(Serial1.available()>0){
    char c = (char)Serial1.read();
    //Serial.println(c);
    if(c=='B'){
      if(test == 0){
        test = 1;
      }else{
        test = 0;
      }
    }
    if(c=='A'){
      // envoyer le json
      Serial1.print("{\"RF\":{\"F\":");
      Serial1.print(force_rf);
      Serial1.print(",\"S\":");
      Serial1.print(ready_rf);
      Serial1.print("},\"RB\":{\"F\":");
      Serial1.print(force_rb);
      Serial1.print(",\"S\":");
      Serial1.print(ready_rb);
      Serial1.print("},\"LF\":{\"F\":");
      Serial1.print(force_lf);
      Serial1.print(",\"S\":");
      Serial1.print(ready_lf);
      Serial1.print("},\"LB\":{\"F\":");
      Serial1.print(force_lb);
      Serial1.print(",\"S\":");
      Serial1.print(ready_lb);
      Serial1.print("},\"GYR\":{\"X\":");
      Serial1.print(mpu6050.getGyroX());
      Serial1.print(",\"Y\":");
      Serial1.print(mpu6050.getGyroY());
      Serial1.print(",\"Z\":");
      Serial1.print(mpu6050.getGyroZ());
      Serial1.print("},\"ANG\":{\"X\":");
      Serial1.print(mpu6050.getAngleX());
      Serial1.print(",\"Y\":");
      Serial1.print(mpu6050.getAngleY());
      Serial1.print(",\"Z\":");
      Serial1.print(mpu6050.getAngleZ());
      Serial1.print("},\"ILS\":{\"S\":");
      Serial1.print(!digitalRead(ILS_PIN));
      Serial1.print("}}\n");
    }
  }
  if(test == 1){
    pixels.setPixelColor(0, pixels.Color(150, 0, 0));
  }
  pixels.show();
  delay(10);
}

"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique


#42 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 207 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 29 juillet 2020 - 08:29

Voici ce que ça donne pour l'instant

 


"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique


#43 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 119 messages
  • Gender:Male

Posté 30 juillet 2020 - 06:35

ça avance !

Faut que tu sois près pour janvier . . .



#44 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 207 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 30 juillet 2020 - 09:43

ça avance !

Faut que tu sois près pour janvier . . .

Oui...

J'ai galéré sur certains trucs assez relou :

- Pour la carte Arduino Nano, on voit en bas à droite le port série RX/TX dispo, et sur la majorité des schéma, il est écrit RX/TX ou au mieux RXD/TXD. Je pensais que c'était le Serial du port UART0 mais en fait non, c'est celui du UART1, le UART0 étant réservé au port USB. C'est pratique mais encore faut-il le savoir.

- Ceci complété par le fait qu'en copiant mon ASCII Art de l'Arduino Nano Every, j'ai inversé RX et TX (qui sont donc RX1 et TX1)

- Enfin, c'est la première fois que j'utilise du Neopixel sous forme de bande. Je n'avais pas fait attention au sens, et c'est important !

sens_neopixel.jpg

- C'est rageant sachant que tout le reste (capteurs de pression, IMU, communication série montée à 25Hz) a très vite fonctionné. L'Arduino Nano Every est une très bonne carte.

 

Le robot est vraiment différent de l'an dernier, les nouveaux pieds en acier sont beaucoup plus robustes, sur les chevilles, j'ai mis des moteurs MX-28 afin de pouvoir les mettre en "roue libre".

La LED bleue du centre donne un rapport d'équilibre entre gauche et droite c'est une variable qui s'appelle xbalance.

Si xbalance = 0, tout l'appui est sur le pied droit (pied gauche en l'air), si xbalance = 1 tout l'appui est sur le pied gauche (pied droit en l'air).

Et j'ai maintenant toutes les valeurs intermédiaires !!

 

Pour l'équilibre avant/arrière, pour l'instant je fixe la position de la cheville de façon à avoir 20% du poids à l'avant et 80% sur le talon. Cela correspond à un couple faible sur l'axe de la cheville. Ainsi, avec les élastiques, en position debout, les moteurs ne fournissent quasiment aucun couples alors que je monte à quasiment 50cm de hauteur.

 

Enfin, on voit sur les côtés des pieds des sortes d'ailettes. Il faut voir ça comme des "roulettes" comme au vélo. Le mieux est que ça ne touche pas mais si ça touche, le robot tombe vers l'extérieur et est rappelé au centre naturellement pour éviter de tomber.


"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique


#45 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 119 messages
  • Gender:Male

Posté 30 juillet 2020 - 01:14

Enfin, on voit sur les côtés des pieds des sortes d'ailettes. 

Si un jour, je fais un bipède (pour l'instant je réfléchis), je commencerais par faire un portique sur roues avec avance automatique.

Le portique devrait détecter l'avancement du bipède et avancerait avec lui. Si le bipède chute, un capteur de pression sur les cables qui le retiennent ferait arrêter le portique.

Fastoche . . .



#46 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 207 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 30 juillet 2020 - 04:04

J'ai adapté l'algorithme de l'an dernier avec un centre plus haut et l'utilisation de la force sous les pieds :-) on passe à l'avance !!

 


"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique


#47 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 119 messages
  • Gender:Male

Posté 30 juillet 2020 - 08:26

Il y a du mieux ! Bravo.



#48 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 207 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 31 juillet 2020 - 08:14

Si un jour, je fais un bipède (pour l'instant je réfléchis), je commencerais par faire un portique sur roues avec avance automatique.

Le portique devrait détecter l'avancement du bipède et avancerait avec lui. Si le bipède chute, un capteur de pression sur les cables qui le retiennent ferait arrêter le portique.

Fastoche . . .

Pour avoir fait différents portiques dont un manège, quand il s'agit de tester le robot suspendu les pieds dans le vide pour voir si les capteurs sont bien reliés ou encore si le moteur droit a le bon signe, c'est pratique. En dynamique, ça devient un perturbateur du mouvement pendulaire. Le robot va jamais droit. c'est frustrant.

Avoir un robot qui peut s'étaler de tout son long sans dégâts est un gros plus de design, le rattraper avec les mains permet aussi de ressentir plus la dynamique et comprendre plus vite. Voir le robot en train de tomber en vidéo au ralenti est aussi très instructif.

 

Justement, en regardant à nouveau la dernière vidéo au ralenti, l'an dernier, je levais la jambe droite que si la jambe gauche venez tout juste de toucher le sol (gràce au switch dans le talon). La jambe gauche n'avais donc pas le temps de se poser. Sur cette vidéo, je ne lève la jambe droite que si 80% du poids total est sur la jambe gauche. Ca change beaucoup de choses et stabilise par la même occasion la chute vers l'avant ou l’arrière.

L'autre condition est que si j'ai levé la jambe gauche et que je tombe vers la gauche assez vite, j'étends la jambe gauche pour reprendre appui.


"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique






Aussi étiqueté avec au moins un de ces mots-clés : bipède, Toulouse robot race

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users