İçindekiler:

Arduino ve MPU6050 Tabanlı Dijital Ruh Seviyesi: 3 Adım
Arduino ve MPU6050 Tabanlı Dijital Ruh Seviyesi: 3 Adım

Video: Arduino ve MPU6050 Tabanlı Dijital Ruh Seviyesi: 3 Adım

Video: Arduino ve MPU6050 Tabanlı Dijital Ruh Seviyesi: 3 Adım
Video: Bölüm 11 - Arduino Drone Uçuş Kontrol Yazılımı 2024, Kasım
Anonim
Image
Image
Devre
Devre

İlk öğretilebilirliğime hoş geldiniz! Umarım bilgilendirici bulursunuz. Lütfen olumlu veya olumsuz geri bildirim bırakmaktan çekinmeyin.

Bu proje, arduino ve MPU6050 tabanlı bir dijital su terazisi yapmaktır. Bitmiş tasarım ve kod bana ait olsa da, orijinal konsept ve üzerinde çalıştığım kodun çoğu bana ait değil. İntihal içinde değilim, bu yüzden fikirleri üzerine inşa ettiğim kişilere kredi vermekten çok mutluyum. Bağırmak istediğim 2 ana kişi YouTuber'ın Paul McWhorter ve DroneBot Workshop'u. Youtube faydalı linkler PDF'ime bunlara bağlantılar ekliyorum. Ayrıca, MPU6050'nin kurulumu ve modülünden harici bir kitaplık olmadan okuma dahil olmak üzere bilgilendirici videosu için EEEnthusiast'a teşekkür ederiz (bağlantısı aynı PDF'dedir).

Ürettiğim proje 'olduğu gibi' çalışıyor ve her iki yönde de kesinlikle %45'e varan doğrulukta. Tam benim tasarladığım gibi kullanabilir veya kendi zevkinize göre uyarlayabilirsiniz. Daha akıllıysanız, projemin DroneBot atölyesi tarafından üretilen projeyle neredeyse aynı göründüğünü fark edeceksiniz, ancak emin olun, özellikle açıları hesaplama koduna ve ayrıca kalibrasyon değerlerini depolama olanağına gelince önemli farklılıklar var. Eeprom!

İştahınızı açabilecek bazı özellikler:

Eğim ve yuvarlanma açıları 0,1 derece dahilinde mevcuttur.

Gyro biriminin yönünü otomatik algılama (yatay veya dikey)

Sonuçların otomatik olarak eeprom'a kaydedildiği tam kalibrasyon

-2 ila +2 derece arasında LED göstergesi (kodda değiştirilebilir)

Ek sesli seviye göstergesi (anında açılıp kapatılabilir)

Minimum bileşen gerektiren kompakt devre

Başlayalım.

Gereçler

Bu proje (olduğu gibi) aşağıdaki öğeleri kullanır:

1 x Arduino nano (benimki bir klon)

1 x MPU6050 cayro/ivmeölçer modülü

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

1 x Geçiş yapmak için itin

1 x Piezo zili

1 x Yeşil LED

2 x Sarı LED

2 x Kırmızı LED

5 x 220 ohm dirençler

Çeşitli atlama kabloları

ekmek tahtası

Güç kaynağı (benimki bilgisayarıma bağlı değilken 5v USB güç bankası kullandı, ancak uygun şekilde bağlanmış bir pil kullanabilirsiniz)

Adım 1: Devre

Devre
Devre
Devre
Devre

Tüm bileşenlere sahip olduğunuzu varsayarsak, breadboard'unuzu oluşturmanız gerekecektir.

Kurulumumu kılavuz olarak gösteriyorum ancak bağlantılar şu şekilde:

Arduino pin D2, basmalı anahtarın 1 tarafına bağlanır. Basmalı anahtarın diğer tarafı toprağa bağlanır

Arduino pin D3, 220 ohm direncin 1 tarafına bağlanır. Direncin diğer tarafı Kırmızı LED'in anoduna bağlanır. Kırmızı LED'in katodu toprağa gider.

Arduino pin D4, 220 ohm direncin 1 tarafına bağlanır. Direncin diğer tarafı Sarı LED'in anoduna bağlanır. Sarı LED'in katodu toprağa gider.

Arduino pin D5, 220 ohm direncin 1 tarafına bağlanır. Direncin diğer tarafı Yeşil LED'in anoduna bağlanır. Yeşil LED'in katodu toprağa gider.

Arduino pin D6, 220 ohm direncin 1 tarafına bağlanır. Direncin diğer tarafı Sarı LED'in anoduna bağlanır. Sarı LED'in katodu toprağa gider.

Arduino pin D7, 220 ohm direncin 1 tarafına bağlanır. Direncin diğer tarafı Kırmızı LED'in anoduna bağlanır. Kırmızı LED'in katodu toprağa gider.

Arduino pin D8, Piezo buzzer'ın bir tarafına bağlanır. Buzzer'ın diğer tarafı toprağa bağlanır.

Arduino pin A4, MPU6050 VE LCD üzerindeki SDA pinlerine bağlanır.

Arduino pin A5, MPU6050 VE LCD'deki SCL pinlerine bağlanır

MPU6050 ve LCD için 5v güç ve Gnd, sırasıyla Arduino Nano 5v ve GND pinlerinden gelir.

Tamamlandığında, gösterilen kurulumuma benzer olmalıdır. Blu tak'ı MPU6050'nin hareket etmesini durdurmak için altına ve ayrıca devre tahtasının kenarında tutmak için LCD'ye koydum.

2. Adım: Kod

Ekli kod, bu proje için kullandığım koddur. Sorun yaşayabileceğiniz tek kitaplık, LiquidCrystal_I2C.h kütüphanesi, LCD'lerle ilk çalışmaya başladığımda bunu içe aktardım. Ne yazık ki, aynı #include ifadesini kullanan ancak biraz farklı olan birkaç kitaplık var. Sizinkiyle ilgili sorunlarınız varsa, sizin için çalışan başka bir LCD kodu bulun ve kodu buna göre değiştirin. Sadece farklı olan kurulum olması muhtemeldir. Tüm 'yazdır' komutları aynı şekilde çalışmalıdır.

Tüm kodlar yorumlandı ve doğru yaptığımı varsayarsak, her şeyi açıklayan bir video da olacak, ancak burada dikkat edilmesi gereken birkaç nokta var:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Yukarıdaki kod, LCD'm için kurulum. Eğer kütüphaneniz farklı ise sadece kütüphanenizi değil bu satırı da değiştirmeniz gerekebilir.

{ lcd.setCursor(0, 1); lcd.print("Yatay!"); oryantasyon = YATAY; //MPU-6050'den ham acc ve gyro verilerini 1000 kez okuyun (int cal_int = 0; cal_int < 1000; cal_int ++) { read_mpu_6050_data(); //gyro_x_cal değişkenine gyro x ofsetini ekleyin gyro_x_cal += gyro_x; //gyro y ofsetini gyro_y_cal değişkenine gyro_y_cal += gyro_y; //gyro_z_cal değişkenine gyro z ofsetini ekleyin gyro_z_cal += gyro_z; //acc x ofsetini acc_x_cal değişkenine acc_x_cal += acc_x ekleyin; //acc y ofsetini acc_y_cal değişkenine acc_y_cal += acc_y ekleyin; } // Ortalama ofset değerini elde etmek için tüm sonuçları 1000'e 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; yatayKalibrasyon = 255; eeprom_adresi = 0; EEPROM.put(eeprom_address, horizonalCalibration); eeprom_address += sizeof(int); EEPROM.put(eeprom_adresi, gyro_x_cal); eeprom_address += sizeof(yüzer); EEPROM.put(eeprom_adresi, gyro_y_cal); eeprom_address += sizeof(yüzer); EEPROM.put(eeprom_adresi, gyro_z_cal); eeprom_address += sizeof(yüzer); EEPROM.put(eeprom_adresi, acc_x_cal); eeprom_address += sizeof(yüzer); EEPROM.put(eeprom_adresi, acc_y_cal); eeprom_address += sizeof(yüzer); // Yerçekimi nedeniyle acc_z için bir ofset kaydetmediğimizi unutmayın! gecikme(500); }

Yukarıdaki kod bloğu, kalibrasyon rutinini yürütür. Bu kod yatay kalibrasyon içindir. Dikey kalibrasyon için neredeyse aynı kod vardır (not, kod MPU6050'nizin yatay mı yoksa dikey olarak mı monte edildiğini bilir!). MPU6050, 1000 kez okunur. uygun değerler kümülatif olarak eklenir ve ardından ortalama bir 'ofset' değeri vermek üzere 1000'e bölünür. Bu değerler daha sonra Nano eeprom'a kaydedilir. Tüm yatay kalibrasyon değerleri eeprom adresi 0'dan başlayarak saklanır. Tüm dikey değerler eeprom adresi 24'ten başlayarak saklanır. Kalibrasyon tamamen düz bir yüzeyde YAPILMALIDIR, aksi takdirde hiçbir anlam ifade etmezler.

/* * Sonraki birkaç satır, ham verileri LCD ve LED'lere gönderilebilecek açılara dönüştürmek için işler. * Hızlanma verilerinin bölündüğü 4096 değeri MPU6050 veri sayfasından alınmıştır ve örnekleme hızına dayanmaktadır. * 9.8 değeri yerçekimidir * atan2 işlevi matematik modülündendir ve verilen verilerden açıları hesaplamak için kullanılır */ thetaM =-atan2((acc_x/4096.0)/9.8, (acc_z/4096.0)/9.8) /2/3.141592656 * 360; //Ham veri phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; //Ham veri dt=(millis()-millisOld)/1000.; millisOld=milis(); /* * Bu bölüm, sistemi daha duyarlı hale getirmek için gyro verilerini kullanır * gyro verilerinin bölündüğü 65.5 değeri MPU6050 veri sayfasından alınır ve örnekleme hızına dayanır */ theta=(theta+(gyro_y/ 65.5)*dt)*.96 + tetaM*.04; //Düşük geçiş filtresi phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //Alçak geçiş filtresi

Yukarıdaki kod açıları hesaplayan şeylerdir. Umarım yorumlar nasıl çalıştığına dair biraz fikir verir, ancak derinlemesine açıklama için ekteki PDF'de bağlantılı Paul McWhorters videosuna göz atın. Yine de söyleyeceğim şey, gyro ve Accelerometer (kodumun altındaki kurulum MPU6050 alt rutininde yapılan) için örnekleme hızını değiştirebilmenizdir. Örnek oranını değiştirirseniz, ham verilerin ne kadar bölündüğünü de değiştirmeniz gerekir. İvmeölçer verileri için mevcut değer 4096'dır. Gyro için mevcut değer 65.5'tir.

Örnekleme ve ofset değerlerinin nasıl bulunduğuna ilişkin daha ayrıntılı bilgi için ekteki veri sayfalarına ve EEEntusiast'ın videosuna (ekteki PDF'deki bağlantı) bakın.

3. Adım: Sonraki Adımlar

Bu noktaya kadar inşallah bu projeyi yapmış olacağız, ama şimdi ne olacak?

İlk olarak, neden onu gerçekten kullanabileceğiniz bir su terazisi haline getirmiyorsunuz? Uyarlayabileceğiniz ucuz bir su terazisi (kutu tipi olduğundan emin olun) satın alabilir veya kitiniz varsa kendi seviyenizi/kutunuzu yazdırabilirsiniz.

Belki bir oranda diğerinden daha iyi çalışıp çalışmadıklarını görmek için jiroskop ve ivmeölçer örnek oranlarıyla biraz oynayın.

Kodu daha da hassaslaştırmaya çalışın. Örneğin, şu anda 45 derecenin ötesinde, belirtilen açı en hafif tabirle kabadır. etrafında yol var mı?

Herhangi bir sorunuz varsa, ne kadar basit görünse de, lütfen sorun. Yardım edebilirsem, yaparım.

Bu talimatı beğendiyseniz, lütfen bir beğeni verin, böylece bilmem için.

Bunu yaparsanız, lütfen bana gösterin (özellikle çalışır durumdaysa).

TEŞEKKÜRLER

Önerilen: