- Цена: $3
Датчики определения положения в пространстве широко используются в мобильных устройствах, а для самоделок чаще всего применяются в квадрокоптерах. Также, его можно применить в светящемся шлеме! Удобно, не правда ли? Наклонил голову вправо — загорелось правое «полушарие» =) влево — левое, согнул голову в шее — сзади на шлеме высветился стоп-сигнал! Вот только, думаю, моей шеи хватит минут на 5 таких упражнений, потом — коллдаун, в виде боли на неделю обеспечен. Итак, заказал — прислали, теперь нужно разобраться и продемонстрировать функционал для Вас, уважаемые читатели Муськи. Пришло с треком, не известно, почему, но в Киеве посылку держали неделю (или это глюки системы треккинга). Дошла чуть менее, чем за три недели. Упаковано в три слоя утеплителя — для амортизации. Сам модуль — внутри запаянного пакетика со штрих-кодом на наклейке: Размеры платы: 20×16мм. В комплекте два набора штыревых контактов: ровные и загнутые — удобно, не придется гнуть или ровнять.… Большие отверстия не металлизированы, как на картинке в магазине, поэтому, если Вы будите их прикручивать болтами к «минусу», эффекта не будет. Я заливаю их термоклеем, а он, образуя «шапочки», надёжно фиксирует плату. Отвертия контактов металлизированы отлично, паяются без проблем. Модуль GY-521 включает понижающий линейный стабилизатор для питания от 5В, красный светодиод питания и обвязку, обеспечивающую работу по протоколу I2C.СхемаВзята из статьи про такой же модуль — cxem.net/mc/mc324.php MPU-6050 снабжен акселерометром, гироскопом и термометром. Зачем нужен термометр — не понятно, вероятно, его было удобно разместить в этой микросхеме. Или, действительно, есть такие варианты применения, о которых я не знаю, где тебя вертят и греют нужно вертеться в пространстве и знать температуру =) Или, в процессе интенсивной работы с устройством, оно может нагреваться и нужно контролировать его температуру и нагрузку.
Характеристики:
— 16-битный АЦП, — напряжение питания 3-5В, — поддержка протокола «IIC» (может, I2C ?), — диапазон ускорений: ± 2 ± 4 ± 8 ± 16g, — диапазон «гиро»: ± 250 500 1000 2000 ° / s, — покрытие иммерсионным золотом вместо лужения, — ток при работе последнего примера составил 5.3 мА и 1.2 мА когда устройство не успело стартовать (питание на модуль было подано после выполнения setup() контроллером)
Подключение к Arduino
Для интерфейса I2C у Ардуино имеются контакты A4 (SDA) и A5 (SCL), да-а, это те, которые расположены чёрти-где (на одной плате у меня они были справа от контроллера, на другой с левого края). В коде нужно использовать библиотеку Wire, прочитать о ней можно туточки. Минимальная схема во Fritzing такая:… а значит у нас уже не 8 лишних штырьков, а целых двенадцать!
Тестирование
Термометр тестировать проще всего: залил скетч отсюда, открыл монитор порта, выставил скорость на 9600, — побежали такие строкиВследствие нагревания феном для волос, значение Tmp = взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно. Данные, выводимые вторым скетчем Более приятный глазу пример описан в этой статье. Там реализована трансляция положения предмета в реальном времени! Для повторения эксперимента, нужно скачать по ссылкам в конце той статьи: скетч для Ардуино — GY_521_send_serial (в atmega128 у меня залилось без проблем) и прогу для 3D-рендеринга ShowGY521Data. Последнюю нужно запускать в IDE Processing, статья была написана в 2013 году и для нормальной работы, качать лучше версию 1.5.1, в исходнике нужно подправить номер порта:short portIndex = 1; в строке 15 вместо 1 поставить порядковый номер COM-порта, но не номер из его имени (у меня, при подключении программатора, появляется один порт «COM15», я исправил на , если у Вас, допустим, есть порты «COM8» и «COM10», причем, последний соединён с Ардуино, то ничего исправлять не надо);myPort = new Serial(this, portName, 38400); в строке 42 поставить скорость, которая была в скетче для Ардуино — 19200. Запускаем программу…видим три объекта, моделирующих гироскоп, акселерометр и нечто «средне».При отклонении платы, объекты синхронно пляшут, акселерометр подёргивается реще
После определённого времени кручения платой, показания гироскопа сбиваются:это нормально и об этом написано в статье, упомянутой выше. Примечательно, что если нажать ресет и перезагрузить плату в произвольном положении, то реальное положение в пространстве будет показывать акселерометр, гироскоп же сориентироваться в изначальное положение:Суть этого вяления раскрыта в первом комментарии к этой статье от AndyBig. Думаю, можно будет реализовать с помощью этого модуля какую-нибудь «неваляшку», шлем обклеивать светодиодами как-то рука не поднимается.Тестовая установка
Тентаклиевый монстр, о котором я писал ранее, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):если отсоединить тентакли шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.всё ещё может напугать, но на самом деле бояться нечего:спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил Orange Pi PC =)猫Даташит на сенсор MPU-6050Описание регистров MPU-6050Неплохая статья Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Акселерометр — это прибор, позволяющий измерять ускорение тела под действием внешних сил. Подробно об устройстве этого датчика мы уже рассказывали на одном из уроков: Акселерометр: что это такое и как им определять наклон тела
На этот раз мы перейдем от теории к практике: подключим датчик к Ардуино, и напишем пару программ для работы с ним. Подключать будем модуль MPU6050 от RobotClass.
В основе этого модуля лежит микросхема MPU6050, в которой размещаются сразу два датчика: акселерометр и гироскоп. На плате уже имеется вся необходимая обвязка, а также преобразователь напряжения.
Характеристики модуля MPU6050 ROC:
- напряжение питания: от 3,5 до 6 В;
- потребляемый ток: 500 мкА;
- ток в режиме пониженного потребления: 10 мкА при 1,25 Гц, 20 мкА при 5 Гц, 60 мкА при 20 Гц, 110 мкА при 40 Гц;
- диапазон: ± 2, 4, 8, 16g;
- разрядность АЦП: 16;
- интерфейс: I2C (до 400 кГц).
На плате имеется 8 контактов:
- VCC — положительный контакт питания;
- GND — земля;
- SDA — линия данных I2C;
- SCL — линия синхроимпульсов I2C;
- INT — настраиваемое прерывание;
- AD0 — I2C адрес; по-умолчанию AD0 подтянут к земле, поэтому адрес устройства — 0x68; если соединить AD0 к контактом питания, то адрес изменится на 0x69;
- XCL, XDA — дополнительный I2C интерфейс для подключения внешнего магнитометра.
Подключение MPU6050 к Ардуино
Соединим контакты датчика с Ардуино Уно согласно стандартной схеме для интерфейса I2C:
MPU6050 ROC | GND | VCC | SDA | SCL |
Ардуино Уно | GND | +5V | A4 | A5 |
Принципиальная схема
Внешний вид макета
Программа для получения сырых данных с акселерометра MPU6050
Составим программу, которая будет каждые 20 миллисекунд получать данные из MPU6050 и выводить их в последовательный порт.
#include "I2Cdev.h" #include "MPU6050.h" #define T_OUT 20 MPU6050 accel; unsigned long int t_next; void setup() { Serial.begin(9600); accel.initialize(); Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); } void loop() { long int t = millis(); if( t_next < t ){ int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw; t_next = t + T_OUT; accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw); Serial.println(ay_raw); // вывод в порт проекции ускорения на ось Y } }
Для работы программы потребуются библиотеки: MPU6050 и I2Cdev, ссылки на которые можно найти в конце урока.
Загружаем программу на Ардуино и открываем окно графика. Поворачиваем датчик вокруг оси X на 90 градусов в одну сторону, потом на 90 в другую. Получится примерно такая картина.
На графике хорошо видно, что при наклоне оси Y вертикально, акселерометр выдает значения близкие к четырём тысячам. Откуда берется это число?
Точность измерения ускорения в MPU6050
Дело в том, что датчик MPU6050 позволяет настраивать точность измерений. Можно выбрать один из четырех классов точности: ±2G, 4G, 8G и 16G, где 1G — это одна земная гравитация. Используемая нами библиотека по-умолчанию настраивает датчик на диапазон ±8G (прим. по ссылке внизу статьи библиотека по-умолчанию устанавливает ±2G).
С другой стороны, MPU6050 имеет 16 разрядный АЦП. 2 в степени 16 даст нам число 65 536. Поскольку датчик может измерять и отрицательное и положительное ускорение, то он будет выдавать нам числа от -32768 до +32768.
Сложив эти два факта вместе получаем, что при таких настройках 1G будет равен числу 4096 (ну а -1G равен числу -4096). Это вполне совпадает с наблюдаемыми на графике значениями!
Следующий шаг — преобразование этих странных чисел в привычные нам углы, измеряемые в градусах.
Программа для вычисления угла наклона акселерометра MPU6050
Добавим в предыдущую программу вычисление угла поворота датчика вокруг оси X:
#include "I2Cdev.h" #include "MPU6050.h" #define TO_DEG 57.29577951308232087679815481410517033f #define T_OUT 20 MPU6050 accel; float angle_ax; long int t_next; float clamp(float v, float minv, float maxv){ if( v>maxv ) return maxv; else if( v= 0){ angle_ax = 90 - TO_DEG*acos(ay); } else { angle_ax = TO_DEG*acos(-ay) - 90; } Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X } }
Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!
Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!
Заключение
На этом уроке мы получили с датчика MPU6050 сначала сырые данные, а потом и угол его наклона в градусах. Это большое достижение. Но впереди еще немного математики и еще более крутые результаты! Будем делать комплементарный фильтр, который позволит работать с датчиком даже в условиях вибрации и тряски.
Несколько идей/заданий:
- Детектор стука, он же детектор попадания пули в мишень. Программа должна обнаружить всплеск показаний датчика по одной из осей и сигнализировать об этом, например, с помощью зуммера.
- Кодовый замок, открывающийся по определенной последовательности стука. То же, что и в предыдущем задании, только нужно считать паузы между стуками и сверять их с эталонной последовательностью.
- Детектор свободного падения. Если значения акселерометра по всем трем осям близки к нулю, значит тело находится в состоянии свободного падения.
- Пульт управления роботом. Можно прикрепить датчик на перчатку и отслеживать наклоны ладони по двум осям. Передавать значения датчика через Bluetooth роботу.
Принципиальная схема датчика
Полезные ссылки
2+
Ардуино – популярнейшая система для одноимённых МК, позволяющая любому желающему, даже без специального образования, воплотить в жизнь проект, о котором он давно мечтал. Будь то автоматизированная теплица или простая система выключения света по хлопку в умном доме.
Но естественно, сам микроконтроллер не способен выполнять все функции, и для этого к нему необходимо покупать датчики, коих на рынке более нескольких десятков разновидностей. Об одном из таких, а именно мы рассмотрим гироскоп Ардуино, и пойдёт речь. Что это такое, в каких проектах его можно применить и как настроить опишем ниже.
А если вам хочется больше практики — посмотрите наши уроки: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino или Гироскоп с помощью Arduino 101.
Назначение связки гироскоп и акселерометр
Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:
- Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
- Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
- Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.
Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.
Но применить модуль можно и с большей выдумкой, например, для измерения количества оборотов в секунду и регуляции мощности охладительной системы или автоматизации различных процессов.
Всё зависит исключительно от вашей выдумки и конкретного проекта.
Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino
Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.
Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.
Комплектующие
Создаётся данный датчик или МК, в зависимости от того, что вы собрались приобретать, из компонентов ATmega328.
Так, в нём имеются:
- 14 штук различных пинов и цифровых выходов, половина из которых являются ШИМ-выходами.
- Специальные кварцевые резонаторы до 16 МГц мощностью.
- Встроенный вход под usb-кабель, который позволит вам сэкономить не только время, но и деньги, которые вы могли бы потратить на покупку адаптера.
- Контакты и распиновка для стандартного питания с нулем, фазой и заземлением.
- Контакты для сброса до заводских настроек, при которых весь машинный код и данные будут стёрты. Это полезно в том случае, если вы напортачили с программой и модуль превратился в бесполезную груду железа, и просто как экономия времени, если необходимо сменить прошивку.
- ICSP контакт, который необходим для того, чтобы запрограммировать машинный код, который будет находиться внутри системы.
Все эти компоненты и составляют Arduino гироскоп, позволяя ему выполнять свои базовые функции. Но как же запрограммировать систему, если вы до этого не имели опыта работа с данными МК?
Сборка
Здесь всё зависит от используемого вами интерфейса, например, для I2C от Ардуино пригодятся контакты: A4, A5, которые являются SDA и SCL входами соответственно.
Для нормального функционирования всей этой системы необходимо будет использовать wire библиотеку в коде.
Gy-521 (mpu6050) | Arduino (Uno) |
---|---|
VCC | 3.3 V |
GND | GND |
SCL | A5 |
SDA | A4 |
Также будьте готовы к тому, что распиновка может оказаться не самой удачной, поэтому не стоит делать корпус для устройства впритык, пока вы не подключите и не увидите реальные размеры вашего проекта.
Питание модуля строго 3.3В!
Программы
Без программы модуль будет не более чем грудой железа, которая не выполнит ни одной функции. Базовые библиотеки для взаимодействия с другими МК можно найти на официальном сайте или в интернете, но, помимо них, вам потребуется вспомогательный код. С его помощью можно настроить взаимодействие между акселерометром и тем же блютуз модулем, без которого, в большинстве проектов, он станет бесполезен.
Мы воспользуемся готовой библиотекой для Arduino MPU 6050, которую написал Джефф Роуберг.
Скачать библиотеку MPU6050
В целом, многие поступают и другим путем, правда далеко не все умеют программировать на С++, поэтому перед пользователем, который хочет написать программу для работы с гироскопом, открывается два пути:
- Найти уже готовый шаблон или библиотеку. Для этого потребуется всего пара секунд и подключение к интернету, но не стоит забывать, что готовые решения пишутся, зачастую, столь же неопытными инженерами. Поэтому, по возможности, проверяйте, насколько качественный код вы скачиваете. Смотрите отзывы о библиотеке, если есть такая возможность, и старайтесь скачивать их на зарубежных форумах. Там и выбор будет больше, и куда выше вероятность найти действительно качественную библиотеку.
- Написать функции и методы для работы системы своими силами. Этот вариант подойдёт лишь тем, кто ранее имел дело с языком С++ и понимает все нюансы работы с Ардуино. Все необходимые вспомогательные библиотеки можно скачать в интернете, а всё остальное вы можете подогнать под свои нужды. Такой способ идеально подходит для тех, кто хочет реализовать собственный проект, не имеющий аналогов. Ведь в таком случае найти заготовленный код под него будет крайне сложно, даже если быть готовым править большую его часть.
Вернемся к нашей библиотеке. После того как вы скачали библиотеку гироскопа вам нужно сделать следующее.
Нужно распаковать/извлечь эту библиотеку, взять папку с именем «MPU6050» и поместить ее в папку «library» в Arduino. Для этого перейдите в место, где вы установили Arduino (Arduino -> libraries) и вставьте свою папку в папку библиотек. Возможно, вам также придется сделать то же самое, чтобы установить библиотеку I2Cdev, если у вас еще нет ее на вашем Ардуино. Для её установки выполните ту же процедуру, что и выше. Вы можете скачать I2Cdev на нашем сайте по этой ссылке.
Если вы всё сделали правильно, при открытии IDE Arduino вы можете увидеть «MPU6050» в:
Файл -> Примеры.
Затем откройте пример программы из меню:
Файл -> Примеры -> MPU6050 -> Примеры -> MPU6050_DMP6.
Затем вы должны загрузить этот код в свой Ардуино. После загрузки кода откройте последовательный монитор и установите скорость передачи в бодах как 115200. Затем проверьте, видите ли вы что-то вроде «Инициализация устройств I2C …» («Initializing I2C devices …») на последовательном мониторе.
Если вы этого не сделаете, просто нажмите кнопку сброса. Теперь вы увидите строку с надписью «Отправить символы, чтобы начать программирование и демо DMP» («Send any character to begin DMP programming and demo»). Просто введите любой символ на последовательном мониторе и отправьте его, и вы должны начать видеть значения поступающие с MPU 6050.
Также можно, например, воспользоваться скетчем ниже, который пересчитывает координату X и Y и выводит в консоль (монитор последовательного порта):
#include #include "Kalman.h" Kalman kalmanX; Kalman kalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate the angle using a Kalman filter double compAngleY = 180; double kalAngleX; // Calculate the angle using a Kalman filter double kalAngleY; uint32_t timer; void setup() { Wire.begin(); Serial.begin(9600); i2cWrite(0x6B,0x00); // Disable sleep mode kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); } void loop() { /* Update all the values */ uint8_t* data = i2cRead(0x3B,14); accX = ((data[0] << 8) | data[1]); accY = ((data[2] << 8) | data[3]); accZ = ((data[4] << 8) | data[5]); tempRaw = ((data[6] << 8) | data[7]); gyroX = ((data[8] << 8) | data[9]); gyroY = ((data[10] << 8) | data[11]); gyroZ = ((data[12] << 8) | data[13]); /* Calculate the angls based on the different sensors and algorithm */ accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG; accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG; double gyroXrate = (double)gyroX/131.0; double gyroYrate = -((double)gyroY/131.0); gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000); kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000); timer = micros(); Serial.println(); Serial.print("X:"); Serial.print(kalAngleX,0); Serial.print(" "); Serial.print("Y:"); Serial.print(kalAngleY,0); Serial.println(" "); // The accelerometer's maximum samples rate is 1kHz } void i2cWrite(uint8_t registerAddress, uint8_t data){ Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop } uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) { uint8_t data[nbytes]; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don't release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i < nbytes; i++) data [i]= Wire.read(); return data; }
Когда X и Y равны 180 — гироскоп в горизонтальной плоскости:
Вот вы определились с выбором и уже написали всё необходимое ПО, пришла пора его протестировать. Для этого, естественно, необходимо собрать всё вместе.
Наладка
Далее наступает самый ответственный этап – отладка программного кода. Здесь вам необходимо подключить питание к прибору, а сам прибор – к компьютеру, чтобы следить за строками в консоли. Прогоните несколько базовых функций и посмотрите, не будет ли ошибок или багов. Если они возникают, то воспользуйтесь любым удобным методом дебагинга.
Самый простой вариант – использовать для ввода переменные, которые вычисляются рандомным образом, и смотреть, как код будет вести себя в различных ситуациях.
Тестирование
После отладки необходимо провести тестирование. В чём разница? При тестировании вы точно знаете, что программный код работает без лагов и багов, но вам необходимо убедиться, что в нём нет логических ошибок.
С акселерометром и гироскопом проще всего использовать программы 3Д рендеринга показаний, вроде ShowGY521Data, которые позволят в реальном времени увидеть, как железо позиционируется в пространстве. В случае неисправностей всегда можно подправить нулевой уровень и уменьшить чувствительность акселерометра, который также влияет на конечную модель отображения устройства.
Используемые источники:
- https://mysku.ru/blog/china-stores/40178.html
- https://robotclass.ru/tutorials/arduino-accelerometer-mpu6050/
- https://arduinoplus.ru/arduino-giroskop/