Taula de continguts:

Projecte Arduino Digital Compass: 3 passos
Projecte Arduino Digital Compass: 3 passos

Vídeo: Projecte Arduino Digital Compass: 3 passos

Vídeo: Projecte Arduino Digital Compass: 3 passos
Vídeo: ARDUÍNO #5: Conheça o Arduíno UNO 2024, Desembre
Anonim
Image
Image

Hola! En aquest instructiu veureu com podeu fer una brúixola digital mitjançant un Arduino i l’IDE de processament. Això és bastant senzill, però interessant i amb un aspecte genial del projecte Arduino.

Podeu veure l'exemple de demostració d'aquest tutorial al vídeo anterior. Sempre podeu trobar vídeos més interessants com aquest al meu canal de YouTube, així com trobar molts projectes i tutorials d’electrònica al meu lloc web, HowToMechatronics.com

Pas 1: requereixen parts

Per a aquest projecte només necessitareu una placa Arduino i un magnetòmetre MEMS per mesurar el camp magnètic terrestre. Utilitzaré el tauler GY-80 que conté el magnetòmetre de 3 eixos MC5883L.

Abans de continuar amb el codi font del projecte. Si necessiteu més detalls sobre el funcionament del magnetòmetre MEMS i sobre com connectar i utilitzar el tauler GY-80 mitjançant la comunicació I2C, podeu consultar els meus tutorials particulars.

Pas 2: Codi font Arduino

El que hem de fer primer és pujar un esbós a la placa Arduino que llegirà les dades del magnetòmetre i les enviarà a l’IDE de processament. Aquí teniu el codi font Arduino:

/ * Arduino Compass * * de Dejan Nedelkovski, * www. HowToMechatronics.com * * /

#include // Biblioteca Arduino I2C

#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;

títol flotant, headingDegrees, headingFiltered, declinació;

flotador Xm, Ym, Zm;

#define Magnetometer 0x1E // Adreça I2C de 7 bits de HMC5883

configuració nul·la () {

// Inicialitzar les comunicacions sèrie i I2C Serial.begin (115200); Wire.begin (); retard (100); Wire.beginTransmission (magnetòmetre); Wire.write (0x02); // Selecciona el mode de registre Wire.write (0x00); // Mode de mesura contínua Wire.endTransmission (); }

bucle buit () {

// ---- X-Axis Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Eix Y

Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Eix Z. Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetòmetre); // transmetre al dispositiu Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (magnetòmetre, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- Eix X mX1 = mX1 << 8; mX_out = mX0 + mX1; // Dades brutes // Del full de dades: 0,92 mG / dígit Xm = mX_out * 0,00092; // Unitat de Gauss // * El camp magnètic terrestre oscil·la entre 0,25 i 0,65 Gauss, de manera que aquests són els valors que necessitem per obtenir aproximadament.

// ---- Eix Y

mY1 = mY1 << 8; mY_out = mY0 + mY1; Ym = mY_out * 0,00092;

// ---- Eix Z

mZ1 = mZ1 <0,073 declinació rad = 0,073; encapçalament + = declinació; // Corregint quan es reverencien els signes si (encapçalament <0) encapçalament + = 2 * PI;

// Correcció a causa de l’addició de l’angle de declinació

if (encapçalament> 2 * PI) encapçalament - = 2 * PI;

headingDegrees = encapçalament * 180 / PI; // L'encapçalament de la unitat de Graus

// Suavitzar l’angle de sortida / Filtre de pas baix

headingFiltered = headingFiltered * 0,85 + headingDegrees * 0,15;

// Enviament del valor de l'encapçalament a través del port sèrie a l'IDE de processament

Serial.println (headingFiltered);

retard (50); }

Pas 3: processament del codi font IDE

Després de penjar l'esbós anterior d'Arduino, hem de rebre les dades a l'IDE de processament i dibuixar la brúixola digital. La brúixola es compon d'una imatge de fons, una imatge fixa de la fletxa i una imatge giratòria del cos de la brúixola. De manera que els valors del camp magnètic eart calculats amb l’Arduino s’utilitzen per girar la brúixola.

Aquí teniu el codi font de l’IDE de processament:

/ * Arduino Compass * * de Dejan Nedelkovski, * www. HowToMechatronics.com * * / import processing.serial. *; importació java.awt.event. KeyEvent; importació java.io. IOException;

MyPort en sèrie;

PImage imgCompass; PImage imgCompassArrow; PImatge de fons;

Dades de cadena = "";

capçalera flotant;

configuració nul·la () {

mida (1920, 1080, P3D); llis(); imgCompass = loadImage ("Brúixola.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = new Serial (this, "COM4", 115200); // inicia la comunicació serial myPort.bufferUntil ('\ n'); }

sorteig buit () {

imatge (fons, 0, 0); // Carrega la imatge de fons pushMatrix (); traduir (amplada / 2, alçada / 2, 0); // Tradueix el sistema de coordenades al centre de la pantalla, de manera que la rotació es produeixi al centre rotateZ (radians (-heading)); // Gira la brúixola al voltant de la imatge de l’eix Z (imgCompass, -960, -540); // Carrega la imatge de la brúixola i, a mesura que es trasllada el sistema de coordenades, hem d’establir la imatge a -960x, -540y (la meitat de la mida de la pantalla) popMatrix (); // El sistema de coordenades torna a la posició original 0, 0, 0 imatge (imgCompassArrow, 0, 0); // Carrega la imatge CompassArrow que no es veu afectada per la funció rotateZ () a causa de la funció popMatrix () textSize (30); text ("Encapçalament:" + encapçalament, 40, 40); // Imprimeix el valor de l'encapçalament a la pantalla

retard (40);

}

// comença a llegir dades del port sèrie

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // llegeix les dades del port sèrie i les posa a la variable Cadena "dades". encapçalament = float (dades); // Converteix el valor de la cadena en valor flotant}

Espero que aquest projecte us agradi. Si és així, també podeu visitar el meu lloc web per obtenir projectes més interessants.

Recomanat: