Comment faire une boussole en utilisant Arduino et Processing IDE
Dans ce projet Arduino , nous verrons comment nous pouvons créer cette boussole à l'aide d'un Arduino, d'un magnétomètre MEMS et de l'IDE de traitement. Voici une vidéo de démonstration de la boussole :
Tout ce dont nous avons besoin pour ce projet est un magnétomètre MEMS, pour mesurer le champ magnétique terrestre, une carte Arduino et quelques fils de connexion. À titre d'exemple, j'utiliserai le HMC5883L, un magnétomètre à 3 axes intégré dans la carte de dérivation GY-80.
Nous devons d'abord obtenir les données du capteur à l'aide de la carte Arduino via le protocole I2C. Ensuite, en utilisant les valeurs de l'axe X et de l'axe Y du capteur, nous calculerons le cap et enverrons sa valeur à l'IDE de traitement via le port série. Le code suivant fera ce travail :
Si vous avez besoin de plus de détails sur le fonctionnement du magnétomètre MEMS et sur la façon d'en extraire les données, vous pouvez consulter mon didacticiel sur les capteurs MEMS.
Ici, nous devons d'abord recevoir les valeurs d'en-tête provenant du port série. Pour plus de détails sur la façon dont cela est fait, vous pouvez consulter mon tutoriel Arduino et traitement.
La boussole est en fait une image, ou plus précisément, elle est composée de plusieurs images transparentes chargées dans Processing IDE. Les images doivent être situées dans le répertoire de travail du sketch. Après avoir défini les objets images dans la section draw() à l'aide de la fonction image(), nous chargeons l'image d'arrière-plan (qui est facultative, vous pouvez utiliser une simple couleur pour l'arrière-plan). Ensuite, l'image de la boussole est chargée qui, à l'aide de la fonction rotateZ(), est pivotée avec les valeurs de l'en-tête. Au-dessus d'eux, l'image Compass Arrow est chargée.
Voici le code IDE de traitement :
Ici, vous pouvez télécharger les fichiers du projet, les images et les codes sources : Aperçu
Fonctionnement de la boussole
Pièce Arduino
/* Arduino Compass
*
* by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
#include <Wire.h> //I2C Arduino Library
#define Magnetometer_mX0 0x03
#define Magnetometer_mX1 0x04
#define Magnetometer_mZ0 0x05
#define Magnetometer_mZ1 0x06
#define Magnetometer_mY0 0x07
#define Magnetometer_mY1 0x08
int mX0, mX1, mX_out;
int mY0, mY1, mY_out;
int mZ0, mZ1, mZ_out;
float heading, headingDegrees, headingFiltered, declination;
float Xm,Ym,Zm;
#define Magnetometer 0x1E //I2C 7bit address of HMC5883
void setup(){
//Initialize Serial and I2C communications
Serial.begin(115200);
Wire.begin();
delay(100);
Wire.beginTransmission(Magnetometer);
Wire.write(0x02); // Select mode register
Wire.write(0x00); // Continuous measurement mode
Wire.endTransmission();
}
void loop(){
//---- X-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mX1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mX0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mX0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mX1 = Wire.read();
}
//---- Y-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mY1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mY0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mY0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mY1 = Wire.read();
}
//---- Z-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mZ1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mZ0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mZ0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mZ1 = Wire.read();
}
//---- X-Axis
mX1=mX1<<8;
mX_out =mX0+mX1; // Raw data
// From the datasheet: 0.92 mG/digit
Xm = mX_out*0.00092; // Gauss unit
//* Earth magnetic field ranges from 0.25 to 0.65 Gauss, so these are the values that we need to get approximately.
//---- Y-Axis
mY1=mY1<<8;
mY_out =mY0+mY1;
Ym = mY_out*0.00092;
//---- Z-Axis
mZ1=mZ1<<8;
mZ_out =mZ0+mZ1;
Zm = mZ_out*0.00092;
// ==============================
//Calculating Heading
heading = atan2(Ym, Xm);
// Correcting the heading with the declination angle depending on your location
// You can find your declination angle at: https://www.ngdc.noaa.gov/geomag-web/
// At my location it's 4.2 degrees => 0.073 rad
declination = 0.073;
heading += declination;
// Correcting when signs are reveresed
if(heading <0) heading += 2*PI;
// Correcting due to the addition of the declination angle
if(heading > 2*PI)heading -= 2*PI;
headingDegrees = heading * 180/PI; // The heading in Degrees unit
// Smoothing the output angle / Low pass filter
headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;
//Sending the heading value through the Serial Port to Processing IDE
Serial.println(headingFiltered);
delay(50);
}
Code language: Arduino (arduino)Traitement de la partie IDE
/* Arduino Compass
*
* by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
PImage imgCompass;
PImage imgCompassArrow;
PImage background;
String data="";
float heading;
void setup() {
size (1920, 1080, P3D);
smooth();
imgCompass = loadImage("Compass.png");
imgCompassArrow = loadImage("CompassArrow.png");
background = loadImage("Background.png");
myPort = new Serial(this, "COM4", 115200); // starts the serial communication
myPort.bufferUntil('\n');
}
void draw() {
image(background,0, 0); // Loads the Background image
pushMatrix();
translate(width/2, height/2, 0); // Translates the coordinate system into the center of the screen, so that the rotation happen right in the center
rotateZ(radians(-heading)); // Rotates the Compass around Z - Axis
image(imgCompass, -960, -540); // Loads the Compass image and as the coordinate system is relocated we need need to set the image at -960x, -540y (half the screen size)
popMatrix(); // Brings coordinate system is back to the original position 0,0,0
image(imgCompassArrow,0, 0); // Loads the CompassArrow image which is not affected by the rotateZ() function because of the popMatrix() function
textSize(30);
text("Heading: " + heading,40,40); // Prints the value of the heading on the screen
delay(40);
}
// starts reading data from the Serial Port
void serialEvent (Serial myPort) {
data = myPort.readStringUntil('\n');// reads the data from the Serial Port and puts it into the String variable "data".
heading = float(data); // Convering the the String value into Float value
}
Code language: Arduino (arduino)
Processus de fabrication
- Créer un moniteur Ambilight à l'aide d'Arduino
- Machine à LÉVITATION ULTRASONIQUE utilisant ARDUINO
- Télécommande universelle utilisant Arduino, 1Sheeld et Android
- Voltmètre DIY utilisant Arduino et Smartphone
- Mesure de la fréquence et du cycle de service à l'aide d'Arduino
- Comment créer un bouton de clavier personnalisable personnalisable
- Sonar utilisant arduino et affichage lors du traitement de l'IDE
- Compteur de voitures utilisant Arduino + Traitement + PHP
- Contrôle de la luminosité des LED à l'aide de Bolt et Arduino