Рубрики
Схемы на Arduino

Подключение датчика MPU9250 к Arduino

Обработка данных движения какого-либо объекта – весьма востребованная в современном мире технология, широко применяющаяся при создании различных роботов, самоуправляемых автомобилей, дронов и многого другого. Для полноценной обработки данных движения объекта необходимо взаимодействовать с такими параметрами как линейное ускорение, угловое ускорение и магнитный север (magnetic north).

Ранее на нашем сайте мы уже рассматривали подключение к плате Arduino датчика акселерометра и гироскопа MPU6050 и магнитометра HMC5883L. Но MPU9250 является более универсальным датчиком – он объединяет в себе возможности гироскопа, акселерометра и магнитометра. И в данной статье мы рассмотрим его подключение к плате Arduino и обработку получаемых с него данных (калибровку, автокалибровку, фильтрацию и усреднение).

Необходимые компоненты

  1. Плата Arduino Mega 2560 (купить на AliExpress) (можно также использовать и другие типы плат Arduino).
  2. Датчик MPU9250 (купить на AliExpress).

Общие сведения о датчике MPU9250

Датчик MPU9250 реализует функции 3-осевого гироскопа, 3-осевого акселерометра и 3-осевого магнитометра, то есть он представляет собой 9-ти осевой IMU сенсор (Inertial Measurement Unit – инерционное измерительное устройство). Его внешний вид с распиновкой контактов показан на следующем рисунке.

Назначение контактов датчика MPU9250:

Обозначение контакта Назначение контакта
VCC Внешнее питание 3.3 В
GND Общий
SCL Линия тактовых импульсов I2C и SPI
SDA Линия данных для I2C или SPI
EDA Линия данных при подключении внешних датчиков по шине I2C
ECL Линия тактов при подключении внешних датчиков по шине I2C
AD0 Для выставления адреса I2C в режиме I2C. В режиме SPI это линия данных от датчика
INT Линия прерываний. Срабатывание настраивается при конфигурировании датчика MPU-9250
NCS В режиме SPI – линия выбора ведомого (chip select). В режиме I2C не соединяется ни с чем
FSYNC Зависит от конфигурации

MPU9250 является самым миниатюрным в мире девятиосевым датчиком. Это говорит о высокой производительности его микросхемы. Состоит корпус датчика из двух мельчайших кристаллов, один из которых отвечает за гироскоп и акселерометр, а другой за магнитометр. Данные с них обрабатываются встроенным сигнальным процессором DMP с помощью алгоритмов Motion Fusion и передаются по интерфейсам I2C или SPI.

Рассмотрим более подробно работу составных частей датчика.

Гироскоп – это сенсор, реагирующий на изменение углов ориентации в пространстве.

Акселерометр сравнивает проекцию ускорения объекта с гравитационным ускорением и способен замерять линейную скорость объекта, а вкупе с гироскопом – и положение в пространстве.

Магнитометр представляет собой устройство для измерения интенсивности ближайшего магнитного поля, действующего на объект.

Датчик MPU9250 позволяет измерять такие параметры как угол yaw (рыскание), угол pitch (тангаж) и угол roll (крен). Графическое изображение этих параметров представлено на следующем рисунке.

Схема проекта

Схема подключения датчика MPU9250 к плате Arduino представлена на следующем рисунке.

Подключать датчик MPU9250 к плате Arduino можно по интерфейсу I2C или интерфейсу SPI. В нашем случае мы использовали подключение по интерфейсу I2C (5V, Gnd, SCL, SDA). При использовании интерфейса SPI необходимо будет задействовать 5 контактов на плате модуля (5V, Gnd, SCL, SDA, CS, SDO).

Питать модуль можно как от напряжения от 5 В, поскольку на плате датчика имеется линейный стабилизатор для данного типа питания, так и от напряжения 3,3 В.

Обработка данных от датчика MPU9250

MPU9250 имеет 16-битный регистр для каждого из 3-х датчиков, входящих в его состав. Они временно хранят данные от датчика прежде чем произойдет их передача по интерфейсу I2C.

Считывание данных

Для взаимодействия с датчиком MPU9250 мы будем использовать библиотеку, разработанную пользователем kriswiner. Скачать ее можно по адресу – https://github.com/kriswiner/MPU9250.

Мы будем считывать данные по 8 бит и затем объединять их в 16-битные. Это реализуется следующим фрагментом кода из библиотеки kriswiner’а:

Калибровка исходных/необработанных данных (Raw Data)

Получаемые с датчика MPU9250 данные должны быть откалиброваны в соответствии с оборудованием пользователя, в котором будет использоваться датчик. Калибровка магнитометра требуется для компенсации магнитного склонения (Magnetic Declination). Корректировочное значение в данном случае сильно зависит от местоположения датчика. Необходимо откалибровать две переменные: yaw и magbias.

Ниже приведенный фрагмент кода реализует калибровку переменной yaw для магнитного склонения, характерного для местности: Potheri, Chennai, India.

Данные о магнитном склонении в конкретной местности можно получить, к примеру, с помощью следующих сайтов:

  • http://geomag.nrcan.gc.ca/calc/mdcal-en.php;
  • http://www.ngdc.noaa.gov/geomag-web/.

В следующем фрагменте кода реализована калибровка переменной magbias, которая взята из функции magcalMPU9250(float * dest1, float * dest2) (из библиотеки, которую мы используем для работы с датчиком MPU9250).

Автоматическая калибровка магнитометра

Это одна из самых простых, но в то же время важных участков кода программы. Функция magcalMPU9250(float * dest1, float * dest2) производит калибровку магнитометра в то время когда вы перемещаете его по фигуре восьмерки (цифры “8”). Она сохраняет максимальные и минимальные значения, а затем на их основе вычисляет среднее.

Для более детального изучения данного вопроса рекомендуем обратиться к источнику: https://github.com/kriswiner/MPU6050/wiki/Simple-and-Effective-Magnetometer-Calibration.

Постоянная калибровка для определенного места

Если вы не хотите каждый раз при включении устройства производить автоматическую калибровку магнитометра, то вы должны записать средние значения переменной magbias[] после их вычислений с помощью следующего фрагмента кода:

Значения 470, 120, 125 фиксированы для местоположения автора проекта, поэтому после выполнения данной процедуры нет необходимости вызова функции void magcalMPU9250(float * dest1, float * dest2), поэтому вы можете закомментировать или удалить ее из программы. Также не забудьте закомментарить в программе ее вызов как сделано в следующем примере кода:

Фильтрация данных

Поскольку исходные данные (raw data) содержат достаточно большое количество шума, мы будем использовать различные фильтры (Madgwick/Mahony/Kalman) чтобы преобразовать их в кватернионы (Quaternions).

Усреднение данных

Поскольку данные на выходе датчика изменяются очень быстро, мы будем производить их выборку в течение определенного промежутка времени (50 ms) и вычислять их среднее значение.

Получение “реальных” значений

Наконец, на завершающем этапе обработки данных, мы получим значения параметров yaw, pitch и roll из кватернионов.

Считывание данных с датчика MPU9250 в плату Arduino Mega 2560

Для работы с датчиком MPU9250 существует достаточно много библиотек, но мы будем использовать одну из самых популярных среди них: MPU-9250 Arduino Library by Kriswiner.

Когда вы сохраните библиотеку в ваш каталог Arduino, можно приступать к работе с ней. Откройте пример MPU9250BasicAHRS.ino.

Также выполните следующие соединения в схеме:

MPU9250 Breakout ——— Arduino
• VIN ———————- 5V
• SDA ———————– SDA (Pin 20)
• SCL ———————– SCL (Pin 21)
• GND ———————- GND

Помните о том, что соединительные провода в нашем случае не должны быть очень длинными потому что протокол I2C плохо работает на больших расстояниях.

После этого нам нужно очистить код примера MPU9250BasicAHRS от ненужных нам фрагментов. Например, можно удалить фрагменты кода, отвечающие за работу с ЖК дисплеем. Также в код примера мы добавим фрагмент кода для авто калибровки кода. Модифицированный таким образом код можно скачать по следующей ссылке.

После этого загрузите данный код программы в вашу плату Arduino. Откройте окно монитора последовательной связи, измените скорость на 115200, вы должны увидеть следующее:

Если вы видите:

То это будет означать проблемы с подключением датчика. В худшем случае это может быть неисправность платы Arduino или датчика. Устраните эти проблемы прежде чем продолжать.

Если все идет хорошо и вы видите сообщения “MPU is online” и “Mag Calibration: Wave device in a figure eight until done!”, то вы должны начать перемещать ваш датчик MPU9250 по фигуре восьмерки (цифра “8”) до тех пор пока датчик не закончит автоматическую калибровку. После этого вы должны увидеть значения параметров yaw, pitch и roll:

Автоматическая калибровка азимута (Yaw) RTPT с помощью P-контроллера

Сначала нам необходимо преобразовать значение параметра yaw из диапазона (-180 to +180) в диапазон (0 to 360) с помощью следующей простой формулы:

yaw = yaw + 180;

Затем нам необходимо найти ошибку в параметре yaw используя простой пропорциональный регулятор (Proportional controller), затем прибавить значение этой ошибки к значению параметра yaw. После этого можно будет работать с этим новым значением параметра yaw.

Исходный код программы

Его можно скачать по следующей ссылке.

Источник статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *