Mündəricat:

Arduino Rəqəmsal Kompas Layihəsi: 3 addım
Arduino Rəqəmsal Kompas Layihəsi: 3 addım

Video: Arduino Rəqəmsal Kompas Layihəsi: 3 addım

Video: Arduino Rəqəmsal Kompas Layihəsi: 3 addım
Video: Microbit: Akselerometr funksiyasının işlənməsi 2024, Iyul
Anonim
Image
Image

Salam! Bu təlimatda Arduino və Processing IDE -dən istifadə edərək rəqəmsal kompas necə qura biləcəyinizi görəcəksiniz. Bu olduqca sadə, lakin maraqlı və sərin görünüşlü Arduino Layihəsidir.

Bu təlimatın demo nümunəsini yuxarıdakı videoda izləyə bilərsiniz. Həmişə YouTube kanalımda bu kimi daha maraqlı videoları tapa bilərsiniz, veb saytım HowToMechatronics.com -da bir çox elektronika layihələri və dərsləri tapa bilərsiniz.

Addım 1: Lazım olan hissələr

Bu layihə üçün yerin maqnit sahəsini ölçmək üçün yalnız bir Arduino Board və MEMS Magnetometerə ehtiyacınız olacaq. MC5883L 3 - Axis Magnetometer olan GY - 80 qırılma lövhəsindən istifadə edəcəyəm.

Layihə üçün mənbə koduna davam etməzdən əvvəl MEMS maqnitometrinin necə işlədiyini və I2C Rabitə vasitəsi ilə GY - 80 qırılma lövhəsini necə bağlayacağınızı və istifadə edəcəyinizi daha ətraflı öyrənmək istəyirsinizsə, bunun üçün xüsusi dərslərimi yoxlaya bilərsiniz.

Addım 2: Arduino Mənbə Kodu

Əvvəlcə etməmiz lazım olan məlumatları maqnitometrdən oxuyacaq və onu Processing IDE -ə göndərəcək Arduino Board -a bir eskiz yükləməkdir. Budur Arduino Mənbə Kodu:

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

#daxil edin // I2C Arduino Kitabxanası

#define maqnitölçən_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, headingFiltered, meyl;

float Xm, Ym, Zm;

#define Magnetometer 0x1E // HMC5883 I2C 7bit ünvanı

boş quraşdırma () {

// Serial və I2C əlaqələrini işə salın Serial.begin (115200); Wire.begin (); gecikmə (100); Tel.beginTransmission (Magnetometer); Wire.write (0x02); // Wire.write (0x00) rejim qeydini seçin; // Davamlı ölçmə rejimi Wire.endTransmission (); }

boşluq döngəsi () {

// ---- X-Axis Wire.beginTrmission (Magnetometer); // cihaza ötürmək Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // cihaza ötürmək Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y ekseni

Tel.beginTransmission (Maqnitometr); // cihaza ötürmək Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // cihaza ötürmək Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTrmission (Magnetometer); // cihaza ötürmək Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // cihaza ötürmək Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); əgər (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X Ekseni mX1 = mX1 << 8; mX_out = mX0+mX1; // Xam məlumatlar // Məlumat cədvəlindən: 0.92 mG/rəqəm Xm = mX_out*0.00092; // Gauss vahidi //* Yerin maqnit sahəsi 0,25 ilə 0,65 Gauss arasında dəyişir, buna görə də təxminən əldə etməyimiz lazım olan dəyərlərdir.

// ---- Y ekseni

mY1 = mY1 << 8; mY_out = mY0+mY1; Ym = mY_out*0.00092;

// ---- Z oxu

mZ1 = mZ1 <0.073 rad sapması = 0.073; başlıq += meyl; // (<0 başlığı) başlığı += 2*PI olduqda işarələrə hörmət edildikdə düzəltmə;

// Açılma bucağının əlavə edilməsi səbəbindən düzəltmə

əgər (başlıq> 2*PI) başlıq -= 2*PI;

headingDegrees = başlıq * 180/PI; // Dərəcələr vahidində başlıq

// Çıxış bucağını hamarlaşdırmaq / Aşağı keçid filtri

headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;

// Başlıq dəyərini Serial Port vasitəsilə IDE -nin İşlənməsinə göndərmək

Serial.println (başlıqFiltered);

gecikmə (50); }

Addım 3: IDE Mənbə Kodunun İşlənməsi

Əvvəlki Arduino eskizini yüklədikdən sonra məlumatları Processing IDE -ə almalı və Digital Compass çəkməliyik. Pusula arxa plan şəklindən, oxun sabit görüntüsündən və kompasın gövdəsinin fırlanan görüntüsündən ibarətdir. Beləliklə, Arduino ilə hesablanan yer maqnit sahəsinin dəyərləri pusulanı döndərmək üçün istifadə olunur.

İşlənmə IDE -nin mənbə kodu budur:

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

Serial myPort;

PImage imgCompass; PImage imgCompassArrow; Şəkil fonu;

String məlumatları = "";

üzən başlıq;

boş quraşdırma () {

ölçü (1920, 1080, P3D); hamar (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = yeni Serial (bu, "COM4", 115200); // seriyalı ünsiyyətə başlayır myPort.bufferUntil ('\ n'); }

boş çəkmə () {

şəkil (arxa plan, 0, 0); // Arka plan görüntüsünü yükləyir pushMatrix (); tərcümə (eni/2, hündürlüyü/2, 0); // Koordinat sistemini ekranın mərkəzinə çevirir, beləliklə fırlanma tam mərkəzdə olur rotateZ (radian (-başlıq)); // Pusulanı Z -Axis görüntüsünün ətrafında döndürür (imgCompass, -960, -540); // Pusula görüntüsünü yükləyir və koordinat sistemi köçürüldükdə, görüntünü -960x, -540y (ekran ölçüsünün yarısı) olaraq təyin etməliyik popMatrix (); // Koordinat sistemini əvvəlki vəziyyətinə qaytarır 0, 0, 0 görüntü (imgCompassArrow, 0, 0); // popMatrix () funksiyası textSize (30) səbəbindən rotateZ () funksiyasından təsirlənməyən CompassArrow görüntüsünü yükləyir; mətn ("Başlıq:" + başlıq, 40, 40); // Ekranda başlığın dəyərini yazır

gecikmə (40);

}

// Serial Limandan məlumatları oxumağa başlayır

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // məlumatları Serial Portdan oxuyur və String dəyişəninə daxil edir "data". başlıq = float (məlumatlar); // String dəyərini Float dəyərinə çevirmək}

Ümid edirəm bu layihəni bəyənəcəksiniz. Əgər belədirsə, daha gözəl layihələr üçün veb saytımı da ziyarət edə bilərsiniz.

Tövsiyə: