0. Podzespoły i oprogramowanie niezbędne do sterowania 3-osiowym akcelerometrem MPU-6050 + moduł żyroskopu

Wymagane komponenty:

{Produkt: 2000} {Produkt: 841}

I. Jak używać czujnika pozycjonowania z Arduino

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.

II. Eksperymentalne procedury

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

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.beginTransmission (MPU);

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.beginTransmission (MPU);

Wire.write (0x43);

Wire.endTransmission (false);

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:

// Dołączamy bibliotekę dla I2C

#include <Wire.h>

// Definiujemy adres I2C MPU

# zdefiniować MPU 0x68

// Definiujemy współczynniki konwersji

# zdefiniować A_R 16384.0

# zdefiniować G_R 131.0

// Definiujemy konwersję radianów na stopnie 180 / PI

# zdefiniować RAD_A_DEG = 57.295779

// MPU podaje wartości w 16-bitowych liczbach całkowitych

// Deklarujemy pamięci dla surowych wartości

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.beginTransmission (MPU);

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 ();

// 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;

// Odczytujemy wartości z żyroskopu

Wire.beginTransmission (MPU);

Wire.write (0x43);

Wire.endTransmission (false);

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 ();

// 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]);

// Czekamy 1 sekundę, aby móc to wizualizować na monitorze szeregowym

opóźnienie (1000);

}

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: