- Цена: $3
 
                 Датчики определения положения в пространстве широко используются в мобильных устройствах, а для самоделок чаще всего применяются в квадрокоптерах.  Также, его можно применить в светящемся шлеме! Удобно, не правда ли? Наклонил голову вправо — загорелось правое «полушарие» =) влево — левое, согнул голову в шее — сзади на шлеме высветился стоп-сигнал! Вот только, думаю, моей шеи хватит минут на 5 таких упражнений, потом — коллдаун, в виде боли на неделю обеспечен.  Итак, заказал — прислали, теперь нужно разобраться и продемонстрировать функционал для Вас, уважаемые читатели Муськи.  Пришло с треком, не известно, почему, но в Киеве посылку держали неделю (или это глюки системы треккинга). Дошла чуть менее, чем за три недели. Упаковано в три слоя утеплителя — для амортизации. Сам модуль — внутри запаянного пакетика со штрих-кодом на наклейке:

тебя вертят и греют нужно вертеться в пространстве и знать температуру =)  Или, в процессе интенсивной работы с устройством, оно может нагреваться и нужно контролировать его температуру и нагрузку.
Характеристики:
— 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/
 




Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino
Что такое Ардуино? Это свобода для изобретателя
ОБОРУДОВАНИЕ 
ТЕХНОЛОГИИ 
РАЗРАБОТКИ
							
ESP8266 и Arduino, подключение, распиновка
Сигнализация на базе Ардуино своими руками
Датчики давления Arduino bmp280, bmp180, bme280
Arduino Pro Micro