Mobile
Ten krótki samouczek wyjaśnia, jak wykrywać pozycję poprzez ruch. Moduł MPU6050 to czujnik ruchu, zdolny do pomiaru przyspieszenia i obrotu we wszystkich trzech osiach ruchu (x, y, z) z dość dobrą precyzją.
Posiada również 16-bitowy konwerter ADC, który konwertuje dane na wartość cyfrową i wysyła je do Arduino przez I2C.
Aby uzyskać więcej informacji o produktach lub ich opisach technicznych, wejdź na naszą stronę internetową Sklep Solectro.
Połączenie
Moduł zasilany jest bezpośrednio z Arduino , więc nie potrzebujemy zewnętrznego zasilania. Będziesz musiał przylutować szpilki lub nagłówki, aby użyć go na płycie prototypowej lub kablach DuPont. W tym przykładzie podłączymy moduł do Arduino UNO przez I2C.
Moduł zasilany jest bezpośrednio z Arduino , więc nie potrzebujemy zewnętrznego źródła zasilania. Piny są połączone zgodnie z tabelą:
Kołek czujnika
Przypnij przez Arduino UNO
VCC
5V
GND
SCL
DO 5
SDA
A4
INT
D0
Pozostałe dwa piny modułu czujnika są połączone z sondą pomiarową za pomocą dostarczonych kabli, jak pokazano na poniższym schemacie:
Operacja
W pierwszym przykładzie dla tego modułu możemy uzyskać wartości surowe lub RAW zebrane przez czujnik i wyświetlić je na monitorze szeregowym.
Otwórz nowy szkic i wklej następujący kod:
// Dołączamy bibliotekę dla I2C
#include <Wire.h>
// Definiujemy adres I2C MPU
// W zależności od stanu AD0, adres może mieć wartość 0x68 lub 0x69
# zdefiniować MPU 0x68
// Definiujemy współczynniki konwersji
# zdefiniować A_R 16384.0
# zdefiniować G_R 131.0
// Definiujemy konwersję radianów na 180 stopni / PI
# zdefiniować RAD_A_DEG = 57.295779
// MPU podaje wartości w 16-bitowych liczbach całkowitych
// Deklarujemy pamięci dla wartości RAW
int16_t AcX;
int16_t AcY;
int16_t AcZ;
int16_t GyX;
int16_t GyY;
int16_t GyZ;
// Deklarujemy ciąg znaków dla kątów
pływak Acc [2];
pływak Gy [2];
pływak Angle [2];
void setup ()
{
// Inicjalizujemy I2C i port szeregowy
Wire.begin ();
Wire.beginTransmission (MPU);
Wire.write (0x6B);
Wire.write (0);
Wire.endTransmission (true);
Serial.begin (9600);
}
void loop ()
// Odczytujemy wartości akcelerometru
Wire.write (0x3B); // Żądamy rejestru 0x3B - odpowiada AcX
Wire.endTransmission (false);
Wire.requestFrom (MPU, 6, true); // Od 0x3B żądanych jest 6 rejestrów
AcX = Wire.read () << 8 | Wire.read (); // Każda wartość zajmuje 2 rejestry
AcY = Wire.read () << 8 | Wire.read ();
AcZ = Wire.read () << 8 | Wire.read ();
// Odczytujemy wartości z żyroskopu
Wire.write (0x43);
Wire.requestFrom (MPU, 4, true); // W przeciwieństwie do akcelerometru wymagane są tylko 4 rekordy
GyX = Wire.read () << 8 | Wire.read ();
GyY = Wire.read () << 8 | Wire.read ();
/ Wartości pokazujemy na monitorze szeregowym
Serial.print ("Akcelerometr brutto X:"); Serial.println (AcX);
Serial.print ("Akcelerometr brutto Y:"); Serial.println (AcY);
Serial.print ("Akcelerometr brutto Z:"); Serial.println (AcZ);
Serial.print ("Żyroskop brutto Y:"); Serial.println (GyX);
Serial.print ("Gross gyro X:"); Serial.println (GyY);
Serial.print ("Żyroskop brutto Y:"); Serial.println (GyZ);
// Czekamy 1 sekundę, aby móc to wizualizować na monitorze szeregowym
opóźnienie (1000);
Po załadowaniu projektu otwieramy Monitor szeregowy z karty Narzędzia i możemy zobaczyć przechwycone nieprzetworzone wartości:
Jako drugi przykład pokazujemy, jak za pomocą tego modułu można uchwycić aktualny kąt nachylenia. Skopiuj następujący kod do pustego szkicu:
// Definiujemy konwersję radianów na stopnie 180 / PI
// Deklarujemy pamięci dla surowych wartości
// Obliczamy odpowiednio kąty Y, X.
Acc [1] = atan (-1 * (AcX / A_R) / sqrt (pow ((AcY / A_R), 2) + pow ((AcZ / A_R), 2))) * RAD_TO_DEG;
Acc [0] = atan ((AcY / A_R) / sqrt (pow ((AcX / A_R), 2) + pow ((AcZ / A_R), 2))) * RAD_TO_DEG;
// Obliczamy kąt żyroskopu
Gy [0] = GyX / G_R;
Gy [1] = GyY / G_R;
// Stosujemy filtr uzupełniający
Kąt [0] = 0,98 * (kąt [0] + Gy [0] * 0,010) + 0,02 * Acc [0];
Kąt [1] = 0,98 * (kąt [1] + Gy [1] * 0,010) + 0,02 * Acc [1];
// Pokazujemy wartości przez monitor szeregowy
Serial.print ("Kąt X:"); Serial.println (kąt [0]);
Serial.print ("Kąt Y:"); Serial.println (Angle [1]);
Po załadowaniu projektu otwieramy Monitor szeregowy z zakładki Narzędzia i możemy zobaczyć surowe wartości przechwyconych kątów X i Y:
Na koniec możemy również jak zwykle zainstalować bibliotekę „MPU6050.h” z „Menedżera bibliotek” i użyć następującego kodu w nowym szkicu:
#include „I2Cdev.h”
#include „MPU6050.h”
#include „Wire.h”
// W zależności od stanu AD0, adres może być 0x68 lub 0x69, aby sterować slave'em, który będzie czytać przez magistralę I2C
Czujnik MPU6050;
// RAW lub surowe wartości odczytane z akcelerometru i żyroskopu na osiach x, y, z
int ax, ay, az;
int gx, gy, gz;
void setup () {
Serial.begin (57600); // Funkcja uruchomienia portu szeregowego z prędkością 57600 bodów
Wire.begin (); // Uruchom dla magistrali I2C
sensor.initialize (); // Rozpoczynając od czujnika MPU6050
if (sensor.testConnection ()) Serial.println ("Czujnik został uruchomiony pomyślnie");
else Serial.println ("Błąd podczas uruchamiania czujnika");
void loop () {
// Odczytaj przyspieszenia i prędkości kątowe
sensor.getAcceleration (& ax, & ay, & az);
sensor.getRotation (& gx, & gy, & gz);
// Pokazuje odczyty, które są rejestrowane, oddzielone tabulatorem
Serial.print ("a [xyz] g [xyz]: \ t");
Serial.print (ax); Serial.print ("\ t");
Serial.print (ay); Serial.print ("\ t");
Serial.print (az); Serial.print ("\ t");
Serial.print (gx); Serial.print ("\ t");
Serial.print (gy); Serial.print ("\ t");
Serial.println (gz);
opóźnienie (100);
Czyj schemat połączeń jest następujący: