- Wymagane materiały:
- Schemat obwodu:
- Zasilanie konfiguracji:
- Programowanie Arduino:
- Przygotowanie aplikacji Android przy użyciu przetwarzania:
- Działanie inklinometru Arduino:
MPU6050 jest IC 3-osiowy akcelerometr oraz żyroskop 3 oś połączone w jedną całość. Zawiera również czujnik temperatury i DCM do wykonywania złożonego zadania. MPU6050 jest powszechnie używany do budowania dronów i innych zdalnych robotów, takich jak robot samobalansujący. W tym projekcie dowiemy się, jak korzystać z MPU6050 zbudowanego z inklinometru lub poziomicy. Jak wiemy, inklinometr służy do sprawdzania, czy powierzchnia jest idealnie wypoziomowana, czy nie, są one dostępne jako mierniki sprit bubble lub mierniki cyfrowe. W tym projekcie zamierzamy zbudować cyfrowy inklinometr, który będzie można monitorować za pomocą aplikacji na Androida. Powodem używania zdalnego wyświetlacza, takiego jak telefon komórkowy, jest to, że możemy monitorować wartości z MPU6050 bez konieczności patrzenia na sprzęt, byłoby to bardzo przydatne, gdy MPU6050 jest umieszczony na dronie lub w innych niedostępnych miejscach.
Wymagane materiały:
- Arduino Pro-mini (5 V)
- Czujnik żyroskopowy MPU6050
- Moduł Bluetooth HC-05 lub HC-06
- Płyta FTDI
- Płytka prototypowa
- Przewody łączące
- Inteligentny telefon
Schemat obwodu:
Pełny schemat obwodu dla tego projektu czujnika nachylenia Arduino pokazano poniżej. Ma tylko trzy komponenty i można go łatwo zamontować na płytce stykowej.
W MPU6050 łączy się z pomocą I2C, a tym samym kołek SDA jest połączony z kołkiem A4 Arduino który jest kołek SDA i kołek SCL połączonego z wtykiem A5 Arduino. Moduł HC-06 Bluetooth działa za pomocą komunikacji szeregowej, stąd pin Rx Bluetooth jest połączony z pinem D11, a pin Tx Bluetooth jest połączony z pinem D10 Arduino. Te styki D10 i D11 zostaną skonfigurowane jako pin szeregowy przez zaprogramowanie Arduino. Moduł HC-05 i moduł MSP6050 działają na napięciu + 5V i dlatego są zasilane przez pin Vcc Arduino, jak pokazano powyżej.
Użyłem kilku przewodów połączeniowych do płytki prototypowej i zbudowałem zestaw na małej płytce stykowej. Po wykonaniu połączeń moja tablica wygląda tak poniżej.
Zasilanie konfiguracji:
Możesz zasilić swój obwód przez płytkę programującą FTDI, tak jak ja to zrobiłem, lub użyć baterii 9 V lub adaptera 12 V i podłączyć go do pin RAW Arduino pro mini. Arduino Pro-mini ma wbudowany regulator napięcia, który przekształciłby to zewnętrzne napięcie stabilizowane + 5V.
Programowanie Arduino:
Gdy sprzęt będzie gotowy, możemy przystąpić do programowania naszego Arduino. Jak zwykle pełny kod tego projektu można znaleźć na dole tej strony. Ale aby lepiej zrozumieć projekt, złamałem kod do małych szczelin i wyjaśniłem je w następujący sposób.
Pierwszym krokiem byłoby połączenie MPU6050 z Arduino. W tym projekcie wykorzystamy bibliotekę opracowaną przez Korneliusza, którą można pobrać z linku poniżej
MPU6050 Liberty - Korneliusz Jarzębski
Pobierz plik ZIP i dodaj go do swojego Arduino IDE. Następnie przejdź do Plik-> Przykłady-> Arduino_MPU6050_Master -> MPU6050_gyro_pitch_roll_yaw . Otworzy się przykładowy program korzystający z właśnie pobranej biblioteki. Więc kliknij prześlij i poczekaj, aż program zostanie przesłany do Twojego Arduino Pro mini. Gdy to zrobisz, otwórz monitor szeregowy i ustaw szybkość transmisji na 115200 i sprawdź, czy otrzymujesz następujące informacje.
Początkowo wszystkie trzy wartości będą równe zero, ale podczas przesuwania płytki prototypowej można obserwować, jak te wartości się zmieniają. Jeśli się zmienią, oznacza to, że połączenie jest poprawne, w przeciwnym razie sprawdź połączenia. Poświęć trochę czasu i zwróć uwagę na to, jak trzy wartości Pitch Roll i Yaw zmieniają się w zależności od sposobu nachylenia czujnika. Jeśli jesteś zdezorientowany, naciśnij przycisk resetowania na Arduino, a wartości zostaną ponownie zainicjowane do zera, a następnie przechyl czujnik w jednym kierunku i sprawdź, które wartości się zmieniają. Poniższe zdjęcie pomoże ci lepiej zrozumieć.
Z tych trzech parametrów interesuje nas tylko Roll and Pitch. Wartość Rolka powie nam o nachyleniu w osi X i wartości Pitch powie nam o nachyleniu w osi y. Teraz, gdy zrozumieliśmy podstawy, zacznijmy faktycznie programować Arduino, aby odczytać te wartości, wyślij je do Arduino przez Bluetooth. Jak zawsze zacznijmy od włączenia wszystkich bibliotek potrzebnych do tego projektu
#zawierać
Następnie inicjalizujemy numer seryjny oprogramowania dla modułu Bluetooth. Jest to możliwe dzięki bibliotece oprogramowania szeregowego w Arduino, piny IO można zaprogramować tak, aby działały jako piny szeregowe. Tutaj używamy cyfrowych pinów D10 i D11, gdzie D10 id Rx i D11 to Tx.
SoftwareSerial BT (10, 11); // RX, TX
Następnie inicjalizujemy zmienne i obiekty potrzebne dla programu i przechodzimy do funkcji setup (), w której określamy prędkość transmisji dla monitora szeregowego i Bluetooth. Dla HC-05 i HC-06 szybkość transmisji wynosi 9600, więc użycie tej samej jest obowiązkowe. Następnie sprawdzamy, czy magistrala IIC Arduino jest podłączona do MPU6050, jeśli nie, drukujemy komunikat ostrzegawczy i pozostajemy tam tak długo, jak urządzenie jest podłączone. Następnie kalibrujemy żyroskop i ustawiamy jego wartości progowe za pomocą odpowiednich funkcji, jak pokazano poniżej.
void setup () {Serial.begin (115200); BT.begin (9600); // rozpocznij komunikację Bluetooth z szybkością transmisji 9600 // Zainicjuj MPU6050 while (! mpu.begin (MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) {Serial.println ("Nie można znaleźć prawidłowego czujnika MPU6050, sprawdź okablowanie!"); opóźnienie (500); } mpu.calibrateGyro (); // Kalibruj żyroskop podczas startu mpu.setThreshold (3); // Kontroluje czułość}
Wiersz „ mpu.calibrateGyro ();” skalibruj MPU6050 dla pozycji, w której jest aktualnie umieszczony. Linia ta może być wywoływana wiele razy w programie, gdy tylko trzeba skalibrować MPU6050 i wszystkie wartości mają być ustawione na zero. „Mpu.setThreshold (3);” ta funkcja kontroluje, jak bardzo zmienia się wartość dla ruchu na czujniku, zbyt niska wartość zwiększy hałas, więc zachowaj ostrożność podczas majstrowania przy tym.
Wewnątrz pustej pętli () wielokrotnie odczytywaliśmy wartości żyroskopu i czujnika temperatury, obliczamy wartości pochylenia, przechyłu i odchylenia, wysyłamy je do modułu Bluetooth. Kolejne dwie linie odczytują surowe wartości żyroskopu i wartość temperatury
Norma wektorowa = mpu.readNormalizeGyro (); temp = mpu.readTemperature ();
Następnie obliczamy nachylenie, przechylenie i odchylenie, mnożąc przez krok czasu i dodając go do poprzednich wartości. Krok czasowy jest tylko przerwa między kolejnymi odczytami.
wysokość = wysokość + norm.YAxis * timeStep; roll = roll + norm.XAxis * timeStep; odchylenie = odchylenie + norm.ZAxis * timeStep;
Aby lepiej zrozumieć krok czasu, spójrzmy na poniższą linię. Ta linia jest umieszczana w celu odczytu wartości z MPU6050 dokładnie w odstępach 10 mS lub 0,01 sekundy. Dlatego deklarujemy wartość timeStep jako 0,01. I użyj poniższej linii, aby zatrzymać program, jeśli pozostało więcej czasu. (millis () - timer ()) podaje czas potrzebny na wykonanie programu do tej pory. Po prostu odejmujemy to z 0,01 sekundy i przez pozostały czas po prostu zatrzymujemy nasz program przy użyciu funkcji opóźnienia.
delay ((timeStep * 1000) - (millis () - timer));
Gdy skończymy czytać i obliczać wartości, możemy przesłać je do naszego telefonu przez Bluetooth. Ale jest tu haczyk. Moduł Bluetooth, którego używamy, może wysłać tylko 1 bajt (8 bitów), co pozwala na wysyłanie liczb tylko od 0 do 255. Musimy więc podzielić nasze wartości i zmapować je w tym zakresie. Odbywa się to za pomocą następujących linii
if (roll> -100 && roll <100) x = map (roll, -100, 100, 0, 100); if (wysokość dźwięku> -100 && wysokość <100) y = mapa (wysokość dźwięku, -100, 100, 100, 200); if (temp> 0 && temp <50) t = 200 + int (temp);
Jak możesz się domyślić, wartość roll jest odwzorowywana na 0 do 100 w zmiennej x, a wysokość na 100 do 200 w zmiennej y, a temp jest mapowana na 200 i więcej w zmiennej t. Możemy użyć tych samych informacji, aby pobrać dane z tego, co wysłaliśmy. Na koniec zapisujemy te wartości przez Bluetooth, używając następujących linii.
BT.write (x); BT.write (y); BT.write (t);
Jeśli zrozumiałeś cały program, przewiń w dół, aby rzucić okiem na program i przesłać go na płytę Arduino.
Przygotowanie aplikacji Android przy użyciu przetwarzania:
Aplikacja na Androida dla tego inklinometru Arduino została opracowana przy użyciu IDE Processing. Jest to bardzo podobne do Arduino i może być używane do tworzenia aplikacji systemowych, aplikacji na Androida, projektów internetowych i wielu innych. Wykorzystaliśmy już przetwarzanie do opracowania innych naszych fajnych projektów, które są wymienione poniżej
- Gra w ping ponga wykorzystująca Arduino
- Radio FM sterowane smartfonem za pomocą przetwarzania.
- System radarowy Arduino wykorzystujący przetwarzanie i czujnik ultradźwiękowy
Jednak nie jest możliwe wyjaśnienie całego kodu, jak stworzyć tę aplikację. Masz więc dwa sposoby, aby to omówić. Możesz pobrać plik APK z poniższego linku i zainstalować aplikację na Androida bezpośrednio na telefonie. Lub przewiń poniżej, aby znaleźć pełny kod przetwarzania i samemu dowiedzieć się, jak to działa
W pliku ZIP można znaleźć folder o nazwie data, który zawiera wszystkie obrazy i inne źródła, które mają zostać załadowane do aplikacji na Androida. Poniższa linia decyduje, z którą nazwą Bluetooth powinien się automatycznie łączyć
bt.connectToDeviceByName („HC-06”);
Wewnątrz funkcji draw () , rzeczy będą wykonywane wielokrotnie, tutaj rysujemy obrazy, wyświetlamy tekst i animujemy paski na podstawie wartości z modułu Bluetooth. Możesz sprawdzić, co dzieje się wewnątrz każdej funkcji, czytając program.
void draw () // Nieskończona pętla {background (0); imageMode (CENTER); obraz (logo, szerokość / 2, wysokość / 1,04, szerokość, wysokość / 12); Załaduj obrazki(); textfun (); getval (); }
Na koniec jest jeszcze jedna ważna rzecz do wyjaśnienia, pamiętaj, że podzieliliśmy wartość wysokości tonu, przechyłu i temperatury na 0 do 255. Więc tutaj ponownie przywracamy normalne wartości, odwracając je do normalnych wartości.
if (info <100 && info> 0) x = map (info, 0, 100, - (width / 1.5) / 3, + (width / 1.5) / 3); // x = info; else if (info <200 && info> 100) y = map (info, 100, 200, - (width / 4.5) /0.8, + (width / 4.5) /0.8); // y = info; else if (info> 200) temp = info -200; println (temp, x, y);
Istnieją znacznie lepsze sposoby przesyłania danych z modułu Bluetooth do telefonu, ale ponieważ jest to tylko projekt hobbystyczny, zignorowaliśmy je, możesz zgłębić, jeśli jesteś zainteresowany.
Działanie inklinometru Arduino:
Po przygotowaniu sprzętu i aplikacji nadszedł czas na zabawę z tym, co stworzyliśmy. Wgraj kod Arduino na płytkę, możesz również usunąć komentarze na liniach Serial.println i sprawdzić, czy sprzęt działa zgodnie z oczekiwaniami za pomocą monitora szeregowego. W każdym razie jest to całkowicie opcjonalne.
Po przesłaniu kodu uruchom aplikację Android na swoim telefonie komórkowym. Aplikacja powinna automatycznie połączyć się z modułem HC-06 i wyświetli komunikat „Połącz z: HC-06” w górnej części aplikacji, jak pokazano poniżej.
Początkowo wszystkie wartości będą wynosić zero, z wyjątkiem wartości temperatury. Dzieje się tak, ponieważ Arduino skalibrowało MPU-6050 dla tej pozycji jako odniesienie, teraz możesz przechylić sprzęt i sprawdzić, czy wartości w aplikacji mobilnej również zmieniają się wraz z animacją. Pełne działanie aplikacji można obejrzeć na poniższym filmie. Teraz możesz umieścić płytkę stykową w dowolnym miejscu i sprawdzić, czy powierzchnia jest idealnie wypoziomowana.
Mam nadzieję, że zrozumiałeś projekt i nauczyłeś się z niego czegoś pożytecznego. Jeśli masz jakiekolwiek wątpliwości, skorzystaj z sekcji komentarzy poniżej lub z forów, aby rozwiązać problem.