Coupler accéléromètre ADXL345 avec gyroscope ITG3200 pour controler servomoteurs

Bonjour,

Je travaille pour mon projet de terminale de Science de l'Ingénieur sur un bras robot, dont le but est que ce bras puisse reproduire les mouvements qui sont fait par l'humain.
Nous sommes 4 à travailler sur ce projet mais pour ma part, je devais me concentrer sur la partie de l'épaule du robot ainsi que le bras ( hors doigts, main et poignet ).
Nous arrivons à la fin du projet et voilà où j'en suis à l'heure actuelle : Je disposais d'une carte d'Arduino, d'un gyroscope itg3200 et d'un accéléromètre ADXL345. J'ai réussi à contrôler un servomoteur avec le gyroscope et également avec l'accéléromètre, mais de manière séparée.
Je chercher donc maintenant à pouvoir contrôler le servomoteur en utilisant à la fois le gyroscope et l'accéléromètre, les deux qui seraient donc en simultanés.
Cependant, ayant fait de nombreuses recherches au travers de forum, je ne trouve pas de code qui relient ces deux dispositifs, je me demande même si au finale cela est possible de les faire fonctionner ensemble.

Je viens donc vers vous pour pouvoir me donner une piste ou plus encore, toute aide est la bienvenue même un bout de code sera mis en valeur, en sachant que ce projet ne sera dans tout les cas pas fini.

Je vous mets ci-dessous les codes que j'ai utilisé pour contrôler le servomoteur avec le gyro et l'accéléromètre. Je précise que je n'ai que très peu de notions sur Arduino d'où sûrement la présence d'erreur de code ou de structure.

Merci d'avance pour votre attention et d'avoir pris le temps de me lire et merci à tous ceux qui m'aideront d'une manière ou d'une autre à la résolution de ce problème ! :slight_smile:

Code controler un servo avec gyro :

#include <Wire.h>
#include <ITG3200.h>

#include <Servo.h>

Servo servo1;
Servo servo2;

ITG3200 Gyro;

int x, y, z;
int rawX, rawY, rawZ;
int mappedRawX, mappedRawY;

void setup() {
  Serial.begin(9600);
  Gyro.init();
  servo1.attach(9);
  servo2.attach(6);  
}

void loop() {
  Gyro.getXYZ(&x, &y, &z);

  rawX = x - 7;
  rawY = y - 6;
  rawZ = z + 10;
  
  if (rawX < -255) rawX = -255; else if (rawX > 255) rawX = 255;
  if (rawY < -255) rawY = -255; else if (rawY > 255) rawY = 255;
   
  mappedRawX = map(rawX, -255, 255, 0, 180);
  mappedRawY = map(rawY, -255, 255, 0, 180);
  
  servo1.write(mappedRawX);
  delay(15);
  servo2.write(180 - mappedRawY);
  delay(15);
  
  Serial.print(" mappedRawX = "); Serial.print(mappedRawX); // raw data with offset
  Serial.print(" mappedRawY = "); Serial.println(mappedRawY); // raw data with offset
}

Code controler un servo avec accéléromètre :

#include <Wire.h>
#include <ADXL345.h>

#include <Servo.h>

Servo servo1;  // create servo object to control a servo
Servo servo2;

ADXL345 adxl; //variable adxl is an instance of the ADXL345 library

int x, y, z;
int rawX, rawY, rawZ;
int mappedRawX, mappedRawY;

void setup() {
  Serial.begin(9600);
  adxl.powerOn();
  servo1.attach(9);
  servo2.attach(6);
}

void loop() {
  adxl.readXYZ(&x, &y, &z); //read the accelerometer values and store them in variables  x,y,z

  rawX = x - 7;
  rawY = y - 6;
  rawZ = z + 10;
  
  if (rawX < -255) rawX = -255; else if (rawX > 255) rawX = 255;
  if (rawY < -255) rawY = -255; else if (rawY > 255) rawY = 255;
   
  mappedRawX = map(rawX, -255, 255, 0, 180);
  mappedRawY = map(rawY, -255, 255, 0, 180);
  
  servo1.write(mappedRawX);
  delay(15);
  servo2.write(180 - mappedRawY);
  delay(15);
  
  Serial.print(" mappedRawX = "); Serial.print(mappedRawX); // raw data with offset
  Serial.print(" mappedRawY = "); Serial.println(mappedRawY); // raw data with offset

bonjour,
si tu mets deux fois le même code, comment veux tu que l'on réponde?

Bonjour,

Difficile de t'aider dans la mesure où nul ne sait ce qu'il faut faire avec les valeurs des capteurs.

Tu disposes de gyroscopes et d'accéléromètres... Certes...
Mais comment comptes-tu utiliser les informations qu'ils renvoient ?

  • Est-ce que l'on prend la position du Gyro et on la corrige avec les données de l'accéléromètre ?
  • Fait-on l'inverse ?
  • Ou autre chose ?
  • Et comment ?

Il te revient de définir l'algorithme a utiliser pour piloter les servos en fonction des capteurs.
Une fois que tu as défini ceci, il sera peut-être possible de t'aider à le coder.
(Quoi que, pour un futur ingénieur, cela ne devrait pas être d'une complexité crasse :slight_smile: )

Bon amusement ! :slight_smile:

Coyotte

Bonjour, merci pour votre réponse.

Je compte utiliser les informations que renvoie le gyroscope et l'accéléromètre pour controler le bras de manière optimale car lors de mes recherches, j'ai vu la chose suivante : '' Le gyroscope ne détecte pas un déplacement linéaire le long d'un axe, mais une accélération de la rotation AUTOUR d'un AXE.
Le gyroscope mesure soit des changements dans l'orientation (mouvement angulaires) ou des changements de vitesse de rotation.
Le gyroscope comprend 3 capteurs.
Le gyroscope ne donne que des données relatives (ex : rotation de 30° vers la droite).

Il faut donc pour cela le couplet avec un accéléromètre qui lui permet de savoir dans quelle direction l’appareil se déplace; il ne détecte pas une position, mais une accélération sur l’un des trois axes X, Y, Z."

Je vais donc essayer de trouver un algorithme comme vous l'avez dit mais je voulais juste savoir si c'était faisable avec ces deux types de capteurs, de les faire fonctionner en simultané avec une carte arduino.

Bonjour,

On va simplifier un peu:

  • Le gyroscope permet de mesurer des vitesses de rotation
  • L'accéléromètre permet de mesurer des accélérations longitudinales, y compris celle de la pesanteur

Le deuxième point est important: comme on connait la valeur et la direction de l'accélération de la pesanteur, la mesure de cette dernière suivant les 3 axes de ton accéléro permet de connaître l'orientation de ce dernier.

Avec quelques calculs, tu as donc ainsi un capteur qui te permet de mesurer l'orientation angulaire (l'accéléromètre) et un capteur qui te permet de mesurer les vitesses angulaires (le gyroscope).

C'est dans cette fois que tu dois continuer tes recherches.

Merci pour votre réponse, je vais donc poursuivre mes recherches dans cette voie !