Per aspera ad astra, или как я строил ракету. Часть 2. Собираем альтиметр на STM32 и BMP280



    Всем привет! 

    В предыдущей части я остановился на том, что мои ракеты удачно взлетели и приземлились, а на одной даже был установлен альтиметр. В этой статье я и расскажу о том как сделать простой высотомер на основе STM32 Nucleo L031K6 и датчика давления BMP 280 , который к тому же хранит все данные во Flash памяти.

    Выбор железа 


    Основные требования к альтиметру:

    1. Высокая скорость считывания высоты, так как ракета в апогее находится не слишком долго, а я хотел узнать именно максимальную высоту;
    2. Низкое энергопотребление, чтобы не ставить большой аккумулятор;
    3. Небольшие размеры всей конструкции.

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



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

    STM32 Nucleo L031K6


    BMP280


    Адаптер для CR2032

    Разработка кода


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

    Запись во Flash память происходила следующим образом так:

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


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

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

    В итоге алгоритм работы программы следующий:

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

    При питании 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м и успешно приземлилась. Таким образом это испытание было полностью успешным. Я удостоверился в том, что альтиметр работает и приступил к разработке новой бортовой аппаратуры.

    Заключение


    В итоге, я полностью собрал компактный альтиметр, который помещается в небольшую модель ракеты. Испытания прошли успешно, электроника пережила взлет и посадку и измерила высоту полета. На этом проект разработки альтиметра я закончил, возможно в будущем использую его в одной из ракет, потому что знать высоту полета иногда очень полезно (например, если вы запускаете ракеты ради достижения максимальной или какой-нибудь определенной высоты). Сейчас, как я уже говорил, я занимаюсь разработкой бортовой камеры с радиопередатчиком, потому что ракету с такой серьезной электроникой я терять не намерен. 

    Спасибо за внимание!

    Средняя зарплата в IT

    111 380 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 7 299 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 43

      +1
      А не проще было взять полетный контроллер от квадрокоптера?
      С подключенным альтиметром, акселерометром и кучей прочих датчиков
      И с радиоканалом передачи данных и кучей другой интересной периферии. При этом максимально легкий и компактный
        +1
        Возможно было бы проще, но не в моем случае. Я хотел именно собрать свой альтиметр, разобраться во всех нюансах, да и всегда интереснее что-то сделать самому)
          0

          Полетный контроллер будет сильно тяжелее и значительно больше потребление.
          Я для RC самолетов делал на arduino+bmp(e)280, по i2c подключается к приемнику радиоуправления в телеметрийный порт (Radiolink). Измерения отображаются прамо на пульте. https://github.com/wyfinger/RadiolinkTelemetry
          Там же вариант с gps, искать модель после незапланированной посадки сильно проще :)
          На ракету тоже можно добавить пару микросерв для руления, приемник и gps датчик.

            0
            Плата 30x30 мм весом 3.5г будет тяжелее?
            И по потреблению, если там тот же STM32 с чего бы там быть большому? Главное, запитать не через встроенный DC-DC, а напрямую
          +2
          Такое можно собрать на ESP(рекомендую клоны Wemos D1 mini) — потребление может и больше, но размер меньше. Плюс WiFi — высотные данные в реальном времени. Плюс обновление прошивки по воздуху без разбора и подключения программатора.

          Я делал наружу потому что это датчик для домашней автоматизации и лишний нагрев от WiFi мне не нужен. Если вам только высоту его можно и развернуть вовнутрь что бы меньше места занимало. Или разъемы можно взять поменьше или вообще без них запаять.
            +3
            Только потребление у ESP8266 явно не для CR2032
            Придется еще аккумулятор встраивать и заряжать его перед каждым запуском
              0

              Есть еще esp32 solo, там и плюшек на борту побольше, и powersave фичи есть.

              0

              А если применить контроллер в маленьком корпусе, например tiny-AVR, то можно сделать устройство на плате не больше CR2032.

              +4
              Похоже аномалию алтиметра (отрицательная высота) можно объяснить.

              Алтиметр измеряет давление (датчик давления BMP 280) и чем ниже ракета, тем больше давление. Раз пошли отрицательные числа, значит что-то вызвало скачок (увеличение) давления (подозреваю, что двигатель виной).

              Так же интересна аномальная высота перед стартом во второй раз (в первый раз этой аномалии нет). Так что потенциально датчик давления можно использовать для дополнительной диагностики.

              P.S. Нужны дополнительные тесты под ускорением — вдруг от ускорения меняются показания?
                0
                Большое спасибо за помощь! Да, я еще раз посмотрел формулу расчета высоты:



                И как раз получается, что:



                То есть, в моем случае давление на уровне моря равно 101325 Па и при превышении давления даже на единицу натуральный логарифм становится отрицательным, откуда и появляется значение -8 м в неудачном запуске.

                По поводу аномалии перед стартом во второй раз я вижу две причины
                1. Опять же из-за работы двигателя повысилось давление, следовательно упала высота. В таком случае можно предположить, что реальный апогей метров на 10 выше измеренного
                2. Как вы сказали, возможно от ускорения меняются показания датчика. Надо будет провести измерения при тряске датчика

                В общем, еще раз спасибо за комментарий, вы мне помогли понять некоторые «причуды» работы BMP280)
                  0
                  реальный апогей метров на 10 выше измеренного
                  — в верхней точке ведь двигатель не работает? Если альтиметр не в герметичной капсуле (щели, отверстия для воздуха ведь есть?), то давление должно быть нормальным (при желании можно откалибровать приборный отсек на предмет времени выравнивания давления). Но проще изолировать от двигателя и сделать щели для атмосферы.
                  VT100
                  Попробуйте повернуть ПН на 180° перпендикулярно продольной оси ракеты.
                  Да, вполне может быть. А отсутствие аномального пика в первый раз возможно объясняется тем, что после ремонта во второй раз датчик имел другое положение (ориентацию).

                  В любом случае — в верхней точке траектории двигатель отключен и ускорение нулевое (возможно, следует учесть, что на поверхности земли 1 g, в верхней точке 0 g — невесомость). Во время падения ускорение будет медленно возвращаться.
                    0
                    Нет, после ремонта ориентацию барометра не менял, он был все также горизонтально расположен в корпусе.

                    А что интересно тогда будет происходить с мембраной при невесомости? И получается, что во время падения показания наоборот выше реальных, потому что ускорение то теперь направлено вниз. Как много интересных нюансов при работе барометров в таких необычных для них условиях)
                      +1
                      ускорение то теперь направлено вниз

                      Перед стартом ускорение 1g (земное, направление «вверх»).
                      При старте в момент работы двигателя ускорение «вверх» увеличивается.
                      При выключении двигателя ускорение меняет знак (торможение об атмосферу), в верхней точке ускорение 0 (торможения об атмосферу нет).
                      По мере падения увеличивается скорость и появляется сила трения, возвращается вес и обычное ускорение в 1g (вспоминаем парашютистов в свободном падении или летающую пикирующую лабораторию для тренировки космонавтов на невесомость, правда там двигатели и рули высоты работают).

                      Покрути на земле датчик и получишь представление о разбросе показаний в зависимости от ориентации ускорения. Если при кручении вдоль какой-то оси показания меняются, значит для датчика «низ» меняется на «верх». Если показания не меняются, значит вращаешь как фигуриста вокруг. Но разница в показаниях должна быть небольшой. (Эх, центрифугу бы).
                        0

                        Если можно прененебречь сопротивлением атмосферы, то все время от выключения двигателя до падения на землю — ракета и ПН находятся в невесомости.

                +1
                Отличное хобби! Прямо завидую. Особенно если добавить полезную нагрузку в виде БЧ.
                Конечно можно сделать компактнее и с передачей данных (RAK4200 + датчик). И ещё можно прочитать статью NXP об инициализации I2C.
                  0
                  А не могли бы вы пояснить, что такое БЧ? Это что-то бортовое?)
                  Сейчас я делаю модуль бортовой камеры с радиопередатчиком nRF24l01 на 2.4 ГГц, но он будет выступать в качестве маяка. Передавать с ракеты буду только один бит, просто, чтобы другим nRF24l01 я мог понять где сигнал сильнее и где мне стоит искать упавшую ракету. Конечно с радио передачей есть много нюансов (выбор передающей и принимающей антенны, компоновка всего оборудования в корпус ракеты и тд.), но я думаю, что справлюсь с этой задачей)
                    0
                    БЧ — боевая часть
                    Интересно будет почитать.
                  +1

                  +1 для imageman


                  P.S. Нужны дополнительные тесты под ускорением — вдруг от ускорения меняются показания?

                  Мембрана датчика давления является инертной массой и работает как акселерометр. Смотрите, какой "пичок" проходит во время старта. Попробуйте повернуть ПН на 180° перпендикулярно продольной оси ракеты.

                    0
                    Очень интересная идея! Получается, что мембрана установлена параллельно металлической крышке датчика?
                    В моем случае BMP280 был установлен так, что эта крышка была горизонтальна, и вектор ускорения был перпендикулярен ей. Так что, если мембрана расположена, так как я предположил, то ускорение во время старта возможно и повлияло на показания в этот момент!
                    Спасибо за идею)
                      0
                      P.S. Сейчас еще раз пересмотрел график с аномалией во время старта — «пинок» длиться примерно 1-1.5 с, что как раз укладывается во время работы самого двигателя — 1.2 с. Так что это еще одно подтверждение идеи с мембраной и ускорением!
                        0
                        А скорость набегания воздуха при полете на показания не влияет?
                          0

                          Теоретически — может (эффект Бернулли?).
                          Практически — надо смотреть как полость ГО сообщается с атмосферой. Если сделать отверстие на "носу" — будет небольшой(?) наддув. Если сделать 2..3 отверстия в нижней части — может быть эжекция из полости ГО.

                            0
                            Если установить барометр прям на головной обтекатель, чтобы он был снаружи ракеты и прямо обдувался воздухом, то набегание воздуха будет влиять на показания. В моем случае прямого отверстия из атмосферы к барометру нет, воздух проникает к нему лишь через маленькие щели в корпусе, через стык ГО с основной трубой ракеты и т.д, так что прямого обдува датчика нет
                      0

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

                        +1
                        Главный вопрос не придут ли за автором органы.
                        Это не главный, а дежурный вопрос под всеми такими статьями:) На пикабу ребята трубу больше роста запускают и на такие вопросы у них ответ: «Пока мы не совершеннолетние — надо успеть» :)
                        Они кстати и Амперку стебут за местные статьи:)
                          0

                          В том то и беда, я и сам непрочь что-нибудь летающее собрать, и есть интересные идеи по конструкции ракет, но законы отбивают всякое желание((.
                          Так что ограничусь летающим кировым — в 250 грамм можно довольно большой дирижабль упихать.

                            0
                            Мне тоже интересно, снимки сделать в апогее (ну-ну:), радиосвязь автоматическую быстро провести или хотя бы пакет успеть скинуть (электрический:). С шаром может даже интересней будет
                          0
                          Ну у меня же не квадрокоптер:)
                          0

                          Можно еще использовать gps-модуль, тогда вы будете записывать весь трек полета, а не только высоту и избавиться от влияния ускорений на измерения. Для снижения массы рекомендую с макеток все "сдувать" на платы (ток нада немного руку набить).

                            0
                            Те, gps модулю, которые я видел имеют частоту обновления примерно 1 Гц, а для моих движков это мало, потому за секунду ракета может взлететь на очень большую высоту. Максимальная вертикальная скорость по расчетам составляет 100 м/с.
                              0
                              а вы ставьте два модуля — тогда будет шанс удвоить частоту обновления!

                              во-вторых — это только пока горит топливо она быстро летит, когда двигатель выключится и в пике она будет лететь уже не так быстро.
                            0
                            Интересно, а сколько ПН кушает? Что еще можно с CR2032 запитать/запустить из датчиков? (какой запас по мощности?)
                              0

                              Максимальный ток разрядки 2032 — не более 1..2 мА (по памяти), номинальный еще меньше. Для питания более мощных нагрузок следует добавлять конденсаторы (имея увеличение утечек как плату).
                              Coin cells and peak current draw
                              High pulse drain impact on CR2032 coin cell battery capacity

                                0
                                О спасибо, надо зарубку на память сделать.
                                0
                                BMP при частоте считывания 10 Гц потребляет 27 мкА, STM32 2,5 мА, а CR2032 может выдавать 3 мА
                                  0
                                  Ядро STM32L031K6 на частоте 32 МГц в Run mode потребляет 5 мА (таблица 24 в даташите), плюс периферия.
                                  Energizer, например, советует своим 2032 батареям длительно давать токи не более 0,19 мА. Токи больше — только импульсные.
                                  Советую все HAL_Delay заменить на переход в низкопотребляющий режим, тогда батарейки хватит на большее время.
                                    0
                                    Еще обратите внимание, что вы включаете тактирование всех GPIO портов, хотя все явно не используете, а также включаете USART2, хотя его тоже не используете в коде. Это лишнее энергопотребление, которое можно снизить.
                                      0
                                      Спасибо за советы, учту их в следующих проектах. В этом же альтиметре я особо не гнался за снижением энергопотребления, мне хватало того, что STM'ка L-серии имеет пониженное энергопотребление, да и BMP280 тоже ест не много энергии. При испытаниях нареканий к времени автономной работы альтиметра не было, оно в основном было ограничено памятью МК, потому что 8 Кбайт заполнялись примерно за 7 минут работы
                                        0
                                        Превышение энергопотребления над возможностями батареи приводит к тому, что напряжение питания может временно проваливаться ниже, чем допустимо для работы контроллера и датчиков, что может привести к трудноуловимым глюкам. Советую как минимум заходить в кубе в раздел Power Consumption Calculator (PCC) и смотреть там максимум энергопотребления (чтобы он не превышал возможности батареи).
                                          0
                                          А если керамикой/танталами обвешать?
                                            0
                                            Это так себе решение без достаточных интервалов с пониженной нагрузкой. От резких коротких импульсов частично поможет, но превышать номинальный ток источника — всегда плохая идея. Разные производители для cr2032 пишут номинальный ток порядка 0,18 — 0,2 мА. Превышать его можно импульсно (до 6-7 мА) с длительными промежутками пониженного потребления. В вашем случае можно уложиться в эти требования, если переводить контроллер в sleep режим всегда, когда контроллер ничем не занят, и работать на пониженной частоте, вам тут 32 МГц «не в коня корм».
                                              0
                                              Ну понятно, что в среднем меньше должно получиться…
                                  +1
                                  BMP плох как альтиметр, у него нижний предел давления высокий. Он на 10 км выходит из диапазона.

                                  Я просто оставлю здесь эту ссылку на аналогичную мою поделку для шаров.
                                  www.instructables.com/Electronic-Barometric-Altimeter-for-Stratosphere-B

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое