Mündəricat:

Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayiş: 4 Addım (Şəkillərlə)
Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayiş: 4 Addım (Şəkillərlə)

Video: Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayiş: 4 Addım (Şəkillərlə)

Video: Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayiş: 4 Addım (Şəkillərlə)
Video: Egzoz nasıl patlatılır ? 2024, Noyabr
Anonim
Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayişi
Arduino Atmosfer Bant Ölçüsü/ MS5611 GY63 GY86 Nümayişi

Bu həqiqətən bir barometr/altimetrdir, ancaq videoya baxaraq başlığın səbəbini görəcəksiniz.

Arduino GY63 və GY86 qırılma lövhələrində olan MS5611 təzyiq sensoru inanılmaz performans təmin edir. Sakit bir gündə boyunuzu 0,2 m -ə qədər ölçəcək. Bu, başınızdan kosmosa olan məsafəni təsirli şəkildə ölçmək və ayaqlarınızdan kosmosa qədər olan məsafəni çıxarmaqdır (təzyiqi ölçməklə - yuxarıdakı havanın ağırlığıdır). Bu möhtəşəm cihaz, Everestin hündürlüyünü rahatlıqla ölçəcək və eyni zamanda bir neçə düymə qədər ölçə bilən bir sıra var.

Bu layihə: bir məktəb layihəsi, Arduino kodunun dəyişdirilməsi nümunəsi və MS5611 sensorundan istifadə edərək araşdırmaq üçün yaxşı bir başlanğıc yeri olaraq təyin edildi. Bu sensorda çətinlik çəkənlərin çoxlu forum sualları var. Buradakı yanaşma istifadə etməyi çox sadə edir. Bu layihəni etdikdən sonra təzyiqlə əlaqəli digər tətbiqləri inkişaf etdirmək üçün yaxşı təchiz olunmuş olacaqsınız.

Hər bir sensorun məlumatları düzəltmək üçün oxunması və istifadəsi lazım olan öz kalibrləmə sabitləri var. Bunları idarə etməyə kömək edəcək bir kitabxana var. Burada göstərilən kod oxumaq üçün kitabxanadan istifadə edir, sonra hündürlüyə çevirir və LCD ekranında göstərir.

Əvvəlcə məlumatları ilkin testlər üçün PC/dizüstü kompüterdəki serial monitora göndərəcəyik. Bunlar bir az səs -küy göstərir və buna görə də onları düzəltmək üçün bir filtr əlavə edirik. Sonra LCD ekranı əlavə edəcəyik ki, cihaz müstəqil işləyə bilsin və boyunuzu və ya başqa bir şeyi ölçməyə cəhd edə bilərsiniz.

Qeyd edək ki, GY63 lövhəsində yalnız MS5611 təzyiq sensoru var. GY86 10 dərəcə sərbəstlik lövhəsi adlanır və 3 eksenli akselerometr, 3 oxlu cayro və 3 eksenli maqnitometrdən bir neçə dollara çoxdur.

Sizə lazım olacaq:

1. Arduino UNO (və ya standart pinoutlu digər) və onun USB kabeli

2. GY63 qırılma lövhəsi və ya GY86

3. 4 Dupont kişi -dişi - və ya birləşdirən tel aparır

4. Arduino LCD klaviatura qalxanı

5. 9v batareya və qurğuşun

6. 2.54 mm yuva zolağı (isteğe bağlı, lakin tövsiyə olunur)

Hazırlıq

Arduino IDE -ni (inteqrasiya edilmiş inkişaf mühiti) yükləyin:

Maraq üçün bəzi texniki bitlər

MS5611 çox sayda ölçmə apararaq əla performansını təmin edir. Cəmi 8 ms -də 4096 3 bayt (24 bit) analoq ölçmə apara bilər və orta dəyər verə bilər. Daxili temperatur üçün təzyiq məlumatlarının düzəldilməsi üçün həm təzyiqi, həm də temperaturu ölçmək məcburiyyətindədir. Beləliklə, saniyədə təxminən 60 cüt təzyiq və temperatur oxunuşu verə bilər.

Məlumat vərəqi burada mövcuddur:

Əlaqələr I2C vasitəsilə həyata keçirilir. Beləliklə, digər I2C sensorlar avtobusu paylaşa bilər (bütün çiplərin I2C -də olduğu GY86 10DOF lövhəsində olduğu kimi).

Addım 1: MS5611 Kitabxanasını əldə edin

Bir çox Arduino sensoru ya Arduino IDE -yə daxil olan standart kitabxanadan istifadə edir, ya da asanlıqla quraşdırıla bilən kitabxanası olan bir zip faylı ilə təchiz olunur. MS5611 sensorlar üçün bu belə deyil. Ancaq bir axtarış tapıldı: https://github.com/gronat/MS5611, MS5611 üçün kitabxanası olan, temperaturun düzəldilməsi də daxil olmaqla.

Seçim 1

Yuxarıdakı veb saytına gedin, 'Klonla və ya Yüklə' düyməsini basın və 'ZIP Yüklə' seçin. Bu yükləmə qovluğunuza MS5611-master.zip çatdırmalıdır. İstəyirsinizsə, gələcəkdə tapa biləcəyiniz bir qovluğa köçürün. Arduino qovluqlarıma əlavə edilən 'data' adlı bir kataloq istifadə edirəm.

Təəssüf ki, yüklənmiş.zip faylında heç bir nümunə eskiz yoxdur və kitabxananı və nümunələri Arduino IDE -yə əlavə etmək yaxşı olardı. README.md faylında kopyalanıb eskizə yapışdırıla bilən və saxlanıla bilən minimum bir nümunə var. Bu yola çıxmağın bir yoludur.

Seçim 2

Kodun bu təlimatda işləməsini asanlaşdırmaq üçün yuxarıdakı minimum nümunəni və burada göstərilən nümunələri kitabxanaya əlavə etdim və aşağıda Arduino IDE -yə quraşdırılacaq.zip faylını əlavə etdim.

Aşağıdakı zip faylını yükləyin. İstəyirsinizsə, bunu daha yaxşı bir qovluğa köçürün.

Arduino IDE -ni işə salın. Eskiz> Kitabxanaya Daxil et> Zip faylı əlavə edin və faylı seçin. IDE -ni yenidən başladın. İndi IDE -də həm kitabxana quraşdırılacaq, həm də burada göstərilən bütün nümunələr. Fayl> nümunələr >> MS5611-master düyməsini basaraq yoxlayın. Üç eskiz siyahıya alınmalıdır.

Addım 2: Sensoru Arduino -ya qoşun və Test edin

Sensoru Arduino -ya qoşun və sınayın
Sensoru Arduino -ya qoşun və sınayın
Sensoru Arduino -ya qoşun və sınayın
Sensoru Arduino -ya qoşun və sınayın

GY63/GY86 lövhələri ümumiyyətlə başlıqlarla gəlir, lakin lehimlənmir. Başlıqları yerində lehimləmək və kişi-qadın Dupont uclarını istifadə etmək və ya (qərar verdiyim kimi) lehim aparatlarını birbaşa lövhəyə qoymaq və Arduino'ya qoşulmaq üçün ucuna sancaqlar əlavə etmək sizin seçiminizdir. Lövhəni daha sonra bir layihəyə lehimləmək istəyə biləcəyinizi düşünürsünüzsə, ikinci seçim daha yaxşıdır. Təcrübə üçün lövhədən istifadə etmək istəyirsinizsə, birincisi daha yaxşıdır. Qaynaq işlərinin aparılmaması pin başlığından daha asandır.

Lazım olan əlaqələr bunlardır:

GY63/GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - A5 I2C saatı> SDA - A4 I2C məlumatları

Sensor lövhəsini yuxarıda göstərildiyi kimi Arduinoya bağlayın və Arduino'yu USB ucu ilə PC/dizüstü kompüterə qoşun. Sensoru bəzi qeyri -şəffaf/qara materialla da örtün. Sensor işığa həssasdır (bu tip sensorların əksəriyyətində olduğu kimi).

Arduino IDE -ni işə salın. Basın:

Fayl> nümunələr >> MS5611-master> MS5611data2serial.

Eskizlə birlikdə IDE -nin yeni bir nümunəsi görünəcək. Yükləmə düyməsini basın (sağ ox).

Ardından serial plotteri işə salın - Alətlər> Serial Plotter düyməsini basın və lazım olduqda baudu 9600 olaraq təyin edin. Göndərilən məlumatlar Paskaldakı təzyiqdir. Bir saniyə sonra sensoru yenidən ölçəkləyərək 0,3 m-ə qaldıraraq alçaltmaq izin azalması və qaldırılması kimi göstərilməlidir (aşağı hündürlük daha yüksək təzyiqdir).

Məlumatların bir az səs -küyü var. Yuxarıdakı ilk süjetə baxın. Bu rəqəmsal bir filtr (həqiqətən faydalı bir vasitə) istifadə edərək hamarlaşdırıla bilər.

Filtr tənliyi belədir:

dəyər = dəyər + K (yeni dəyər)

burada 'dəyər' süzülmüş məlumatdır və 'yeni' ən son ölçülmüşdür. K = 1 olarsa süzgəc yoxdur. K -nin aşağı dəyərləri üçün məlumatlar T/K sabit bir zaman düzəldilir, burada T nümunələr arasındakı vaxtdır. Burada T təxminən 17 ms -dir, buna görə 0.1 -in dəyəri 170ms və ya 1/6s ətrafında sabit bir zaman verir.

Filtr əlavə edilə bilər:

Quraşdırmadan əvvəl süzülmüş məlumatlar üçün bir dəyişən əlavə edin ():

süzülmüş float = 0;

Sonra təzyiqdən sonra filtr tənliyini əlavə edin =…. xətt

süzülmüş = süzülmüş + 0.1*(təzyiqlə süzülmüş);

Süzülmüş dəyəri ilk oxunuşa başlamaq yaxşı bir fikirdir. Bunu etmək üçün yuxarıdakı xəttin ətrafında bir 'if' ifadəsi əlavə edin, belə görünür:

əgər (süzülmüş! = 0) {

süzülmüş = süzülmüş + 0.1*(təzyiqlə süzülmüş); } başqa {süzülmüş = təzyiq; // ilk oxunuş belə süzgəcdən keçirildi oxumağa}

'! =' Testi 'bərabər deyil'. Beləliklə, "süzülmüş" 0 -a bərabər deyilsə, filtr tənliyi yerinə yetirilir, əgər varsa, təzyiq oxunuşuna təyin edilir.

Nəhayət, Serial.println ifadəsindəki 'təzyiqi' 'süzülmüş' olaraq dəyişdirməliyik ki, süzülmüş dəyəri görək.

Ən yaxşı öyrənmə yuxarıdakı dəyişiklikləri əl ilə etməklə əldə edilir. Ancaq bunları MS5611data2serialWfilter nümunəsinə daxil etdim. Beləliklə, problemlər varsa, nümunə yüklənə bilər.

İndi kodu Arduinoya yükləyin və təkmilləşdirməni görün. Yuxarıdakı ikinci süjetə baxın və Y miqyasının x2 genişləndirildiyini unutmayın.

Filtr sabitinin daha aşağı bir dəyərini sınayın, 0,1 yerinə 0,02 deyin və fərqi görün. Məlumatlar daha hamar, lakin daha yavaş cavab verir. Bu sadə filtrdən istifadə edərkən axtarılan bir kompromisdir. Xüsusiyyət elektron sxemlərdə geniş istifadə olunan bir RC (müqavimət və tutum) filtri ilə eynidir.

Addım 3: Bağımsız hala gətirin

İndi LCD klaviatura qalxanı əlavə edəcəyik, təzyiqi metrlərlə yüksəkliyə çevirəcəyik və ekranda göstərəcəyik. Klaviatura 'Seç' düyməsinə basaraq dəyəri sıfıra endirmə qabiliyyətini də əlavə edəcəyik.

Arduino -da LCD ekran varsa, sensorun LCD ekranına qoşulması lazımdır. Təəssüf ki, LCD ekranlar ümumiyyətlə uyğun yuvalar olmadan gəlir. Buna görə seçimlər lehim bağlantıları qurmaq və ya bir az rozetka almaqdır. Soket şeridi ebayda poçt xərclərindən çox deyil. '2.54mm yuva zolağı' üzərində bir araşdırma aparın və Arduino üzərindəki oxşarları axtarın. Bunlar ümumiyyətlə 36 və ya 40 pin uzunluğunda gəlir. Standart Dupont potensialları üçün kifayət qədər dərin olmadığı üçün dönmüş pinlərdən çəkinərdim.

Soket şeridi uzunluğa qədər kəsilməli və kəsik bir pinlə eyni yerdə aparılmalıdır. Beləliklə, 6 pinli bir zolaq üçün - 7 -ci pimi bir neçə incə kəlbətinlə çıxarın, sonra kiçik bir mişar maşını istifadə edərək həmin yerdə kəsin. Səliqəli hala gətirmək üçün uclarını verirəm.

Lövhəyə lehimləyərkən heç bir lehim körpüsü olmadığından əmin olun.

Sensorun bağlanması ilə bağlı müvafiq qərarla LCD ekranını Arduino'ya bağlayın və sensoru eyni pimlərə bağlayın - amma indi LCD ekranında.

Batareyanı və aparatı da hazırlayın. Qırıntı qutumdakı hissələrdən qurğuşun hazırladım, ancaq ebayda da mövcuddur - batareya qutusu və açarı olan gözəl bir seçim də daxil olmaqla. "PP3 2.1 mm qurğuşun" üzərində axtarın.

Cari istehlak 80ma civarındadır. Buna görə bir neçə dəqiqədən çox çalışmaq istəyirsinizsə, PP3 -dən daha böyük 9v batareyanı düşünün.

Addım 4: Rakım və LCD üçün Kod əlavə edin

Image
Image

Təzyiqi hündürlüyə çevirmək və ekranı idarə etmək üçün bir az daha kodlaşdırmalıyıq.

Eskizin əvvəlində ekran kitabxanasını əlavə edin və hansı pinlərin istifadə olunduğunu söyləyin:

#daxil edin

// kitabxananı LiquidCrystal lcd (8, 9, 4, 5, 6, 7) interfeys pinlərinin nömrələri ilə işə salın;

Sonra klaviatura düymələrini oxumaq üçün bəzi dəyişənlərə və funksiyaya ehtiyacımız var. Bütün bunlar A0 analoq girişinə bağlıdır. Hər bir düymə A0 -a fərqli bir gərginlik verir. 'Arduino lcd ekran düymələri kodu' üzərində edilən axtarışda yaxşı bir kod tapıldı:

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

Quraşdırmadan əvvəl bu kodu əlavə edin ():

// panel və düymələrin istifadə etdiyi bəzi dəyərləri təyin edin

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 // int read_LCD_buttons () {adc_key_in = analogRead (0); // sensordan dəyəri oxuyun // oxunduqda düymələrim bu boşluqların mərkəzindədir: 0, 144, 329, 504, 741 // bu dəyərlərə təxminən 50 əlavə edirik və əgər yaxın olub olmadığını yoxlayırıq (adc_key_in> 1000) btnNONE qaytar; // Sürət səbəbiylə bunu 1 -ci seçim edirik, çünki (adc_key_in <50) btnRIGHT; əgər (adc_key_in <250) btnUP qaytarsa; if (adc_key_in <450) btnDOWN qaytar; əgər (adc_key_in <650) btnLEFT qaytarsa; əgər (adc_key_in <850) btnSELECT qaytarsanız; qayıt btnNONE; // hamısı uğursuz olduqda, bunu geri qaytarın …}

Hündürlük ümumiyyətlə başlanğıc nöqtəsində sıfırlanır. Beləliklə, həm hündürlük, həm də istinad üçün dəyişənlərə ehtiyacımız var. Setup () və yuxarıdakı funksiyadan əvvəl bunları əlavə edin:

float mtr;

float ref = 0;

Paskaldakı təzyiqdən metrə çevrilmə, dəniz səviyyəsində demək olar ki, 12 -yə bölünmədir. Bu düstur əksər yerüstü ölçmələr üçün uyğundur. Yüksək yüksəkliklərdə dönüşüm üçün daha uyğun olan daha dəqiq düsturlar var. Bir balon uçuşunun hündürlüyünü qeyd etmək üçün bundan istifadə edəcəksinizsə bunları istifadə edin.

Sıfır hündürlükdə və SEÇİM düyməsinə basıldıqda başlayacağımız üçün istinad ilk təzyiq göstəricisinə qurulmalıdır. Filtr kodundan sonra və Serial.println ifadəsindən əvvəl əlavə edin:

əgər (ref == 0) {

ref = süzülmüş/12.0; } if (read_LCD_buttons () == btnSELECT) {ref = süzülmüş/12.0; }

Bundan sonra hündürlük hesablamasını əlavə edin:

mtr = ref - süzülmüş/12.0;

Son olaraq Serial.println ifadəsini 'süzülmüş' yerinə 'mtr' göndərmək üçün dəyişdirin və LCD -yə 'mtr' göndərmək üçün kod əlavə edin:

Serial.println (mtr); // Serial (UART) vasitəsilə təzyiq göndərin

lcd.setCursor (0, 1); // sətir 2 lcd.print (mtr);

Buradakı bütün dəyişikliklər MS5611data2lcd nümunəsinə daxil edilmişdir. Bunu 2 -ci addımdakı kimi yükləyin.

Faydalı olan son bir mod var. Ekranı saniyədə 60 dəfə yeniləyərkən oxumaq çətindir. Filtrimiz, 0.8s ətrafında sabit bir zamanla məlumatları hamarlaşdırır. Ekranı hər 0.3 saniyədə yeniləmək kifayət qədər çox görünür.

Eskizin əvvəlindəki bütün digər dəyişən təriflərdən sonra sayğac əlavə edin (məsələn, float ref = 0;):

int i = 0;

Sonra 'i' və 'if' ifadəsini 20 -yə çatdıqda işə salmaq üçün kod əlavə edin və sonra sıfıra qoyun və Serial və lcd əmrlərini 'if' ifadəsi daxilinə köçürün ki, bunlar yalnız hər 20 -ci oxunuşda yerinə yetirilsin:

i += 1;

əgər (i> = 20) {Serial.println (mtr); // Serial (UART) lcd.setCursor (0, 1) vasitəsilə təzyiq göndərin; // sətir 2 lcd.print (mtr); i = 0; }

Öyrənməyə kömək edən kodu əl ilə daxil etməyi təşviq etmək üçün bu son dəyişikliklə bir nümunə daxil etmədim.

Bu layihə, məsələn, rəqəmsal barometr üçün yaxşı bir başlanğıc nöqtəsi verməlidir. RC modellərində istifadəni nəzərdən keçirmək istəyənlər üçün - Frsky və Turnigy 9x telemetriya sistemləri üçün altimetr və variometr imkan verən kod üçün OpenXvario axtarın.

Tövsiyə: