Оглавление:
- Шаг 1. Получите библиотеку MS5611
- Шаг 2. Подключите датчик к Arduino и проверьте
- Шаг 3. Сделайте его автономным
- Шаг 4: Добавьте код высоты и ЖК-дисплей
Видео: Атмосферная рулетка Arduino / Демонстрация MS5611 GY63 GY86: 4 шага (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
На самом деле это барометр / высотомер, но вы поймете причину названия, посмотрев видео.
Датчик давления MS5611, установленный на коммутационных платах Arduino GY63 и GY86, обеспечивает потрясающую производительность. В безветренный день он будет измерять ваш рост с точностью до 0,2 м. Это эффективное измерение расстояния от вашей головы до космического пространства и вычитание его из расстояния между вашими ногами и космическим пространством (путем измерения давления - то есть веса воздуха выше). Это впечатляющее устройство имеет диапазон, который позволяет с комфортом измерять высоту Эвереста, а также может измерять высоту до нескольких дюймов.
Этот проект был задуман как школьный проект, пример модификации кода Arduino и хорошая отправная точка для изучения использования датчика MS5611. Есть много вопросов на форуме от тех, у кого проблемы с этим датчиком. Предлагаемый здесь подход делает его использование очень простым. После выполнения этого проекта вы будете хорошо оснащены для разработки других приложений, связанных с давлением.
У каждого датчика есть свои калибровочные константы, которые необходимо считывать и использовать для корректировки данных. Есть библиотека, которая поможет им управлять. Показанный здесь код использует библиотеку для снятия показаний, а затем преобразует их в высоту и отображает их на ЖК-экране.
Сначала мы отправим данные на последовательный монитор на ПК / ноутбуке для начальных тестов. Они показывают некоторый шум, поэтому мы добавляем фильтр, чтобы сгладить их. Затем мы добавим ЖК-дисплей, чтобы устройство могло работать независимо, и вы могли попробовать измерить свой рост или что-нибудь еще.
Обратите внимание, что на плате GY63 есть только датчик давления MS5611. GY86 называется доской с 10 степенями свободы, а также включает в себя 3-осевой акселерометр, 3-осевой гироскоп и 3-осевой магнитометр всего за несколько долларов.
Тебе понадобится:
1. Arduino UNO (или другой со стандартной распиновкой) и его USB-кабель
2. Коммутационная плата GY63 или GY86
3. 4 провода Dupont «папа-мама» или соединительный провод
4. Экран ЖК-клавиатуры Arduino.
5. Аккумулятор 9 В и свинец
6. Блок розеток 2,54 мм (необязательно, но рекомендуется)
Подготовка
Загрузите Arduino IDE (интегрированную среду разработки) по адресу:
Некоторые технические детали для интереса
MS5611 обеспечивает отличную производительность за счет усреднения большого количества измерений. Он может выполнить 4096 3-байтовых (24 битных) аналоговых измерений всего за 8 мсек и дать среднее значение. Он должен измерять как давление, так и температуру, чтобы данные давления можно было скорректировать с учетом внутренней температуры. Следовательно, он может выдавать около 60 пар показаний давления и температуры в секунду.
Технический паспорт доступен по адресу:
Связь осуществляется через I2C. Таким образом, другие датчики I2C могут совместно использовать шину (как в случае с платой GY86 10DOF, где все микросхемы находятся на I2C).
Шаг 1. Получите библиотеку MS5611
Многие датчики Arduino либо используют стандартную библиотеку, входящую в состав Arduino IDE, либо поставляются в виде zip-файла с библиотекой, которую можно легко установить. Как правило, это не относится к датчикам MS5611. Однако поиск нашел: https://github.com/gronat/MS5611, в котором есть библиотека для MS5611, включая выполнение температурной коррекции.
Опция 1
Перейдите на указанный выше веб-сайт, нажмите «Клонировать или загрузить» и выберите «Загрузить ZIP». Это должно доставить MS5611-master.zip в ваш каталог загрузок. Теперь, если хотите, переместите его в папку, где вы сможете найти его в будущем. Я использую каталог под названием «data», добавленный в мои папки Arduino.
К сожалению, загруженный файл.zip не содержит примеров эскизов, и было бы неплохо добавить библиотеку и примеры в IDE Arduino. В файле README.md есть минимальный пример, который можно скопировать, вставить в эскиз и сохранить. Это один из способов начать работу.
Вариант 2
Чтобы упростить запуск кода из этого руководства, я добавил приведенный выше минимальный пример и примеры, показанные здесь, в библиотеку и прикрепил файл.zip ниже, который будет установлен в IDE Arduino.
Загрузите zip-файл ниже. Если хотите, переместите это в лучшую папку.
Запустите IDE Arduino. Нажмите «Скетч»> «Включить библиотеку»> «Добавить zip-файл» и выберите файл. Перезагрузите IDE. Теперь в IDE будет установлена библиотека и все примеры, показанные здесь. Проверьте, щелкнув Файл> Примеры >> MS5611-master. Следует перечислить три эскиза.
Шаг 2. Подключите датчик к Arduino и проверьте
Платы GY63 / GY86 обычно идут с разъемами, но не припаяны. Таким образом, это ваш выбор: либо припаять разъемы на месте и использовать выводы Dupont «папа-мама», либо (как я решил) припаять выводы непосредственно к плате и добавить контакты к выводу для подключения к Arduino. Последний вариант лучше, если вы думаете, что позже можете впаять плату в проект. Первый вариант лучше, если вы хотите использовать доску для экспериментов. Отпаять выводы намного проще, чем штыревой наконечник.
Необходимые соединения:
GY63 / GY86 Arduino
VCC - Питание 5 В GND - GND Земля SCL - A5 Часы I2C> SDA - A4 Данные I2C
Присоедините плату датчика к Arduino, как указано выше, и подключите Arduino к ПК / ноутбуку через USB-кабель. Также накройте датчик непрозрачным / черным материалом. Датчик чувствителен к свету (как и большинство датчиков этого типа).
Запустите IDE Arduino. Нажмите:
Файл> примеры >> MS5611-master> MS5611data2serial.
Вместе со скетчем появится новый экземпляр IDE. Нажмите кнопку загрузки (стрелка вправо).
Затем запустите последовательный плоттер - щелкните «Инструменты»> «Последовательный плоттер» и, при необходимости, установите скорость 9600 бод. Отправляемые данные представляют собой давление в паскалях. Примерно через секунду он изменит масштаб, и подъем и опускание датчика, скажем, на 0,3 м должно показывать опускание и подъем кривой (меньшая высота - более высокое давление).
В данных есть некоторый шум. См. Первый график выше. Это можно сгладить с помощью цифрового фильтра (действительно полезный инструмент).
Уравнение фильтра:
значение = значение + K (новое значение)
где «значение» - это отфильтрованные данные, а «новое» - это последние измерения. Если K = 1, фильтрация отсутствует. Для более низких значений K данные сглаживаются с постоянной времени T / K, где T - время между выборками. Здесь T составляет около 17 мс, поэтому значение 0,1 дает постоянную времени 170 мс или около 1/6 с.
Фильтр можно добавить:
Добавьте переменную для отфильтрованных данных перед setup ():
с плавающей точкой отфильтровано = 0;
Затем добавьте уравнение фильтра после давления =…. линия.
отфильтровано = отфильтровано + 0,1 * (отфильтровано под давлением);
Рекомендуется инициализировать отфильтрованное значение первым чтением. Поэтому добавьте оператор «if» в строку выше, которая делает это так, чтобы оно выглядело так:
if (отфильтровано! = 0) {
отфильтровано = отфильтровано + 0,1 * (отфильтровано под давлением); } else {отфильтрованный = давление; // первое чтение, поэтому отфильтровано чтение}
Тест «! =» Не равен «не равно». Таким образом, если «отфильтровано» не равно 0, уравнение фильтра выполняется, но если это так, то оно устанавливается на показание давления.
Наконец, нам нужно изменить «давление» на «отфильтровано» в операторе Serial.println, чтобы увидеть отфильтрованное значение.
Наилучшее обучение достигается путем внесения вышеуказанных изменений вручную. Однако я включил их в пример MS5611data2serialWfilter. Так что, если есть проблемы, пример можно загрузить.
Теперь загрузите код в Arduino и посмотрите на улучшение. См. Второй график выше и обратите внимание, что масштаб Y увеличен в 2 раза.
Попробуйте уменьшить значение константы фильтра, скажем 0,02 вместо 0,1, и вы увидите разницу. Данные более плавные, но с более медленным откликом. Это компромисс, который следует искать при использовании этого простого фильтра. Характеристики такие же, как у RC-фильтра (сопротивления и емкости), широко используемого в электронных схемах.
Шаг 3. Сделайте его автономным
Теперь мы добавим экран ЖК-клавиатуры, преобразуем давление в высоту в метрах и покажем это на дисплее. Мы также добавим возможность обнуления значения нажатием кнопки «Выбрать» на клавиатуре.
С экраном LCD на Arduino датчик должен быть подключен к экрану LCD. К сожалению, ЖК-экраны обычно поставляются без соответствующих разъемов. Таким образом, можно сделать паяные соединения или получить блок розеток. Блок розеток доступен на ebay по цене, не превышающей почтовые расходы. Выполните поиск по «планке розеток 2,54 мм» и найдите те, которые похожи на те, что есть на Arduino. Обычно они бывают длиной 36 или 40 штифтов. Я бы не стал использовать повернутые штифты, так как они недостаточно глубоки для стандартных поводков Dupont.
Полоса розеток должна быть обрезана до нужной длины, причем разрез должен производиться в том же месте, что и булавка. Итак, для полосы с 6 штифтами - удалите 7-й штифт с помощью тонких плоскогубцев, затем отрежьте в этом месте с помощью младшей ножовки. Концы подпиливаю, чтобы получились аккуратными.
При пайке их на плату следите за тем, чтобы не было паяных перемычек.
Приняв соответствующее решение о подключении датчика, подключите ЖК-экран к Arduino и подключите датчик к тем же контактам, но теперь на ЖК-экране.
Также приготовьте аккумулятор и свинец. Я сделал свинец из деталей, лежащих в корзине для мусора, но они также доступны на ebay - включая хороший вариант, включающий батарейный отсек и переключатель. Выполните поиск по запросу «PP3 с шагом 2,1 мм».
Текущее потребление составляет около 80 мА. Следовательно, если вы хотите работать более нескольких минут, подумайте о более крупной батарее на 9 В, чем у PP3.
Шаг 4: Добавьте код высоты и ЖК-дисплей
Нам нужно сделать немного больше кода, чтобы преобразовать давление в высоту и управлять дисплеем.
В начале скетча добавьте библиотеку дисплея и укажите, какие выводы используются:
#включают
// инициализируем библиотеку номерами контактов интерфейса LiquidCrystal lcd (8, 9, 4, 5, 6, 7);
Далее нам нужны некоторые переменные и функция для чтения кнопок клавиатуры. Все они подключены к аналоговому входу A0. Каждая кнопка подает различное напряжение на A0. Поиск по запросу «код кнопок Arduino lcd shield» обнаружил хороший код по адресу:
www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code
Добавьте этот код перед setup ():
// определяем некоторые значения, используемые панелью и кнопками
int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // чтение кнопок int read_LCD_buttons () {adc_key_in = analogRead (0); // считываем значение с датчика // мои кнопки при чтении центрируются в следующих значениях: 0, 144, 329, 504, 741 // мы добавляем примерно 50 к этим значениям и проверяем, близки ли мы if (adc_key_in> 1000) return btnNONE; // Мы делаем этот вариант первым из соображений скорости, так как это будет наиболее вероятный результат if (adc_key_in <50) return btnRIGHT; если (adc_key_in <250) вернуть btnUP; если (adc_key_in <450) вернуть btnDOWN; если (adc_key_in <650) вернуть btnLEFT; если (adc_key_in <850) вернуть btnSELECT; return btnNONE; // когда все остальные терпят неудачу, возвращаем это…}
Высота обычно обнуляется в начальной точке. Итак, нам нужны переменные как для высоты, так и для справки. Добавьте их перед setup () и функцией выше:
float mtr;
float ref = 0;
Преобразование давления в паскалях в метры почти равно делению на 12 на уровне моря. Эта формула подходит для большинства наземных измерений. Существуют более точные формулы, которые больше подходят для преобразования на больших высотах. Используйте их, если собираетесь использовать это для записи высоты полета воздушного шара.
Ссылка должна быть установлена на первое показание давления, поэтому мы начинаем с нулевой высоты и при нажатии кнопки SELECT. Добавьте после кода фильтра и перед оператором Serial.println:
if (ref == 0) {
ref = отфильтровано / 12,0; } если (read_LCD_buttons () == btnSELECT) {ref = filter / 12.0; }
После этого добавьте расчет высоты:
mtr = ref - отфильтровано / 12.0;
Наконец, измените оператор Serial.println, чтобы он отправлял «mtr» вместо «filter», и добавьте код для отправки «mtr» на ЖК-дисплей:
Serial.println (mtr); // Отправка давления через последовательный порт (UART)
lcd.setCursor (0, 1); // строка 2 lcd.print (mtr);
Все изменения здесь включены в пример MS5611data2lcd. Загрузите это, как на шаге 2.
Есть еще один полезный мод. Дисплей плохо читается, когда он обновляется 60 раз в секунду. Наш фильтр сглаживает данные с постоянной времени около 0,8 с. Так что обновления дисплея каждые 0,3 с кажется достаточно.
Поэтому добавьте счетчик после всех других определений переменных в начале скетча (например, после float ref = 0;):
int я = 0;
Затем добавьте код для увеличения «i» и оператора «if» для запуска, когда оно дойдет до 20, а затем установите его обратно на ноль и переместите команды Serial и lcd внутри оператора if, чтобы они выполнялись только при каждом 20-м чтении:
я + = 1;
если (я> = 20) {Serial.println (mtr); // Отправка давления через последовательный порт (UART) lcd.setCursor (0, 1); // строка 2 lcd.print (mtr); я = 0; }
Я не включил пример с этой последней модификацией, чтобы побудить вводить код вручную, что помогает в обучении.
Этот проект должен стать хорошей отправной точкой, например, для цифрового барометра. Для тех, кто может захотеть рассмотреть возможность использования в моделях RC - поищите OpenXvario для кода, который включает высотомер и вариометр для телеметрических систем Frsky и Turnigy 9x.
Рекомендуемые:
Измерение времени (рулетка): 5 шагов (с изображениями)
Измерение времени (рулетка): для этого проекта мы (Алекс Фил и Анна Линтон) взяли повседневный измерительный инструмент и превратили его в часы! Первоначальный план состоял в том, чтобы моторизовать существующую рулетку. Создавая это, мы решили, что будет проще создать собственную оболочку, которая будет работать с
Рулетка для социальной дистанции 1,50 м: 3 шага (с изображениями)
Измерительная лента для социальной дистанции 1,50 м: в этой сборке я использую обычную рулетку для измерения расстояния 1,5 м. Тогда я скажу "полтора метра". Он также будет указывать зеленым или красным светом, если вы находитесь выше или ниже этого расстояния. Этот проект
Демонстрация использования уязвимостей клавиатуры Arduino (HID) и предотвращение: 4 шага (с изображениями)
Демонстрация использования клавиатуры Arduino (HID) и предотвращение: в этом проекте мы собираемся использовать arduino leonardo для имитации возможной атаки USB с использованием HID (устройство интерфейса humain). Я создал это руководство не для того, чтобы помочь хакерам, а чтобы показать вам некоторые реальные опасности и то, как защитить себя от них
Рулетка с наушников IPod: 4 шага
Рулетка в наушниках IPod: Вам когда-нибудь нужно было что-то измерить, но у вас не было под рукой рулетки? В следующий раз используйте наушники iPod! Просто добавьте дюймовые метки на кабель наушников, и у вас будет 31-дюймовая измерительная лента, которая всегда с вами, без лишнего веса или
Техно-компьютерная рулетка (или кто делает кофе?): 6 шагов (с изображениями)
Техно-компьютерная рулетка (или «Кто делает кофе?»): Это устройство, сделанное из переработанных компьютерных деталей, чтобы дать абсолютный, однозначный и неопровержимый ответ на вечный офисный вопрос: «Чья очередь делать кофе?» Каждый раз при включении питания эта чудесная деви