Comment utiliser module HMC5883L 3-Axis avec Arduino
Introduction:
Module HMC5883L 3-Axis est un capteur de boussole magnétomètre capable de détecter la force du champ magnétique le long des axes X, Y et Z. Dans ce guide, nous allons apprendre comment interagir avec ce module et obtenir des informations de direction précises en utilisant un Arduino. Nous allons également explorer les différentes caractéristiques du module et comment le connecter à l’Arduino.
Aperçu du module HMC5883L:
Le module HMC5883L est équipé de la technologie magnétorésistive anisotrope et agit comme un capteur de boussole numérique. Il mesure l’intensité du champ magnétique le long des axes X, Y et Z et fournit une sortie de tension différentielle sur les broches correspondantes. Grâce à une précision de 1 à 2 degrés et une plage de mesure de -8 à +8 gauss, ce module offre des performances fiables et de haute qualité pour vos projets de navigation.
Caractéristiques du module HMC5883L:
Avant de plonger dans l’utilisation du module, examinons de plus près ses caractéristiques :
- Plage de tension d’alimentation de 3V à 6V, le rendant compatible avec l’Arduino.
- Supporte le protocole de communication I2C.
- Capteurs magnétorésistifs à 3 axes et ASIC.
- Taux de sortie de données maximal de 160 Hz pour des mises à jour rapides.
- Interface I2C pour une communication simple avec l’Arduino.
- Précision de direction de 1 à 2 degrés pour des mesures précises.
- Convertisseur analogique-numérique intégré sur 12 bits pour une résolution élevée.
Broches du module HMC5883L:
Pour commencer notre projet, comprenons la fonction de chaque broche du module :
- VCC : Alimentation du module (typiquement +5V avec Arduino).
- GND : Masse (GND) de l’alimentation.
- SCL : Broche d’horloge pour la communication I2C avec l’Arduino (reliée à la broche A5).
- SDA : Broche de données pour la communication I2C avec l’Arduino (reliée à la broche A4).
- DRDY : Broche de sortie de données prête à être lue.
Matériel requis
Avant de commencer, assurez-vous de disposer du matériel suivant :
- Arduino UNO et son câble USB
- Fils de connexion : Pour établir les connexions entre l’Arduino et le module HMC5883L.
- Compass GY-271 HMC5883L 3-Axis
-
Compass GY-271 3 Axis45,00 DH
-
Produit en promotionCâble de connexion M/F JumperLe prix initial était : 7,00 DH.6,00 DHLe prix actuel est : 6,00 DH.
-
Arduino Uno R3 avec câble USB120,00 DH
Câblage du module HMC5883L avec Arduino
Avant de plonger dans la programmation, connectons notre module HMC5883L à l’Arduino :
- Branchez le pin VCC du module à +5V de l’Arduino.
- Connectez la broche GND du module à la masse de l’Arduino.
- Reliez la broche SDA du module à la broche A4 (SDA) de l’Arduino.
- Connectez la broche SCL du module à la broche A5 (SCL) de l’Arduino.
Code Arduino
#include <Arduino.h> #include <Wire.h> #include "HMC5883L_Simple.h" HMC5883L_Simple::HMC5883L_Simple() { declination_offset_radians = 0; mode = COMPASS_SINGLE | COMPASS_SCALE_130 | COMPASS_HORIZONTAL_X_NORTH; i2c_address = COMPASS_I2C_ADDRESS; } void HMC5883L_Simple::SetDeclination( int declination_degs , int declination_mins, char declination_dir ) { switch(declination_dir) { case 'E': declination_offset_radians = ( declination_degs + (1/60 * declination_mins)) * (M_PI / 180); break; case 'W': declination_offset_radians = 0 - (( declination_degs + (1/60 * declination_mins) ) * (M_PI / 180)); break; } } void HMC5883L_Simple::SetSamplingMode( uint16_t sampling_mode ) { mode = (mode & ~0x03) | (sampling_mode & 0x03); Write(COMPASS_MODE_REGISTER, mode & 0x03); } void HMC5883L_Simple::SetScale( uint16_t scale ) { mode = (mode & ~0x1C) | (scale & 0x1C); Write(COMPASS_CONFIG_REGISTER_B, (( mode >> 2 ) & 0x07) << 5); } void HMC5883L_Simple::SetOrientation( uint16_t orientation ) { mode = (mode & ~0x3FE0) | (orientation & 0x3FE0); } float HMC5883L_Simple::GetHeadingDegrees() { // Obtain a sample of the magnetic axes MagnetometerSample sample = ReadAxes(); float heading; float mag_north, mag_west; // Z = bits 0-2 switch((mode >> 5) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.Z; break; case COMPASS_SOUTH: mag_north = 0-sample.Z; break; case COMPASS_WEST: mag_west = sample.Z; break; case COMPASS_EAST: mag_west = 0-sample.Z; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // Y = bits 3 - 5 switch(((mode >> 5) >> 3) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.Y; break; case COMPASS_SOUTH: mag_north = 0-sample.Y; ; break; case COMPASS_WEST: mag_west = sample.Y; break; case COMPASS_EAST: mag_west = 0-sample.Y; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // X = bits 6 - 8 switch(((mode >> 5) >> 6) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.X; break; case COMPASS_SOUTH: mag_north = 0-sample.X; break; case COMPASS_WEST: mag_west = sample.X; break; case COMPASS_EAST: mag_west = 0-sample.X; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // calculate heading from the north and west magnetic axes heading = atan2(mag_west, mag_north); // Adjust the heading by the declination heading += declination_offset_radians; // Correct for when signs are reversed. if(heading < 0) heading += 2*M_PI; // Check for wrap due to addition of declination. if(heading > 2*M_PI) heading -= 2*M_PI; // Convert radians to degrees for readability. return heading * 180/M_PI; } /** Read the axes from the magnetometer. * In SINGLE mode we take a sample. In CONTINUOUS mode we * just grab the most recent result in the registers. */ HMC5883L_Simple::MagnetometerSample HMC5883L_Simple::ReadAxes() { if(mode & COMPASS_SINGLE) { Write(COMPASS_MODE_REGISTER, (uint8_t)( mode & 0x03 )); delay(66); // We could listen to the data ready pin instead of waiting. } uint8_t buffer[6]; Read(COMPASS_DATA_REGISTER, buffer, 6); MagnetometerSample sample; // NOTE: // The registers are in the order X Z Y (page 11 of datasheet) // the datasheet when it describes the registers details then in order X Y Z (page 15) // stupid datasheet writers sample.X = (buffer[0] << 8) | buffer[1]; sample.Z = (buffer[2] << 8) | buffer[3]; sample.Y = (buffer[4] << 8) | buffer[5]; return sample; } /** Write data to the compass by I2C */ void HMC5883L_Simple::Write(uint8_t register_address, uint8_t data) { Wire.beginTransmission(i2c_address); Wire.write(register_address); Wire.write(data); Wire.endTransmission(); } /** Read data from the compass by I2C */ uint8_t HMC5883L_Simple::Read(uint8_t register_address, uint8_t buffer[], uint8_t length) { // Write the register address that we will begin the read from, this // has the effect of "seeking" to that register Wire.beginTransmission(i2c_address); Wire.write(register_address); Wire.endTransmission(); // Read the data starting at that register we seeked Wire.requestFrom(i2c_address, length); if(Wire.available() == length) { for(uint8_t i = 0; i < length; i++) { buffer[i] = Wire.read(); } return length; } return 0; }
Applications et utilisations :
Le module HMC5883L est largement utilisé dans divers projets et applications :
- Navigation et orientation : Le module est utilisé pour déterminer l’orientation d’un objet ou d’un véhicule, ce qui est essentiel dans les systèmes de navigation GPS et les robots mobiles autonomes.
- Détection d’objet métallique : Le module peut être utilisé pour détecter la présence d’objets métalliques dans le voisinage, par exemple, dans des projets de détection de métaux.
- Projets de réalité augmentée : Le module peut être utilisé dans des projets de réalité augmentée pour déterminer l’orientation de l’utilisateur et afficher des informations pertinentes en fonction de la direction. Projets artistiques interactifs : Le module peut être utilisé dans des projets d’art interactifs pour détecter l’orientation d’un utilisateur ou d’un objet et générer des effets visuels en conséquence.
Conseils et astuces supplémentaires:
Assurez-vous d’alimenter le module HMC5883L avec une tension compatible comprise entre 3V et 6V. Une alimentation incorrecte peut endommager le module.
Lors de la configuration du module, assurez-vous de définir correctement l’orientation en fonction de la façon dont vous avez monté le module dans votre projet. Cela garantira que les données de direction sont correctement interprétées.
Si vous utilisez le module dans un environnement où les champs magnétiques externes sont présents (par exemple, à proximité d’un aimant ou d’un moteur), cela peut affecter les mesures de direction. Essayez d’utiliser le module dans un environnement aussi exempt de perturbations magnétiques que possible.
Si vous devez utiliser le module en extérieur pour la navigation, assurez-vous qu’il est correctement protégé des intempéries, de l’humidité et des chocs physiques.
Conclusion:
En conclusion, le module HMC5883L 3-Axis est un outil puissant pour la détection de la direction et de l’orientation. En utilisant ce module avec Arduino, vous pouvez facilement intégrer des fonctionnalités de boussole dans vos projets, ouvrir de nouvelles possibilités dans la robotique et la réalité augmentée, et apprendre des concepts importants de physique et d’électronique de manière pratique. Avec un peu d’imagination et de créativité, les possibilités d’utilisation de ce module sont pratiquement illimitées !
Lien outilles
- Téléchargement de l’Arduino IDE : https://www.arduino.cc/en/software
- Pour plus d’articles : https://www.moussasoft.com/tutoriels-electroniques
- Twitter: Moussa Lhoussaine (@Moussasoft_com) / Twitter