Indholdsfortegnelse:

Arduino Digital Compass Project: 3 trin
Arduino Digital Compass Project: 3 trin

Video: Arduino Digital Compass Project: 3 trin

Video: Arduino Digital Compass Project: 3 trin
Video: Rover5_HMC5883_CompassControlledFigure8_130302a 2024, Juli
Anonim
Image
Image

Hej! I denne instruktive vil du se, hvordan du kan lave et digitalt kompas ved hjælp af en Arduino og Processing IDE. Dette er ganske enkelt, men interessant og sejt Arduino -projekt.

Du kan se demo -eksemplet på denne vejledning i videoen ovenfor. Du kan altid finde flere interessante videoer som denne på min YouTube -kanal samt finde en masse elektronikprojekter og selvstudier på mit websted, HowToMechatronics.com

Trin 1: Påkrævede dele

Til dette projekt skal du blot bruge et Arduino Board og et MEMS Magnetometer til måling af jordens magnetfelt. Jeg vil bruge GY - 80 breakout board, som indeholder MC5883L 3 - Axis Magnetometer.

Inden vi fortsætter med kildekoden til projektet Hvis du har brug for flere detaljer om, hvordan MEMS magnetometer fungerer, samt hvordan du tilslutter og bruger GY - 80 breakout board via I2C Communication, kan du tjekke mine særlige tutorials for det.

Trin 2: Arduino kildekode

Det, vi først skal gøre, er at uploade en skitse til Arduino Board, der vil læse dataene fra magnetometeret, og det vil sende det til Processing IDE. Her er Arduino kildekoden:

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

#include // I2C Arduino Library

#define Magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04 #define Magnetometer_mZ0 0x05 #Definer Magnetometer_mZ1 0x06 #Definer Magnetometer_mY0 0x07 #Definer Magnetometer_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

float heading, headingDegrees, headingFiltreret, deklination;

flyde Xm, Ym, Zm;

#define Magnetometer 0x1E // I2C 7bit adresse på HMC5883

ugyldig opsætning () {

// Initialiser seriel og I2C kommunikation Serial.begin (115200); Wire.begin (); forsinkelse (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Vælg tilstandsregistrering Wire.write (0x00); // Kontinuerlig målingstilstand Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-akse

Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // overføre til enheden Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-akse mX1 = mX1 << 8; mX_out = mX0+mX1; // Rå data // Fra databladet: 0,92 mG/ciffer Xm = mX_out*0,00092; // Gauss -enhed //* Jordens magnetfelt spænder fra 0,25 til 0,65 Gauss, så det er de værdier, vi har brug for at få cirka.

// ---- Y-akse

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

// ---- Z-akse

mZ1 = mZ1 <0,073 rad deklination = 0,073; overskrift += deklination; // Korrigering, når tegn er æret, hvis (overskrift <0) overskrift += 2*PI;

// Korrektion på grund af tilføjelsen af deklinationsvinklen

hvis (overskrift> 2*PI) overskrift -= 2*PI;

headingDegrees = overskrift * 180/PI; // Overskriften i grader -enhed

// Udjævning af outputvinklen / lavpasfilter

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

// Sende overskriftsværdien via den serielle port til Processing IDE

Serial.println (overskriftFiltreret);

forsinkelse (50); }

Trin 3: Behandling af IDE -kildekode

Efter at vi har uploadet den tidligere Arduino -skitse, skal vi modtage dataene i Processing IDE og tegne det digitale kompas. Kompasset består af et baggrundsbillede, et fast billede af pilen og et roterende billede af kompassets krop. Så værdierne for eart magnetfelt beregnet med Arduino bruges til at rotere kompasset.

Her er kildekoden til Processing IDE:

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

Seriel myPort;

PImage imgCompass; PImage imgCompassArrow; PImage baggrund;

String data = "";

flydeoverskrift;

ugyldig opsætning () {

størrelse (1920, 1080, P3D); glat(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = ny Serial (dette, "COM4", 115200); // starter seriel kommunikation myPort.bufferUntil ('\ n'); }

ugyldig tegning () {

billede (baggrund, 0, 0); // Indlæser baggrundsbilledet pushMatrix (); translate (bredde/2, højde/2, 0); // Oversætter koordinatsystemet til midten af skærmen, så rotationen sker lige i midten rotateZ (radianer (-heading)); // Roterer kompasset omkring Z -akse billede (imgCompass, -960, -540); // Indlæser kompasbilledet, og da koordinatsystemet flyttes, skal vi indstille billedet til -960x, -540y (halv skærmstørrelse) popMatrix (); // Bringer koordinatsystemet er tilbage til den oprindelige position 0, 0, 0 image (imgCompassArrow, 0, 0); // Indlæser CompassArrow -billedet, som ikke påvirkes af funktionen rotateZ () på grund af popMatrix () -funktionen textSize (30); tekst ("Overskrift:" + overskrift, 40, 40); // Udskriver værdien af overskriften på skærmen

forsinkelse (40);

}

// begynder at læse data fra den serielle port

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // læser dataene fra serieporten og sætter dem i strengvariablen "data". heading = float (data); // Konvertering af strengværdien til Float -værdi}

Jeg håber, at du kan lide dette projekt. Hvis det er sådan, kan du også besøge min hjemmeside for flere fede projekter.

Anbefalede: