Всем привет!
В предыдущей части я остановился на том, что мои ракеты удачно взлетели и приземлились, а на одной даже был установлен альтиметр. В этой статье я и расскажу о том как сделать простой высотомер на основе STM32 Nucleo L031K6 и датчика давления BMP 280 , который к тому же хранит все данные во Flash памяти.
Выбор железа
Основные требования к альтиметру:
- Высокая скорость считывания высоты, так как ракета в апогее находится не слишком долго, а я хотел узнать именно максимальную высоту;
- Низкое энергопотребление, чтобы не ставить большой аккумулятор;
- Небольшие размеры всей конструкции.
Исходя из них в качестве микроконтроллера взял STM32 Nucleo L031K6 (высокая скорость работы, низкое потребление тока, малый размер). Высоту решил измерять с помощью барометра BMP280 (те же резоны, что и у МК). Также добавил кнопку, при нажатии которой начиналась запись высоты. Ну и питала всю электронику батарейка CR2032, подключенная через адаптер. В итоге получилась такая схема:
STM32 Nucleo L031K6
BMP280
Адаптер для CR2032
Разработка кода
Код вы можете найти на моем гитхабе . Пины STM32 были сконфигурированы в CubeMX под IAR. Для работы с BMP280 использовал вот эту библиотеку, добавил в нее функцию расчета высоты над уровнем моря с помощью барометрической формулы и инициализацию датчика с нужными мне параметрами частоты считывания, фильтрации и тд. Так как я хотел измерить высоту полета относительно земли, мне нужно было сначала вычислить высоту над уровнем моря в моей местности, взять ее за «ноль» и относительно нее измерять высоту полета. Частота измерений равнялась 10 Гц.
Запись во Flash память происходила следующим образом так:
- Для всех измерений выделил 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-принтере
Вид сверху
Вид снизу
Кнопку приклеил рядом с BMP280, установил остальные модули в свои места, припаял все провода и
В обтекатель ракеты альтиметр плотно вставлялся. Для того, чтобы он никуда не отлетел после удара, протянул через отверстие в креплении резинку, соединяющую корпус ракеты и обтекатель.
Собранный альтиметр. Вид спереди
Вид сзади. Видна резинка, соединяющая альтиметр с ракетой
Альтиметр был готов! Теперь предстояло его испытать, а это значит, что я снова отправился на полигон!
Запуск альтиметра и результаты измерений
К сожалению первый запуск был с неисправными двигателями, о которых я писал в прошлой статье.
В итоге график получился таким:
По горизонтали — номер измерения. Каждые 10 измерений — 1 секунда. По вертикали — высота в сантиметрах
Ракета взлетела на 15м, затем устремилась в землю. После прохождения апогея через 1 секунду началась какая-то аномалия: после значения 12м почему-то показания упали до -8м. Это произошло в момент второго запуска двигателя (которого не должно было быть), так что не исключаю, что неисправный двигатель как-то повлиял на альтиметр. Во всех остальных тестах он работал отлично, так что это была проблема явно не в электронике. В общем, те испытания альтиметра были успешными лишь наполовину, так как во вторую половину полета произошла аномалия. Сам график вы можете найти на гитхабе, он называется rocket_flight_fall_test.
После ремонта ракеты я снова отправился на полигон и в этот раз испытания прошли успешно. Полет был отличным, показания альтиметра были стабильными и соответствовали полету. График полета получился вот такой:
По горизонтали — номер измерения. Каждые 10 измерений — 1 секунда. По вертикали — высота в сантиметрах
Ракета поднялась на 150м и успешно приземлилась. Таким образом это испытание было полностью успешным. Я удостоверился в том, что альтиметр работает и приступил к разработке новой бортовой аппаратуры.
Заключение
В итоге, я полностью собрал компактный альтиметр, который помещается в небольшую модель ракеты. Испытания прошли успешно, электроника пережила взлет и посадку и измерила высоту полета. На этом проект разработки альтиметра я закончил, возможно в будущем использую его в одной из ракет, потому что знать высоту полета иногда очень полезно (например, если вы запускаете ракеты ради достижения максимальной или какой-нибудь определенной высоты). Сейчас, как я уже говорил, я занимаюсь разработкой бортовой камеры с радиопередатчиком, потому что ракету с такой серьезной электроникой я терять не намерен.
Спасибо за внимание!
sav13
А не проще было взять полетный контроллер от квадрокоптера?
С подключенным альтиметром, акселерометром и кучей прочих датчиков
И с радиоканалом передачи данных и кучей другой интересной периферии. При этом максимально легкий и компактный
IlorDash Автор
Возможно было бы проще, но не в моем случае. Я хотел именно собрать свой альтиметр, разобраться во всех нюансах, да и всегда интереснее что-то сделать самому)
wyfinger
Полетный контроллер будет сильно тяжелее и значительно больше потребление.
Я для RC самолетов делал на arduino+bmp(e)280, по i2c подключается к приемнику радиоуправления в телеметрийный порт (Radiolink). Измерения отображаются прамо на пульте. https://github.com/wyfinger/RadiolinkTelemetry
Там же вариант с gps, искать модель после незапланированной посадки сильно проще :)
На ракету тоже можно добавить пару микросерв для руления, приемник и gps датчик.
sav13
Плата 30x30 мм весом 3.5г будет тяжелее?
И по потреблению, если там тот же STM32 с чего бы там быть большому? Главное, запитать не через встроенный DC-DC, а напрямую