- Что такое акселерометр и гироскопический датчик?
- Модуль акселерометра и гироскопического датчика MPU6050
- Необходимые компоненты
- Принципиальная электрическая схема
- Объяснение программирования
MPU6050 представляет собой ИК 3-осевой акселерометр и 3-осевой гироскоп в сочетании в одно целое. В нем также находится датчик температуры и DCM для выполнения сложной задачи. MPU6050 обычно используется при создании дронов и других удаленных роботов, таких как самобалансирующийся робот. В этом проекте мы построим цифровой транспортир с использованием MPU6050 и Arduino. Здесь серводвигатель используется для отображения угла на изображении транспортира. Вал серводвигателя прикреплен с помощью иглы, которая будет вращаться на изображении транспортира, чтобы указать угол, который также отображается на ЖК-дисплее 16x. Прежде чем вдаваться в подробности, давайте узнаем о датчике гироскопа.
Что такое акселерометр и гироскопический датчик?
Акселерометр используется для измерения ускорения. Фактически он воспринимает как статическое, так и динамическое ускорение. Например, мобильные телефоны используют датчик акселерометра, чтобы определять, что мобильный телефон находится в альбомном или портретном режиме. Ранее мы использовали Accelerometer с Arduino для создания многих проектов, таких как:
Гироскоп используется для измерения угловой скорости, которая использует силу земного притяжения для определения ориентации движущегося объекта. Угловая скорость - это скорость изменения углового положения вращающегося тела.
Например, современные мобильные телефоны используют гироскопические датчики, чтобы играть в мобильные игры в соответствии с ориентацией мобильного телефона. Кроме того, гарнитура VR использует датчик гироскопа для просмотра в 360-градусной ориентации.
Таким образом, в то время как акселерометр может измерять линейное ускорение, гироскоп может помочь определить ускорение вращения. При использовании обоих датчиков в качестве отдельных модулей становится трудно определить ориентацию, положение и скорость. Но благодаря объединению двух датчиков он работает как инерциальный измерительный блок (IMU). Таким образом, в модуле MPU6050 акселерометр и гироскоп присутствуют на одной печатной плате для определения ориентации, положения и скорости.
Приложения:
- Используется в дронах для контроля направления
- Самобалансирующиеся роботы
- Управление роботизированной рукой
- Датчик наклона
- Используется в мобильных телефонах, игровых приставках
- Гуманоидные роботы
- Используется в самолетах, автомобилях и т. Д.
Модуль акселерометра и гироскопического датчика MPU6050
MPU6050 - это микроэлектромеханическая система (MEMS), которая состоит из 3-осевого акселерометра и 3-осевого гироскопа внутри него. Также есть датчик температуры.
Он может измерять:
- Ускорение
- Скорость
- Ориентация
- Смещение
- Температура
Этот модуль также имеет внутри себя цифровой процессор движения (DMP), который достаточно мощный для выполнения сложных вычислений и, таким образом, освобождает микроконтроллер от работы.
Модуль также имеет два вспомогательных контакта, которые можно использовать для подключения внешних модулей IIC, таких как магнитометр. Поскольку адрес IIC модуля настраивается, более одного датчика MPU6050 можно подключить к микроконтроллеру с помощью вывода AD0.
Особенности и характеристики:
- Источник питания: 3-5 В
- Связь: протокол I2C
- Встроенный 16-битный АЦП обеспечивает высокую точность
- Встроенный DMP обеспечивает высокую вычислительную мощность
- Может использоваться для взаимодействия с другими устройствами IIC, такими как магнитометр
- Настраиваемый адрес IIC
- Встроенный датчик температуры
Распиновка MPU6050:
Пин код | Имя контакта | Использовать |
1 | Vcc | Обеспечивает питание модуля, может быть от + 3В до + 5В. Обычно используется + 5В |
2 | Земля | Подключен к земле системы |
3 | Последовательные часы (SCL) | Используется для обеспечения тактового импульса для связи I2C |
4 | Последовательные данные (SDA) | Используется для передачи данных через соединение I2C |
5 | Вспомогательные последовательные данные (XDA) | Может использоваться для сопряжения других модулей I2C с MPU6050. Это необязательно |
6 | Вспомогательные последовательные часы (XCL) | Может использоваться для сопряжения других модулей I2C с MPU6050. Это необязательно |
7 | AD0 | Если в одном MCU используется более одного MPU6050, то этот вывод можно использовать для изменения адреса. |
8 | Прерывание (INT) | Вывод прерывания, указывающий, что данные доступны для чтения MCU. |
Ранее мы использовали MPU6050 с Arduino для создания самобалансирующегося робота и инклинометра.
Необходимые компоненты
- Arduino UNO
- Модуль гироскопа MPU6050
- ЖК-дисплей 16x2
- Потенциометр 10к
- SG90-Серводвигатель
- Транспортир Изображение
Принципиальная электрическая схема
Принципиальная схема этого DIY Arduino Protractor приведена ниже:
Схема соединений между Arduino UNO и MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5В |
GND |
GND |
SCL |
A5 |
ПДД |
A4 |
Цепные соединения между Arduino UNO и серводвигателем:
Серводвигатель |
Arduino UNO |
КРАСНЫЙ (VCC) |
+ 5В |
ОРАНЖЕВЫЙ (ШИМ) |
9 |
КОРИЧНЕВЫЙ (ЗЕМЛЯ) |
GND |
Схема соединений между Arduino UNO и ЖК-дисплеем 16x2:
ЖК-дисплей |
Ардуино Нано |
VSS |
GND |
VDD |
+ 5В |
V0 |
К центральному контакту потенциометра Для управления контрастностью ЖК-дисплея |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
А |
+ 5В |
K |
GND |
Объяснение программирования
Как обычно, полная программа с демонстрационным видео приводится в конце этого руководства.
Здесь серводвигатель соединен с Arduino, и его вал проецируется на изображение транспортира, указывающее угол наклона MPU6050. Программирование для этого учебника простое. Посмотрим подробнее.
Сначала включите все необходимые библиотеки - библиотеку сервомотора для использования сервопривода, библиотеку ЖК-дисплея для использования ЖК-дисплея и библиотеку проводов для использования связи I2C.
MPU6050 использует связь I2C и, следовательно, должен подключаться только к контактам I2C Arduino. Итак, библиотека Wire.h используется для установления связи между Arduino UNO и MPU6050. Ранее мы связали MPU6050 с Arduino и отображали значения координат x, y, z на ЖК-дисплее 16x2.
#включают
Затем определите выводы ЖК-дисплея RS, E, D4, D5, D6, D7, которые подключены к Arduino UNO.
ЖК-дисплей LiquidCrystal (2,3,4,5,6,7);
Затем определяется адрес I2C MPU6050.
const int MPU_addr = 0x68;
Затем инициализируйте объект myservo для использования класса Servo и трех переменных для хранения значений осей X, Y и Z.
Сервомоторный резервуар; int16_t axis_X, axis_Y, axis_Z;
Следующие минимальное и максимальное значение устанавливаются как 265 и 402 для угла измерения от 0 до 360.
int minVal = 265; int maxVal = 402;
void setup ():
В функции настройки void сначала запускается связь I2C, и начинается передача с MPU6050 с адресом 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Переведите MPU6050 в спящий режим, написав 0x6B, а затем разбудите его, написав 0
Wire.write (0x6B); Wire.write (0);
После включения MPU6050 завершите передачу
Wire.endTransmission (истина);
Здесь вывод PWM серводвигателя соединен с выводом 9 Arduino UNO.
myservo.attach (9);
Как только мы включим схему, на ЖК-дисплее появится приветственное сообщение, которое исчезнет через 3 секунды.
lcd.begin (16,2); // Устанавливает ЖК-дисплей в режим 16X2 lcd.print ("CIRCUIT DIGEST"); задержка (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print («Ардуино»); lcd.setCursor (0,1); lcd.print («MPU6050»); задержка (3000); lcd.clear ();
void loop ():
Опять же, связь I2C начинается с MPU6050.
Wire.beginTransmission (MPU_addr);
Затем начните с регистра 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Теперь процесс перезапускается, и для этого установлено значение false, но соединение активно.
Wire.endTransmission (ложь);
После этого запросите данные из 14 регистров.
Wire.requestFrom (MPU_addr, 14, истина);
Теперь соответствующие значения регистров оси (x, y, z) получаются и сохраняются в переменных axis_X, axis_Y, axis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Затем сопоставьте эти значения от 265 до 402 как от -90 до 90. Это делается для всех трех осей.
int xAng = карта (axis_X, minVal, maxVal, -90,90); int yAng = карта (axis_Y, minVal, maxVal, -90,90); int zAng = карта (axis_Z, minVal, maxVal, -90,90);
Формула для вычисления значения x в градусах (от 0 до 360) приведена ниже. Здесь мы преобразуем только x, потому что вращение серводвигателя основано на перемещении значения x.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
Значение угла X от 0 до 360 градусов преобразуется в 0 до 180.
int pos = map (x, 0,180,0,180);
Затем запишите значение угла для поворота сервопривода на изображении транспортира и распечатайте эти значения на ЖК-дисплее 16x2.
myservo.write (pos); lcd.setCursor (0,0); lcd.print («Угол»); lcd.setCursor (0,1); lcd.print (x); задержка (500); lcd.clear ();
Вот как можно использовать MPU6050 с Arduino для измерения угла. Полный код и видео для этого проекта приведены ниже.