Ардуино: акселерометр MPU6050
Содержание
- Подключение MPU6050 к Ардуино
- Программа для получения сырых данных с акселерометра MPU6050
- Точность измерения ускорения в MPU6050
- Программа для вычисления угла наклона акселерометра MPU6050
- Заключение
Акселерометр — это прибор, позволяющий измерять ускорение тела под действием внешних сил. Подробно об устройстве этого датчика мы уже рассказывали на одном из уроков: Акселерометр: что это такое и как им определять наклон тела
На этот раз мы перейдем от теории к практике: подключим датчик к Ардуино, и напишем пару программ для работы с ним. Подключать будем модуль 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 и выводить их в последовательный порт.
Для работы программы потребуются библиотеки: 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:
Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!
Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!
Заключение
На этом уроке мы получили с датчика MPU6050 сначала сырые данные, а потом и угол его наклона в градусах. Это большое достижение. Но впереди еще немного математики и еще более крутые результаты! Будем делать комплементарный фильтр, который позволит работать с датчиком даже в условиях вибрации и тряски.
Источник: