Tartalomjegyzék:

Arduino digitális iránytű projekt: 3 lépés
Arduino digitális iránytű projekt: 3 lépés

Videó: Arduino digitális iránytű projekt: 3 lépés

Videó: Arduino digitális iránytű projekt: 3 lépés
Videó: HMC5883L magnetométer (digitális iránytű) 2024, November
Anonim
Image
Image

Helló! Ebben az utasításban látni fogja, hogyan készíthet digitális iránytűt Arduino és a feldolgozó IDE használatával. Ez egy nagyon egyszerű, de érdekes és hűvös megjelenésű Arduino projekt.

Ennek az oktatóanyagnak a demó példáját megnézheti a fenti videón. A YouTube -csatornámon mindig találhat ehhez hasonló érdekesebb videókat, valamint rengeteg elektronikai projektet és oktatóanyagot a webhelyemen, a HowToMechatronics.com webhelyen.

1. lépés: Szükséges alkatrészek

Ehhez a projekthez csak egy Arduino táblára és egy MEMS magnetométerre lesz szüksége a földmágneses mező méréséhez. A GY -80 töréskártyát fogom használni, amely tartalmazza az MC5883L 3 tengelyes magnetométert.

Mielőtt folytatnánk a projekt forráskódját Ha további információra van szüksége a MEMS magnetométer működéséről, valamint arról, hogyan kell csatlakoztatni és használni a GY -80 megszakító kártyát az I2C kommunikáción keresztül, akkor tekintse meg az adott oktatóanyagomat.

2. lépés: Arduino forráskód

Először fel kell töltenünk egy vázlatot az Arduino Boardra, amely kiolvassa a magnetométer adatait, és elküldi azokat a Processing IDE -nek. Íme az Arduino forráskódja:

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

#include // I2C Arduino könyvtár

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

úszócím, fejlécFokok, fejlécSzűrt, deklináció;

úszó Xm, Ym, Zm;

#define Magnetometer 0x1E // I2C HMC5883 7 bites címe

void setup () {

// Soros és I2C kommunikáció inicializálása Serial.begin (115200); Wire.begin (); késleltetés (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Módválasztó regiszter Wire.write (0x00); // Folyamatos mérési mód Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-tengely

Wire.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-tengelyhuzal.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // továbbítás az eszközre Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-tengely mX1 = mX1 << 8; mX_out = mX0+mX1; // Nyers adatok // Az adatlapból: 0,92 mG/számjegy Xm = mX_out*0,00092; // Gauss egység //* A Föld mágneses tere 0,25 és 0,65 Gauss között mozog, tehát ezek az értékek, amelyeket hozzávetőlegesen meg kell kapnunk.

// ---- Y-tengely

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

// ---- Z-tengely

mZ1 = mZ1 <0,073 rad deklináció = 0,073; fejléc += deklináció; // Javítás a jelek tisztelete esetén, ha (<0. Fejléc) fejléc += 2*PI;

// Javítás a deklinációs szög hozzáadása miatt

if (fejléc> 2*PI) fejléc -= 2*PI;

headDegrees = fejléc * 180/PI; // A címsor mértékegységben

// A kimeneti szög simítása / Aluláteresztő szűrő

headFiltered = headFiltered*0,85 + headDegrees*0,15;

// A címsor értékének elküldése a soros porton keresztül az IDE feldolgozásához

Serial.println (headFiltered);

késleltetés (50); }

3. lépés: Az IDE forráskód feldolgozása

Miután feltöltöttük az előző Arduino vázlatot, be kell vennünk az adatokat a feldolgozó IDE -be, és meg kell rajzolnunk a digitális iránytűt. Az iránytű háttérképből, rögzített nyílképből és az iránytű testének forgó képéből áll. Tehát az Arduino -val kiszámított földmágneses mező értékeit használják az iránytű forgatására.

Íme a feldolgozó IDE forráskódja:

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

Soros myPort;

PImage imgCompass; PImage imgCompassArrow; PImage háttér;

String adatok = "";

úszófej;

void setup () {

méret (1920, 1080, P3D); sima(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = új soros (ez, "COM4", 115200); // elindítja a soros kommunikációt myPort.bufferUntil ('\ n'); }

void draw () {

kép (háttér, 0, 0); // Betölti a háttérképet pushMatrix (); fordítás (szélesség/2, magasság/2, 0); // Lefordítja a koordináta-rendszert a képernyő közepére, így a forgatás közvetlenül a rotateZ középső részében történik (radiánok (-fej)); // Az iránytűt Z -tengely köré forgatja (imgCompass, -960, -540); // Betölti az iránytű képét, és a koordinátarendszer áthelyezésekor a képet -960x, -540y (a képernyő méretének fele) értékre kell állítanunk popMatrix (); // A koordináta -rendszer visszaállítása az eredeti pozícióba 0, 0, 0 image (imgCompassArrow, 0, 0); // Betölti a CompassArrow képet, amelyet a rotateZ () függvény nem érint a popMatrix () függvény textSize (30) miatt; szöveg ("Címsor:" + fejléc, 40, 40); // Kinyomtatja a címsor értékét a képernyőn

késleltetés (40);

}

// elkezdi olvasni az adatokat a soros portról

void serialEvent (Soros myPort) {data = myPort.readStringUntil ('\ n'); // beolvassa az adatokat a soros portból, és beilleszti a "data" karakterlánc változóba. fejléc = lebegés (adatok); // A String érték átalakítása Float értékké}

Remélem tetszeni fog ez a projekt. Ha ez így van, látogasson el a webhelyemre további menő projektekért.

Ajánlott: