63

Самодельный стратостат. Часть 1б

Продолжаем продолжать


Вторая подчасть первой части "инструкции" по сборке своего стратостата из мангала и детских травм. Она будет немного скучновата, но без нее у вас ничего не полетит. Так что давайте перетерпим эту часть и дальше будет веселее :-)


Мы закончили на описании отладки dotnet приложения на RPI. Теперь давайте немного осмотрим сам код.


Программирование


Сразу ссылка на репозиторий с исходниками — GitHub


Я очень долго откладывал этот раздел для написания, т.к. софт был написан год назад и я почти забыл все те ужасы, которые мне пришлось побороть, сражаясь с китайскими комплектующими. Но попробуем хоть что-то наковырять. Сейчас я лишь заменил project reference на nuget package, т.к. зачем-то я скачивал исходники проекта нугет пакета (надеюсь просто так, сейчас солюшен билдится).


Как и в системе "театр-вешалка", dotnet приложение начинается с конфигурации. Конфигурации DI, логгеров и вот этого всего. В нашем случае в функции Main:

Как видите, мы пошли путем использования IHostedService как основной крутилки нашего логгера, настроили SerialPort для доступа к GPS HAT (зачем-то я его инжектю в hosted service, вместо того чтобы использовать там GpsModuleCommand, очевидно проглядел тогда), добавили наши сервисы для доступа к SenseHat в контейнер DI и настроили логирование в консоль. Тут все — host.RunAsync()!


Не буду приводить тут содержимое каждого файла, кому надо — посмотрят на гитхабе. Тут обрисую основную идею. Вся она описана в нашем хостед сервисе RpiProbeHostedService. Содержммое метода StartAsync:

Итак, для начала нам нужно узнать в каком состоянии наш GPS HAT. Т.к. тот факт, что он включен — еще не означает, что включен непосредственно GPS модуль. Если GPS выключен — включаем его и идем дальше.


А дальше у нас бесконечный цикл с задержкой в 1с. В первую очередь нам нужны показания GPS — так как это есть точка синхронизации всех данных. Так же, дата из этих показаний используется как имя файла-репорта. Так что нам эти данные прям очень нужны.


Затем собираем данные с SenseHat и внешнего градусника и записываем это все в файл-репорт. Вот и вся нехитрая логика.


С SenseHat проблем не было вообще никаких. А сейчас, при написании статьи, оказалось что с тех пор MS даже добавила его поддержку в свою iot library. Тут подробнее — MSDN.


Проблемы, как вы догадались, были с внешним градусником. Я перепробовал с десяток разных проектов на разных языках (Python в их числе). Но ни один не заработал именно с этим градусником. Пару раз было очень близко, но видимо моя модель чуть-чуть отличалась и показания отрицательных температур были неверны. Это сейчас, с остывшей головой, я понимаю — если проблема в месте, где присутствует минус — надо смотреть на тип данных. И таки да, замена byte на sbyte сделала свое дело. Но тогда, год назад, я был на грани отчаяния. Метод ReadTemperature:

Метод хоть и небольшой, но содержит парочку magic numbers. Знаете, где вы найдете их объяснение? Нигде. Это все наковыряно и проверено (методом проб и ошибок) из разных проектов. Так что если у вас такой градусник — поздравляю, ваши страдания окончены.


Не стоит забывать, что наш самописец не подключен к монитору и нам надо бы как-то понимать — все ли на нем работает штатно. Для этих целей я использовал LED матрицу на SenseHat. Она небольшая, всего 8x8, так что выводить туда картинки не получится. Но получится мигать/светить лампочками. Более чем достаточно в столь аскетичном устройстве. Код метода DisplayStatus:

Видим, что я инкапсулировал координаты лампочки, которой надо посветить, в класс ответа от конкретной функции (GPS ответ, Sense ответ, ответ от внешнего градусника и т.п.). Все эти response реализуют интерфейс IResponse:

Соответственно, обязаны предоставлять статус в формате "Успех\провал" и координаты ячейки LED куда его поместить, и делают это на свое усмотрение. Не буду говорить что это идеальный дизайн, но, как минимум год назад, мне он показался подходящим. Вот, например, как реализует свой статус ответ от SenseHat:

Итого у нас есть 5 подсистем:

1. GPS модуль: вкл\выкл

2. GPS модуль: координаты получены и прочитаны

3. SenseHat

4. Внешний градусник: показания есть\нет

5. Лог-файл: координаты имеются\нет


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


GPS HAT тоже не вызвал особых проблем, насколько я помню. За исключением новости (для меня), что для работы с SerialPort нужны привелегии root и его ответ пришлось немного попарсить:

Положение всех компонентов ответа указано в документации.


Еще 1 момент — EventBased подход я решил не использовать, но он вроде работает и методы для него (DataReceived) остались в коде. Честно говоря, не помню почему я так решил, но думаю причины были.

Перейдем к финансам.


Бухгалтерия


Быстренько пробежимся по моей нелюбимой части — сколько все это чудо стоит. В этот манускрипт не попали: стоимость камеры (она у меня уже на тот момент и так была), стоимость спасения и всякая мелочевка, типа клея и винтиков. Эти позиции сильно субъективны.

Внизу 2 суммы: одна за все позиции, вторая (Minimum) — это только если запускать одну камеру — без RPI и всего с ней связанного. Как видите, поисковый трекер вместе с подпиской занимают ~30% цены всего аппарата. Так что если найдете вариант подешевле — это хороший повод сэкономить.


Также, в процессе моих экспериментов, я накупил много лишнего — это красная секция в табличке. Это то, что совсем не пригодилось. Желтая секция — это то, без чего можно было бы обойтись. Эдакая ни вам, ни нам середина. Запуск только лишь зеленой секции означает запуск только камеры и RPI с Sense Hat. Мы запускали зеленую + желтую.


Конечно тут есть простор для оптимизации. Например, я считаю, что вместо GPS HAT можно было бы найти что-то подешевле, за парашют мы тоже явно переплатили, карту памяти для RPI можно смело брать 16Гб (а то и меньше), ну и так далее. Но это все было в первый раз, хотелось подстраховаться — отсюда и цена соответствующая.


Подготовка к запуску


Прежде всего надо понять — где запускать? Если вы житель мегаполиса, у меня для вас плохие новости — нигде. Ладно шучу, не все так плохо =)


Главное — надо никому не мешать. Рядом не должно быть ни воздушных трасс, ни аэродромов, ни запретных или бесполетных зон. Выбирать место надо с учетом предполагаемой траектории движения (которая зависит от ветра и вертикальной скорости аппарата).


Для этого можно воспользоваться сервисом FPLN: включаем в настройках показ всего что нам нужно и ищем глазами свободное место. Вот чисто для примера такое (в зависимости от предполагаемой траектории):

Откуда нам взять предполагаемую траекторию? Тоже есть сервис. CUSF Landing Predictor 2.5. Вбиваем наши варианты и параметры и смотрим что будет:

Совмещаем картинку с FPLN и смотрим — подходит/не подходит? Если нет — ищем новое место, если да — поздравляю.


Для прогнозирования ветра можно использовать Windy. CUSF Landing Predictor так же учитывает направление и силу ветра на выбранное время и координаты. Как вспомогательное средство, можно использовать FlightRadar чтобы помониторить в реальном времени самолеты в предполагаемом районе запуска.

Ну что. Если вы дошли до этого этапа, значит бОльшая часть пути позади. Впереди запуск!


Запуск


Со слов участников: Выбрали точку, заправили тарантас, взяли пару баллонов гелия и двинули на место. Описывать тут особо нечего. Имейте только ввиду — шар такого размера с гелием имеет неплохую подъемную силу! Так что придерживайте его пока будете надувать (а лучше привяжите временно).


В этой операции использовались:

1. Клапан Голубева

2. Переходник под него

3. Шланг

4. Переходник со шланга на баллон 3/4 дюйма


Просто вставлю пару фото, чтобы дать понять масштабы:

Убедитесь что GPS трекер включен! Без него — вся эта затея будет провалена сразу после запуска. Далее подключаем питание к RPI и GoPro. Ждем успешный статус на RPI, включаем запись видео на камере, запаковываем короб, крепим к парашютному фалу, парашют к шару и… Поехали!

Нуштош... Скучности, так необходимые, заканчиваются, как и лимит символов на пост у Pikabu. В следующей части (Часть 1в) нас ждет: Поиск и спасение, Результаты (анализ телеметрии), Видео с бортовой камеры (и не только) и Выводы


Оставайтесь на связи и: Fly safe, cmdr!

0
Автор поста оценил этот комментарий

Вы действительно молодцы. Я ещё не дочитал ваш опус, но очень хочу это побыстрее сделать. Будет еще много вопросов и идей.

А с водородом действительно не всё так просто. В том числе с получением его на месте. Вот как закончился наш первый эксперимент по получению водорода. Ответ на пост «Алюминиевая банка vs соляная кислота»
Там видеоролик=)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Так, ну нам надо скооперироваться :) Вы синтезируете водород на месте а мы запускаем и достаём шар :)

0
Автор поста оценил этот комментарий
Прикольно, уважуха вам...
Насколько высоко забрались?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Не в этом (первом) запуске, но максимальная высота за все запуски - 35794м

показать ответы
1
Автор поста оценил этот комментарий

Амперка же добралась до 27 км. Почти что космос)) Ещё 3 года тому

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Только они не предоставили инструкцию как туда добраться и мы, в итоге, добрались сильно выше ;)

показать ответы
0
Автор поста оценил этот комментарий
Сколько будет постов 100?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Конкретно частей "инструкции" будет 3. Была бы одна (в оригинале это и есть 1 статья), если бы не ограничения пикабу. Потом еще будет "несколько" уже про запуски "модифицированной" версии, но там более развлекательное содержимое.

0
Автор поста оценил этот комментарий

Само собой. Но в любом случае более лёгкий газ при прочих равных поднмет шар на бОльшую высоту до того, как шар лопнет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну, может быть. Вряд ли там будет разница из разряда: гелий поднял на 30, а водород на 70. Но, наверное, какая-то будет. Тем не менее мы подняли и гелий на 35 в итоге :)

показать ответы
0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Не поднимется. Ну точнее немного поднимется, но рано или поздно настанет момент, когда его подъемной силы станет недостаточно, чтобы тащить полезную нагрузку. Иначе у нас бы космонавтов на шарах к мкс отправляли

показать ответы
0
Автор поста оценил этот комментарий

Постойте. Шар поднимается не за счет расширения. Он поднимается за счет того, что при одном и том же давлении любой объём водорода гораздо легче такого же объёма воздуха. То есть шар поднимает архимедова сила. Он всплывает в воздухе как масло всплывает в воде. И расширение тут ни при чем.
Другой вопрос, что при подъёме атмосферное давление падает и одно и то же количество газа стремится занять бОльший объём. От этого шар расширяется и в какой-то момент растягивается до такой степени, что лопается.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Если мы накинем сверху тканевую оболочку, препятствующую расширению - он зависнет на определённой высоте и не лопнет никогда.

показать ответы
0
Автор поста оценил этот комментарий

А какая тут принципиальная разница с гелием? Удельный вес того же объёма водорода меньше, чем у гелия, а значит наполнив им шар до той же степени, что вы наполнили гелием вы получите бОльшую подъёмную силу. Это значит, что водорода нужно меньше, а это значит, что расшириться он сможет больше в том же шаре и поднять, соответственно, полезную массу выше до того как лопнет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Дак не важно до какой степени расширится водород и сколько это времени займёт. Даже если водород будет расширяться 3 дня - шар все равно лопнет на той же высоте. Ведь шар поднимается за счёт расширения. Если он не будет расширяться - он не будет подниматься. Водород же не создаёт отрицательную гравитацию. Есть проекты, когда люди делают тканевую или фольгированную оболочку и накачивают ее водородом. Она не рвётся от растяжения, просто перестаёт растягиваться. И такой шар может летать вплоть до года

показать ответы
0
Автор поста оценил этот комментарий

Круто!
А вы не рассматривали вариант с водородом? Его можно, вроде бы, легко получать из алюминия и щёлочи с водой. Он сильно дешевле гелия и подъёмная сила у него выше.  Если подавать его через гидрозатвор или пламягаситель, то не должно быть проблем с безопасностью. Там же не гремучий заз, а чистый водород будет, его не так-то просто воспламенить, если он изолирован в оболочке.
Вашу же конструкцию, как я понял, можно быо бы сильно облегчить, использовав  ESP-32 для логгирования показаний датчиков, а GPS-трек писать отдельным логгером. Можно найти даже логгер с UARTом, который выдаст поток в NMEA-формате. Сопоставить потом по ремени можно с логом датчиков.
Ещё меня не покидает мысль, что довольно интересно было бы вставить в зонд радио-маяк на двухметровом диапазоне, который бы транслировал координаты в цифре постоянно. Можно, к примеру, китайский баофенг туда запустить, а через стандартный разъём туда подать ШИМ с контроллера и кодировать координаты простой морзянкой или докрутить коды хемминга и передавать в режиме КВ-пейджера.
Для группе подбора и поиска выдать направленную антенну для того же баофенга и римотанный синей изолентой к нему тот же самый NodeMCU, которого вполне хватит, чтобы показывать гугловую карту и точку принятых координат со шлейфом.
По-хорошему можно было бы даже автоматический искатель замутить на крышу. Остронаправленную поворотную антенну на сервоприводах под радиопрозрачным колпаком от ветра. И научить её автоматически ориентироваться на максимум сигнала. При потере - сканировать сектор ожидаемого местоположения исходя из экстраполированных координат шара  по данным радиотелеметрии и положения радара.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А ну да, есть ещё вариант синтезировать водород на месте. Я этим никогда не занимался, но читал инструкции в интернетах :) По итогу мне это показалось не насколько необходимым, чтобы заниматься этим. Что мы получим взамен? Большую подъемную силу? Ну, вроде нам и гелия хватает для нашей нагрузки (в следующих частях мы ее еще облегчили). Больше высота? Ну тут скорее зависит от шара, а не от газа. Водород хоть и может улететь в космос, но вот выдержит ли шар такое растяжение?

показать ответы
0
Автор поста оценил этот комментарий

Круто!
А вы не рассматривали вариант с водородом? Его можно, вроде бы, легко получать из алюминия и щёлочи с водой. Он сильно дешевле гелия и подъёмная сила у него выше.  Если подавать его через гидрозатвор или пламягаситель, то не должно быть проблем с безопасностью. Там же не гремучий заз, а чистый водород будет, его не так-то просто воспламенить, если он изолирован в оболочке.
Вашу же конструкцию, как я понял, можно быо бы сильно облегчить, использовав  ESP-32 для логгирования показаний датчиков, а GPS-трек писать отдельным логгером. Можно найти даже логгер с UARTом, который выдаст поток в NMEA-формате. Сопоставить потом по ремени можно с логом датчиков.
Ещё меня не покидает мысль, что довольно интересно было бы вставить в зонд радио-маяк на двухметровом диапазоне, который бы транслировал координаты в цифре постоянно. Можно, к примеру, китайский баофенг туда запустить, а через стандартный разъём туда подать ШИМ с контроллера и кодировать координаты простой морзянкой или докрутить коды хемминга и передавать в режиме КВ-пейджера.
Для группе подбора и поиска выдать направленную антенну для того же баофенга и римотанный синей изолентой к нему тот же самый NodeMCU, которого вполне хватит, чтобы показывать гугловую карту и точку принятых координат со шлейфом.
По-хорошему можно было бы даже автоматический искатель замутить на крышу. Остронаправленную поворотную антенну на сервоприводах под радиопрозрачным колпаком от ветра. И научить её автоматически ориентироваться на максимум сигнала. При потере - сканировать сектор ожидаемого местоположения исходя из экстраполированных координат шара  по данным радиотелеметрии и положения радара.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да чего мы только не рассматривали, вариантов реализации и идей бесконечное множество. Но, чтобы довести что-то до конца - надо четко обозначить цель. Цель у нас была обозначена одна: привезти видео в 4к с высоты 30+ км. Звучит, вроде бы просто, но вот, спустя 4 запуска, выясняется что не просто. Например та же температура GP - как ее охлаждать на 30км? И ладно ее, а как охлаждать SD карту в ней? А что делать, если программа управления передатчиком заглючит? И т.д. и т.п.  Так что мы решили отбрасывать «коленочные» самоделки по максимуму, полагаясь только на готовые решения. Этот аппарат не претендует на звание самого технологичного, он претендует на звание «самого легкособираемого». В общем, пока первая цель не будет достигнута - все эксперименты у нас заблокированы. А потом, видно будет.


По поводу водорода уже где-то был спор. Да, он дешевле в 3 раза и не горит в чистом виде, но вероятность его воспламенения выше, чем у гелия. Например транспортировать его в багажнике авто - я бы не стал. У нас некоторые курят :) Значит нужен прицеп (и фаркоп). А его аренда/покупка полностью ликвидируют выигрыш в цене.