Съдържание:

Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация: 4 стъпки (със снимки)
Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация: 4 стъпки (със снимки)

Видео: Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация: 4 стъпки (със снимки)

Видео: Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация: 4 стъпки (със снимки)
Видео: Home Assistant - подключаем адресную ленту WS2812B через ESP8266 с прошивкой WLED 2024, Юли
Anonim
Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация
Атмосферна лента Arduino/ MS5611 GY63 GY86 Демонстрация

Това наистина е барометър/висотомер, но ще видите причината за заглавието, като погледнете видеоклипа.

Сензорът за налягане MS5611, открит на пробивните платки Arduino GY63 и GY86, осигурява невероятна производителност. В спокоен ден той ще измерва височината ви с точност до 0,2 м. Това ефективно измерва разстоянието от главата ви до космоса и го изважда от разстоянието на краката ви до космоса (чрез измерване на налягането - това е теглото на въздуха отгоре). Това грандиозно устройство има диапазон, който удобно ще измерва височината на Еверест - и също може да измери до няколко инча.

Този проект беше предназначен като: училищен проект, пример за промяна на кода на Arduino и добро начално място за изследване с помощта на сензора MS5611. Има много въпроси във форума от тези, които имат проблеми с този сензор. Подходът тук прави използването му много лесно. След като направите този проект, ще бъдете добре подготвени за разработване на други приложения, свързани с натиска.

Всеки сензор има свои собствени калибрационни константи, които трябва да бъдат прочетени и използвани за коригиране на данните. Налична е библиотека, която да ви помогне да ги управлявате. Кодът, показан тук, използва библиотеката за вземане на показания и след това ги преобразува във височина и ги показва на LCD щит.

Първо ще изпратим данните към серийния монитор на компютъра/лаптопа за първоначални тестове. Те показват известен шум и затова добавяме филтър, за да ги изгладим. След това ще добавим LCD дисплей, за да може устройството да работи независимо и можете да опитате да измерите височината си - или нещо друго.

Обърнете внимание, че платката GY63 има само сензор за налягане MS5611. GY86 се нарича платка с 10 степени на свобода и включва също 3 -осен акселерометър, 3 -осен жироскоп и 3 -осен магнитометър само за няколко долара повече.

Ще имаш нужда:

1. Arduino UNO (или друг със стандартен извод) и неговия USB кабел

2. GY63 пробивна платка или GY86

3. 4 изводи Dupont мъжки -женски - или свързващ проводник

4. Щит за клавиатура с LCD дисплей Arduino

5. 9v батерия и проводник

6. 2,54 мм гнездо за лента (по избор, но препоръчително)

Подготовка

Изтеглете Arduino IDE (интегрирана среда за разработка) от:

Няколко технически бита за интерес

MS5611 осигурява отличната си производителност чрез усредняване на голям брой измервания. Той може да направи 4096 3 -байтови (24 -битови) аналогови измервания само за 8ms и да даде средната стойност. Той трябва да измерва както налягането, така и температурата, така че данните за налягането могат да бъдат коригирани за вътрешната температура. Следователно той може да достави около 60 двойки показания за налягане и температура в секунда.

Информационният лист е достъпен на:

Комуникацията се осъществява чрез I2C. Така че други I2C сензори могат да споделят шината (какъвто е случаят на платката GY86 10DOF, където всички чипове са на I2C).

Стъпка 1: Вземете библиотека MS5611

Много от сензорите на Arduino или използват стандартна библиотека, която е включена в Arduino IDE, или са снабдени с zip файл с библиотека, която може лесно да се инсталира. Това обикновено не е така за сензорите MS5611. Търсенето обаче намери: https://github.com/gronat/MS5611, което има библиотека за MS5611, включително извършване на корекция на температурата.

Опция 1

Отидете на уебсайта по -горе, щракнете върху „Клониране или изтегляне“и изберете „Изтегляне на ZIP“. Това трябва да достави MS5611-master.zip във вашата директория за изтегляне. Сега, ако желаете, преместете го в папка, където можете да го намерите в бъдеще. Използвам директория, наречена „данни“, добавена към папките ми Arduino.

За съжаление изтегленият.zip файл не включва примерни скици и би било хубаво да добавите библиотеката и примерите към Arduino IDE. Във файла README.md има минимален пример, който може да бъде копиран и поставен в скица и запазен. Това е един от начините да продължите.

Вариант 2

За да улесня изпълнението на кода в тази инструкция, добавих минималния пример по -горе и примерите, показани тук, към библиотеката и прикачих.zip файл по -долу, който ще се инсталира в Arduino IDE.

Изтеглете zip файла по -долу. Преместете това в по -добра папка, ако желаете.

Стартирайте Arduino IDE. Щракнете върху Sketch> Include Library> Add zip file и изберете файла. Рестартирайте IDE. Сега IDE ще има инсталирана библиотека плюс всички примери, показани тук. Проверете, като щракнете върху Файл> примери >> MS5611-master. Трябва да бъдат изброени три скици.

Стъпка 2: Свържете сензора към Arduino и тествайте

Свържете сензора към Arduino и тествайте
Свържете сензора към Arduino и тествайте
Свържете сензора към Arduino и тествайте
Свържете сензора към Arduino и тествайте

Платките GY63/GY86 обикновено идват с заглавки, но не са запоени. Така че вашият избор е или да запоявате заглавките на място и да използвате мъжки и женски кабели на Dupont, или (както реших) да запоявате проводници директно към дъската и да добавите щифтове към проводника, за да включите в Arduino. Последната опция е по -добра, ако смятате, че може да искате да запоите дъската в проект по -късно. Първият е по -добър, ако искате да използвате дъската за експерименти. Разпаяването на проводниците е много по -лесно от заглавката на щифта.

Необходимите връзки са:

GY63/GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - A5 I2C часовник> SDA - A4 I2C данни

Прикрепете сензорната платка към Arduino както по -горе и свържете Arduino към компютъра/лаптопа чрез USB кабела. Също така покрийте сензора с някакъв непрозрачен/черен материал. Сензорът е чувствителен към светлина (какъвто е случаят с повечето от този тип сензори).

Стартирайте Arduino IDE. Щракнете върху:

Файл> примери >> MS5611-master> MS5611data2serial.

Със скицата ще се появи нов екземпляр на IDE. Щракнете върху бутона за качване (стрелка надясно).

След това стартирайте серийния плотер - щракнете върху Инструменти> Сериен плотер и ако е необходимо задайте бод на 9600. Изпратените данни са налягането в паскали. След около секунда той ще се измести отново и повдигането и спускането на сензора с примерно 0,3 м трябва да се покаже като спускане и повдигане на следата (по-ниската височина е по-високо налягане).

Данните имат известен шум. Вижте първия сюжет по -горе. Това може да се изглади с помощта на цифров филтър (наистина полезен инструмент).

Уравнението на филтъра е:

стойност = стойност + K (нова стойност)

където „стойност“е филтрираната информация, а „нова“е най -новото измерение. Ако K = 1 няма филтриране. За по -ниски стойности на K данните се изглаждат с времева константа от T/K, където T е времето между извадките. Тук T е около 17ms, така че стойност 0.1 дава времева константа от 170ms или около 1/6s.

Филтърът може да бъде добавен чрез:

Добавете променлива за филтрираните данни преди setup ():

поплавък филтриран = 0;

След това добавете уравнението на филтъра след налягането =…. линия.

филтриран = филтриран + 0,1*(филтриран под налягане);

Добра идея е филтрираната стойност да се инициализира на първо четене. Затова добавете изявление „ако“около горния ред, което прави това, така че да изглежда така:

if (филтрирано! = 0) {

филтриран = филтриран + 0,1*(филтриран под налягане); } else {филтрирано = налягане; // първо четене, така зададено филтриране на четене}

Тестът „! =“Не е „равен“. Така че, ако „филтриран“не е равен на 0, уравнението на филтъра се изпълнява, но ако е, то се настройва на отчитане на налягането.

Накрая трябва да променим „налягане“на „филтрирано“в израза Serial.println, за да видим филтрираната стойност.

Най -доброто обучение се постига чрез извършване на горните промени ръчно. Въпреки това ги включих в примера MS5611data2serialWfilter. Така че, ако има проблеми, примерът може да бъде зареден.

Сега качете кода в Arduino и вижте подобрението. Вижте втория график по -горе и отбележете, че Y скалата е разширена x2.

Опитайте по -ниска стойност за филтърната константа, кажете 0.02 вместо 0.1 и вижте разликата. Данните са по -гладки, но с по -бавен отговор. Това е компромис, който трябва да се търси при използването на този прост филтър. Характеристиката е същата като RC (съпротивление и капацитет) филтър, широко използван в електронни схеми.

Стъпка 3: Направете го самостоятелен

Сега ще добавим щит за LCD клавиатура, ще преобразуваме налягането във височина в метри и ще го покажем на дисплея. Ще добавим и възможност за нулиране на стойността чрез натискане на бутона „Избор“на клавиатурата.

С LCD екрана на Arduino сензорът ще трябва да бъде свързан към LCD екрана. За съжаление LCD екраните обикновено идват без подходящи гнезда. Така че вариантите са да се направят спойки или да се вземе някаква гнездо за гнездо. Socket strip се предлага в ebay за не повече от цената на пощенските разходи. Потърсете „2,54 мм лента за гнездо“и потърсете такива, подобни на тези на Arduino. Обикновено те идват с дължина 36 или 40 пина. Бих избегнал завъртаните щифтове, тъй като те не са достатъчно дълбоки за стандартните кабели на Dupont.

Гнездовата лента трябва да бъде отрязана на дължина и изрязването трябва да бъде направено на същото място като щифт. Така че за 6 -пинова лента - премахнете 7 -тата игла с няколко фини клещи, след това изрежете на това място с помощта на млад трион. Изпилям краищата, за да ги направя спретнати.

Уверете се, че няма споени мостове, когато ги запоявате върху дъската.

С подходящото решение за свързване на сензора включете LCD екрана към Arduino и свържете сензора същите щифтове - но сега върху LCD екрана.

Подгответе и батерията и проводника. Измислих моето олово от части в кошчето за скрап, но те също са налични в ebay - включително хубава опция, която включва кутия за батерии и превключвател. Потърсете „PP3 2.1 мм олово“.

Консумацията на ток е около 80ma. Следователно, ако искате да работите повече от няколко минути, помислете за по -голяма 9v батерия от PP3.

Стъпка 4: Добавете код за надморска височина и LCD

Image
Image

Трябва да направим малко повече кодиране, за да преобразуваме налягането във височина и да управляваме дисплея.

В началото на скицата добавете библиотеката на дисплея и кажете това какви пинове се използват:

#включва

// инициализираме библиотеката с номерата на интерфейсните щифтове LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

След това се нуждаем от някои променливи и функция за четене на бутоните на клавиатурата. Всички те са свързани към аналогов вход A0. Всеки бутон дава различно напрежение на A0. Търсене на „код на бутоните на lcd щита arduino“намери добър код на адрес:

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

Добавете този код преди setup ():

// дефинираме някои стойности, използвани от панела и бутоните

int lcd_key = 0; int adc_key_in = 0; #дефинирайте btnRIGHT 0 #дефинирайте btnUP 1 #дефинирайте btnDOWN 2 #дефинирайте btnLEFT 3 #дефинирайте btnSELECT 4 #дефинирайте btnNONE 5 // прочетете бутоните int read_LCD_buttons () {adc_key_in = analogRead (0); // чета стойността от сензора // бутоните ми при четене са центрирани на тези стойности: 0, 144, 329, 504, 741 // добавяме приблизително 50 към тези стойности и проверяваме дали сме близо (if_cl_in> 1000) връщане btnNONE; // Ние правим тази първа опция поради причини за скоростта, тъй като това ще бъде най -вероятният резултат, ако (adc_key_in <50) върне btnRIGHT; if (adc_key_in <250) връща btnUP; if (adc_key_in <450) връща btnDOWN; if (adc_key_in <650) връща btnLEFT; if (adc_key_in <850) връща btnSELECT; връщане btnNONE; // когато всички други се провалят, върнете това …}

Надморската височина обикновено се нулира в началната точка. Така че имаме нужда от променливи както за височина, така и за справка. Добавете ги преди setup () и горната функция:

поплавък mtr;

поплавък ref = 0;

Преобразуването от налягане в паскали в метри е почти точно деление на 12 на морското равнище. Тази формула е подходяща за повечето наземни измервания. Има по -точни формули, които са по -подходящи за преобразуване на голяма надморска височина. Използвайте тези, ако ще използвате това, за да запишете височината на полет с балон.

Референцията трябва да бъде зададена за първото отчитане на налягането, така че да започнем от нулева височина и при натискане на бутона SELECT. Добавете след кода на филтъра и преди израза Serial.println:

ако (ref == 0) {

ref = филтриран/12,0; } if (read_LCD_buttons () == btnSELECT) {ref = filtered/12.0; }

След това добавете изчислението на височината:

mtr = ref - филтриран/12,0;

Накрая променете израза Serial.println, за да изпратите „mtr“вместо „филтриран“, и добавете код, за да изпратите „mtr“на LCD дисплея:

Serial.println (mtr); // Изпращане на налягане чрез сериен (UART)

lcd.setCursor (0, 1); // ред 2 lcd.print (mtr);

Всички промени тук са включени в примера MS5611data2lcd. Заредете това както в стъпка 2.

Има един последен мод, който е полезен. Дисплеят е труден за четене, когато се актуализира 60 пъти в секунда. Нашият филтър изглажда данните с времева константа около 0.8s. Така че актуализирането на дисплея на всеки 0,3 секунди изглежда достатъчно.

Така че добавете брояч след всички други дефиниции на променливи в началото на скицата (например след float ref = 0;):

int i = 0;

След това добавете код към увеличаване на „i“и „if“израз, който да се изпълни, когато достигне 20, след което го върнете на нула и преместете командите Serial и lcd в оператора „if“, така че те се изпълняват само на всеки 20 -ти показател:

i += 1;

if (i> = 20) {Serial.println (mtr); // Изпращане на налягане чрез сериен (UART) lcd.setCursor (0, 1); // ред 2 lcd.print (mtr); i = 0; }

Не включих пример с тази последна промяна, за да насърча въвеждането на кода ръчно, което подпомага ученето.

Този проект трябва да даде добра отправна точка, например за цифров барометър. За тези, които биха искали да обмислят използването в RC модели - потърсете OpenXvario за код, който позволява алтиметър и вариометър за телеметрични системи Frsky и Turnigy 9x.

Препоръчано: