Цифровой духовный уровень на базе Arduino и MPU6050: 3 шага
Цифровой духовный уровень на базе Arduino и MPU6050: 3 шага
Anonim
Image
Image
Схема
Схема

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

Этот проект предназначен для создания цифрового спиртового уровня на базе Arduino и MPU6050. Хотя законченный дизайн и код принадлежат мне, исходная концепция и большая часть кода, над которым я работал, - нет. Я не сторонник плагиата, поэтому я более чем счастлив отдать должное тем, на чьих идеях я построил. Два основных человека, которым я хочу поблагодарить, - это Пол Маквортер из YouTube и DroneBot Workshop. Я включаю ссылки на них в свой PDF-файл с полезными ссылками на YouTube. Также спасибо EEEnthusiast за его информативное видео об использовании MPU6050, включая настройку и чтение из модуля без внешней библиотеки (его ссылка находится в том же PDF-файле).

Созданный мной проект работает «как есть» и довольно точен, определенно до 45% в любом направлении. Вы можете использовать его в точности так, как я его разработал, или можете адаптировать его по своему вкусу. Более проницательные из вас заметят, что мой проект выглядит почти идентично проекту, созданному мастерской DroneBot, но будьте уверены, есть существенные различия, особенно когда речь идет о коде для расчета углов, а также о возможности хранения калибровочных значений в Eeprom!

Некоторые особенности, чтобы подогреть аппетит:

Углы наклона и крена доступны с точностью до 0,1 градуса.

Автоматическое определение ориентации гироскопа (горизонтальная или вертикальная)

Полная калибровка с автоматическим сохранением результатов в eeprom

Светодиодная индикация от -2 до +2 градусов (с возможностью изменения в коде)

Дополнительная звуковая индикация уровня (можно включить / выключить на лету)

Компактная схема, требующая минимального количества компонентов

Давайте начнем.

Запасы

В этом проекте (как есть) используются следующие элементы:

1 x Arduino nano (мой клон)

1 x модуль гироскопа / акселерометра MPU6050

1 x LCD - 16 x 2 + соединение I2C

1 x нажмите, чтобы переключить

1 х пьезо-зуммер

1 х зеленый светодиод

2 х желтых светодиода

2 х красных светодиода

5 резисторов по 220 Ом

Различные соединительные кабели

Макетная плата

Источник питания (у меня использовался USB-блок питания на 5 В, когда он не был подключен к моему ПК, но вы могли использовать аккумулятор, подключенный соответствующим образом)

Шаг 1: Схема

Схема
Схема
Схема
Схема

Предполагая, что у вас есть все компоненты, вам нужно будет собрать макетную плату.

Я показываю свою настройку в качестве руководства, но подключения следующие:

Вывод D2 Arduino подключается к 1 стороне кнопочного переключателя. Другая сторона нажимного переключателя подключается к земле.

Вывод D3 Arduino подключается к одной стороне резистора 220 Ом. Другая сторона резистора подключается к аноду красного светодиода. Катод красного светодиода идет на массу.

Вывод D4 Arduino подключается к одной стороне резистора 220 Ом. Другая сторона резистора подключается к аноду желтого светодиода. Катод желтого светодиода идет на массу.

Вывод D5 Arduino подключается к одной стороне резистора 220 Ом. Другая сторона резистора подключается к аноду зеленого светодиода. Катод зеленого светодиода идет на массу.

Вывод D6 Arduino подключается к одной стороне резистора 220 Ом. Другая сторона резистора подключается к аноду желтого светодиода. Катод желтого светодиода идет на массу.

Вывод D7 Arduino подключается к одной стороне резистора 220 Ом. Другая сторона резистора подключается к аноду красного светодиода. Катод красного светодиода идет на массу.

Контакт D8 Arduino подключается к одной стороне пьезозуммера. Другая сторона зуммера подключается к земле.

Вывод A4 Arduino подключается к выводам SDA на MPU6050 И ЖК-дисплее.

Контакт Arduino A5 подключается к контактам SCL на MPU6050 И ЖК-дисплее.

Питание 5 В и заземление для MPU6050 и ЖК-дисплея поступают от контактов Arduino Nano 5 В и GND соответственно.

После завершения он должен быть похож на показанную мной настройку. Я положил blu tak под MPU6050, чтобы он не двигался, а также на ЖК-дисплей, чтобы он оставался на краю макета.

Шаг 2: Код

Прилагаемый код - это код, который я использовал для этого проекта. Единственная библиотека, с которой у вас могут возникнуть проблемы, - это

Библиотека LiquidCrystal_I2C.h, которую я импортировал, когда впервые начал работать с ЖК-дисплеями. К сожалению, есть несколько библиотек, которые используют один и тот же оператор #include, но немного отличаются. Если у вас есть проблемы с вашим, найдите другой ЖК-код, который вам подходит, и измените код соответствующим образом. Отличается только установка. Все команды печати должны работать одинаково.

Весь код прокомментирован, и, если я все сделал правильно, также будет видео, объясняющее все, но вот несколько моментов, на которые следует обратить внимание:

LiquidCrystal_I2C lcd (0x27, 16, 2);

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

{lcd.setCursor (0, 1); lcd.print («Горизонтально!»); ориентация = ГОРИЗОНТАЛЬНАЯ; // Считываем необработанные данные Acc и гироскопа из MPU-6050 1000 раз для (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Добавляем смещение гироскопа по оси x к переменной gyro_x_cal gyro_x_cal + = gyro_x; // Добавляем смещение гироскопа по оси y к переменной gyro_y_cal gyro_y_cal + = gyro_y; // Добавляем смещение гироскопа по оси z к переменной gyro_z_cal gyro_z_cal + = gyro_z; // Добавляем смещение acc x к переменной acc_x_cal acc_x_cal + = acc_x; // Добавляем смещение acc y к переменной acc_y_cal acc_y_cal + = acc_y; } // Разделим все результаты на 1000, чтобы получить среднее смещение gyro_x_cal / = 1000.0; gyro_y_cal / = 1000.0; gyro_z_cal / = 1000.0; acc_x_cal / = 1000,0; acc_y_cal / = 1000,0; HorizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizontalCalibration); eeprom_address + = sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address + = sizeof (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address + = sizeof (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address + = sizeof (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address + = sizeof (float); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address + = sizeof (float); // Обратите внимание, что мы не сохраняем смещение для acc_z из-за силы тяжести! задержка (500); }

Вышеупомянутый блок кода выполняет процедуру калибровки. Этот код предназначен для горизонтальной калибровки. Для вертикальной калибровки есть почти идентичный код (обратите внимание, код знает, установлен ли ваш MPU6050 горизонтально или вертикально!). MPU6050, читается 1000 раз. соответствующие значения суммируются, а затем делятся на 1000, чтобы получить среднее значение «смещения». Эти значения затем сохраняются в Nano eeprom. Все значения горизонтальной калибровки сохраняются, начиная с адреса eeprom 0. Все вертикальные значения сохраняются, начиная с адреса eeprom 24. Калибровка ДОЛЖНА выполняться на полностью ровной поверхности, в противном случае они ничего не значат.

/ * * Следующие несколько строк обрабатывают необработанные данные, чтобы преобразовать их в углы, которые можно вывести на ЖК-дисплей и светодиоды. * Значение 4096, на которое делятся данные ускорения, взято из таблицы данных MPU6050 и основано на частоте дискретизации. * Значение 9,8 - сила тяжести * Функция atan2 взята из математического модуля и используется для вычисления углов по заданным данным * / thetaM = -atan2 ((acc_x / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Исходные данные phiM = -atan2 ((acc_y / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Исходные данные dt = (millis () - millisOld) / 1000.; millisOld = миллис (); / * * В этом разделе используются данные гироскопа, чтобы сделать систему более отзывчивой * значение 65,5, на которое делятся данные гироскопа, взято из таблицы данных MPU6050 и основано на частоте дискретизации * / theta = (theta + (gyro_y / 65,5) * dt) *. 96 + thetaM *.04; // Фильтр низких частот phi = (phi + (gyro_x / 65.5) * dt) *. 96 + phiM *.04; // Фильтр нижних частот

Приведенный выше код - это то, что вычисляет углы. Надеюсь, комментарии дадут небольшое представление о том, как это работает, но для более подробного объяснения посмотрите видео Пола МакВортерса, на которое есть ссылка в прикрепленном PDF-файле. Что я скажу, так это то, что вы можете изменить частоту дискретизации для гироскопа и акселерометра (что делается в подпрограмме настройки MPU6050 в нижней части моего кода). Если вы измените частоту дискретизации, вам также придется изменить степень деления необработанных данных. Для данных акселерометра текущее значение - 4096. Для гироскопа текущее значение - 65,5.

Обратитесь к прилагаемым таблицам данных и видео EEEntusiast (ссылка в прикрепленном PDF-файле) для получения более подробной информации о том, как находятся значения выборки и смещения.

Шаг 3. Дальнейшие действия

К этому моменту, надеюсь, уже сделали этот проект, но что теперь?

Во-первых, почему бы на самом деле не встроить его в спиртовой уровень, который вы можете использовать. Вы можете купить дешевый спиртовой уровень (убедитесь, что это коробочный), который вы можете адаптировать, или, если у вас есть комплект, распечатайте свой собственный уровень / коробку.

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

Попробуй доработать код дальше. Например, в настоящее время угол, превышающий 45 градусов, является, мягко говоря, приблизительным. Есть ли способ обойти это?

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

Если вам нравится эта инструкция, поставьте лайк, чтобы я знал.

Если сделаете это, покажите, пожалуйста (особенно если он в рабочем корпусе).

СПАСИБО