Sisällysluettelo:

Arduino Digital Compass Project: 3 vaihetta
Arduino Digital Compass Project: 3 vaihetta

Video: Arduino Digital Compass Project: 3 vaihetta

Video: Arduino Digital Compass Project: 3 vaihetta
Video: Arduino Analog + Digital Compass with HMC5883L sensor 2024, Marraskuu
Anonim
Image
Image

Hei! Tässä ohjeessa näet, kuinka voit tehdä digitaalisen kompassin Arduinon ja Processing IDE: n avulla. Tämä on melko yksinkertainen, mutta mielenkiintoinen ja siistin näköinen Arduino -projekti.

Voit katsoa tämän opetusohjelman demoesimerkin yllä olevasta videosta. Löydät aina tällaisia mielenkiintoisempia videoita YouTube -kanavaltani sekä paljon elektroniikkaprojekteja ja opetusohjelmia verkkosivustoltani, HowToMechatronics.com

Vaihe 1: Tarvittavat osat

Tätä projektia varten tarvitset vain Arduino -levyn ja MEMS -magnetometrin maan magneettikentän mittaamiseen. Käytän GY -80 -katkaisulautaa, joka sisältää MC5883L 3 -akselisen magneettimittarin.

Ennen kuin jatkamme projektin lähdekoodilla Jos tarvitset lisätietoja MEMS -magnetometrin toiminnasta sekä GY -80 -katkaisukortin liittämisestä ja käyttämisestä I2C -tiedonsiirron kautta, voit tarkistaa oppaistani.

Vaihe 2: Arduinon lähdekoodi

Meidän on ensin tehtävä luonnos Arduino Boardille, joka lukee tiedot magnetometristä ja lähettää sen Processing IDE: lle. Tässä on Arduinon lähdekoodi:

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

#include // I2C Arduino -kirjasto

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

kelluva otsikko, otsikkoAsetukset, nimikeSuodatettu, deklinaatio;

kelluva Xm, Ym, Zm;

#define Magnetometri 0x1E // I2C HMC5883 7 -bittinen osoite

void setup () {

// Alusta sarja- ja I2C -viestintä Serial.begin (115200); Wire.begin (); viive (100); Wire.beginTransmission (Magnetometri); Wire.write (0x02); // Valitse tilarekisteri Wire.write (0x00); // Jatkuva mittaustila Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // lähettää laitteelle Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometri); // lähettää laitteelle Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-akseli

Wire.beginTransmission (Magnetometri); // lähettää laitteelle Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometri); // lähettää laitteelle Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-akselin lanka.beginTransmission (Magnetometer); // lähettää laitteelle Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometri); // lähettää laitteelle Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometri, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-akseli mX1 = mX1 << 8; mX_out = mX0+mX1; // Raakatiedot // Tietolomakkeesta: 0,92 mG/numero Xm = mX_out*0,00092; // Gauss -yksikkö //* Maan magneettikenttä vaihtelee välillä 0,25 - 0,65 Gauss, joten nämä ovat arvoja, jotka meidän on saatava suunnilleen.

// ---- Y-akseli

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

// ---- Z-akseli

mZ1 = mZ1 <0,073 rad deklinaatio = 0,073; otsikko += deklinaatio; // Korjataan, kun merkkejä kunnioitetaan, jos (otsikko <0) otsikko += 2*PI;

// Korjaus deklinaatiokulman lisäämisen vuoksi

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

headDegrees = nimike * 180/PI; // Otsikko asteina

// Lähtökulman tasoittaminen / Alipäästösuodatin

otsikkoSuodatettu = otsikkoSuodatettu*0,85 + otsikkoTasot*0,15;

// Otsikon arvon lähettäminen sarjaportin kautta IDE -käsittelyyn

Serial.println (otsikkoSuodatettu);

viive (50); }

Vaihe 3: IDE -lähdekoodin käsittely

Kun olemme ladanneet edellisen Arduino -luonnoksen, meidän on vastaanotettava tiedot Processing IDE: hen ja piirrettävä digitaalinen kompassi. Kompassi koostuu taustakuvasta, kiinteästä nuolen kuvasta ja pyörivästä kuvasta kompassin rungosta. Joten Arduinolla laskettuja korva -magneettikentän arvoja käytetään kompassin pyörittämiseen.

Tässä on Processing IDE: n lähdekoodi:

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

Sarja myPort;

KUVA imgCompass; KUVA imgCompassArrow; PImage -tausta;

Merkkijonotiedot = "";

kelluva otsikko;

void setup () {

koko (1920, 1080, P3D); sileä(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = uusi sarja (tämä, "COM4", 115200); // aloittaa sarjaliikenteen myPort.bufferUntil ('\ n'); }

void draw () {

kuva (tausta, 0, 0); // Lataa taustakuvan pushMatrix (); kääntää (leveys/2, korkeus/2, 0); // Kääntää koordinaattijärjestelmän näytön keskelle siten, että kierto tapahtuu suoraan keskellä rotateZ (radiaanit (-pää)); // Kierrä kompassia Z -akselin kuvan ympäri (imgCompass, -960, -540); // Lataa kompassikuvan ja koordinaattijärjestelmän siirron yhteydessä meidän on asetettava kuva -960x, -540y (puolet näytön koosta) popMatrix (); // Tuo koordinaatiston takaisin alkuperäiseen asentoonsa 0, 0, 0 kuva (imgCompassArrow, 0, 0); // Lataa CompassArrow -kuvan, johon rotateZ () -toiminto ei vaikuta popMatrix () -funktion vuoksi textSize (30); teksti ("Otsikko:" + otsikko, 40, 40); // Tulostaa otsikon arvon näytölle

viive (40);

}

// aloittaa tietojen lukemisen sarjaportista

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // lukee tiedot sarjaportista ja laittaa ne merkkijonomuuttujaan "data". otsikko = kelluva (data); // String -arvon muuntaminen Float -arvoksi}

Toivottavasti pidät tästä projektista. Jos näin on, voit myös vierailla verkkosivustollani saadaksesi lisää hienoja projekteja.

Suositeltava: