Цифровая электроника для начинающих (Елисеев) - страница 25

2.9 Подключаем гироскоп, компас и акселерометр

С помощью шины I2C можно подключать различные устройства, например многочисленные датчики. Для примера можно рассмотреть плату “Grove - IMU 10DOF”.

Плата работает по той же шине I2C и подключается точно так же, как и дисплей из предыдущей главы, 4 проводами. На плате находятся датчик MPU-9250, содержащий гироскоп, акселерометр и компас, и цифровой барометр BMP280.


Подключение платы точно такое же, как на картинке с дисплеем из предыдущей главы. Сам обмен данных с датчиками достаточно сложен, но готовые библиотеки для Arduino уже существуют, и их весьма просто использовать.


Чтобы получить данные с датчика MPU-9250, нужно скачать библиотеку с сайта https://github.com/Snowda/MPU9250 (выбрать Download - zip) и распаковать ее в папку Документы\Arduino\libraries. Сам код чтения данных с датчика и их вывода в последовательный порт весьма прост.


#include "Wire.h"

#include "I2Cdev.h"

#include "MPU9250.h"


MPU9250 accelgyro;

int index = 0;


void setup() {

// Запуск шины I2C

Wire.begin();


// Инициализация порта

Serial.begin(115200);

// Инициализация датчика

accelgyro.initialize();


// Проверка подключения

Serial.println("Testing device connections...");

Serial.println(accelgyro.testConnection() ? "MPU9250 connected" : "MPU9250 failed");

}


void loop() {

// Чтение данных

int16_t ax, ay, az, gx, gy, gz, mx, my, mz;

accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);


// Получение ускорения или вращения (опционально)

//accelgyro.getAcceleration(&ax, &ay, &az);

//accelgyro.getRotation(&gx, &gy, &gz);


// Вывод в порт

Serial.print(index); Serial.print("\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.print(gz); Serial.print("\t");

Serial.print(mx); Serial.print("\t");

Serial.print(my); Serial.print("\t");

Serial.println(mz);


index++;

}


Как можно видеть, все просто, и для получения данных достаточно одной строчки кода getMotion9. Остальной код имеет вспомогательное значение, и служит для передачи данных в serial port. Разумеется, вместо него можно использовать что-то другое, например включать или выключать светодиод, если данные превосходят некую заданную величину.


Переменная index используется для вывода результатов с увеличением счетчика. Она создана в виде глобальной переменной, т.к. функция loop каждый раз вызывается заново. Стоит заметить, что при работе программы в течении долгого времени, переменная index может переполниться, для избежания таких случаев стоит использовать тип данных с большей разрядностью.