İçindekiler:

Arduino Dijital Pusula Projesi: 3 Adım
Arduino Dijital Pusula Projesi: 3 Adım

Video: Arduino Dijital Pusula Projesi: 3 Adım

Video: Arduino Dijital Pusula Projesi: 3 Adım
Video: Arduino Dijital Metre Yapımı (16x2 LCD Ekran Kullanımı) 2024, Kasım
Anonim
Image
Image

Merhaba! Bu talimatta, Arduino ve İşleme IDE'sini kullanarak nasıl Dijital Pusula yapabileceğinizi göreceksiniz. Bu oldukça basit ama ilginç ve havalı görünen Arduino Projesi.

Bu eğitimin demo örneğini yukarıdaki videoda izleyebilirsiniz. YouTube kanalımda her zaman bunun gibi daha ilginç videolar bulabilir ve web sitem HowToMechatronics.com'da birçok elektronik proje ve öğretici bulabilirsiniz.

Adım 1: Gerekli Parçalar

Bu proje için, dünyanın manyetik alanını ölçmek için sadece bir Arduino Kartına ve bir MEMS Manyetometreye ihtiyacınız olacak. MC5883L 3 – Eksen Manyetometresini içeren GY – 80 devre kartını kullanacağım.

Projenin kaynak koduna devam etmeden önce MEMS manyetometresinin nasıl çalıştığı ve ayrıca GY - 80 devre kartının I2C İletişimi aracılığıyla nasıl bağlanıp kullanılacağı hakkında daha fazla ayrıntıya ihtiyacınız varsa, bunun için özel derslerime göz atabilirsiniz.

Adım 2: Arduino Kaynak Kodu

İlk yapmamız gereken şey, manyetometreden gelen verileri okuyacak ve onu Processing IDE'ye gönderecek olan Arduino Board'a bir kroki yüklemek. İşte Arduino Kaynak Kodu:

/* Arduino Pusulası * * Dejan Nedelkovski tarafından, * www. HowToMechatronics.com * */

#include //I2C Arduino Kütüphanesi

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

kayan yön, başlıkDereceler, başlıkFiltrelenmiş, sapma;

yüzer Xm, Ym, Zm;

#define Manyetometre 0x1E //I2C HMC5883'ün 7 bit adresi

geçersiz kurulum(){

//Seri ve I2C iletişimini başlat Serial.begin(115200); Wire.begin(); gecikme(100); Wire.beginTransmission(Manyetometre); Wire.write(0x02); // Modu seçin register Wire.write(0x00); // Sürekli ölçüm modu Wire.endTransmission(); }

boşluk döngüsü(){

//---- X-Axis Wire.beginTransmission(Magnetometer); // cihaza ilet Wire.write(Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mX0 = Wire.read(); } Wire.beginTransmission(Manyetometre); // cihaza ilet Wire.write(Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mX1 = Wire.read(); }

//---- Y Ekseni

Wire.beginTransmission(Manyetometre); // cihaza ilet Wire.write(Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mY0 = Wire.read(); } Wire.beginTransmission(Manyetometre); // cihaza ilet Wire.write(Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mY1 = Wire.read(); } //---- Z-Ekseni Kablosu.beginTransmission(Magnetometer); // cihaza ilet Wire.write(Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mZ0 = Wire.read(); } Wire.beginTransmission(Manyetometre); // cihaza ilet Wire.write(Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(Manyetometre, 1); if(Wire.available()<=1) { mZ1 = Wire.read(); } //---- X Ekseni mX1=mX1<<8; mX_out =mX0+mX1; // Ham veri // Veri sayfasından: 0.92 mG/digit Xm = mX_out*0.00092; // Gauss birimi //* Dünyanın manyetik alanı 0.25 ila 0.65 Gauss arasında değişir, yani bunlar yaklaşık olarak almamız gereken değerlerdir.

//---- Y Ekseni

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

//---- Z ekseni

mZ1=mZ1< 0.073 rad sapma = 0.073; başlık += sapma; // İşaretler ters çevrildiğinde düzeltiliyor if(heading <0) Heading += 2*PI;

// Sapma açısının eklenmesi nedeniyle düzeltme

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

başlıkDerece = başlık * 180/PI; // Derece birimindeki başlık

// Çıkış açısını yumuşatma / Alçak geçiren filtre

başlıkFiltrelenmiş = başlıkFiltrelenmiş*0.85 + başlıkDereceler*0.15;

// Başlık değerini Seri Port üzerinden Processing IDE'ye gönderme

Serial.println(başlıkFiltrelenmiş);

gecikme(50); }

Adım 3: IDE Kaynak Kodunun İşlenmesi

Önceki Arduino taslağını yükledikten sonra verileri Processing IDE'ye almamız ve Dijital Pusulayı çizmemiz gerekiyor. Pusula, bir arka plan görüntüsünden, okun sabit görüntüsünden ve pusula gövdesinin dönen bir görüntüsünden oluşur. Böylece Arduino ile hesaplanan dünya manyetik alanı değerleri pusulayı döndürmek için kullanılır.

İşte Processing IDE'nin kaynak kodu:

/* Arduino Pusulası * * Dejan Nedelkovski tarafından, * www. HowToMechatronics.com * */ import process.serial.*; java.awt.event. KeyEvent'i içe aktar; java.io. IOException'ı içe aktarın;

Seri myPort;

PImage imgCompass; PImage imgCompassArrow; PResim arka planı;

Dize verisi="";

yüzer başlık;

geçersiz kurulum() {

boyut (1920, 1080, P3D); düz(); imgCompass = loadImage("Compass.png"); imgCompassArrow = loadImage("CompassArrow.png"); arkaplan = loadImage("Arkaplan.png"); myPort = yeni Seri(bu, "COM4", 115200); // seri iletişimi başlatır myPort.bufferUntil('\n'); }

geçersiz beraberlik() {

resim(arka plan, 0, 0); // Arkaplan resmini yükler pushMatrix(); çevir(genişlik/2, yükseklik/2, 0); // Koordinat sistemini ekranın merkezine çevirir, böylece döndürme tam merkezde olur döndürmeZ(radyan(-başlık)); // Pusulayı Z - Ekseni görüntüsü etrafında döndürür(imgCompass, -960, -540); // Pusula görüntüsünü yükler ve koordinat sisteminin yeri değiştirildiği için görüntüyü -960x, -540y (ekran boyutunun yarısı) olarak ayarlamamız gerekir popMatrix(); // Koordinat sistemini orijinal konumuna geri getirir 0, 0, 0 image(imgCompassArrow, 0, 0); // popMatrix() işlevi textSize(30) nedeniyle döndürmeZ() işlevinden etkilenmeyen CompassArrow görüntüsünü yükler; text("Başlık: " + başlık, 40, 40); // Başlığın değerini ekrana yazdırır

gecikme(40);

}

// Seri Porttan veri okumaya başlar

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n');// Seri Bağlantı Noktasından verileri okur ve "data" String değişkenine koyar. başlık = kayan nokta(veri); // String değerini Float değerine dönüştürme }

Umarım bu projeyi beğenirsiniz. Eğer öyleyse, daha güzel projeler için web sitemi de ziyaret edebilirsiniz.

Önerilen: