Innholdsfortegnelse:

Arduino Digital Compass Project: 3 trinn
Arduino Digital Compass Project: 3 trinn

Video: Arduino Digital Compass Project: 3 trinn

Video: Arduino Digital Compass Project: 3 trinn
Video: Arduino — растровые изображения из I2C EEPROM на OLED-дисплей 128x64 2024, Juli
Anonim
Image
Image

Hallo! I denne instruksjonsboken vil du se hvordan du kan lage et digitalt kompass ved hjelp av en Arduino og Processing IDE. Dette er ganske enkelt, men interessant og kult Arduino -prosjekt.

Du kan se demo -eksemplet på denne opplæringen på videoen ovenfor. Du kan alltid finne flere interessante videoer som dette på YouTube -kanalen min, samt finne mange elektronikkprosjekter og opplæringsprogrammer på nettstedet mitt, HowToMechatronics.com

Trinn 1: Deler påkrevd

For dette prosjektet trenger du bare et Arduino -bord og et MEMS -magnetometer for å måle jordmagnetfeltet. Jeg vil bruke GY - 80 breakout board som inneholder MC5883L 3 - Axis Magnetometer.

Før vi fortsetter med kildekoden for prosjektet. Hvis du trenger flere detaljer om hvordan MEMS magnetometer fungerer, samt hvordan du kobler til og bruker GY - 80 breakout board via I2C Communication, kan du sjekke mine spesielle opplæringsprogrammer for det.

Trinn 2: Arduino kildekode

Det vi først må gjøre er å laste opp en skisse til Arduino Board som vil lese dataene fra magnetometeret, og den vil sende den til Processing IDE. Her er Arduino kildekoden:

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

#include // I2C Arduino Library

#define Magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04 #Definer 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, headingFiltrert, deklinasjon;

flyte Xm, Ym, Zm;

#define Magnetometer 0x1E // I2C 7bit adresse til HMC5883

ugyldig oppsett () {

// Initialiser seriell og I2C kommunikasjon Serial.begin (115200); Wire.begin (); forsinkelse (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Velg modusregister Wire.write (0x00); // Kontinuerlig målemodus Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // overføre til enheten Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetometer); // overføre til enheten 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 enheten Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetometer); // overføre til enheten 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 enheten Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); hvis (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetometer); // overføre til enheten 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/siffer Xm = mX_out*0,00092; // Gauss -enhet //* Jordens magnetfelt varierer fra 0,25 til 0,65 Gauss, så dette er verdiene vi trenger for å få omtrent.

// ---- Y-akse

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

// ---- Z-akse

mZ1 = mZ1 <0,073 rad deklinasjon = 0,073; overskrift += deklinasjon; // Korrigere når tegn er ærverdige hvis (overskrift <0) overskrift += 2*PI;

// Korrigering på grunn av tillegg av deklinasjonsvinkelen

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

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

// Utjevning av utgangsvinkelen / lavpassfilter

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

// Sende overskriftsverdien gjennom serieporten til prosessering IDE

Serial.println (headingFiltrert);

forsinkelse (50); }

Trinn 3: Behandler IDE -kildekoden

Etter at vi har lastet opp den forrige Arduino -skissen, må vi motta dataene i Processing IDE og tegne det digitale kompasset. Kompasset består av et bakgrunnsbilde, et fast bilde av pilen og et roterende bilde av kompassets kropp. Så verdiene for eart -magnetfeltet beregnet med Arduino brukes til å rotere kompasset.

Her er kildekoden til Processing IDE:

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

Seriell myPort;

PImage imgCompass; PImage imgCompassArrow; Bildebilde;

String data = "";

flyteoverskrift;

ugyldig oppsett () {

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

ugyldig trekning () {

bilde (bakgrunn, 0, 0); // Laster bakgrunnsbildet pushMatrix (); translate (bredde/2, høyde/2, 0); // Oversetter koordinatsystemet til midten av skjermen, slik at rotasjonen skjer midt i midten rotateZ (radianer (-heading)); // Roter kompasset rundt Z -akse -bilde (imgCompass, -960, -540); // Laster inn kompassbildet, og ettersom koordinatsystemet flyttes, trenger vi å sette bildet til -960x, -540y (halv skjermstørrelse) popMatrix (); // Bringer koordinatsystemet er tilbake til den opprinnelige posisjonen 0, 0, 0 image (imgCompassArrow, 0, 0); // Laster inn CompassArrow -bildet som ikke påvirkes av rotateZ () -funksjonen på grunn av popMatrix () -funksjonen textSize (30); tekst ("Overskrift:" + overskrift, 40, 40); // Skriver ut verdien av overskriften på skjermen

forsinkelse (40);

}

// begynner å lese data fra serieporten

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // leser dataene fra serieporten og legger dem inn i strengvariabelen "data". heading = float (data); // Konvertere strengen til Float -verdi}

Jeg håper du vil like dette prosjektet. Hvis det er slik, kan du også besøke nettstedet mitt for flere kule prosjekter.

Anbefalt: