Cuprins:

Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație: 4 pași (cu imagini)
Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație: 4 pași (cu imagini)

Video: Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație: 4 pași (cu imagini)

Video: Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație: 4 pași (cu imagini)
Video: Arduino desde cero en Español - Capítulo 36 - BMP280 Presión atmosférica, 🌡️Temperatura, Altitud 2024, Iulie
Anonim
Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație
Banda de măsurare atmosferică Arduino / MS5611 GY63 GY86 Demonstrație

Acesta este într-adevăr un barometru / altimetru, dar veți vedea motivul titlului uitându-vă la videoclip.

Senzorul de presiune MS5611, găsit pe plăcile de separare Arduino GY63 și GY86, oferă performanțe uimitoare. Într-o zi calmă, vă va măsura înălțimea până la 0,2m. Aceasta este măsurarea efectivă a distanței dintre cap și spațiul exterior și scăderea acestuia de la distanța picioarelor voastre până la spațiul exterior (prin măsurarea presiunii - adică greutatea aerului de deasupra). Acest dispozitiv spectaculos are o gamă care va măsura confortabil înălțimea Everestului și se poate măsura și la câțiva centimetri.

Acest proiect a avut ca scop: un proiect de școli, un exemplu de modificare a codului Arduino și un bun loc de pornire pentru a explora folosind senzorul MS5611. Există o mulțime de întrebări pe forum de la cei care au dificultăți cu acest senzor. Abordarea de aici face ca utilizarea sa să fie foarte simplă. După ce ați făcut acest proiect, veți fi bine echipat pentru a dezvolta alte aplicații legate de presiune.

Fiecare senzor are propriile sale constante de calibrare care trebuie citite și utilizate pentru a corecta datele. Există o bibliotecă disponibilă pentru a ajuta la generarea acestora. Codul afișat aici folosește biblioteca pentru a face citiri, apoi le convertește în înălțime și le afișează pe un ecran LCD.

Mai întâi vom trimite datele către monitorul serial de pe computer / laptop pentru testele inițiale. Acestea arată un pic de zgomot și astfel adăugăm un filtru pentru a le netezi. Apoi vom adăuga un afișaj LCD, astfel încât unitatea să funcționeze independent și puteți încerca să vă măsurați înălțimea - sau orice altceva.

Rețineți că placa GY63 are doar senzorul de presiune MS5611. GY86 este numit o placă de 10 grade de libertate și include, de asemenea, un accelerometru pe 3 axe, un giroscop cu 3 axe și un magnetometru pe 3 axe pentru doar câțiva dolari în plus.

Vei avea nevoie:

1. Arduino UNO (sau altul cu pinout standard) și cablul său USB

2. Placă GY63 sau GY86

3. 4 Dupont conduce tată-mamă - sau fir de legătură

4. Scutul tastaturii LCD Arduino

5. Baterie și plumb de 9v

6. Benzi de priză de 2,54 mm (opțional, dar recomandat)

Pregătirea

Descărcați Arduino IDE (mediu de dezvoltare integrat) de la:

Unele biți tehnici de interes

MS5611 oferă performanțele sale excelente prin media unui număr mare de măsurători. Poate face 4096 măsurători analogice de 3 octeți (24 biți) în doar 8 ms și poate da valoarea medie. Trebuie să măsoare atât presiunea, cât și temperatura, astfel încât datele de presiune să poată fi corectate pentru temperatura internă. Prin urmare, poate furniza aproximativ 60 de perechi de citiri de presiune și temperatură pe secundă.

Fișa tehnică este disponibilă la:

Comunicațiile sunt prin I2C. Deci, alți senzori I2C pot partaja magistrala (cum este cazul pe placa GY86 10DOF unde toate cipurile sunt pe I2C).

Pasul 1: obțineți o bibliotecă MS5611

Mulți dintre senzorii Arduino utilizează fie o bibliotecă standard care este inclusă cu IDE Arduino, fie sunt furnizate cu un fișier zip cu o bibliotecă care poate fi instalată cu ușurință. Acest lucru tinde să nu fie cazul senzorilor MS5611. Cu toate acestea, a fost găsită o căutare: https://github.com/gronat/MS5611 care are o bibliotecă pentru MS5611, inclusiv efectuarea corectării temperaturii.

Opțiunea 1

Accesați site-ul web de mai sus, faceți clic pe „Clonați sau descărcați” și selectați „Descărcați codul ZIP”. Aceasta ar trebui să livreze MS5611-master.zip în directorul dvs. de descărcări. Acum, dacă doriți, mutați-l într-un dosar unde îl veți găsi în viitor. Folosesc un director numit „date” adăugat în folderele mele Arduino.

Din păcate, fișierul.zip descărcat nu include exemple de schițe și ar fi bine să adăugați biblioteca și exemple la IDE-ul Arduino. Există un exemplu minim în fișierul README.md care poate fi copiat și lipit într-o schiță și salvat. Aceasta este o modalitate de a începe.

Opțiunea 2

Pentru a face mai ușoară rularea codului în acest instructable, am adăugat exemplul minim de mai sus și exemplele prezentate aici în bibliotecă și am atașat un fișier.zip de mai jos care se va instala în IDE-ul Arduino.

Descărcați fișierul zip de mai jos. Mutați acest lucru într-un folder mai bun, dacă doriți.

Porniți IDE-ul Arduino. Faceți clic pe Schiță> Includeți bibliotecă> Adăugați fișier zip și selectați fișierul. Reporniți IDE-ul. IDE va avea acum ambele biblioteca instalată plus toate exemplele prezentate aici. Verificați făcând clic pe Fișier> exemple >> MS5611-master. Trebuie enumerate trei schițe.

Pasul 2: Conectați senzorul la Arduino și testați

Conectați senzorul la Arduino și testați
Conectați senzorul la Arduino și testați
Conectați senzorul la Arduino și testați
Conectați senzorul la Arduino și testați

Plăcile GY63 / GY86 vin de obicei cu anteturi, dar nu sunt lipite. Așadar, este alegerea dvs. fie să lipiți anteturile la locul lor și să folosiți cabluri Dupont de tip masculin-feminin, fie (așa cum am decis) cabluri de lipit direct la bord și să adăugați pini la cablu pentru a le conecta la Arduino. Ultima opțiune este mai bună dacă credeți că ați putea dori să lipiți placa într-un proiect mai târziu. Primul este mai bun dacă doriți să utilizați placa pentru experimentare. Cablurile de soldare sunt mult mai ușoare decât anteturile cu pini.

Conexiunile necesare sunt:

GY63 / GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - A5 I2C clock> SDA - A4 I2C data

Atașați placa senzorului la Arduino ca mai sus și conectați Arduino la computer / laptop prin cablul USB. De asemenea, acoperiți senzorul cu un material opac / negru. Senzorul este sensibil la lumină (așa cum este cazul majorității acestui tip de senzor).

Porniți IDE-ul Arduino. Clic:

Fișier> exemple >> MS5611-master> MS5611data2serial.

O nouă instanță a IDE va apărea împreună cu schița. Faceți clic pe butonul de încărcare (săgeata dreapta).

Apoi porniți serialul - faceți clic pe Instrumente> Serial Plotter și, dacă este necesar, setați baudul la 9600. Datele trimise sunt presiunea în Pascali. După o secundă sau cam așa se va redimensiona și ridicarea și coborârea senzorului cu 0,3 m ar trebui să arate ca coborârea și ridicarea urmelor (înălțimea mai mică este o presiune mai mare).

Datele au ceva zgomot. A se vedea primul complot de mai sus. Acest lucru poate fi netezit folosind un filtru digital (un instrument cu adevărat util).

Ecuația filtrului este:

valoare = valoare + K (valoare nouă)

unde „valoare” este datele filtrate, iar „nou” este cea mai recentă măsurătoare. Dacă K = 1 nu există filtrare. Pentru valori mai mici de K, datele sunt netezite cu o constantă de timp de T / K, unde T este timpul dintre eșantioane. Aici T este în jur de 17 ms, deci o valoare de 0,1 dă o constantă de timp de 170 ms sau aproximativ 1 / 6s.

Filtrul poate fi adăugat de:

Adăugați o variabilă pentru datele filtrate înainte de configurare ():

float filtrat = 0;

Apoi adăugați ecuația filtrului după presiunea =…. linia.

filtrat = filtrat + 0,1 * (filtrat sub presiune);

Este o idee bună să inițializezi valoarea filtrată la prima lectură. Deci, adăugați o declarație „dacă” în jurul liniei de mai sus care face acest lucru, astfel încât să arate ca:

if (filtrat! = 0) {

filtrat = filtrat + 0,1 * (filtrat sub presiune); } else {filtrat = presiune; // prima lectură, așa că setul filtrat la citire}

Testul „! =” Nu este „egal”. Deci, dacă „filtrat” nu este egal cu 0, ecuația filtrului este executată, dar dacă este, atunci este setată la citirea presiunii.

În cele din urmă, trebuie să schimbăm „presiunea” în „filtrat” în instrucțiunea Serial.println, astfel încât să vedem valoarea filtrată.

Cea mai bună învățare se realizează prin efectuarea manuală a modificărilor de mai sus. Cu toate acestea, le-am inclus în exemplul MS5611data2serialWfilter. Deci, dacă există probleme, exemplul poate fi încărcat.

Acum încărcați codul pe Arduino și vedeți îmbunătățirea. Vedeți al doilea grafic de mai sus și observați că scala Y este extinsă x2.

Încercați o valoare mai mică pentru constanta filtrului, să spunem 0,02 în loc de 0,1 și vedeți diferența. Datele sunt mai fine, dar cu un răspuns mai lent. Acesta este un compromis care trebuie căutat atunci când se utilizează acest filtru simplu. Caracteristica este aceeași cu un filtru RC (rezistență și capacitate) utilizat pe scară largă în circuitele electronice.

Pasul 3: faceți-o independentă

Acum vom adăuga un ecran LCD pentru tastatură, vom converti presiunea la înălțime în metri și o vom afișa pe ecran. Vom adăuga, de asemenea, posibilitatea de a zero valoarea prin apăsarea butonului tastatură „Selectare”.

Cu ecranul LCD de pe Arduino, senzorul va trebui conectat la ecranul LCD. Din păcate, ecranele LCD vin de obicei fără prize adecvate. Deci, opțiunile sunt de a face conexiuni de lipit sau de a obține niște benzi de priză. Banda de priză este disponibilă pe eBay pentru nu mult mai mult decât costul poștal. Efectuați o căutare pe „banda de soclu de 2,54 mm” și căutați altele similare cu cele de pe Arduino. Acestea vin de obicei în lungimi de 36 sau 40 de pini. Aș evita cele cu pini întoarse, deoarece acestea nu sunt suficient de adânci pentru cablurile Dupont standard.

Banda de soclu trebuie tăiată la lungime, iar tăierea trebuie făcută în același loc cu un știft. Deci, pentru o bandă cu 6 pini - scoateți al șaptelea pin cu niște clești fini, apoi tăiați-l în acel loc folosind un ferăstrău junior. Depun capetele pentru a le face îngrijite.

Asigurați-vă că nu există punți de lipit atunci când le lipiți pe tablă.

Cu decizia corespunzătoare privind conectarea senzorului, conectați ecranul LCD la Arduino și conectați senzorul la aceiași pini - dar acum pe ecranul LCD.

De asemenea, pregătiți bateria și cablul. Mi-am alcătuit din piese din coșul de gunoi, dar sunt disponibile și pe eBay - inclusiv o opțiune drăguță care include o cutie de baterii și un comutator. Căutați pe „PP3 2.1mm lead”.

Consumul actual este de aproximativ 80ma. Prin urmare, dacă doriți să rulați mai mult de câteva minute, luați în considerare o baterie mai mare de 9v decât PP3.

Pasul 4: Adăugați cod pentru altitudine și ecranul LCD

Image
Image

Trebuie să facem un pic mai mult de codificare pentru a converti presiunea în înălțime și pentru a conduce afișajul.

La începutul schiței adăugați biblioteca de afișare și spuneți-i ce pini sunt utilizați:

#include

// inițializați biblioteca cu numerele pinilor de interfață LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

În continuare avem nevoie de câteva variabile și o funcție pentru a citi butoanele tastaturii. Toate acestea sunt conectate la intrarea analogică A0. Fiecare buton dă o tensiune diferită lui A0. O căutare pe „codul butoanelor ecranului LCD arduino” a găsit un cod bun la:

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

Adăugați acest cod înainte de configurare ():

// definiți câteva valori utilizate de panou și butoane

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 // citiți butoanele int read_LCD_buttons () {adc_key_in = analogRead (0); // citiți valoarea din senzor // butoanele mele când sunt citite sunt centrate pe aceste valori: 0, 144, 329, 504, 741 // adăugăm aproximativ 50 la acele valori și verificăm dacă suntem aproape dacă (adc_key_in> 1000) returnează btnNONE; // Facem din aceasta prima opțiune din motive de viteză, deoarece va fi cel mai probabil rezultat dacă (adc_key_in <50) returnează btnRIGHT; if (adc_key_in <250) returnează btnUP; if (adc_key_in <450) returnează btnDOWN; if (adc_key_in <650) returnează btnLEFT; if (adc_key_in <850) returnează btnSELECT; returnează btnNONE; // când toți ceilalți eșuează, returnează acest lucru …}

Altitudinea este de obicei redusă la zero la punctul de plecare. Deci, avem nevoie de variabile atât pentru înălțime, cât și pentru referință. Adăugați acestea înainte de configurare () și funcția de mai sus:

float mtr;

float ref = 0;

Conversia de la presiunea în Pascali la metri este aproape exact o divizare cu 12 la nivelul mării. Această formulă este bună pentru majoritatea măsurătorilor de la sol. Există formule mai precise care sunt mai potrivite pentru conversia la altitudini mari. Folosiți-le dacă doriți să le utilizați pentru a înregistra altitudinea unui zbor cu balonul.

Referința trebuie setată la prima citire a presiunii, astfel încât să începem la înălțimea zero și când este apăsat butonul SELECT. Adăugați, după codul de filtrare și înainte de instrucțiunea Serial.println:

if (ref == 0) {

ref = filtrat / 12.0; } if (read_LCD_buttons () == btnSELECT) {ref = filtrat / 12.0; }

După aceasta adăugați calculul înălțimii:

mtr = ref - filtrat / 12.0;

În cele din urmă, modificați instrucțiunea Serial.println pentru a trimite „mtr” în loc de „filtrat” și adăugați cod pentru a trimite „mtr” pe ecranul LCD:

Serial.println (mtr); // Trimite presiune prin serial (UART)

lcd.setCursor (0, 1); // linia 2 lcd.print (mtr);

Toate modificările de aici sunt incluse în exemplul MS5611data2lcd. Încărcați acest lucru ca la pasul 2.

Există un ultim mod care este util. Afișajul este greu de citit atunci când este actualizat de 60 de ori pe secundă. Filtrul nostru netezește datele cu o constantă de timp de aproximativ 0,8 secunde. Așadar, actualizarea afișajului la fiecare 0,3 s pare suficientă.

Așadar, adăugați un contor după toate celelalte definiții ale variabilelor la începutul schiței (de exemplu, după float ref = 0;):

int i = 0;

Apoi adăugați cod pentru a incrementa „i” și o instrucțiune „if” pentru a rula când ajunge la 20 și apoi setați-l la zero și mutați comenzile Serial și LCD în instrucțiunea „if”, astfel încât acestea să fie executate doar la fiecare a 20-a lectură:

i + = 1;

if (i> = 20) {Serial.println (mtr); // Trimite presiune prin serial (UART) lcd.setCursor (0, 1); // linia 2 lcd.print (mtr); i = 0; }

Nu am inclus un exemplu cu această ultimă modificare pentru a încuraja introducerea manuală a codului care ajută învățarea.

Acest proiect ar trebui să ofere un bun punct de plecare, de exemplu, pentru un barometru digital. Pentru cei care ar putea dori să ia în considerare utilizarea în modelele RC - căutați OpenXvario pentru cod care să permită un altimetru și un variometru pentru sistemele de telemetrie Frsky și Turnigy 9x.

Recomandat: