Table des matières:

Projet de boussole numérique Arduino : 3 étapes
Projet de boussole numérique Arduino : 3 étapes

Vidéo: Projet de boussole numérique Arduino : 3 étapes

Vidéo: Projet de boussole numérique Arduino : 3 étapes
Vidéo: #1 ARDUINO - Découverte et Premier Projet (Allumer une LED) 2024, Novembre
Anonim
Image
Image

Salut! Dans cette instructable, vous verrez comment vous pouvez créer une boussole numérique à l'aide d'un Arduino et de l'IDE de traitement. C'est un projet Arduino assez simple mais intéressant et cool.

Vous pouvez regarder l'exemple de démonstration de ce tutoriel sur la vidéo ci-dessus. Vous pouvez toujours trouver des vidéos plus intéressantes comme celle-ci sur ma chaîne YouTube ainsi que de nombreux projets et tutoriels électroniques sur mon site Web, HowToMechatronics.com

Étape 1: Pièces requises

Pour ce projet, vous n'aurez besoin que d'une carte Arduino et d'un magnétomètre MEMS, pour mesurer le champ magnétique terrestre. J'utiliserai la carte de dérivation GY - 80 qui contient le magnétomètre à 3 axes MC5883L.

Avant de continuer avec le code source du projet Si vous avez besoin de plus de détails sur le fonctionnement du magnétomètre MEMS ainsi que sur la connexion et l'utilisation de la carte de dérivation GY - 80 via la communication I2C, vous pouvez consulter mes tutoriels particuliers à ce sujet.

Étape 2: code source Arduino

Ce que nous devons d'abord faire, c'est télécharger un croquis sur la carte Arduino qui lira les données du magnétomètre et l'enverra à l'IDE de traitement. Voici le code source Arduino:

/* Boussole Arduino * * par Dejan Nedelkovski, * www. HowToMechatronics.com * */

#include //Bibliothèque Arduino I2C

#define Magnétomètre_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 monY0, monY1, monY_out; entier mZ0, mZ1, mZ_out;

titre flottant, titreDegrés, titreFiltré, déclinaison;

flotteur Xm, Ym, Zm;

#define Magnétomètre 0x1E //I2C Adresse 7 bits du HMC5883

void setup(){

//Initialiser les communications série et I2C Serial.begin(115200); Fil.begin(); retard (100); Wire.beginTransmission (magnétomètre); Wire.write(0x02); // Sélection du registre de mode Wire.write(0x00); // Mode de mesure en continu Wire.endTransmission(); }

boucle vide(){

//---- X-Axis Wire.beginTransmission(Magnetometer); // transmettre à l'appareil Wire.write(Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mX0 = Wire.read(); } Wire.beginTransmission(Magnétomètre); // transmettre à l'appareil Wire.write(Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mX1 = Wire.read(); }

//---- Axe Y

Wire.beginTransmission (magnétomètre); // transmettre à l'appareil Wire.write(Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mY0 = Wire.read(); } Wire.beginTransmission(Magnétomètre); // transmettre à l'appareil Wire.write(Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mY1 = Wire.read(); } //---- Z-Axis Wire.beginTransmission(Magnetometer); // transmettre à l'appareil Wire.write(Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mZ0 = Wire.read(); } Wire.beginTransmission(Magnétomètre); // transmettre à l'appareil Wire.write(Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(Magnétomètre, 1); if(Wire.available()<=1) { mZ1 = Wire.read(); } //---- Axe X mX1=mX1<<8; mX_out =mX0+mX1; // Données brutes // De la fiche technique: 0.92 mG/chiffre Xm = mX_out*0.00092; // Unité Gauss //* Le champ magnétique terrestre varie de 0,25 à 0,65 Gauss, ce sont donc les valeurs que nous devons obtenir approximativement.

//---- Axe Y

mY1=mY1<<8; mY_out =mY0+mY1; Ym = mY_out*0.00092;

//---- Axe z

mZ1=mZ1< 0,073 rad déclinaison = 0,073; cap += déclinaison; // Correction lorsque les signes sont inversés if(heading <0) header += 2*PI;

// Correction due à l'ajout de l'angle de déclinaison

if(titre > 2*PI)titre -= 2*PI;

titreDegrés = titre * 180/PI; // Le titre en Degrés

// Lissage de l'angle de sortie / Filtre passe-bas

titreFiltré = titreFiltré*0.85 + titreDegrés*0.15;

//Envoi de la valeur d'en-tête via le port série à l'IDE de traitement

Serial.println(headingFiltered);

retard (50); }

Étape 3: Traitement du code source IDE

Après avoir téléchargé le croquis Arduino précédent, nous devons recevoir les données dans l'IDE de traitement et dessiner la boussole numérique. La boussole est composée d'une image d'arrière-plan, d'une image fixe de la flèche et d'une image rotative du corps de la boussole. Ainsi, les valeurs du champ magnétique terrestre calculées avec l'Arduino sont utilisées pour faire tourner la boussole.

Voici le code source de l'IDE de traitement:

/* Boussole Arduino * * par Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial.*; importer java.awt.event. KeyEvent; importer java.io. IOException;

myPort série;

PImage imgBoussole; PImage imgCompassArrow; Arrière-plan de l'image;

Données de chaîne="";

cap du flotteur;

void setup() {

taille (1920, 1080, P3D); lisse(); imgBoussole = loadImage("Boussole.png"); imgCompassArrow = loadImage("CompassArrow.png"); background = loadImage("Background.png"); myPort = new Serial(this, "COM4", 115200); // démarre la communication série myPort.bufferUntil('\n'); }

tirage nul () {

image(fond, 0, 0); // Charge l'image de fond pushMatrix(); translate(largeur/2, hauteur/2, 0); // Traduit le système de coordonnées au centre de l'écran, de sorte que la rotation se produise juste au centre rotateZ(radians(-heading)); // Fait pivoter la boussole autour de l'image Z - Axis (imgCompass, -960, -540); // Charge l'image de la boussole et comme le système de coordonnées est déplacé, nous devons définir l'image à -960x, -540y (la moitié de la taille de l'écran) popMatrix(); // Ramène le système de coordonnées à sa position d'origine 0, 0, 0 image(imgCompassArrow, 0, 0); // Charge l'image CompassArrow qui n'est pas affectée par la fonction rotateZ() à cause de la fonction popMatrix() textSize(30); text("En-tête: " + en-tête, 40, 40); // Imprime la valeur de l'en-tête à l'écran

retard (40);

}

// commence à lire les données du port série

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n'); // lit les données du port série et les place dans la variable String "data". titre = float(données); // Conversion de la valeur String en valeur Float }

J'espère que vous aimerez ce projet. Si c'est le cas, vous pouvez également visiter mon site Web pour des projets plus sympas.

Conseillé: