- Co to jest akcelerometr i czujnik żyroskopowy?
- Akcelerometr MPU6050 i moduł czujnika żyroskopowego
- Wymagane składniki
- Schemat obwodu
- Objaśnienie programowania
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 zbudujemy cyfrowy kątomierz przy użyciu MPU6050 i Arduino. Tutaj do wyświetlenia kąta na obrazie kątomierza używany jest serwomotor. Wał silnika serwo jest przymocowany za pomocą igły, która będzie się obracać na obrazie kątomierza, aby wskazać kąt, który jest również wyświetlany na wyświetlaczu 16xLCD. Zanim przejdziemy do szczegółów, poznajmy czujnik żyroskopu.
Co to jest akcelerometr i czujnik żyroskopowy?
Do pomiaru przyspieszenia służy akcelerometr. W rzeczywistości wyczuwa zarówno statyczne, jak i dynamiczne przyspieszenie. Na przykład telefony komórkowe używają czujnika przyspieszenia, aby wykryć, że telefon komórkowy jest w trybie poziomym lub pionowym. Wcześniej używaliśmy akcelerometru z Arduino do tworzenia wielu projektów, takich jak:
Żyroskop służy do pomiaru prędkości kątowej, który wykorzystuje grawitację Ziemi do określenia orientacji obiektu w ruchu. Prędkość kątowa to szybkość zmiany położenia kątowego wirującego ciała.
Na przykład dzisiejsze telefony komórkowe używają czujników żyroskopowych do grania w gry mobilne zgodnie z orientacją telefonu komórkowego. Ponadto gogle VR wykorzystują czujnik żyroskopowy, aby wyświetlać widoki w orientacji 360
Tak więc, podczas gdy akcelerometr może mierzyć przyspieszenie liniowe, żyroskop może pomóc znaleźć przyspieszenie obrotowe. Kiedy oba czujniki są używane jako oddzielne moduły, trudno jest znaleźć orientację, położenie i prędkość. Ale dzięki połączeniu dwóch czujników działa jako inercyjna jednostka pomiarowa (IMU). Tak więc w module MPU6050 akcelerometr i żyroskop znajdują się na jednej płytce drukowanej, aby znaleźć orientację, pozycję i prędkość.
Aplikacje:
- Używany w dronach do kontroli kierunku
- Roboty samobalansujące
- Sterowanie ramieniem robota
- Czujnik pochylenia
- Używany w telefonach komórkowych, konsolach do gier wideo
- Humanoidalne roboty
- Używany w samolotach, motoryzacji itp.
Akcelerometr MPU6050 i moduł czujnika żyroskopowego
MPU6050 to układ mikroelektromechaniczny (MEMS), który składa się z 3-osiowego akcelerometru i 3-osiowego żyroskopu. Posiada również czujnik temperatury.
Może mierzyć:
- Przyśpieszenie
- Prędkość
- Orientacja
- Przemieszczenie
- Temperatura
Moduł ten ma również wbudowany cyfrowy procesor ruchu (DMP), który jest wystarczająco mocny, aby wykonywać złożone obliczenia, a tym samym zwolnić pracę mikrokontrolera.
Moduł ma również dwa pomocnicze piny, które mogą być używane do łączenia zewnętrznych modułów IIC, takich jak magnetometr. Ponieważ adres IIC modułu jest konfigurowalny, więcej niż jeden czujnik MPU6050 może być połączony z mikrokontrolerem za pomocą pinu AD0.
Funkcje i dane techniczne:
- Zasilanie: 3-5 V.
- Komunikacja: protokół I2C
- Wbudowany 16-bitowy ADC zapewnia wysoką dokładność
- Wbudowany DMP zapewnia dużą moc obliczeniową
- Może być używany do łączenia z innymi urządzeniami IIC, takimi jak magnetometr
- Konfigurowalny adres IIC
- Wbudowany czujnik temperatury
Pinout MPU6050:
Kod PIN | Nazwa pinu | Posługiwać się |
1 | Vcc | Zapewnia zasilanie modułu, może wynosić od + 3 V do + 5 V. Zwykle używane jest + 5V |
2 | Ziemia | Podłączony do uziemienia systemu |
3 | Zegar szeregowy (SCL) | Służy do dostarczania impulsu zegarowego dla komunikacji I2C |
4 | Dane szeregowe (SDA) | Służy do przesyłania danych za pośrednictwem komunikacji I2C |
5 | Pomocnicze dane szeregowe (XDA) | Może być używany do łączenia innych modułów I2C z MPU6050. Jest to opcjonalne |
6 | Pomocniczy zegar szeregowy (XCL) | Może być używany do łączenia innych modułów I2C z MPU6050. Jest to opcjonalne |
7 | AD0 | Jeśli więcej niż jeden MPU6050 jest używany na jednym MCU, ten pin może służyć do zmiany adresu |
8 | Przerwanie (INT) | Styk przerwania wskazujący, że dane są dostępne do odczytania przez MCU. |
Wcześniej używaliśmy MPU6050 z Arduino do budowy samobalansującego robota i inklinometru.
Wymagane składniki
- Arduino UNO
- Moduł żyroskopu MPU6050
- Wyświetlacz LCD 16x2
- Potencjometr 10k
- Silnik serwo SG90
- Obraz kątomierza
Schemat obwodu
Schemat obwodu dla tego DIY Arduino Protractor podano poniżej:
Połączenia obwodów między Arduino UNO a MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Połączenia obwodów między Arduino UNO a serwomotorem:
Siłownik |
Arduino UNO |
CZERWONY (VCC) |
+ 5V |
POMARAŃCZOWY (PWM) |
9 |
BRĄZOWY (GND) |
GND |
Połączenia obwodów między Arduino UNO a wyświetlaczem LCD 16x2:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Do środka PIN potencjometru Do kontrolowania kontrastu wyświetlacza LCD |
RS |
2 |
RW |
GND |
mi |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
ZA |
+ 5V |
K. |
GND |
Objaśnienie programowania
Jak zwykle kompletny program wraz z filmem demonstracyjnym znajduje się na końcu tego samouczka.
Tutaj serwosilnik jest połączony z Arduino, a jego wał jest rzutowany na obraz kątomierza wskazujący kąt nachylenia MPU6050. Programowanie tego samouczka jest proste. Zobaczmy to szczegółowo.
Najpierw dołącz wszystkie wymagane biblioteki - bibliotekę Servo Motor do używania Servo, bibliotekę LCD do korzystania z LCD i bibliotekę Wire do korzystania z komunikacji I2C.
MPU6050 wykorzystuje komunikację I2C i dlatego musi być podłączony tylko do pinów I2C Arduino. Tak więc biblioteka Wire.h służy do nawiązania komunikacji między Arduino UNO a MPU6050. Wcześniej połączyliśmy MPU6050 z Arduino i wyświetliliśmy wartości współrzędnych x, y, z na wyświetlaczu LCD 16x2.
#zawierać
Następnie zdefiniuj piny RS, E, D4, D5, D6, D7 wyświetlacza LCD, które są połączone z Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Następnie definiowany jest adres I2C MPU6050.
const int MPU_addr = 0x68;
Następnie zainicjalizuj obiekt myservo, aby użyć klasy Servo i trzech zmiennych do przechowywania wartości osi X, Y i Z.
Servo myservo; int16_t axis_X, axis_Y, axis_Z;
Następna minimalna i maksymalna wartość to 265 i 402 dla pomiaru kąta od 0 do 360.
int minVal = 265; int maxVal = 402;
void setup ():
W funkcji void setup pierwsza komunikacja I2C jest uruchomiona a transmisja rozpoczęła się z MPU6050 z adresem 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Przełącz MPU6050 w tryb uśpienia, wpisując 0x6B, a następnie obudź go, wpisując 0
Wire.write (0x6B); Wire.write (0);
Po uaktywnieniu MPU6050 zakończ transmisję
Wire.endTransmission (true);
Tutaj pin PWM silnika serwo jest połączony z pinem 9 Arduino UNO.
myservo.attach (9);
Gdy tylko włączymy obwód, na wyświetlaczu LCD pojawi się komunikat powitalny i zostanie on wyczyszczony po 3 sekundach
lcd.begin (16,2); // Ustawia LCD w trybie 16X2 lcd.print ("CIRCUIT DIGEST"); opóźnienie (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print („MPU6050”); opóźnienie (3000); lcd.clear ();
void loop ():
Ponownie komunikacja I2C rozpoczyna się od MPU6050.
Wire.beginTransmission (MPU_addr);
Następnie zacznij od rejestru 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Teraz proces jest restartowany przez ustawienie transmisji końcowej jako fałszywej, ale połączenie jest aktywne.
Wire.endTransmission (false);
Następnie poproś o dane z 14 rejestrów.
Wire.requestFrom (MPU_addr, 14, true);
Teraz respektowane wartości rejestrów osi (x, y, z) są uzyskiwane i zapisywane w zmiennych axis_X, axis_Y, axis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Następnie odwzoruj te wartości od 265 do 402 jako od -90 do 90. Odbywa się to dla wszystkich trzech osi.
int xAng = map (axis_X, minVal, maxVal, -90,90); int yAng = map (axis_Y, minVal, maxVal, -90,90); int zAng = map (axis_Z, minVal, maxVal, -90,90);
Wzór do obliczenia wartości x w stopniach (od 0 do 360) podano poniżej. Tutaj konwertujemy tylko x, ponieważ obrót serwomotoru jest oparty na ruchu wartości x.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
Wartość kąta X od 0 do 360 stopni jest konwertowana na 0 do 180.
int pos = map (x, 0,180,0,180);
Następnie wpisz wartość kąta, aby obrócić serwo na obrazie kątomierza i wydrukuj te wartości na wyświetlaczu LCD 16x2.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Kąt"); lcd.setCursor (0,1); lcd.print (x); opóźnienie (500); lcd.clear ();
A więc tak można wykorzystać MPU6050 z Arduino do pomiaru kąta. Pełny kod i wideo dla tego projektu znajduje się poniżej.