Выбрать главу

Плата работает по той же шине 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 может переполниться, для избежания таких случаев стоит использовать тип данных с большей разрядностью.

Запустив программу, мы получим в Serial Monitor данные типа таких:

0,      225,153,15401,            22,44,15,      540,302,192

1,      223,175,15434,            7,41,15,      540,302,192

2,      226,161,15417,            3,46,16,      540,302,192

3,      233,166,15411,            7,51,3,            540,302,192

4,      233,166,15411,            13,44,2,      540,302,192

5,      223,161,15435,            13,44,2,      540,302,192

Каждый датчик - 3х-осевой, соответственно мы имеем 3 колонки цифр с каждого из сенсоров (акселерометр, гироскоп и компас). Примерно такие же датчики стоят и в смартфонах, что используется например в играх, для управления наклонами устройства.

Данные также можно открыть в любой программе построения графиков, например онлайн на https://plot.ly/create/, и наглядно посмотреть как изменяются значения при вращении или повороте датчика. К примеру, на картинке показан график с магнитометра при поднесении к датчику металлического предмета.

Сам график построен с помощью бесплатного сервиса https://plot.ly/create/.

Чтение данных с барометра BMP280 аналогично. Нужно скачать библиотеки с сайта https://github.com/adafruit/Adafruit_BMP280_Library и поместить их в папку Документы\Arduino\libraries.

Код аналогичен приведенному выше.

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

void setup() {

Serial.begin(115200);

Serial.println(F("BMP280 test"));

if (!bmp.begin()) {

Serial.println(F("Could not find a valid BMP280 sensor"));

while (1);

}

}

void loop() {

// Чтение температуры

Serial.print(F("T = "));

Serial.print(bmp.readTemperature());

Serial.println(" *C");

// Атмосферное давление

Serial.print(F("Pressure = "));

Serial.print(bmp.readPressure());

Serial.println(" Pa");

// Барометрическая высота относительно “нулевой” отметки

Serial.print(F("Approx altitude = "));

Serial.print(bmp.readAltitude(1013.25)); // Давление на “нулевой” отметке

Serial.println(" m");

Serial.println();

delay(2000);

}

Разумеется, атмосферное давление не меняется столь же быстро, как показания акселерометра. Оставив программу работать некоторое время, можно получить график изменения атмосферного давления. Барометрическая высота кстати, активно используется в авиации, т.к. позволяет получать довольно-таки точную высоту над уровнем моря относительно нулевой отметки. Точность цифровых датчиков весьма высока, и позволяет улавливать даже разницу в высоте менее 1м. Это используется например, в квадрокоптерах для удержания заданной высоты полета.