İçindekiler:
Video: Arduino ve MPU6050 Tabanlı Dijital Ruh Seviyesi: 3 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
İ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
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:
Arduino Tabanlı Dijital Termometre: 3 Adım
Arduino Tabanlı Dijital Termometre: Bu projede, oda sıcaklığını analiz etmek için kullanılabilecek Arduino tabanlı bir dijital termometre tasarlanmıştır. Termometre genellikle sıcaklık ölçüm cihazı olarak kullanılmaktadır. Ölçmek için kullanılabilecek çeşitli ilkeler vardır
Electronicslovers tarafından Dijital Ruh Düzeyi DIY Proje Modülü: 6 Adım
Digital Spirit Level Electronicslovers tarafından Kendin Yap Proje Modülü: Evinize bir mobilya parçası veya benzeri bir şey monte etmeniz gereken bir zaman vardır ve düz bir montaj için herkes her zamanki gibi bir su terazisi kullanır. ElectronicsLovers Tech Team, her zamanki modülden bir farkı olan bu modülü oluşturdu: i
Arduino Tabanlı Temassız Kızılötesi Termometre - Arduino Kullanan IR Tabanlı Termometre: 4 Adım
Arduino Tabanlı Temassız Kızılötesi Termometre | Arduino Kullanan IR Tabanlı Termometre: Merhaba arkadaşlar, bu talimatta arduino kullanarak temassız bir Termometre yapacağız. Bazen sıvının/katının sıcaklığı çok yüksek veya çok düşük olduğundan, onunla temas kurmak ve okumak zordur. o sahnede sıcaklık
NodeMCU ESP8266 Kullanan IOT Tabanlı Su Seviyesi Kontrol Cihazı: 6 Adım
NodeMCU ESP8266'yı Kullanan IOT Tabanlı Su Seviyesi Kontrol Cihazı: Bu, IOT tabanlı bir su seviyesi kontrol cihazının nasıl oluşturulacağına ilişkin Talimattır. Bu projenin özellikleri şunlardır: - Android uygulamasında gerçek zamanlı su seviyesi güncellemeleri. Su minimum seviyenin altına düştüğünde su pompasını otomatik olarak AÇIN.
Arduino Tabanlı Dijital SAFE KUTU: 10 Adım
Arduino Tabanlı Dijital GÜVENLİ KUTU: Hey millet! Güvenle saklamak istediğiniz bir şey var mı? İstenmeyen davetsiz misafirlerden ve mahremiyet istilacılarından uzak tutulması gereken bir şey mi? Peki, senin problemin için bir çözümüm var! İşte Arduino tabanlı bir kilitli kasa