Mündəricat:

Arduino və MPU6050 əsaslı rəqəmsal ruh səviyyəsi: 3 addım
Arduino və MPU6050 əsaslı rəqəmsal ruh səviyyəsi: 3 addım

Video: Arduino və MPU6050 əsaslı rəqəmsal ruh səviyyəsi: 3 addım

Video: Arduino və MPU6050 əsaslı rəqəmsal ruh səviyyəsi: 3 addım
Video: Microbit ile Sayaç programı yaptık. [ Maker Kalesi ] 2024, Noyabr
Anonim
Image
Image
Dövrə
Dövrə

İlk təlimatçılığa xoş gəldiniz! Ümid edirəm məlumatlandırıcı tapacaqsınız. Zəhmət olmasa müsbət və ya mənfi rəy yazmaqdan çekinmeyin.

Bu layihə arduino və MPU6050 əsaslı rəqəmsal ruh səviyyəsi yaratmaqdır. Bitmiş dizayn və kod mənim olmasına baxmayaraq, orijinal konsepsiya və işlədiyim kodun çoxu deyil. Mən plagiatla məşğul deyiləm, buna görə də fikirlərimi qurduğum insanlara kredit verməkdən çox məmnunam. Qışqırmaq istədiyim 2 əsas insan YouTuber Paul McWhorter və DroneBot Atölyesidir. Onlara bağlantıları youtube faydalı bağlantılarım PDF -yə daxil edirəm. EEEnthusiast -a MPU6050 -dən istifadə etməklə bağlı xarici video kitabçası olmadan modulun qurulması və oxunması da daxil olmaqla məlumatlandırıcı videosuna görə təşəkkür edirik (linki eyni PDF -dədir).

İstehsal etdiyim layihə 'olduğu kimi' işləyir və çox dəqiqdir, əlbəttə ki, hər iki istiqamətdə 45% -ə qədər. Tam olaraq dizayn etdiyim kimi istifadə edə bilərsiniz və ya öz zövqünüzə uyğunlaşdıra bilərsiniz. Layihəmin DroneBot atelyesinin istehsal etdiyi layihə ilə demək olar ki, eyni olduğunu fərq edərsən, amma əmin ol ki, xüsusən bucaqların hesablanması kodu ilə yanaşı kalibrləmə dəyərlərini saxlama qurğusuna gəldikdə də ciddi fərqlər var. Eeprom!

İştahınızı açan bəzi xüsusiyyətlər:

Pitch and roll açıları bir dərəcə 0.1 -ə qədər mövcuddur.

Gyro vahidinin istiqamətinin avtomatik aşkarlanması (üfüqi və ya şaquli)

Nəticələri olan tam kalibrləmə avtomatik olaraq eepromda saxlanılır

LED göstəricisi -2 ilə +2 dərəcə (kodda dəyişdirilə bilər)

Səviyənin əlavə səsli göstəricisi (dərhal açıla/söndürülə bilər)

Minimum komponent tələb edən kompakt əyri

Gəlin başlayaq.

Təchizat

Bu layihə (olduğu kimi) aşağıdakı maddələrdən istifadə edir:

1 x Arduino nano (mənimki klondur)

1 x MPU6050 girro/akselerometr modulu

1 x LCD - 16 x 2 + I2C bağlantısı

1 x keçid etmək üçün basın

1 x Piezo siqnalı

1 x Yaşıl LED

2 x Sarı LED

2 x Qırmızı LED

5 x 220 ohm rezistorlar

Müxtəlif keçid kabelləri

Çörək lövhəsi

Enerji təchizatı (mənim kompüterimə qoşulmadıqda 5v USB güc bankı istifadə edirdim, ancaq müvafiq olaraq bağlı bir batareyadan istifadə edə bilərsiniz)

Addım 1: Dövrə

Dövrə
Dövrə
Dövrə
Dövrə

Bütün komponentlərə sahib olduğunuzu düşünürsünüzsə, çörək taxtasını düzəltməlisiniz.

Quruluşumu bələdçi olaraq göstərirəm, ancaq əlaqələr aşağıdakı kimidir:

Arduino pin D2 təkan açarının 1 tərəfinə bağlanır. İtmə açarının digər tərəfi yerə bağlanır

Arduino pin D3, 220 ohm rezistorun 1 tərəfinə bağlanır. Rezistorun digər tərəfi Qırmızı LED anoduna bağlanır. Qırmızı LED -in katodu yerə düşür.

Arduino pin D4, 220 ohm rezistorun 1 tərəfinə bağlanır. Rezistorun digər tərəfi Sarı LED anoduna bağlanır. Sarı LED -in katodu yerə düşür.

Arduino pin D5, 220 ohm rezistorun 1 tərəfinə bağlanır. Rezistorun digər tərəfi Yaşıl LED anoduna bağlanır. Yaşıl LED -in katodu yerə gedir.

Arduino pin D6, 220 ohm rezistorun 1 tərəfinə bağlanır. Rezistorun digər tərəfi Sarı LED anoduna bağlanır. Sarı LED -in katodu yerə düşür.

Arduino pin D7, 220 ohm rezistorun 1 tərəfinə bağlanır. Rezistorun digər tərəfi Qırmızı LED anoduna bağlanır. Qırmızı LED katodu yerə düşür.

Arduino pin D8, Piezo siqnalının bir tərəfinə bağlanır. Siqnalın digər tərəfi yerə bağlanır.

Arduino pin A4, MPU6050 və LCD -də SDA pinlərinə bağlanır.

Arduino pin A5, MPU6050 və LCD üzərindəki SCL pinlərinə bağlanır

MPU6050 və LCD üçün 5v güc və Gnd sırasıyla Arduino Nano 5v və GND pinlərindən gəlir.

Tamamlandıqdan sonra göstərilən quruluşa bənzəməlidir. Hərəkətini dayandırmaq üçün MPU6050 -nin altına blu tak qoydum və çörək taxtasının kənarında saxlamaq üçün LCD -də.

Addım 2: Kod

Əlavə edilmiş kod, bu layihə üçün istifadə etdiyim koddur. Problemi ola biləcək yeganə kitabxana

LiquidCrystal_I2C.h kitabxanası, ilk dəfə LCD -lərlə işə başladığım zaman bunu idxal etdim. Təəssüf ki, eyni #include ifadəsini istifadə edən, lakin bir qədər fərqlənən bir neçə kitabxana var. Sizinlə bağlı problemləriniz varsa, sizin üçün işləyən başqa bir LCD kodu tapın və kodu müvafiq olaraq dəyişdirin. Yalnız fərqli bir quruluş ola bilər. Bütün 'çap' əmrləri eyni şəkildə işləməlidir.

Bütün kodlar şərh edildi və düzgün etdiyimi güman etsəm, hər şeyi izah edən bir video da olacaq, amma burada bir neçə məqamı qeyd etmək lazımdır:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Yuxarıdakı kod mənim LCD -nin qurulmasıdır. Kitabxananız fərqlidirsə, təkcə kitabxananızı deyil, həm də bu xətti dəyişdirməlisiniz.

{lcd.setCursor (0, 1); lcd.print ("Üfüqi!"); oriyentasiya = YATAY; // MPU-6050-dən xam acc və gyro məlumatlarını 1000 dəfə oxuyun (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // gyro x ofsetini gyro_x_cal dəyişəninə əlavə edin gyro_x_cal += gyro_x; // gyro y ofsetini gyro_y_cal dəyişəninə əlavə edin gyro_y_cal += gyro_y; // gyro_z_cal dəyişəninə gyro z ofsetini əlavə edin gyro_z_cal += gyro_z; // acc xx ofsetini acc_x_cal dəyişəninə əlavə edin acc_x_cal += acc_x; // acc_y_cal dəyişəninə acc_y_cal += acc_y; } // Ortalama ofset almaq üçün bütün nəticələri 1000 -ə bölün gyro_x_cal /= 1000.0; 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 += ölçüsü (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += ölçüsü (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += ölçüsü (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += ölçüsü (float); EEPROM.put (eeprom_adress, acc_y_cal); eeprom_address += ölçüsü (float); // Qeyd edək ki, cazibə qüvvəsinə görə acc_z üçün ofset saxlamırıq! gecikmə (500); }

Yuxarıdakı kod bloku kalibrləmə rejimini yerinə yetirir. Bu kod üfüqi kalibrləmə üçündür. Şaquli kalibrləmə üçün təxminən eyni kod var (qeyd edin, MPU6050 -nin üfüqi və ya şaquli olaraq quraşdırıldığını kod bilir!). MPU6050, 1000 dəfə oxunur. müvafiq dəyərlər məcmu olaraq əlavə edilir və sonra 1000 -ə bölünərək ortalama 'ofset' dəyəri verilir. Bu dəyərlər daha sonra Nano eepromda saxlanılır. Bütün üfüqi kalibrləmə dəyərləri 0 eeprom ünvanından başlayaraq saxlanılır. Bütün şaquli dəyərlər eeprom 24 ünvanında əvvəldən saxlanılır. Kalibrləmə tamamilə düz bir səthdə aparılmalıdır, əks halda heç bir şey demək deyil.

/ * * Növbəti bir neçə sətir, xam məlumatları LCD və LED -lərə çıxarıla bilən bucaqlara çevirmək üçün işlədir. * Sürətləndirmə məlumatlarının bölündüyü 4096 dəyəri, MPU6050 məlumat cədvəlindən alınır və nümunə nisbətinə əsaslanır. * 9.8 dəyəri cazibə qüvvəsidir * Atan2 funksiyası riyaziyyat modulundandır və verilən məlumatlardan açıları hesablamaq üçün istifadə olunur */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Xam məlumatlar phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Xam məlumatlar dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Bu bölmə, sistemin daha həssas olmasını təmin etmək üçün cayro məlumatlarından istifadə edir * cayro məlumatlarının bölündüyü 65.5 dəyəri MPU6050 məlumat cədvəlindən alınmışdır və nümunə nisbətinə əsaslanır */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + tetaM*.04; // Aşağı keçid filtri phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Aşağı keçid filtri

Yuxarıdakı kod bucaqları hesablayan şeydir. Ümid edirik ki, şərhlər bunun necə işlədiyinə dair bir az fikir verir, lakin dərindən izah etmək üçün əlavə edilmiş PDF -də əlaqəli Paul McWhorters videosuna baxın. Nə deyəcəyəmsə, cayro və Akselerometr üçün nümunə nisbətini dəyişdirə bilərsiniz (bu, kodumun altındakı MPU6050 quraşdırma alt proqramında edilir). Nümunə nisbətini dəyişdirsəniz, xam məlumatların nə qədər bölündüyünü də dəyişdirməlisiniz. Akselerometr məlumatları üçün cari dəyər 4096 -dır. Gyro üçün cari dəyər 65.5 -dir.

Nümunə götürmə və ofset dəyərlərinin necə tapıldığı haqqında daha ətraflı məlumat üçün əlavə edilmiş məlumat vərəqlərinə və EEEntusiast tərəfindən hazırlanmış videoya (əlavə edilmiş PDF -də bağlantı) baxın.

Addım 3: Növbəti addımlar

Bu nöqtədə inşallah bu layihəni həyata keçirəcəyik, amma indi nə?

Birincisi, niyə əslində istifadə edə biləcəyiniz bir ruh səviyyəsinə qurmursunuz. Uyğunlaşdıra biləcəyiniz ucuz bir ruh səviyyəsi satın ala bilərsiniz (qutunun növü olduğundan əmin olun) və ya dəstiniz varsa, öz səviyyənizi/qutunuzu çap edin.

Bir dərəcədən digərinə nisbətən daha yaxşı işlədiklərini görmək üçün, ehtimal ki, cayro və akselerometr nümunələri ilə oynaya bilərsiniz.

Kodu daha da təkmilləşdirməyə çalışın. Məsələn, hazırda 45 dərəcədən yuxarıda göstərilən bucaq ən azından kobuddur. Bunun bir yolu varmı?

Suallarınız varsa, nə qədər sadə görünsələr də, soruşun. Kömək edə bilsəm, kömək edərəm.

Bu təlimatı bəyənirsinizsə, zəhmət olmasa bəyənin ki, biləsiniz.

Bunu edirsinizsə, mənə göstərin (xüsusən işlək vəziyyətdədirsə).

ÇOX SAĞ OL

Tövsiyə: