Spisu treści:

Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstracja: 4 kroki (ze zdjęciami)
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstracja: 4 kroki (ze zdjęciami)

Wideo: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstracja: 4 kroki (ze zdjęciami)

Wideo: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstracja: 4 kroki (ze zdjęciami)
Wideo: Высотомер с использованием платы Arduino и GY63 с датчиком MS5611. 2024, Lipiec
Anonim
Miarka atmosferyczna Arduino / demonstracja MS5611 GY63 GY86
Miarka atmosferyczna Arduino / demonstracja MS5611 GY63 GY86

To naprawdę jest barometr/wysokościomierz, ale przyczynę tego tytułu zobaczysz, oglądając wideo.

Czujnik ciśnienia MS5611, znajdujący się w tabliczkach zaciskowych Arduino GY63 i GY86, zapewnia niesamowitą wydajność. W spokojny dzień zmierzy Twój wzrost z dokładnością do 0,2m. Jest to skuteczny pomiar odległości od twojej głowy do przestrzeni kosmicznej i odejmowanie jej od odległości twoich stóp do przestrzeni kosmicznej (poprzez pomiar ciśnienia – czyli ciężaru powietrza powyżej). To spektakularne urządzenie ma zasięg, który wygodnie zmierzy wysokość Everestu - a także może zmierzyć do kilku cali.

Projekt ten miał być: projektem szkolnym, przykładem modyfikacji kodu Arduino i dobrym miejscem startowym do eksploracji z wykorzystaniem czujnika MS5611. Istnieje wiele pytań na forum od osób, które mają problemy z tym czujnikiem. Podejście tutaj sprawia, że korzystanie z niego jest bardzo proste. Po wykonaniu tego projektu będziesz dobrze przygotowany do tworzenia innych aplikacji związanych z ciśnieniem.

Każdy czujnik ma własne stałe kalibracyjne, które należy odczytać i wykorzystać do poprawienia danych. Dostępna jest biblioteka, która pomaga je prowadzić. Pokazany tutaj kod wykorzystuje bibliotekę do wykonywania odczytów, a następnie konwertuje je na wysokość i wyświetla na ekranie LCD.

Najpierw wyślemy dane do monitora szeregowego w komputerze PC/laptopie w celu przeprowadzenia wstępnych testów. Pokazują one trochę szumu, więc dodajemy filtr, aby je wygładzić. Następnie dodamy wyświetlacz LCD, aby urządzenie mogło działać niezależnie, a Ty możesz spróbować zmierzyć swój wzrost – lub cokolwiek innego.

Zauważ, że płyta GY63 ma tylko czujnik ciśnienia MS5611. GY86 nazywana jest płytą 10 stopni swobody i zawiera również 3-osiowy akcelerometr, 3-osiowy żyroskop i 3-osiowy magnetometr za kilka dolarów więcej.

Będziesz potrzebować:

1. Arduino UNO (lub inny ze standardowym pinoutem) i jego kabel USB

2. Płytka zaciskowa GY63 lub GY86

3. 4 przewody Dupont męskie-żeńskie - lub przewód łączący

4. Osłona klawiatury LCD Arduino

5. Bateria 9 V i ołów

6. Listwa zasilająca 2,54 mm (opcjonalna, ale zalecana)

Przygotowanie

Pobierz Arduino IDE (zintegrowane środowisko programistyczne) ze strony:

Trochę technicznych bitów na zainteresowanie

MS5611 zapewnia doskonałą wydajność dzięki uśrednianiu dużej liczby pomiarów. Może wykonać 4096 3-bajtowych (24-bitowych) pomiarów analogowych w zaledwie 8 ms i podać średnią wartość. Musi mierzyć zarówno ciśnienie, jak i temperaturę, dzięki czemu dane dotyczące ciśnienia mogą być korygowane o temperaturę wewnętrzną. Dzięki temu może dostarczyć około 60 par odczytów ciśnienia i temperatury na sekundę.

Karta danych jest dostępna pod adresem:

Komunikacja odbywa się przez I2C. Więc inne czujniki I2C mogą współdzielić magistralę (tak jak w przypadku płyty GY86 10DOF, gdzie wszystkie chipy są na I2C).

Krok 1: Uzyskaj bibliotekę MS5611

Wiele czujników Arduino korzysta ze standardowej biblioteki dołączonej do Arduino IDE lub jest dostarczanych z plikiem zip z biblioteką, którą można łatwo zainstalować. Zwykle tak nie jest w przypadku czujników MS5611. Jednak znaleziono wyszukiwanie: https://github.com/gronat/MS5611, która zawiera bibliotekę dla MS5611, w tym wykonanie korekcji temperatury.

opcja 1

Przejdź do powyższej witryny, kliknij „Klonuj lub Pobierz” i wybierz „Pobierz ZIP”. Powinno to dostarczyć plik MS5611-master.zip do katalogu pobierania. Teraz, jeśli chcesz, przenieś go do folderu, w którym możesz go znaleźć w przyszłości. Używam katalogu o nazwie „data” dodanego do moich folderów Arduino.

Niestety pobrany plik.zip nie zawiera żadnych przykładowych szkiców i fajnie byłoby dodać bibliotekę i przykłady do Arduino IDE. Istnieje minimalny przykład w pliku README.md, który można skopiować i wkleić do szkicu i zapisać. To jeden ze sposobów na rozpoczęcie działalności.

Opcja 2

Aby ułatwić uruchomienie kodu w tej instrukcji, dodałem minimalny przykład powyżej i przykłady pokazane tutaj do biblioteki i załączyłem plik.zip poniżej, który zostanie zainstalowany w Arduino IDE.

Pobierz plik zip poniżej. Przenieś to do lepszego folderu, jeśli chcesz.

Uruchom środowisko Arduino IDE. Kliknij Szkic>Dołącz bibliotekę>Dodaj plik zip i wybierz plik. Uruchom ponownie środowisko IDE. IDE będzie teraz mieć zainstalowaną bibliotekę oraz wszystkie pokazane tutaj przykłady. Sprawdź, klikając Plik>przykłady>>MS5611-master. Należy wymienić trzy szkice.

Krok 2: Podłącz czujnik do Arduino i przetestuj

Podłącz czujnik do Arduino i przetestuj
Podłącz czujnik do Arduino i przetestuj
Podłącz czujnik do Arduino i przetestuj
Podłącz czujnik do Arduino i przetestuj

Płyty GY63/GY86 są zwykle dostarczane z nagłówkami, ale nie są lutowane. Więc to twój wybór, czy przylutować nagłówki na miejscu i użyć przewodów Dupont męsko-żeńskich, albo (jak zdecydowałem) przylutować przewody bezpośrednio do płyty i dodać szpilki do przewodu, aby podłączyć do Arduino. Ta druga opcja jest lepsza, jeśli myślisz, że możesz później przylutować płytkę do projektu. Ten pierwszy jest lepszy, jeśli chcesz użyć tablicy do eksperymentów. Wylutowywanie wyprowadzeń jest znacznie łatwiejsze niż nagłówek pinów.

Wymagane połączenia to:

Arduino GY63/GY86

VCC - 5v Zasilanie GND - GND Uziemienie SCL - A5 Zegar I2C >SDA - A4 Dane I2C

Podłącz płytkę czujnika do Arduino jak powyżej i podłącz Arduino do komputera PC/laptopa za pomocą przewodu USB. Przykryj również czujnik jakimś nieprzezroczystym/czarnym materiałem. Czujnik jest wrażliwy na światło (jak w przypadku większości tego typu czujników).

Uruchom środowisko Arduino IDE. Kliknij:

Plik>przykłady>>MS5611-master>MS5611data2serial.

Wraz ze szkicem pojawi się nowe wystąpienie IDE. Kliknij przycisk przesyłania (strzałka w prawo).

Następnie uruchom ploter szeregowy – kliknij Narzędzia>Ploter szeregowy i w razie potrzeby ustaw prędkość transmisji na 9600. Wysyłane dane to ciśnienie w paskalach. Po około sekundzie przeskaluje i podniesienie i obniżenie czujnika o powiedzmy 0,3m powinno pokazać obniżanie i podnoszenie śladu (niższa wysokość to wyższe ciśnienie).

Dane mają trochę szumu. Zobacz pierwszy wykres powyżej. Można to wygładzić za pomocą filtra cyfrowego (bardzo przydatne narzędzie).

Równanie filtra to:

wartość = wartość + K(nowa-wartość)

gdzie „wartość” to przefiltrowane dane, a „nowy” to ostatni pomiar. Jeśli K=1 nie ma filtrowania. Dla niższych wartości K dane są wygładzane ze stałą czasową T/K, gdzie T jest czasem między próbkami. Tutaj T wynosi około 17ms, więc wartość 0,1 daje stałą czasową 170ms lub około 1/6s.

Filtr można dodać poprzez:

Dodaj zmienną dla przefiltrowanych danych przed setup():

pływak filtrowany = 0;

Następnie dodaj równanie filtra po ciśnieniu = …. linia.

filtrowane = filtrowane + 0,1*(filtrowane ciśnieniowo);

Dobrym pomysłem jest inicjalizacja filtrowanej wartości do pierwszego odczytu. Dodaj więc instrukcję „if” wokół powyższej linii, która to robi, tak aby wyglądało to tak:

jeśli(filtrowane != 0){

filtrowane = filtrowane + 0,1*(filtrowane ciśnieniowo); } else { filtrowane = ciśnienie; // pierwsze czytanie, więc ustaw filtrowane na czytanie }

Test „!=” jest „nie równy”. Więc jeśli „filtrowane” nie jest równe 0, równanie filtra jest wykonywane, ale jeśli tak, to jest ustawiane na odczyt ciśnienia.

Na koniec musimy zmienić „ciśnienie” na „filtrowane” w instrukcji Serial.println, aby zobaczyć przefiltrowaną wartość.

Najlepszą naukę osiąga się poprzez ręczne wprowadzanie powyższych zmian. Jednak umieściłem je w przykładzie MS5611data2serialWfilter. Więc jeśli są problemy, przykład można załadować.

Teraz prześlij kod do Arduino i zobacz poprawę. Zobacz drugi wykres powyżej i zauważ, że skala Y jest rozszerzona x2.

Wypróbuj niższą wartość stałej filtra, powiedzmy 0,02 zamiast 0,1, i zobacz różnicę. Dane są płynniejsze, ale z wolniejszą reakcją. Jest to kompromis, którego należy szukać, korzystając z tego prostego filtra. Charakterystyka jest taka sama jak filtr RC (rezystancyjny i pojemnościowy) szeroko stosowany w obwodach elektronicznych.

Krok 3: Uczyń go samodzielnym

Teraz dodamy osłonę klawiatury LCD, przeliczymy ciśnienie na wysokość w metrach i pokażemy to na wyświetlaczu. Dodamy również możliwość zerowania wartości, naciskając przycisk „Wybierz” na klawiaturze.

W przypadku ekranu LCD na Arduino czujnik będzie musiał być podłączony do ekranu LCD. Niestety ekrany LCD zwykle są dostarczane bez odpowiednich gniazd. Tak więc opcje to wykonanie połączeń lutowanych lub uzyskanie listwy zasilającej. Listwa zasilająca jest dostępna w serwisie eBay za niewiele więcej niż koszt przesyłki. Wyszukaj „listwę gniazdową 2,54 mm” i poszukaj tych, które są podobne do tych na Arduino. Zazwyczaj występują one w długości 36 lub 40 pinów. Unikałbym szpilek toczonych, ponieważ nie są wystarczająco głębokie dla standardowych przewodów Dupont.

Listwę gniazdową należy przyciąć na odpowiednią długość, a nacięcie wykonać w tym samym miejscu, co kołek. Tak więc w przypadku paska z 6 pinami – usuń siódmą pinezkę za pomocą cienkich szczypiec, a następnie przetnij w tym miejscu piłą do metalu. Piłuję końce, żeby były schludne.

Upewnij się, że nie ma mostków lutowniczych podczas lutowania ich na płytce.

Przy odpowiedniej decyzji o podłączeniu czujnika wpinamy ekran LCD do Arduino i podłączamy czujnik tymi samymi pinami – ale teraz na ekranie LCD.

Przygotuj również baterię i ołów. Skomponowałem ołów z części w moim koszu na złom, ale są one również dostępne w serwisie eBay – w tym fajna opcja, która zawiera pojemnik na baterie i przełącznik. Wyszukaj „Ołów PP3 2,1 mm”.

Pobór prądu wynosi około 80mA. Dlatego jeśli chcesz działać dłużej niż kilka minut, rozważ większą baterię 9V niż PP3.

Krok 4: Dodaj kod dla wysokości i wyświetlacza LCD

Image
Image

Musimy trochę więcej kodować, aby przekonwertować ciśnienie na wysokość i sterować wyświetlaczem.

Na początku szkicu dodaj bibliotekę wyświetlania i powiedz, jakie szpilki są używane:

#włączać

// zainicjuj bibliotekę numerami pinów interfejsu LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Następnie potrzebujemy kilku zmiennych i funkcji do odczytywania przycisków klawiatury. Wszystkie są podłączone do wejścia analogowego A0. Każdy przycisk podaje inne napięcie do A0. Wyszukiwanie „kodu przycisków tarczy LCD arduino” znalazło dobry kod pod adresem:

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

Dodaj ten kod przed setup():

// zdefiniuj niektóre wartości używane przez panel i przyciski

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 // odczytaj przyciski int read_LCD_buttons() { adc_key_in = analogRead(0); // odczytaj wartość z czujnika // moje przyciski przy odczycie są wyśrodkowane na tych wartościach: 0, 144, 329, 504, 741 // dodajemy ok 50 do tych wartości i sprawdzamy czy jesteśmy blisko jeśli (adc_key_in > 1000) zwrot btnBRAK; // Uczynimy to pierwszą opcją ze względu na szybkość, ponieważ będzie to najbardziej prawdopodobny wynik, jeśli (adc_key_in < 50) return btnRIGHT; jeśli (adc_key_in < 250) zwraca btnUP; jeśli (adc_key_in < 450) zwróć btnDOWN; jeśli (adc_key_in < 650) zwraca btnLEFT; if (adc_key_in < 850) zwróć btnSELECT; powrót btnBRAK; // gdy wszystkie inne zawiodą, zwróć to… }

Wysokość jest zwykle zerowana w punkcie początkowym. Potrzebujemy więc zmiennych zarówno dla wysokości, jak i odniesienia. Dodaj je przed setup() i powyższą funkcją:

pływak mtr;

pływak ref = 0;

Przeliczenie ciśnienia w paskalach na metry to prawie dokładnie dzielenie przez 12 na poziomie morza. Ta formuła jest odpowiednia dla większości pomiarów naziemnych. Istnieją dokładniejsze formuły, które są bardziej odpowiednie do konwersji na dużych wysokościach. Użyj ich, jeśli zamierzasz użyć tego do rejestrowania wysokości lotu balonem.

Odniesienie powinno być ustawione na pierwszy odczyt ciśnienia, więc zaczynamy od wysokości zerowej i po naciśnięciu przycisku SELECT. Dodaj po kodzie filtra, a przed instrukcją Serial.println:

jeśli (ref == 0){

ref = przefiltrowane/12,0; } if(read_LCD_buttons() == btnSELECT) { ref = przefiltrowane/12,0; }

Następnie dodaj obliczenie wysokości:

mtr = ref - przefiltrowane/12,0;

Na koniec zmień instrukcję Serial.println, aby wysyłała „mtr” zamiast „filtrowane” i dodaj kod, aby wysłać „mtr” na wyświetlacz LCD:

Serial.println(mtr); // Wyślij ciśnienie przez port szeregowy (UART)

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

Wszystkie zmiany tutaj zawarte są w przykładzie MS5611data2lcd. Załaduj to jak w kroku 2.

Jest jeszcze jeden mod, który jest pomocny. Wyświetlacz jest trudny do odczytania, gdy jest aktualizowany 60 razy na sekundę. Nasz filtr wygładza dane ze stałą czasową około 0,8s. Dlatego aktualizacja wyświetlacza co 0,3 s wydaje się wystarczająca.

Dodaj więc licznik po wszystkich innych definicjach zmiennych na początku szkicu (np. po float ref=0;):

int i = 0;

Następnie dodaj kod, aby zwiększyć „i” i instrukcję „if”, aby uruchomić ją, gdy osiągnie 20, a następnie ustaw ją z powrotem na zero i przenieś polecenia Serial i lcd w ramach instrukcji „if”, aby były wykonywane tylko co 20. odczyt:

ja += 1;

if(i>=20) { Serial.println(mtr); // Wyślij ciśnienie przez port szeregowy (UART) lcd.setCursor(0, 1); // linia 2 lcd.print(mtr); i = 0; }

Nie zamieściłem przykładu z tą ostatnią modyfikacją, aby zachęcić do ręcznego wpisywania kodu ułatwiającego naukę.

Ten projekt powinien dać dobry punkt wyjścia np. dla barometru cyfrowego. Dla tych, którzy mogą chcieć rozważyć użycie w modelach RC - wyszukaj OpenXvario dla kodu, który włącza wysokościomierz i wariometr dla systemów telemetrycznych Frsky i Turnigy 9x.

Zalecana: