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


В этом уроке мы узнаем что такое MEMS, как работают акселерометр, гироскоп и магнитометр MEMS и как их использовать с платой Arduino.

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

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

Наглядно представленный материал статьи вы можете посмотреть в следующем видео:

Что такое MEMS (МЭМС)?

MEMS (Micro-Electro-Mechanical-Systems) или на русском МЭМС — это очень маленькие системы или устройства, состоящие из микрокомпонентов размером от 0,001 мм до 0,1 мм. Эти компоненты изготовлены из кремния, полимеров, металлов и/или керамики и обычно объединяются с процессором (микроконтроллером) для завершения системы.

Теперь мы кратко объясним, как работает каждый из этих датчиков микроэлектромеханических систем (МЭМС).

MEMS акселерометр

Он измеряет ускорение путем измерения изменения емкости. Его микроструктура выглядит примерно так. Он имеет массу, прикрепленную к пружине, которая может двигаться в одном направлении, и фиксированные внешние пластины. Таким образом, когда будет приложено ускорение в определенном направлении, масса будет двигаться, и емкость между пластинами и массой изменится. Это изменение емкости будет измерено, обработано и будет соответствовать определенному значению ускорения.

Принцип работы MEMS акселерометра

MEMS гироскоп

Гироскоп измеряет угловую скорость, используя эффект Кориолиса. Когда масса движется в определенном направлении с определенной скоростью и когда применяется внешняя угловая скорость, как показано зеленой стрелкой, возникает сила, как показано сине-красной стрелкой, которая вызывает перпендикулярное смещение массы. Подобно акселерометру, это смещение вызовет изменение емкости, которая будет измерена, обработана и будет соответствовать определенной угловой скорости.

Принцип работы гироскопа

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

Микроструктура гироскопа

MEMS магнитометр

Он измеряет магнитное поле Земли, используя эффект Холла или магниторезистивный эффект. На самом деле почти 90% датчиков на рынке используют эффект Холла, и вот как это работает.

Схема для демонстрации эффекта Холла

Если у нас есть проводящая пластина, как показано на фотографии, и мы пропускаем через нее ток, электроны будут течь прямо от одной стороны пластины к другой. Теперь, если мы поднесем некоторое магнитное поле к пластине, мы нарушим прямой поток, и электроны отклонятся к одной стороне пластины, а положительные полюсы - к другой стороне пластины. Это означает, что если мы поместим метр между этими двумя сторонами, мы получим некоторое напряжение, которое зависит от силы магнитного поля и его направления.

Принцип работы эффекта Холла

Остальные 10% датчиков на рынке используют магниторезистивный эффект. В этих датчиках используются материалы, чувствительные к магнитному полю, обычно состоящие из железа (Fe) и никеля (Ne). Поэтому, когда эти материалы подвергаются воздействию магнитного поля, они меняют свое сопротивление.

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

Хорошо, теперь давайте подключим эти датчики к плате Arduino и воспользуемся ими. В качестве примера я буду использовать коммутационную плату GY-80, которая имеет следующие датчики: 3-осевой акселерометр ADXL345 , 3-осевой гироскоп L3G4200D, 3-осевой магнитометр MC5883L, а также барометр и термометр, которые мы не будем использовать в этом уроке.

Также можно приобрести эти компоненты по отдельности:

  1. Акселерометр ADXL345 (купить на AliExpress).
  2. Магнитометр (Magnetometer sensor) HMC5883L (купить на AliExpress).
  3. Модуль акселерометра и гироскопа MPU6050 (купить на AliExpress).

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

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

Схема подключения коммутационной платы GY-80 к плате Arduino показана на следующем рисунке.

Схема подключения коммутационной платы GY-80 к плате Arduino

Для подключения мы использовали протокол связи I2C, что означает, что мы можем применять все датчики используя всего два проводами. Таким образом, чтобы обеспечить связь между Arduino и датчиками, нам необходимо знать их уникальные адреса устройств и адреса их внутренних регистров для получения от них данных. Эти адреса можно найти в даташитах датчиков:

Для получения более подробной информации о том, как работает связь по протоколу I2C, вы можете посмотреть статью про использование интерфейса I2C в Arduino.

Теперь давайте посмотрим исходные коды программ получения данных с датчиков. Мы начнем с акселерометра, и перед каждым кодом будут некоторые пояснения, а также некоторые дополнительные описания в комментариях к коду.

Код акселерометра для Arduino

Сначала нам нужно подключить библиотеку Wire для Arduino и определить адреса регистров датчика. В функции setup() нам нужно инициализировать библиотеку Wire и последовательную связь, поскольку мы будем использовать последовательный монитор для отображения результатов. Также здесь нам нужно активировать датчик или разрешить измерение, отправив соответствующий байт в регистр Power_CTL, и вот как мы это делаем. Используя функцию Wire.beginTransmission(), мы выбираем, с каким датчиком мы будем общаться, в данном случае с 3-осевым акселерометром. Затем с помощью функции Wire.write() мы указываем, с каким внутренним регистром мы будем обращаться. После этого мы отправим соответствующий байт для включения измерения. Используя функцию Wire.endTransmission(), мы завершим передачу и передадим данные в регистры.

В функции loop() нам нужно прочитать данные для каждой оси. Начнем с оси X. Итак, сначала мы выберем, с какими регистрами мы будем работать, в данном случае с двумя внутренними регистрами оси X. Затем с помощью функции Wire.requestFrom() мы запросим переданные данные или два байта из двух регистров. Функция Wire.available() вернет количество байтов, доступных для извлечения, и если это число соответствует запрошенным байтам, в нашем случае 2 байтам, с помощью  функции Wire.read() мы прочитаем байты из двух регистров ось Х.

Выходные данные регистров представляют собой дополнение до двух, где X0 является младшим байтом, а X1 — старшим байтом, поэтому нам необходимо преобразовать эти байты в значения с плавающей запятой от -1 до +1 в зависимости от направления относительной оси X к ускорению Земли или силе тяжести. Мы повторим эту процедуру для двух других осей и в конце распечатаем эти значения на последовательном мониторе.

Код гироскопа для Arduino

Для получения данных с гироскопа у нас будет код, аналогичный предыдущему. Итак, сначала нам нужно определить адреса регистров и некоторые переменные для данных. В функции setup() нам нужно проснуться и перевести датчик в обычный режим с помощью CTRL_REG1, а также выбрать чувствительность датчика. Для этого примера я выберу режим чувствительности 2000dps.

В функции loop(), аналогичном акселерометру, мы будем считывать данные по осям X, Y и Z. Затем необработанные данные необходимо преобразовать в значения углов. Из таблицы данных датчика мы видим, что режиму чувствительности 2000 dps соответствует единица измерения 70 mdps/разряд. Это означает, что нам нужно умножить необработанные выходные данные на 0,07, чтобы получить угловую скорость в градусах в секунду. Затем, если умножить угловую скорость на время, мы получим значение угла. Поэтому нам нужно вычислить временной интервал каждой секции цикла, и мы можем сделать это, используя функцию millis() вверху и внизу секции цикла, и мы сохраним ее значение в переменной dt. Таким образом, для каждого выполненного цикла мы будем вычислять угол и прибавлять его к конечному значению угла. Мы сделаем то же самое для двух других осей и в конце распечатаем результаты на последовательном мониторе.

Код магнитометра для Arduino

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

Затем нам нужно преобразовать необработанные данные в значение магнитного поля или единицы Гаусса. Из таблицы данных датчика видно, что режим чувствительности по умолчанию составляет 0,92 мг/цифру. Это означает, что нам нужно умножить необработанные данные на 0,00092, чтобы получить магнитное поле Земли в единицах Гаусса. В конце мы распечатаем значения на последовательном мониторе.

Материал данного урока мы использовали в проекте цифрового компаса MEMS на Arduino, созданном с использованием Processing IDE.

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

(Проголосуй первым!)
Загрузка...
446 просмотров

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

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