İçindekiler:

Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterimi: 4 Adım (Resimlerle)
Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterimi: 4 Adım (Resimlerle)

Video: Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterimi: 4 Adım (Resimlerle)

Video: Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterimi: 4 Adım (Resimlerle)
Video: How to Use Barometric Pressure Sensors on the Arduino - Ultimate Guide to the Arduino #39 2024, Temmuz
Anonim
Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterisi
Arduino Atmosferik Mezura/ MS5611 GY63 GY86 Gösterisi

Bu gerçekten bir barometre/altimetre ama videoya bakarak başlığın sebebini anlayacaksınız.

Arduino GY63 ve GY86 devre kartlarında bulunan MS5611 basınç sensörü, inanılmaz bir performans sunar. Sakin bir günde boyunuzu 0,2 m'ye kadar ölçecektir. Bu, başınızdan uzaya olan mesafeyi etkili bir şekilde ölçmek ve bunu ayaklarınızın uzaya olan mesafesinden çıkarmaktır (basıncı ölçerek - bu, yukarıdaki havanın ağırlığıdır). Bu muhteşem cihaz, Everest'in yüksekliğini rahatça ölçebilecek bir menzile sahiptir ve ayrıca birkaç inç'e kadar da ölçüm yapabilir.

Bu projenin amacı: bir okul projesi, Arduino kodunu değiştirme örneği ve MS5611 sensörünü kullanarak keşfetmek için iyi bir başlangıç noktası. Bu sensörle ilgili sorun yaşayanlardan çok sayıda forum sorusu var. Buradaki yaklaşım, onu kullanmayı çok basit hale getiriyor. Bu projeyi yaptıktan sonra, basınçla ilgili diğer uygulamaları geliştirmek için iyi bir donanıma sahip olacaksınız.

Her sensörün, verileri düzeltmek için okunması ve kullanılması gereken kendi kalibrasyon sabitleri vardır. Bunları sürmeye yardımcı olacak bir kütüphane var. Burada gösterilen kod, okumaları almak için kitaplığı kullanır ve ardından bunları yüksekliğe dönüştürür ve bir LCD Kalkan üzerinde görüntüler.

İlk olarak, ilk testler için verileri PC/dizüstü bilgisayardaki seri monitöre göndereceğiz. Bunlar biraz gürültü gösteriyor ve bu yüzden onları düzeltmek için bir filtre ekliyoruz. Ardından, ünitenin bağımsız olarak çalışabilmesi ve boyunuzu veya başka herhangi bir şeyi ölçmeyi deneyebilmeniz için bir LCD ekran ekleyeceğiz.

GY63 kartının sadece MS5611 basınç sensörüne sahip olduğunu unutmayın. GY86'ya 10 derecelik serbestlik kartı denir ve aynı zamanda sadece birkaç $ karşılığında 3 eksenli ivmeölçer, 3 eksenli jiroskop ve 3 eksenli manyetometre içerir.

İhtiyacın olacak:

1. Arduino UNO (veya standart pin çıkışlı diğer) ve USB kablosu

2. GY63 koparma tahtası veya GY86

3. 4 Dupont erkek-dişi kablo veya bağlantı kablosu

4. Arduino LCD tuş takımı kalkanı

5. 9v pil ve kurşun

6. 2.54mm soket şeridi (isteğe bağlı ancak önerilir)

Hazırlık

Arduino IDE'yi (entegre geliştirme ortamı) şu adresten indirin:

İlgi için bazı teknik bilgiler

MS5611, çok sayıda ölçümün ortalamasını alarak mükemmel performansını sunar. Sadece 8ms'de 4096 3 byte (24bit) analog ölçüm yapabilir ve ortalama değeri verebilir. Basınç verilerinin iç sıcaklık için düzeltilebilmesi için hem basıncı hem de sıcaklığı ölçmesi gerekir. Bu nedenle saniyede yaklaşık 60 çift basınç ve sıcaklık okuması sağlayabilir.

Veri sayfası şu adreste mevcuttur:

İletişim I2C üzerinden yapılır. Böylece diğer I2C sensörleri veri yolunu paylaşabilir (tüm çiplerin I2C üzerinde olduğu GY86 10DOF kartında olduğu gibi).

1. Adım: Bir MS5611 Kitaplığı Alın

Arduino sensörlerinin çoğu, ya Arduino IDE'de bulunan standart bir kitaplık kullanır ya da kolayca kurulabilen bir kitaplığa sahip bir zip dosyası ile sağlanır. Bu, MS5611 sensörleri için geçerli değildir. Ancak bir arama bulundu: https://github.com/gronat/MS5611, MS5611 için sıcaklık düzeltmesinin yapılması da dahil olmak üzere bir kitaplığına sahiptir.

seçenek 1

Yukarıdaki web sitesine gidin, 'Klonla veya İndir'i tıklayın ve 'ZIP İndir'i seçin. Bu, MS5611-master.zip dosyasını indirilenler dizininize teslim etmelidir. Şimdi, isterseniz, ileride bulabileceğiniz bir klasöre taşıyın. Arduino klasörlerime eklenen 'veri' adlı bir dizin kullanıyorum.

Ne yazık ki indirilen.zip dosyası herhangi bir örnek çizim içermiyor ve kütüphaneyi ve örnekleri Arduino IDE'ye eklemek güzel olurdu. README.md dosyasında kopyalanıp bir çizime yapıştırılabilen ve kaydedilebilen minimum bir örnek vardır. Bu gitmenin bir yolu.

seçenek 2

Bu talimatta kodu çalıştırmayı kolaylaştırmak için yukarıdaki minimum örneği ve burada gösterilen örnekleri kitaplığa ekledim ve Arduino IDE'ye kurulacak bir.zip dosyası ekledim.

Aşağıdaki zip dosyasını indirin. İsterseniz bunu daha iyi bir klasöre taşıyın.

Arduino IDE'yi başlatın. Sketch>Kitaplığı Dahil Et>Zip dosyası ekle'ye tıklayın ve dosyayı seçin. IDE'yi yeniden başlatın. IDE şimdi hem kitaplığı hem de burada gösterilen tüm örnekleri yükleyecektir. Dosya>örnekler>>MS5611-master'ı tıklayarak kontrol edin. Üç eskiz listelenmelidir.

Adım 2: Sensörü Arduino'ya Bağlayın ve Test Edin

Sensörü Arduino'ya Bağlayın ve Test Edin
Sensörü Arduino'ya Bağlayın ve Test Edin
Sensörü Arduino'ya Bağlayın ve Test Edin
Sensörü Arduino'ya Bağlayın ve Test Edin

GY63/GY86 kartları genellikle başlıklarla birlikte gelir ancak lehimlenmez. Bu yüzden ya başlıkları yerinde lehimlemek ve erkek-dişi Dupont uçlarını kullanmak ya da (karar verdiğim gibi) lehim uçlarını doğrudan tahtaya ve Arduino'ya takmak için uçlara pimler eklemek sizin seçiminizdir. Tahtayı daha sonra bir projeye lehimlemek isteyebileceğinizi düşünüyorsanız, ikinci seçenek daha iyidir. Tahtayı deney için kullanmak istiyorsanız birincisi daha iyidir. Lehimsiz kablolar, pin başlığından çok daha kolaydır.

Gerekli bağlantılar şunlardır:

GY63/GY86 Arduino

VCC - 5v Güç GND - GND Toprak SCL - A5 I2C saat >SDA - A4 I2C verileri

Sensör kartını yukarıdaki gibi Arduino'ya takın ve Arduino'yu USB kablosuyla PC/dizüstü bilgisayara bağlayın. Ayrıca sensörü bir miktar opak/siyah malzemeyle kaplayın. Sensör ışığa duyarlıdır (bu tip sensörlerin çoğunda olduğu gibi).

Arduino IDE'yi başlatın. Tıklamak:

Dosya>örnekler>>MS5611-master>MS5611data2serial.

Çizimle birlikte IDE'nin yeni bir örneği görünecektir. Yükle düğmesine tıklayın (sağ ok).

Ardından seri çiziciyi başlatın – Araçlar>Seri Plotter'a tıklayın ve gerekirse baud'u 9600'e ayarlayın. Gönderilen veri Pascal cinsinden basınçtır. Bir saniye kadar sonra yeniden ölçeklenir ve sensörün örneğin 0,3 m yükseltilmesi ve alçaltılması, izin alçalması ve yükselmesi olarak göstermelidir (düşük yükseklik daha yüksek basınçtır).

Verilerde biraz gürültü var. Yukarıdaki ilk arsaya bakın. Bu, dijital bir filtre (gerçekten kullanışlı bir araç) kullanılarak düzeltilebilir.

Filtre denklemi:

değer = değer + K(yeni-değer)

burada 'değer' filtrelenmiş veridir ve 'yeni' en son ölçülendir. K=1 ise filtreleme yoktur. Daha düşük K değerleri için veriler, T/K zaman sabiti ile düzleştirilir; burada T, numuneler arasındaki zamandır. Burada T yaklaşık 17ms'dir, bu nedenle 0.1 değeri 170ms veya 1/6s civarında bir zaman sabiti verir.

Filtre şu şekilde eklenebilir:

setup()'tan önce filtrelenmiş veriler için bir değişken ekleyin:

şamandıra filtreli = 0;

Ardından basınç = …'dan sonra filtre denklemini ekleyin. hat.

filtrelenmiş = filtrelenmiş + 0.1*(basınç filtrelenmiş);

Filtrelenen değeri ilk okumaya başlatmak iyi bir fikirdir. Bu nedenle, yukarıdaki satırın etrafına bunu yapan bir 'if' ifadesi ekleyin, böylece şöyle görünür:

if(filtrelenmiş != 0){

filtrelenmiş = filtrelenmiş + 0.1*(basınç filtrelenmiş); } else { filtrelenmiş = basınç; // ilk okuma, böylece filtrelenmiş olarak okumaya ayarlayın }

'!=' testi 'eşit değil'dir. Dolayısıyla, eğer 'filtrelenmiş' 0'a eşit değilse, filtre denklemi yürütülür, ancak öyleyse, basınç okumasına ayarlanır.

Son olarak Serial.println deyiminde 'basıncı' 'filtrelenmiş' olarak değiştirmemiz gerekiyor, böylece filtrelenmiş değeri görebiliyoruz.

En iyi öğrenme, yukarıdaki değişiklikleri manuel olarak yaparak sağlanır. Ancak bunları MS5611data2serialWfilter örneğine dahil ettim. Yani sorun varsa örnek yüklenebilir.

Şimdi kodu Arduino'ya yükleyin ve iyileştirmeyi görün. Yukarıdaki ikinci çizime bakın ve Y ölçeğinin x2 genişletildiğini unutmayın.

Filtre sabiti için daha düşük bir değer deneyin, örneğin 0,1 yerine 0,02 deyin ve farkı görün. Veriler daha pürüzsüz ancak daha yavaş yanıt veriyor. Bu, bu basit filtreyi kullanırken aranması gereken bir uzlaşmadır. Karakteristik, elektronik devrelerde yaygın olarak kullanılan bir RC (direnç ve kapasitans) filtresiyle aynıdır.

Adım 3: Bağımsız Yapın

Şimdi bir LCD Tuş Takımı kalkanı ekleyeceğiz, basıncı metre cinsinden yüksekliğe çevireceğiz ve ekranda göstereceğiz. Ayrıca tuş takımındaki 'Seç' düğmesine basarak değeri sıfırlama özelliğini de ekleyeceğiz.

Arduino'daki LCD kalkanı ile sensörün LCD kalkanına bağlanması gerekecektir. Ne yazık ki LCD ekranları genellikle uygun soketler olmadan gelir. Bu nedenle seçenekler lehim bağlantıları yapmak veya bir miktar soket şeridi almaktır. Soket şeridi, ebay'de posta ücretinden çok daha fazla olmayan bir fiyata mevcuttur. '2.54mm soket şeridi' üzerinde bir arama yapın ve Arduino'dakilere benzer olanları arayın. Bunlar genellikle 36 veya 40 pin uzunluğunda gelir. Standart Dupont adayları için yeterince derin olmadıklarından, döndürülmüş pimlerden kaçınırdım.

Soket şeridi boyuna kesilmeli ve kesim pim ile aynı yerde yapılmalıdır. 6 iğneli bir şerit için – 7. pimi ince bir pense ile çıkarın, ardından küçük bir demir testeresi kullanarak o yerden kesin. Uçlarını düzgün hale getirmek için dosyalıyorum.

Tahtaya lehimlerken lehim köprüleri olmadığından emin olun.

Sensörü bağlama konusunda uygun kararla, LCD ekranını Arduino'ya takın ve sensörü aynı pinleri bağlayın - ancak şimdi LCD ekran üzerinde.

Ayrıca pili ve kurşunu hazırlayın. Kurşun kalemimi hurda kutumdaki parçalardan oluşturdum ancak bunlar ebay'de de mevcut - pil kutusu ve anahtar içeren güzel bir seçenek de dahil. 'PP3 2.1mm kurşun' üzerinde arama yapın.

Mevcut tüketim yaklaşık 80ma'dır. Bu nedenle, birkaç dakikadan fazla çalıştırmak istiyorsanız, PP3'ten daha büyük bir 9v pil düşünün.

Adım 4: Rakım ve LCD için Kod Ekleyin

Image
Image

Basıncı yüksekliğe dönüştürmek ve ekranı sürmek için biraz daha kodlama yapmamız gerekiyor.

Çizimin başlangıcında ekran kitaplığını ekleyin ve buna hangi pinlerin kullanıldığını söyleyin:

#Dahil etmek

// kütüphaneyi LiquidCrystal lcd(8, 9, 4, 5, 6, 7) arabirim pinlerinin numaralarıyla başlat;

Daha sonra bazı değişkenlere ve tuş takımı düğmelerini okumak için bir fonksiyona ihtiyacımız var. Bunların tümü analog giriş A0'a bağlıdır. Her düğme A0'a farklı bir voltaj verir. 'Arduino lcd kalkan düğmeleri kodu' ile ilgili bir arama, şu adreste iyi bir kod buldu:

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

Bu kodu kurulumdan () önce ekleyin:

// panel ve butonlar tarafından kullanılan bazı değerleri tanımlayın

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // düğmeleri oku int read_LCD_buttons() { adc_key_in = analogRead(0); // sensörden değeri oku // okunduğunda düğmelerim şu valilerde ortalanır: 0, 144, 329, 504, 741 // bu değerlere yaklaşık 50 ekliyoruz ve yakın olup olmadığımızı kontrol ediyoruz if (adc_key_in > 1000) btnNONE döndür; // (adc_key_in < 50) döndürmesi btnRIGHT; if (adc_key_in < 250) btnUP döndürür; if (adc_key_in < 450) btnDOWN döndürür; eğer (adc_key_in < 650) btnLEFT döndürürse; eğer (adc_key_in < 850) btnSELECT döndürürse; dönüş btnNONE; // diğerleri başarısız olduğunda, bunu döndür… }

Rakım genellikle başlangıç noktasında sıfırlanır. Yani hem yükseklik hem de referans için değişkenlere ihtiyacımız var. Bunları setup() ve yukarıdaki işlevden önce ekleyin:

yüzer mtr;

kayan nokta referansı = 0;

Pascal cinsinden basınçtan metreye dönüşüm, deniz seviyesinde neredeyse tam olarak 12'ye bölünür. Bu formül, çoğu yere dayalı ölçümler için uygundur. Yüksek irtifalarda dönüşüm için daha uygun olan daha doğru formüller vardır. Bir balon uçuşunun yüksekliğini kaydetmek için kullanacaksanız bunları kullanın.

Sıfır yükseklikte ve SEÇME düğmesine basıldığında başlamamız için referans ilk basınç okumasına ayarlanmalıdır. Filtre kodundan sonra ve Serial.println ifadesinden önce ekleyin:

if(başvuru == 0){

referans = filtrelenmiş/12.0; } if(read_LCD_buttons() == btnSELECT) { başvuru = filtrelenmiş/12.0; }

Bundan sonra yükseklik hesaplamasını ekleyin:

mtr = ref - filtrelenmiş/12.0;

Son olarak Serial.println ifadesini 'filtrelenmiş' yerine 'mtr' gönderecek şekilde değiştirin ve LCD'ye 'mtr' göndermek için kod ekleyin:

Seri.println(mtr); // Seri (UART) üzerinden basınç gönder

lcd.setCursor(0, 1); // 2. satır lcd.print(mtr);

Buradaki tüm değişiklikler MS5611data2lcd örneğine dahil edilmiştir. Bunu 2. adımdaki gibi yükleyin.

Yardımcı olan son bir mod var. Saniyede 60 kez güncellenirken ekranın okunması zor. Filtremiz, verileri 0,8s civarında bir zaman sabitiyle düzeltiyor. Bu yüzden ekranı her 0,3 saniyede bir güncellemek yeterli görünüyor.

Bu nedenle, çizimin başlangıcındaki diğer tüm değişken tanımlarından sonra bir sayaç ekleyin (örneğin, kayan nokta ref=0;'dan sonra):

int ben = 0;

Ardından, 'i'yi artırmak için bir kod ve 20'ye ulaştığında çalışacak bir 'if' ifadesi ekleyin ve ardından sıfıra ayarlayın ve Seri ve lcd komutlarını 'if' ifadesi içinde hareket ettirin, böylece bunlar yalnızca her 20 okumada bir yürütülür:

ben += 1;

if(i>=20) { Serial.println(mtr); // Seri (UART) lcd.setCursor(0, 1) ile basınç gönder; // 2. satır lcd.print(mtr); ben = 0; }

Öğrenmeye yardımcı olan kodu manuel olarak girmeyi teşvik etmek için bu son değişiklikle bir örnek eklemedim.

Bu proje, örneğin dijital bir barometre için iyi bir başlangıç noktası sağlamalıdır. RC modellerinde kullanmayı düşünmek isteyenler için - Frsky ve Turnigy 9x telemetri sistemleri için bir altimetre ve variometre sağlayan kod için OpenXvario'yu arayın.

Önerilen: