Innehållsförteckning:

Arduino Digital Compass Project: 3 steg
Arduino Digital Compass Project: 3 steg

Video: Arduino Digital Compass Project: 3 steg

Video: Arduino Digital Compass Project: 3 steg
Video: Arduino Digital Compass using Hmc5883l Magnetometer 2024, November
Anonim
Image
Image

Hej! I den här instruktören kommer du att se hur du kan göra en digital kompass med en Arduino och Processing IDE. Detta är ganska enkelt men intressant och coolt Arduino -projekt.

Du kan se demo -exemplet på den här självstudien i videon ovan. Du kan alltid hitta fler intressanta videor som detta på min YouTube -kanal samt hitta många elektronikprojekt och självstudier på min webbplats, HowToMechatronics.com

Steg 1: Delar krävs

För detta projekt behöver du bara en Arduino Board och en MEMS Magnetometer för att mäta jordens magnetfält. Jag kommer att använda GY - 80 breakout board som innehåller MC5883L 3 - Axis Magnetometer.

Innan vi fortsätter med källkoden för projektet. Om du behöver mer information om hur MEMS -magnetometern fungerar samt hur du ansluter och använder GY -80 -utbrottskortet via I2C -kommunikationen kan du kolla mina speciella handledning för det.

Steg 2: Arduino -källkod

Det vi måste göra först är att ladda upp en skiss till Arduino Board som läser data från magnetometern och den skickar den till Processing IDE. Här är Arduino -källkoden:

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

#include // 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, headingFiltrerat, deklination;

flyta Xm, Ym, Zm;

#define Magnetometer 0x1E // I2C 7bit adress till HMC5883

void setup () {

// Initiera seriell och I2C -kommunikation Serial.begin (115200); Wire.begin (); fördröjning (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Välj lägesregister Wire.write (0x00); // Kontinuerligt mätläge Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-axel

Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten 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; // Rå data // Från databladet: 0,92 mG/siffra Xm = mX_out*0,00092; // Gauss -enhet //* Jordens magnetfält varierar från 0,25 till 0,65 Gauss, så det är de värden som vi behöver för att få ungefär.

// ---- Y-axel

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

// ---- Z-axel

mZ1 = mZ1 <0,073 raddeklination = 0,073; rubrik += deklination; // Korrigera när tecken är vördade om (rubrik <0) rubrik += 2*PI;

// Korrigering på grund av tillägget av deklinationsvinkeln

om (rubrik> 2*PI) rubrik -= 2*PI;

rubrikgrader = rubrik * 180/PI; // Rubriken i grader -enhet

// Utjämning av utgångsvinkeln / Lågpassfilter

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

// Skicka rubrikvärdet via Serial Port till Processing IDE

Serial.println (rubrikFiltrerad);

fördröjning (50); }

Steg 3: Bearbetar IDE -källkod

Efter att vi har laddat upp den tidigare Arduino -skissen måste vi ta emot data till Processing IDE och rita den digitala kompassen. Kompassen består av en bakgrundsbild, en fast bild av pilen och en roterande bild av kompassens kropp. Så värdena för jordmagnetfältet beräknat med Arduino används för att rotera kompassen.

Här är källkoden för Processing IDE:

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

Seriell myPort;

PImage imgCompass; PImage imgCompassArrow; PImage bakgrund;

Strängdata = "";

flottörrubrik;

void setup () {

storlek (1920, 1080, P3D); slät(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = new Serial (detta, "COM4", 115200); // startar seriell kommunikation myPort.bufferUntil ('\ n'); }

void draw () {

bild (bakgrund, 0, 0); // Läser in bakgrundsbilden pushMatrix (); translate (bredd/2, höjd/2, 0); // Översätter koordinatsystemet till mitten av skärmen, så att rotationen sker mitt i rotationen Z (radianer (-heading)); // Roterar kompassen runt Z -axelbild (imgCompass, -960, -540); // Läser in kompassbilden och när koordinatsystemet flyttas behöver vi ställa in bilden på -960x, -540y (halva skärmstorleken) popMatrix (); // Bringer koordinatsystemet är tillbaka till den ursprungliga positionen 0, 0, 0 image (imgCompassArrow, 0, 0); // Läser in CompassArrow -bilden som inte påverkas av funktionen rotateZ () på grund av popMatrix () -funktionen textSize (30); text ("Rubrik:" + rubrik, 40, 40); // Skriver ut värdet på rubriken på skärmen

fördröjning (40);

}

// börjar läsa data från serieporten

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // läser data från serieporten och lägger in den i strängvariabeln "data". rubrik = float (data); // Konvertera strängvärdet till Float -värde}

Jag hoppas att du kommer att gilla det här projektet. Om det är så kan du också besöka min webbplats för fler coola projekt.

Rekommenderad: