Mundarija:

Arduino raqamli kompas loyihasi: 3 qadam
Arduino raqamli kompas loyihasi: 3 qadam

Video: Arduino raqamli kompas loyihasi: 3 qadam

Video: Arduino raqamli kompas loyihasi: 3 qadam
Video: Internet marketing bo'yicha | Meet up Shohijahon Dadaboyev 2024, Noyabr
Anonim
Image
Image

Salom! Bu yo'riqnomada siz Arduino va Processing IDE yordamida raqamli kompas yasashni ko'rasiz. Bu juda oddiy, ammo qiziqarli va ajoyib ko'rinadigan Arduino loyihasi.

Siz yuqoridagi videodan ushbu darslikning demo misolini ko'rishingiz mumkin. Siz har doim mening YouTube kanalimda shunga o'xshash qiziqarli videolarni topishingiz mumkin, shuningdek, HowToMechatronics.com veb -saytida ko'plab elektronika loyihalari va qo'llanmalarini topishingiz mumkin.

1 -qadam: kerakli qismlar

Loyihani amalga oshirish uchun sizga er magnit maydonini o'lchash uchun Arduino platasi va MEMS magnitometri kerak bo'ladi. Men MC5883L 3 - eksa magnitometrini o'z ichiga olgan GY - 80 kesish taxtasidan foydalanaman.

Loyihaning manba kodini davom ettirishdan oldin, agar sizga MEMS magnitometrining qanday ishlashini, shuningdek G2 - 80 aloqa panelini I2C aloqasi orqali ulash va undan foydalanish haqida batafsil ma'lumot kerak bo'lsa, buning uchun mening maxsus darsliklarimni tekshirishingiz mumkin.

2 -qadam: Arduino manba kodi

Biz birinchi navbatda Arduino kartasiga eskizni yuklashimiz kerak, u magnitometrdan ma'lumotlarni o'qiydi va uni Processing IDE ga yuboradi. Bu erda Arduino manba kodi:

/ * Arduino kompas * * Dejan Nedelkovskiy, * www. HowToMechatronics.com * */

#qo'shing // I2C Arduino kutubxonasi

#magnitometr_mX0 0x03 ni aniqlang

#aniq magnitometr_mX1 0x04 #aniq magnitometr_mZ0 0x05 #aniq magnitometr_mZ1 0x06 #aniq magnitometr_mY0 0x07 #aniq magnitometr_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

float heading, headingDegrees, headFiltered, moyillik;

suzuvchi Xm, Ym, Zm;

#define magnitometr 0x1E // HMC5883 I2C 7bit manzili

bo'sh o'rnatish () {

// Serial.begin va Serial va I2C aloqalarini ishga tushiring (115200); Wire.begin (); kechikish (100); Wire.beginTransmission (magnitometr); Wire.write (0x02); // Wire.write rejim registrini tanlang (0x00); // Doimiy o'lchash rejimi Wire.endTransmission (); }

void loop () {

// ---- X o'qi simlari.beginTransmission (magnitometr); // Wire.write (Magnetometer_mX1) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnitometr); // Wire.write (Magnetometer_mX0) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y o'qi

Wire.beginTransmission (magnitometr); // Wire.write (Magnetometer_mY1) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnitometr); // Wire.write (Magnetometer_mY0) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z o'qi simlari.beginTransmission (magnitometr); // Wire.write (Magnetometer_mZ1) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnitometr); // Wire.write (Magnetometer_mZ0) qurilmasiga uzatish; Wire.endTransmission (); Wire.requestFrom (Magnetometr, 1); agar (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X o'qi mX1 = mX1 << 8; mX_out = mX0+mX1; // Xom ma'lumotlar // Ma'lumotlar varag'idan: 0,92 mG/raqamli Xm = mX_out*0,00092; // Gauss birligi //* Er magnit maydoni 0,25 dan 0,65 Gaussgacha, shuning uchun bu qiymatlarni biz taxminan olishimiz kerak.

// ---- Y o'qi

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

// ---- Z o'qi

mZ1 = mZ1 <0,073 rad og'ish = 0,073; sarlavha += burilish; // Belgilar qaytarilganda tuzatish, agar (<0 sarlavhasi) sarlavhasi += 2*PI bo'lsa;

// Burilish burchagi qo'shilishi tufayli tuzatish

agar (sarlavha> 2*PI) sarlavha -= 2*PI;

headingDegrees = sarlavha * 180/PI; // Darajalar birligi sarlavhasi

// Chiqish burchagini tekislash / Past o'tish filtri

headFiltered = headingFiltered*0,85 + headingDegrees*0.15;

// Sarlavha qiymatini ketma -ket port orqali Processing IDE -ga yuborish

Serial.println (sarlavhaFiltrlangan);

kechikish (50); }

3 -qadam: IDE manba kodini qayta ishlash

Oldingi Arduino eskizini yuklaganimizdan so'ng, ma'lumotlarni Processing IDE -ga olishimiz va raqamli kompasni chizishimiz kerak. Kompas fon rasmi, o'qning sobit tasviri va kompas tanasining aylanadigan tasviridan iborat. Shunday qilib, Arduino bilan hisoblangan er magnit maydonining qiymatlari kompasni aylantirish uchun ishlatiladi.

Bu erda Processing IDE kodi:

/ * Arduino Compass * * Dejan Nedelkovskiy, * www. HowToMechatronics.com * */ import ishlov berish.serial. *; java.awt.event. KeyEvent -ni import qilish; java.io. IOException ni import qilish;

Seriyali myPort;

ImgCompass tasviri; PImage imgCompassArrow; PI tasvir fon;

String ma'lumotlari = "";

suzuvchi sarlavha;

bo'sh o'rnatish () {

hajmi (1920, 1080, P3D); silliq (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); fon = loadImage ("Background.png"); myPort = yangi seriyali (bu, "COM4", 115200); // myPort.bufferUntil ('\ n') ketma -ket aloqasini boshlaydi; }

bekor chizish () {

rasm (fon, 0, 0); // Fon tasvirini yuklaydi pushMatrix (); tarjima qilish (kenglik/2, balandlik/2, 0); // Koordinatalar tizimini ekranning markaziga aylantiradi, shunda aylanish aylananing markazida aylanadi Z (radian (-sarlavha)); // Kompasni Z -o'qi atrofida aylantiradi (imgCompass, -960, -540); // Kompas tasvirini yuklaydi va koordinatali tizim boshqa joyga ko'chirilganda, biz tasvirni -960x, -540y (ekran o'lchamining yarmi) ga o'rnatishimiz kerak popMatrix (); // Koordinatali tizimni asl holatiga qaytaradi 0, 0, 0 tasvir (imgCompassArrow, 0, 0); // popMatrix () funktsiyasi textSize (30) tufayli rotateZ () funktsiyasiga ta'sir qilmaydigan CompassArrow tasvirini yuklaydi; matn ("Sarlavha:" + sarlavha, 40, 40); // Ekranda sarlavha qiymatini chop etadi

kechikish (40);

}

// ketma -ket portdan ma'lumotlarni o'qishni boshlaydi

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // ma'lumotlarni ketma -ket portdan o'qiydi va uni "ma'lumotlar" satrining o'zgaruvchisiga qo'yadi. sarlavha = float (ma'lumotlar); // String qiymatini Float qiymatiga aylantirish}

Umid qilamanki, sizga bu loyiha yoqadi. Agar shunday bo'lsa, siz boshqa ajoyib loyihalar uchun mening veb -saytimga tashrif buyurishingiz mumkin.

Tavsiya: