Table des matières:

Une façon d'utiliser une unité de mesure inertielle ? : 6 étapes
Une façon d'utiliser une unité de mesure inertielle ? : 6 étapes

Vidéo: Une façon d'utiliser une unité de mesure inertielle ? : 6 étapes

Vidéo: Une façon d'utiliser une unité de mesure inertielle ? : 6 étapes
Vidéo: Navigation inertielle : Comment garder le cap ! 2024, Novembre
Anonim
Une façon d'utiliser une unité de mesure inertielle ?
Une façon d'utiliser une unité de mesure inertielle ?

Le contexte:

Je construis pour le plaisir un robot que je veux déplacer de manière autonome à l'intérieur d'une maison.

C'est un long travail et je le fais étape par étape.

J'ai déjà publié 2 instructables sur ce sujet:

  • un sur la fabrication d'un encodeur de roue
  • un sur la connexion wifi

Mon robot est entraîné par 2 moteurs à courant continu à l'aide de mon encodeur de roue fait maison.

J'améliore actuellement le contrôle du mouvement et j'ai passé du temps avec le gyroscope, l'accéléromètre et l'IMU. Je serais ravi de partager cette expérience.

Vous voulez en savoir plus sur la localisation ? Voici un article sur comment combiner intelligence artificielle et ultrasons pour localiser le robot

Étape 1: Pourquoi utiliser une centrale inertielle ?

Pourquoi utiliser une centrale inertielle ?
Pourquoi utiliser une centrale inertielle ?

Alors pourquoi ai-je utilisé un IMU ?

La première raison était que si l'encodeur de roue est suffisamment précis pour contrôler le mouvement rectiligne, même après le réglage, je n'ai pas pu obtenir une précision de rotation inférieure à +- 5 degrés et ce n'est pas suffisant.

J'ai donc essayé 2 capteurs différents. Tout d'abord j'utilise un magnétomètre (LSM303D). Le principe était simple: avant la rotation, obtenez l'orientation nord, calculez la cible et ajustez le mouvement jusqu'à ce que la cible soit atteinte. C'était un peu mieux qu'avec l'encodeur mais avec trop de dispersion. Après cela, j'ai essayé d'utiliser un gyroscope (L3GD20). Le principe était juste d'intégrer la vitesse de rotation fournie par le capteur pour calculer la rotation. Et ça a bien fonctionné. J'ai pu contrôler la rotation à +- 1 degré.

Néanmoins, j'étais curieux d'essayer quelques IMU. Je choisis un composant BNO055. J'ai passé du temps à comprendre et tester cette IMU. J'ai finalement décidé de sélectionner ce capteur pour les raisons suivantes

  • Je peux contrôler la rotation aussi bien qu'avec le L3GD20
  • Je peux détecter une légère rotation lorsque je me déplace en ligne droite
  • J'ai besoin d'obtenir l'orientation nord pour la localisation du robot et l'étalonnage de la boussole du BNO055 est très simple

Étape 2: Comment utiliser BNO055 pour la localisation 2D ?

Comment utiliser BNO055 pour la localisation 2D ?
Comment utiliser BNO055 pour la localisation 2D ?

BNO055 IMU est un capteur intelligent Bosch à 9 axes qui pourrait fournir une orientation absolue.

La fiche technique fournit une documentation complète. C'est un composant de haute technologie, c'est un produit assez complexe et j'ai passé quelques heures à apprendre comment cela fonctionne et à essayer différentes façons de l'utiliser.

Je pense qu'il pourrait être utile de partager cette expérience.

Tout d'abord, j'ai utilisé la bibliothèque Adafruit qui fournit un bon outil pour calibrer et découvrir le capteur.

A la fin et après de nombreux tests j'ai décidé de

  • utiliser la bibliothèque Adafruit pour enregistrer l'étalonnage uniquement
  • utiliser 3 de tous les modes possibles de BNO055 (NDOF, IMU, Compss)
  • dédier un Arduino Nano pour calculer la localisation basée sur les mesures BNO055

Étape 3: Point de vue matériel

Point de vue matériel
Point de vue matériel
Point de vue matériel
Point de vue matériel
Point de vue matériel
Point de vue matériel

BNO055 est un composant I2C. Il a donc besoin d'alimentation, de SDA et de SCL pour communiquer.

Faites juste attention à la tension Vdd en fonction du produit que vous avez acheté. La puce Bosch fonctionne dans la plage: 2,4V à 3,6V et vous pouvez trouver des composants 3,3v et 5v.

Il n'y a aucune difficulté pour connecter le Nano et le BNO055.

  • Le BNO055 est alimenté par le Nano
  • SDA et SCL sont connectés avec 2 résistances pull-up de 2k.
  • 3 LED connectées au Nano pour le diagnostic (avec résistances)
  • 2 connecteurs permettant de définir le mode après boot
  • 1 connecteur vers le BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 connecteur vers le Robot/Mega (+9V, Gnd, sda, Scl, Pin11, Pin12)

Un peu de soudure et c'est tout !

Étape 4: Comment ça marche ?

Comment ça marche ?
Comment ça marche ?

Du point de vue communication:

  • Le Nano est le maître du bus I2C
  • Le Robot/Mega et le BNO055 sont des esclaves I2C
  • Le Nano lit en permanence les registres BNO055
  • Le Robot/Mega lève un signal numérique pour demander le mot du Nano

Du point de vue du calcul: le Nano combiné avec le BNO055 offre

  • Le cap de la boussole (utilisé pour la localisation)
  • Un cap relatif (utilisé pour contrôler les rotations)
  • Le cap et la position absolus (utilisés pour contrôler les déplacements)

Du point de vue fonctionnel: Le Nano:

  • gère la calibration BNO055
  • gère les paramètres et les commandes du BNO055

Le sous-système Nano & BNO055:

  • calculer pour chaque roue de robot le cap et la localisation absolus (avec un facteur d'échelle)
  • calculer le cap relatif lors de la rotation du robot

Étape 5: L'architecture et le logiciel

L'architecture et le logiciel
L'architecture et le logiciel

Le logiciel principal s'exécute sur un Arduino Nano

  • L'architecture est basée sur la communication I2C.
  • J'ai choisi de dédier un Nano car l'Atmega qui fait tourner le robot était plutôt déjà chargé et cette architecture le rend plus facile à réutiliser ailleurs.
  • Le Nano lit les registres BNO055, calcule et stocke l'en-tête et la localisation dans ses propres registres.
  • L'Arduino Atmega qui exécute le code du robot, envoie les informations des encodeurs de roues au Nano et lit les en-têtes et la localisation à l'intérieur des registres Nano.

Le code du sous-système (Nano) est disponible ici sur GitHub

L'outil d'étalonnage Adafruit est ici sur GitHub (l'étalonnage sera stocké sur eeproom)

Étape 6: Qu'ai-je appris ?

Concernant I2C

Tout d'abord j'ai essayé d'avoir 2 maîtres (Arduino) et 1 esclave (capteur) sur le même bus mais à la fin il est possible et plus simple de ne définir que le Nano comme maître et d'utiliser la connexion GPIO entre les 2 Arduinos pour "demander le jeton".

Concernant BNO055 pour l'orientation 2D

Je peux me concentrer sur 3 modes de fonctionnement différents: NDOF (combiner gyroscope, accéléromètre et Compas) lorsque le robot est au repos, IMU (combiner gyroscope, accéléromètre) lorsque le robot est en mouvement et Compass pendant la phase de localisation. La commutation entre ces modes est simple et rapide.

Pour réduire la taille du code et garder la possibilité d'utiliser l'interruption BNO055 pour détecter les collisions, je préfère ne pas utiliser la bibliothèque Adafruit et le faire moi-même.

Conseillé: