[DIY или Сделай сам, Космонавтика, Научно-популярное, Программирование микроконтроллеров] Per aspera ad astra, или как я строил ракету. Часть 2. Собираем альтиметр на STM32 и BMP280

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
26-Сен-2020 18:31


Всем привет! 
В предыдущей части я остановился на том, что мои ракеты удачно взлетели и приземлились, а на одной даже был установлен альтиметр. В этой статье я и расскажу о том как сделать простой высотомер на основе STM32 Nucleo L031K6 и датчика давления BMP 280 , который к тому же хранит все данные во Flash памяти.
Выбор железа 
Основные требования к альтиметру:
  • Высокая скорость считывания высоты, так как ракета в апогее находится не слишком долго, а я хотел узнать именно максимальную высоту;
  • Низкое энергопотребление, чтобы не ставить большой аккумулятор;
  • Небольшие размеры всей конструкции.

Исходя из них в качестве микроконтроллера взял STM32 Nucleo L031K6 (высокая скорость работы, низкое потребление тока, малый размер). Высоту решил измерять с помощью барометра BMP280 (те же резоны, что и у МК). Также добавил кнопку, при нажатии которой начиналась запись высоты. Ну и питала всю электронику батарейка CR2032, подключенная через адаптер. В итоге получилась такая схема:

Использованные модули

SPL

STM32 Nucleo L031K6

BMP280

Адаптер для CR2032

Разработка кода
Код вы можете найти на моем гитхабе. Пины STM32 были сконфигурированы в CubeMX под IAR. Для работы с BMP280 использовал вот эту библиотеку, добавил в нее функцию расчета высоты над уровнем моря с помощью барометрической формулы и инициализацию датчика с нужными мне параметрами частоты считывания, фильтрации и тд. Так как я хотел измерить высоту полета относительно земли, мне нужно было сначала вычислить высоту над уровнем моря в моей местности, взять ее за «ноль» и относительно нее измерять высоту полета. Частота измерений равнялась 10 Гц.
Запись во Flash память происходила следующим образом так:

Организация памяти в STM32 L031K6

SPL


  • Для всех измерений выделил 8 Кбайт с 0x08006000 по 0x08007FFF адреса
  • На одно измерение выделил 2 байта
  • Во Flash записывал по 4 байта, то есть сразу два измерения
  • Максимальное количество измерений — 4096, этого хватало на запись примерно 7-ми минут полета
  • Высоту записывал в сантиметрах для большей точности

А происходила запись следующим образом:
  • Если итератор записи четный, то в переменную с данными для записи во Flash сохраняем текущую высоту в младшую половину слова;
  • Если итератор записи нечетный, то в переменную с данными для записи во Flash добавляем текущую высоту в старшую половину слова и сохраняем эту переменную в ячейку Flash

В итоге алгоритм работы программы следующий:
  • После включения 5 секунд ждем нажатия кнопки для старта измерений высоты.
  • Если кнопка не была нажата, то зажигаем встроенный светодиод и начинаем передачу по UART данных о высоте, записанных во Flash памяти
  • Если кнопка была нажата, то два раза моргаем встроенным светодиодом и вычисляем высоту местности.
  • После вычисления «нуля» два раза моргаем встроенным светодиодом и записываем во Flash-память высоту ракеты над землей.
  • Когда выполнили передачу по UART или завершили измерения высоты, бесконечно моргаем встроенным светодиодом;
  • Ждем пока нас найдут люди и выключат.

При питании STM’ки от CR2032 через пин 3.3V обнаружил, что код не работает. Проблема была в том, что при подаче питания через эту ногу необходимо было отпаять SB9 (расположен рядом с выводами RX и TX на обратной стороне МК)  иначе плата постоянно перезагружалась.
Теперь необходимо было проверить точность работы альтиметра. Взяв рулетку, я стал поднимать альтиметр на разные высоты и смотреть, что он измеряет. Результаты тестов лежат в соответствующей папке на гитхабе. В текстовых файлах — сырые данные с STM’ки, а в Excel’евских таблицах находятся красивые графики всех тестов. Точность соответствовала заявленной — ± 10см. Следует помнить, что высоту я измерял в сантиметрах, поэтому в таблице такие большие числа. 
Сборка альтиметра
Так как во время приземления ракета может сильно ударится о землю, необходимо было хорошо зафиксировать всю электронику, чтобы при тряске не отваливались проводки, или, того хуже, сами модули. Альтиметр разместил в головном обтекателе (места там было достаточно, и стабильности за счет смещения центра тяжести к головному обтекателю прибавилось) в 3D-печатном креплении. STM’ка стояла вертикально, BMP280 контактами вверх и под крепление приклеил адаптер для CR2032. Из-за того, что он не помещался в корпус ракеты, пришлось немного сточить контакты минуса. Рядом с контактами в боковой стенке 3D-печатного крепления проточил вертикальную канавку, чтобы протянуть через нее минус от CR2032, а под плюсом просверлил отверстие и пустил провод через него. Думал крепить альтиметр к головному обтекателю с помощью самореза, поэтому в корпусе есть отверстие, но потом от этой идеи отказался.

Модель крепления, напечатанного на 3D-принтере

Собранный блок альтиметра

SPL

Вид сверху

Вид снизу

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

Собранный альтиметр. Вид спереди  

Вид сзади. Видна резинка, соединяющая альтиметр с ракетой
Альтиметр был готов! Теперь предстояло его испытать, а это значит, что я снова отправился на полигон!
Запуск альтиметра и результаты измерений
К сожалению первый запуск был с неисправными двигателями, о которых я писал в прошлой статье.
В итоге график получился таким:

По горизонтали — номер измерения. Каждые 10 измерений — 1 секунда. По вертикали — высота в сантиметрах
Ракета взлетела на 15м, затем устремилась в землю. После прохождения апогея через 1 секунду началась какая-то аномалия: после значения 12м почему-то показания упали до -8м. Это произошло в момент второго запуска двигателя (которого не должно было быть), так что не исключаю, что неисправный двигатель как-то повлиял на альтиметр. Во всех остальных тестах он работал отлично, так что это была проблема явно не в электронике. В общем, те испытания альтиметра были успешными лишь наполовину, так как во вторую половину полета произошла аномалия. Сам график вы можете найти на гитхабе, он называется rocket_flight_fall_test.
После ремонта ракеты я снова отправился на полигон и в этот раз испытания прошли успешно. Полет был отличным, показания альтиметра были стабильными и соответствовали полету. График полета получился вот такой:

По горизонтали — номер измерения. Каждые 10 измерений — 1 секунда. По вертикали — высота в сантиметрах
Ракета поднялась на 150м и успешно приземлилась. Таким образом это испытание было полностью успешным. Я удостоверился в том, что альтиметр работает и приступил к разработке новой бортовой аппаратуры.
Заключение
В итоге, я полностью собрал компактный альтиметр, который помещается в небольшую модель ракеты. Испытания прошли успешно, электроника пережила взлет и посадку и измерила высоту полета. На этом проект разработки альтиметра я закончил, возможно в будущем использую его в одной из ракет, потому что знать высоту полета иногда очень полезно (например, если вы запускаете ракеты ради достижения максимальной или какой-нибудь определенной высоты). Сейчас, как я уже говорил, я занимаюсь разработкой бортовой камеры с радиопередатчиком, потому что ракету с такой серьезной электроникой я терять не намерен. 
Спасибо за внимание!
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_diy_ili_sdelaj_sam (DIY или Сделай сам), #_kosmonavtika (Космонавтика), #_nauchnopopuljarnoe (Научно-популярное), #_programmirovanie_mikrokontrollerov (Программирование микроконтроллеров), #_raketomodelirovanie (ракетомоделирование), #_raketostroenie (ракетостроение), #_mikrokontrollery_stm (микроконтроллеры stm), #_stm32l031k6, #_altimetr (альтиметр), #_bmp280, #_diy_ili_sdelaj_sam (
DIY или Сделай сам
)
, #_kosmonavtika (
Космонавтика
)
, #_nauchnopopuljarnoe (
Научно-популярное
)
, #_programmirovanie_mikrokontrollerov (
Программирование микроконтроллеров
)
Профиль  ЛС 
Показать сообщения:     

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

Текущее время: 22-Ноя 19:58
Часовой пояс: UTC + 5