Измеритель уровня (уклономер) на основе Arduino и MPU6050

В этой статье мы рассмотрим создание цифрового измерителя уровня (Inclinometer, инклинометр, креномер, уклономер) своими руками (DIY) на основе платы Arduino и MPU6050.

MPU6050 представляет собой 3-х осевой акселерометр и 3-х осевой гироскоп, объединенных в одну микросхему. Также он имеет в своем составе датчик температуры и цифровой канал с памятью, что позволяет с его помощью решать достаточно сложные задачи. Этот датчик часто используется при создании дронов и различных роботов с дистанционным управлением, в особенности самобалансирующихся роботов.

Внешний вид измерителя уровня на основе Arduino и MPU6050

Как мы знаем, измеритель уровня обычно используется для того чтобы проверить ровная поверхность или нет. Выпускаются цифровые измерители уровня и механические (на основе пузырька воздуха – наверняка все вы его видели).

Также в этой статье мы будем удаленно считывать показания измерителя уровня – на экране смартфона. Это очень удобно, когда, к примеру, MPU6050 размещен на дроне или в другом труднодоступном месте.

На нашем сайте вы также можете прочитать статью о подключении гироскопа MPU6050 к плате Arduino.

Необходимые компоненты

  1. Плата Pro-mini (5V) (купить на AliExpress).
  2. Гироскоп MPU6050.
  3. Bluetooth модуль HC-05 или HC-06.
  4. FTDI board (плата).
  5. Макетная плата.
  6. Соединительные провода.
  7. Смартфон.

Внешний вид гироскопа MPU6050

Работа схемы

Схема измерителя уровня на основе платы Arduino и MPU6050 представлена на следующем рисунке. Схема достаточно простая и ее сравнительно легко можно собрать на макетной плате.

Схема измерителя уровня на основе платы Arduino и MPU6050Взаимодействие с датчиком MPU6050 будет осуществляться по протоколу I2C, поэтому его контакт SDA подключен к контакту A4 платы Arduino, а контакт SCL — к контакту A5 платы Arduino. Bluetooth модуль HC-06 работает по порту последовательной связи, его контакт Rx подключен к контакту D11 платы Arduino, а его контакт Tx — к контакту D10 платы Arduino. Контакты D10 и D11 платы Arduino в программе конфигурируются так, чтобы работать как порт последовательной связи. Модуль HC-05 и датчик MSP6050 работают от напряжения +5V, поэтому в схеме они запитаны от контакта Vcc платы Arduino.

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

Внешний вид собранного на макетной плате измерителя уровня

Как запитать схему

Вы можете подать питание на схему с помощью платы программирования FTDI (как сделали мы) или использовать батарейку на 9V или адаптер на 12V – в этом случае вы должны подсоединить их к контакту Raw платы Arduino pro mini – эта плата имеет в своем составе встроенный регулятор напряжения, который трансформирует поступающее входное напряжение в постоянное напряжение +5V.

Внешний вид платы программирования FTDI

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же рассмотрим его наиболее важные фрагменты.

Сначала мы должны подключить гироскоп MPU6050 к плате Arduino, для этой цели мы будем использовать библиотеку, разработанную Korneliusz Jarzebski и которую можно скачать по ссылке — MPU6050 Liberty.

Скачайте ZIP файл библиотеки по приведенной ссылке и добавьте ее в вашу Arduino IDE. После этого запустите пример из скачанной библиотеки по адресу File->Examples->Arduino_MPU6050_Master -> MPU6050_gyro_pitch_roll_yaw. Загрузите программу этого примера в Arduino Pro mini. В результате работы этого примера у вас будет установлена последовательная связь со скоростью 115200 бод/с и в окне монитора последовательной связи вы должны наблюдать примерно следующую картину.

Работа тестового примера по взаимодействию с гироскопом

В исходном состоянии эти три значения будут равны 0, но как только вы будете перемещать вашу макетную плату в пространстве вы заметите как будут изменяться их значения. Если они изменяются, значит, все работает нормально, если нет – ищите ошибку в соединениях схемы. Чтобы сбросить показания датчика можно нажать кнопку сброса на Arduino. Следующая картинка поможет вам понять принцип изменения значений Pitch, Roll и Yaw в зависимости от перемещения датчика MPU6050 в пространстве.

Рисунок, поясняющий значение параметров гироскопа

Нас из этих параметров будут интересовать только параметры Roll и Pitch. Значение параметра Roll будет говорить нам о наклоне по оси X, а значение параметра Pitch – о наклоне по оси Y. Эти данные будут поступать в плату Arduino через Bluetooth.

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

Далее с помощью библиотеки последовательной связи (Software Serial library) мы задействуем последовательную связь на контактах D10 и D11, которые используются в данном случае для взаимодействия с модулем Bluetooth.

Далее мы должны инициализировать необходимые переменные и последовательные порты для связи с модулем Bluetooth и монитором последовательной связи. Для взаимодействия с модулем Bluetooth (HC-05 или HC-06) мы будем использовать скорость 9600 бод/с. Далее мы проверяем наличие соединения по протоколу IIC с датчиком MPU6050 и если его нет, то печатаем предупреждение в окне монитора последовательной связи. Далее запускаем калибровку гироскопа и выставляем ему чувствительность.

Команда “mpu.calibrateGyro();” производит калибровку MPU6050 на его текущей позиции. Эту команду в программе можно вызывать много раз – при ее выполнении значения показателей гироскопа будут выставляться в 0. Команда “mpu.setThreshold(3);” определяет на какую величину будут изменяться значения показателей гироскопа при его перемещении. Не выставляйте очень маленькую чувствительность (малое значение в функции) поскольку это может привести к увеличению шумов.

Далее в функции loop() мы будем непрерывно считывать значения с гироскопа, рассчитывать рассмотренные выше показатели pitch, roll и yaw и передавать их на Bluetooth модуль. Следующие две строки в программе будут считывать значения гироскопа с датчика и значение температуры.

Затем мы рассчитываем показатели pitch, roll и yaw путем умножения данных с гироскопа на шаг времени (time step) и прибавляя к ним предыдущие значения. timeStep здесь у нас – это просто время между успешными считываниями данных с датчика.

Чтобы лучше понять что собой представляет временной шаг (timeStep) давайте посмотрим на следующую приведенную ниже строчку программы. Эта строчка помещает считываемые значения с MPU6050 точно в интервал 10 миллисекунд (мс), или 0.01 секунды. То есть значение timeStep у нас будет равно 0.01. Задержка в этой строчке используется чтобы немного замедлить выполнение программы. Если использовать только (millis() – timer()), то программа будет выполняться слишком быстро. Мы просто вычитаем значение этого выражения из 0.01 секунды и оставшееся время просто ждем с помощью использования функции delay.

После того как мы считали и рассчитали необходимые данные мы можем передавать их через Bluetooth. Но не все так просто в этом проекте. Дело в том, что Bluetooth модуль за один раз может передавать только 1 байт (8 бит) информации, то есть число от 0 до 255. То есть мы должны разделить наши значения и упаковать (map) их в этот диапазон. Это мы будем делать с помощью следующих строчек кода:

То есть значение показателя roll упаковывается в диапазон от 0 до 100 и помещается в переменную x, а значение показателя pitch упаковывается в диапазон от 100 до 200 и помещается в диапазон y. Значение температуры упаковывается в диапазон от 200 до 250 и помещается в переменную t. Аналогичным образом эти данные потом распаковываются на приемном конце. Далее мы передаем эти данные по Bluetooth с помощью следующих строчек кода:

Подготовка приложения на Android

Приложение на Android для нашего проекта мы разработали с помощью бесплатной программной среды Processing IDE, программирование в которой очень похоже на программирование в Arduino. Ранее на нашем сайте программную среду Processing мы использовали в следующих проектах:

В этом проекте вы можете скачать либо готовый APK файл приложения, не утруждая себя погружением в среду Processing, либо можете скачать исходные коды приложения если все таки хотите в нее погрузиться и изменить что либо в нашей программе.

По следующей ссылке вы можете скачать готовый APK файл приложения для проектируемого нами измерителя уровня (правая кнопка мыши на ссылке и выбирайте сохранить как):

Android APK File for Arduino Inclinometer.

Примечание: это приложение будет корректно работать если только Bluetooth устройство имеет имя “HC-06”. Чтобы установить приложение на смартфон разрешите в нем установку приложений из непроверенных источников.

Внешний вид работы приложения на экране смартфона

Объяснение кода приложения для Android

Для тех, кто все же хочет разобраться в коде приложения, мы попытаемся объяснить несколько наиболее важных фрагментов этого кода. Для работы в Processing нам необходимо будет задействовать в нем Android режим, чтобы работать с нашими Android SDK. Исходные коды приложения для Android вы можете скачать по следующей ссылке:

Processing program ZIP file for Arduino Inclinometer.

Внутри скачанного ZIP файла вы найдете папку, в которой находятся все изображения и другие данные, необходимые для работы android приложения.

В следующей строке кода программы мы указываем с каким Bluetooth устройством необходимо автоматически соединиться приложению.

Внутри функции draw(), которая представляет собой бесконечный цикл, мы будем рисовать изображения и печатать текст на экране смартфона в зависимости от данных, принимаемых по Bluetooth.

Также помните о том, что в программе для Arduino мы разделили передаваемые данные на три части и поместили их все в диапазон от 0 до 255. Здесь же мы должны распаковать эти данные и вернуть им нормальные значения.

Тестирование работы измерителя уровня

После того как аппаратная часть проекта будет готова загрузите программу (приведенную в конце статьи) в плату Arduino. В коде программы вы можете снять комментарии со строк Serial.println и наблюдать за ходом выполнения программы в окне монитора последовательной связи.

После загрузки кода программы в плату Arduino запустите Android приложение для этого проекта на вашем смартфоне. Приложение должно автоматически установить соединение с вашим модулем HC-06 и на экране смартфона должна высветиться надпись “Connect to: HC-06” как показано на следующем рисунке.

Тестирование работы измерителя уровня

Сначала все значения гироскопа будут установлены в 0 поскольку в программе мы первым делом производим калибровку гироскопа. Далее, по мере того, как вы будете наклонять конструкцию в разные стороны, значения гироскопа также будут меняться. А значения температуры с самого начала будут показываться реальные. Более подробно работа проекта показана на видео, приведенном в конце статьи.

Теперь вы можете помещать макетную плату с собранным устройством на любые поверхности и проверять действительно ли они являются ровными.

Исходный код программы

Перед загрузкой кода программы в плату Arduino не забудьте скачать и установить библиотеку для работы с гироскопом MPU6050.

Видео, демонстрирующее работу схемы

(Проголосуй первым!)
Загрузка...
152 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *