Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Witaj w moim pierwszym instruktażu! Mam nadzieję, że uznasz to za pouczające. Prosimy o wystawienie opinii, zarówno pozytywnej, jak i negatywnej.
Ten projekt ma na celu stworzenie cyfrowej poziomicy opartej na arduino i MPU6050. Podczas gdy gotowy projekt i kod są moje, oryginalna koncepcja i znaczna część kodu, nad którym pracowałem, nie są. Nie interesuje mnie plagiat, więc jestem bardziej niż szczęśliwy, mogąc pochwalić się pomysłami, na których zbudowałem. Dwie główne osoby, którym chcę się pochwalić, to Paul McWhorter z YouTubera i Warsztat DroneBot. Dołączam linki do nich w moim youtube przydatnych linkach PDF. Dziękuję również EEEnthusiast za jego film informacyjny na temat korzystania z MPU6050, w tym konfigurację i odczyt z modułu bez zewnętrznej biblioteki (jego link jest w tym samym pliku PDF).
Projekt, który wyprodukowałem, działa „tak jak jest” i jest dość dokładny, na pewno do 45% w obie strony. Możesz go używać dokładnie tak, jak go zaprojektowałem, lub możesz dostosować go do własnych upodobań. Bardziej bystrzy z Was zauważy, że mój projekt wygląda prawie identycznie jak ten wyprodukowany przez warsztat DroneBot, ale zapewniam, że są znaczne różnice, zwłaszcza jeśli chodzi o kod do obliczania kątów, plus możliwość przechowywania wartości kalibracji w eeprom!
Niektóre funkcje, które zaostrzą Twój apetyt:
Dostępne kąty pochylenia i obrotu z dokładnością do 0,1 stopnia.
Automatyczne wykrywanie orientacji żyroskopu (pozioma lub pionowa)
Pełna kalibracja z wynikami automatycznie zapisywanymi w eeprom
Sygnalizacja LED od -2 do +2 stopni (możliwość zmiany w kodzie)
Dodatkowa sygnalizacja dźwiękowa poziomu (można włączać/wyłączać w locie)
Kompaktowy obwód wymagający minimalnych komponentów
Zacznijmy.
Kieszonkowe dzieci
Ten projekt (tak jak jest) wykorzystuje następujące elementy:
1 x Arduino nano (mój to klon)
1 x moduł żyroskopu/akcelerometru MPU6050
1 x LCD - 16 x 2 + połączenie I2C
1 x naciśnij, aby zmienić przełącznik
1 x brzęczyk piezoelektryczny
1 x zielona dioda LED
2 x żółte diody LED
2 x czerwone diody LED
Rezystory 5 x 220 omów
Różne kable rozruchowe
Deska do krojenia chleba
Zasilanie (mój korzystał z power banku 5 V USB, gdy nie jest podłączony do mojego komputera, ale można użyć odpowiednio podłączonej baterii)
Krok 1: Obwód
Zakładając, że masz wszystkie komponenty, będziesz musiał zbudować swoją płytkę prototypową.
Pokazuję moją konfigurację jako przewodnik, ale połączenia są następujące:
Pin D2 Arduino łączy się z 1 strony przełącznika wciskanego. Druga strona przełącznika wciskanego łączy się z ziemią
Pin D3 Arduino łączy się z 1 stroną rezystora 220 omów. Druga strona rezystora jest podłączona do anody czerwonej diody LED. Katoda czerwonej diody LED przechodzi do masy.
Pin D4 Arduino łączy się z 1 stroną rezystora 220 omów. Druga strona rezystora jest podłączona do anody żółtej diody LED. Katoda żółtej diody LED przechodzi do masy.
Pin D5 Arduino łączy się z 1 stroną rezystora 220 omów. Druga strona rezystora jest podłączona do anody zielonej diody LED. Katoda zielonej diody LED przechodzi do masy.
Pin D6 Arduino łączy się z 1 stroną rezystora 220 omów. Druga strona rezystora jest podłączona do anody żółtej diody LED. Katoda żółtej diody LED przechodzi do masy.
Pin D7 Arduino łączy się z 1 stroną rezystora 220 omów. Druga strona rezystora jest podłączona do anody czerwonej diody LED. Katoda czerwonej diody LED przechodzi do masy.
Pin D8 Arduino łączy się z jednej strony brzęczyka Piezo. Druga strona brzęczyka łączy się z masą.
Pin A4 Arduino łączy się z pinami SDA na MPU6050 I LCD.
Pin A5 Arduino łączy się z pinami SCL na MPU6050 I LCD
Zasilanie 5V i Gnd dla MPU6050 i LCD pochodzą odpowiednio z pinów Arduino Nano 5v i GND.
Po zakończeniu powinien być podobny do pokazanej konfiguracji. Umieściłem blu tak pod MPU6050, aby zatrzymać jego ruch, a także na LCD, aby trzymać go na krawędzi płytki stykowej.
Krok 2: Kodeks
Załączony kod to kod, którego użyłem do tego projektu. Jedyną biblioteką, z którą możesz mieć problem, jest
Biblioteka LiquidCrystal_I2C.h, którą zaimportowałem, kiedy po raz pierwszy zacząłem pracować z wyświetlaczami LCD. Niestety, istnieje kilka bibliotek, które używają tej samej instrukcji #include, ale są nieco inne. Jeśli masz problemy ze swoim, znajdź inny kod LCD, który działa dla Ciebie i odpowiednio go zmień. Prawdopodobnie będzie to tylko inna konfiguracja. Wszystkie polecenia 'print' powinny działać tak samo.
Cały kod został skomentowany i zakładając, że zrobiłem to dobrze, będzie też film wyjaśniający wszystko, ale oto kilka punktów do zapamiętania:
LiquidCrystal_I2C lcd (0x27, 16, 2);
Powyższy kod to konfiguracja mojego LCD. Jeśli twoja biblioteka jest inna, być może będziesz musiał zmienić nie tylko bibliotekę, ale także ten wiersz.
{ lcd.setCursor(0, 1); lcd.print("Poziomo!"); orientacja = POZIOMA; //Odczytaj nieprzetworzone dane acc i żyroskopu z MPU-6050 1000 razy for (int cal_int = 0; cal_int < 1000; cal_int ++) { read_mpu_6050_data(); //Dodaj przesunięcie x żyroskopu do zmiennej gyro_x_cal gyro_x_cal += gyro_x; //Dodaj przesunięcie y żyroskopu do zmiennej gyro_y_cal gyro_y_cal += gyro_y; //Dodaj przesunięcie z żyroskopu do zmiennej gyro_z_cal gyro_z_cal += gyro_z; //Dodaj offset acc x do zmiennej acc_x_cal acc_x_cal += acc_x; //Dodaj przesunięcie acc y do zmiennej acc_y_cal acc_y_cal += acc_y; } // Podziel wszystkie wyniki przez 1000, aby otrzymać średnie przesunięcie gyro_x_cal /= 1000.0; żyro_y_cal /= 1000,0; żyroskop_z_cal /= 1000,0; acc_x_cal /= 1000,0; acc_y_cal /= 1000,0; Kalibracjapozioma = 255; eeprom_adres = 0; EEPROM.put(eeprom_address, kalibracja horyzontalna); eeprom_address += sizeof(int); EEPROM.put (adres_eeprom, żyroskop_x_cal); eeprom_address += sizeof(liczba zmiennoprzecinkowa); EEPROM.put (adres_eeprom, żyroskop_y_cal); eeprom_address += sizeof(liczba zmiennoprzecinkowa); EEPROM.put (adres_eeprom, żyroskop_z_cal); eeprom_address += sizeof(liczba zmiennoprzecinkowa); EEPROM.put(eeprom_adres, acc_x_cal); eeprom_address += sizeof(liczba zmiennoprzecinkowa); EEPROM.put(eeprom_adres, acc_y_cal); eeprom_address += sizeof(liczba zmiennoprzecinkowa); //Zauważ, że nie przechowujemy przesunięcia dla acc_z, ze względu na grawitację! opóźnienie (500); }
Powyższy blok kodu jest wykonywany zgodnie z procedurą kalibracji. Ten kod służy do kalibracji poziomej. Istnieje prawie identyczny kod kalibracji pionowej (uwaga, kod wie, czy MPU6050 jest zamontowany poziomo czy pionowo!). MPU6050 jest odczytywany 1000 razy. odpowiednie wartości są sumowane, a następnie dzielone przez 1000 w celu uzyskania średniej wartości „przesunięcia”. Wartości te są następnie zapisywane w eepromie Nano. Wszystkie wartości kalibracji poziomej są przechowywane począwszy od adresu eeprom 0. Wszystkie wartości pionowe są przechowywane od adresu eeprom 24. Kalibracja MUSI być wykonana na całkowicie równej powierzchni, w przeciwnym razie nic nie znaczą.
/* * Następne kilka wierszy przetwarza surowe dane, aby zmienić je na kąty, które można wyprowadzić na wyświetlacz LCD i diody LED. * Wartość 4096, przez którą dzielone są dane przyspieszenia, pochodzi z arkusza danych MPU6050 i jest oparta na częstotliwości próbkowania. * Wartość 9,8 to grawitacja * Funkcja atan2 pochodzi z modułu math i służy do obliczania kątów z podanych danych */ thetaM =-atan2((acc_x/4096.0)/9,8, (acc_z/4096.0)/9.8) /2/3.141592656 * 360; //Dane surowe phiM =-atan2((acc_y/4096.0)/9,8, (acc_z/4096.0)/9,8)/2/3.141592656 * 360; //Surowe dane dt=(millis()-millisStary)/1000.; miliStary=millis(); /* * Ta sekcja wykorzystuje dane z żyroskopu, aby system był bardziej responsywny * wartość 65,5, przez którą dane z żyroskopu są dzielone, pochodzi z arkusza danych MPU6050 i jest oparta na częstotliwości próbkowania */ theta=(theta+(gyro_y/ 65,5)*dt)*.96 + thetaM*.04; //Filtr dolnoprzepustowy phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //Filtr dolnoprzepustowy
Powyższy kod to rzeczy, które obliczają kąty. Mamy nadzieję, że komentarze dadzą trochę wglądu w to, jak to działa, ale aby uzyskać dogłębne wyjaśnienie, sprawdź wideo Paula McWhortersa, do którego link znajduje się w załączonym pliku PDF. Powiem jednak, że możesz zmienić częstotliwość próbkowania dla żyroskopu i akcelerometru (co robi się w podprogramie konfiguracji MPU6050 na dole mojego kodu). Jeśli zmienisz częstotliwość próbkowania, musisz również zmienić wielkość dzielenia nieprzetworzonych danych. Dla danych akcelerometru aktualna wartość to 4096. Dla żyroskopu aktualna wartość to 65,5.
Zapoznaj się z załączonymi arkuszami danych i filmem EEEntusiast (link w załączonym pliku PDF), aby uzyskać bardziej szczegółowe informacje na temat znajdowania wartości próbkowania i przesunięcia.
Krok 3: Kolejne kroki
Miejmy nadzieję, że w tym momencie zrobimy ten projekt, ale co teraz?
Po pierwsze, dlaczego nie wbudować go w poziomicę, której możesz użyć. Możesz kupić tanią poziomicę (upewnij się, że jest to typ pudełkowy), którą możesz dostosować, lub jeśli masz zestaw, wydrukuj własną poziomicę/pudełko.
Być może pobaw się z częstotliwościami próbkowania żyroskopu i akcelerometru, aby sprawdzić, czy działają one lepiej przy jednej częstotliwości niż przy innej.
Spróbuj doprecyzować kod. Na przykład obecnie, powyżej 45 stopni, podany kąt jest co najmniej szorstki. Czy można to obejść?
Jeśli masz jakieś pytania, bez względu na to, jak proste mogą się wydawać, zapytaj. Jeśli mogę pomóc, to zrobię.
Jeśli podoba Ci się ta instrukcja, polub ją, abym wiedział.
Jeśli to zrobisz, pokaż mi (zwłaszcza jeśli jest to sprawny przypadek).
DZIĘKUJĘ CI