Mundarija:

Arduino va MPU6050 asosidagi raqamli ruh darajasi: 3 qadam
Arduino va MPU6050 asosidagi raqamli ruh darajasi: 3 qadam

Video: Arduino va MPU6050 asosidagi raqamli ruh darajasi: 3 qadam

Video: Arduino va MPU6050 asosidagi raqamli ruh darajasi: 3 qadam
Video: Robojax Arduino Step By Step Course, Lesson 14: Using Vibration Sensor Module 2024, Noyabr
Anonim
Image
Image
O'chirish davri
O'chirish davri

Mening birinchi o'qituvchimga xush kelibsiz! Umid qilamanki, bu sizga ma'lumot beradi. Iltimos, ijobiy yoki salbiy fikr -mulohazalaringizni qoldiring.

Bu loyiha arduino va MPU6050 asosidagi raqamli ruhiy darajani yaratishdir. Tayyor dizayn va kod meniki bo'lsa -da, men ishlagan kodning asosiy tushunchasi emas. Men plagiat bilan shug'ullanmayman, shuning uchun men o'z fikrlarimni asoslaganlarga minnatdorchilik bildirishdan xursandman. Men baqirishni istagan 2 asosiy odam bu YouTuberning Pol Makvorter va DroneBot ustaxonasi. Men ularga havolalarni youtube -dagi foydali havolalar PDF -ga qo'shaman. EEEnthusiast -ga, shuningdek, tashqi kutubxonasiz modulni sozlash va o'qishni o'z ichiga olgan MPU6050 -dan foydalanish haqidagi ma'lumotli video uchun rahmat (uning havolasi bir xil PDF -da).

Men ishlab chiqargan loyiha "xuddi shunday" ishlaydi va juda aniq, albatta har ikki yo'nalishda ham 45% gacha. Siz uni men yaratganimdek ishlatishingiz yoki o'zingizning didingizga moslashtirishingiz mumkin. Qanchalik aqlli bo'lsangiz, mening loyiham DroneBot ustaxonasi ishlab chiqargan loyihaga deyarli o'xshaydi, lekin ishonch hosil qiling, sezilarli farqlar bor, ayniqsa burchaklarni hisoblash kodi va kalibrlash qiymatlarini saqlash moslamasi haqida. Eeprom!

Sizning ishtahangizni ochadigan ba'zi xususiyatlar:

Burilish burchagi 0,1 darajagacha.

Jiroskopning yo'nalishini avtomatik aniqlash (gorizontal yoki vertikal)

To'liq kalibrlash natijalari avtomatik ravishda eepromda saqlanadi

LED ko'rsatkichi -2 dan +2 darajagacha (kodda o'zgarishi mumkin)

Darajaning qo'shimcha ovozli ko'rsatgichi (tezda yoqish/o'chirish mumkin)

Minimal komponentlarni talab qiladigan ixcham krujka

Qani boshladik.

Ta'minotlar

Ushbu loyiha (xuddi shunday) quyidagi elementlardan foydalanadi:

1 x Arduino nano (meniki - bu klon)

1 x MPU6050 girro/akselerometr moduli

1 x LCD - 16 x 2 + I2C ulanishi

1 x O'zgartirish uchun bosing

1 x piezo signalli signal

1 x yashil LED

2 x sariq LED

2 x qizil LED

5 x 220 ohmli rezistorlar

Har xil o'tish kabellari

Non paneli

Quvvat manbai (mening kompyuterimga ulanmagan bo'lsa, 5v USB quvvat banki ishlatilgan, lekin siz batareyani to'g'ri ulangan holda ishlatishingiz mumkin)

1 -qadam: O'chirish davri

O'chirish davri
O'chirish davri
O'chirish davri
O'chirish davri

Agar sizda barcha komponentlar mavjud bo'lsa, siz non taxtangizni qurishingiz kerak bo'ladi.

Men sozlashimni ko'rsatma sifatida ko'rsataman, lekin ulanishlar quyidagicha:

Arduino pin D2 tugmachaning 1 tomoniga ulanadi. Bosish tugmachasining boshqa tomoni erga ulanadi

Arduino pin D3 220 ohmli rezistorning bir tomoniga ulanadi. Rezistorning boshqa tomoni qizil LEDli anodga ulanadi. Qizil LEDning katodi erga tushadi.

Arduino pin D4 220 ohmli rezistorning bir tomoniga ulanadi. Rezistorning boshqa tomoni sariq LEDli anodga ulanadi. Sariq LEDning katodi erga tushadi.

Arduino pin D5 220 ohmli rezistorning bir tomoniga ulanadi. Rezistorning boshqa tomoni Yashil LED anodiga ulanadi. Yashil LEDning katodi erga tushadi.

Arduino pin D6 220 ohmli rezistorning 1 tomoniga ulanadi. Rezistorning boshqa tomoni sariq LEDli anodga ulanadi. Sariq LEDning katodi erga tushadi.

Arduino pin D7 220 ohmli rezistorning bir tomoniga ulanadi. Rezistorning boshqa tomoni qizil LEDli anodga ulanadi. Qizil LEDning katodi erga tushadi.

Arduino pin D8 Piezo signalining bir tomoniga ulanadi. Buzzerning boshqa tomoni erga ulanadi.

Arduino pin A4, MPU6050 VA LCD displeyidagi SDA pinlariga ulanadi.

Arduino pin A5 MPU6050 VA LCD displeyidagi SCL pinlariga ulanadi

MPU6050 va LCD uchun 5v quvvat va Gnd mos ravishda Arduino Nano 5v va GND pinlaridan keladi.

Tugallangach, u men ko'rsatgan sozlamalarga o'xshash bo'lishi kerak. Men blu -takni MPU6050 ostiga qo'ydim, uning harakatini to'xtatish uchun, shuningdek, uni taxtaning chetida ushlab turish uchun LCD displeyda.

2 -qadam: Kod

Qo'shilgan kod - bu loyiha uchun ishlatgan kodim. Sizda muammo bo'lishi mumkin bo'lgan yagona kutubxona bu

LiquidCrystal_I2C.h kutubxonasi, chunki men LCD displey bilan ishlay boshlaganimda, buni import qildim. Afsuski, bir xil #include iborasini ishlatadigan, lekin biroz boshqacha bo'lgan kutubxonalar bor. Agar sizda muammolar bo'lsa, sizga mos keladigan boshqa LCD kodini toping va shunga mos ravishda kodni o'zgartiring. Bu faqat farq qiladigan sozlash bo'lishi mumkin. Barcha "chop etish" buyruqlari bir xil ishlashi kerak.

Barcha kodlarga izoh berildi va men buni to'g'ri qildim deb faraz qilsam, hamma narsa tushuntirilgan video ham bo'ladi, lekin bu erda e'tiborga olish kerak bo'lgan bir nechta fikrlar:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Yuqoridagi kod - bu mening LCD displeyim uchun sozlash. Agar kutubxonangiz boshqacha bo'lsa, siz nafaqat kutubxonangizni, balki bu qatorni ham o'zgartirishingiz kerak bo'ladi.

{lcd.setCursor (0, 1); lcd.print ("Gorizontal!"); yo'nalish = HORIZONTAL; // (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data () uchun MPU-6050 dan 1000 marta acc va gyro ma'lumotlarini o'qing; // gyro_x_cal o'zgaruvchiga gyro x ofsetini qo'shing gyro_x_cal += gyro_x; // gyro_y_cal o'zgaruvchiga gyro y ofsetini qo'shing gyro_y_cal += gyro_y; // gyro_z_cal o'zgaruvchisiga gyro z ofsetini qo'shing gyro_z_cal += gyro_z; // acc_x_cal o'zgaruvchisiga acc x ofsetini qo'shing acc_x_cal += acc_x; // acc_y_cal o'zgaruvchisiga acc y ofsetini qo'shing acc_y_cal += acc_y; } // O'rtacha ofset gyro_x_cal /= 1000.0 olish uchun barcha natijalarni 1000 ga bo'ling. gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizonalCalibration); eeprom_address += sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += hajmi (float); EEPROM.put (eeprom_adress, gyro_y_cal); eeprom_address += hajmi (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += hajmi (float); EEPROM.put (eeprom_adress, acc_x_cal); eeprom_address += hajmi (float); EEPROM.put (eeprom_adress, acc_y_cal); eeprom_address += hajmi (float); // E'tibor bering, biz tortishish kuchi tufayli acc_z uchun ofset saqlamaymiz! kechikish (500); }

Yuqoridagi kod bloki kalibrlash tartibini bajaradi. Bu kod gorizontal kalibrlash uchun. Vertikal kalibrlash uchun deyarli bir xil kod mavjud (e'tibor bering, sizning MPU6050 gorizontal yoki vertikal o'rnatilganligini kod biladi!). MPU6050 1000 marta o'qiladi. O'rtacha "ofset" qiymatini berish uchun tegishli qiymatlar to'planib, keyin 1000 ga bo'linadi. Bu qiymatlar keyinchalik Nano eepromda saqlanadi. Barcha gorizontal kalibrlash qiymatlari 0 eeprom manzilidan boshlab saqlanadi. Barcha vertikal qiymatlar eeprom 24 manzilida saqlanadi. Kalibrlash mutlaqo tekis yuzada bajarilishi kerak, aks holda ular hech narsani anglatmaydi.

/ * * Keyingi qatorlar xom ma'lumotlarni qayta ishlaydilar, ularni LCD va LEDlarga chiqariladigan burchaklarga o'zgartiradilar. * Tezlashtirish ma'lumotlari bo'linadigan 4096 qiymati MPU6050 ma'lumotlar jadvalidan olingan va namuna tezligiga asoslangan. * 9,8 qiymati-tortishish kuchi /2/3.141592656 * 360; // Xom ma'lumotlar phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Xom ma'lumotlar dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Bu bo'limda tizimning sezgirligini oshirish uchun gyro ma'lumotlari ishlatiladi * 65.5 qiymati, unga ko'ra girro ma'lumotlari MPU6050 ma'lumotlar jadvalidan olingan va namuna tezligiga asoslangan */ teta = (teta+(gyro_y/ 65.5)*dt)*. 96 + tetaM*.04; // Past o'tish filtri phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Past o'tish filtri

Yuqoridagi kod burchaklarni hisoblaydigan narsadir. Umid qilamanki, sharhlar uning qanday ishlashi haqida bir oz tushuncha beradi, lekin chuqur tushuntirish uchun, ilova qilingan PDF -da bog'langan Pol Makvorterning videosini ko'rib chiqing. Men aytmoqchi bo'lgan narsa shundaki, siz gyro va akselerometr uchun namuna olish tezligini o'zgartirishingiz mumkin (bu mening kodim ostidagi MPU6050 subroutine dasturida amalga oshiriladi). Agar siz namuna olish tezligini o'zgartirsangiz, siz ham ma'lumotlarning qancha bo'linishini o'zgartirishingiz kerak. Akselerometr ma'lumotlari uchun joriy qiymat 4096. Gyro uchun joriy qiymat 65,5.

Namuna olish va ofset qiymatlari qanday topilgani haqida batafsil ma'lumot olish uchun biriktirilgan ma'lumotlar varaqlari va EEEntusiast videolari (biriktirilgan PDF havolasi) ga qarang.

3 -qadam: Keyingi qadamlar

Umid qilamanki, shu paytgacha bu loyihani amalga oshirgan bo'lar edik, lekin hozir nima?

Birinchidan, nima uchun siz uni ruhiy darajaga qura olmaysiz? Siz moslashtira oladigan arzon ruhiy darajani sotib olishingiz mumkin (bu qutining turiga ishonch hosil qiling) yoki agar sizda to'plam bo'lsa, o'z darajangizni/qutisini chop eting.

Gyro va akselerometr namunalari bilan o'ynashingiz mumkin, chunki ular boshqasidan ko'ra yaxshiroq ishlayaptimi?

Kodni yanada aniqroq qilishga harakat qiling. Masalan, hozirda 45 gradusdan oshganda, aytilgan burchak, hech bo'lmaganda, qo'pol. Bunga yo'l bormi?

Agar sizda biron bir savol bo'lsa, ular qanchalik sodda ko'rinmasin, iltimos so'rang. Agar men yordam bera olsam, yordam beraman.

Agar sizga bu ko'rsatma yoqqan bo'lsa, iltimos, like qilib qo'ying, shunda men bilaman.

Agar buni qilsangiz, iltimos, menga ko'rsating (ayniqsa, u ishchi holatda bo'lsa).

RAHMAT

Tavsiya: