63

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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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


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


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


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


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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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


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


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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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

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

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

3. SenseHat

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

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


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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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

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


Бухгалтерия


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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


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


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


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


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


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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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

Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

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


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

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


Запуск


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


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

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

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

3. Шланг

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


Просто вставлю пару фото, чтобы дать понять масштабы:
Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат
Самодельный стратостат. Часть 1б Своими руками, Стратосфера, Зонд, Raspberry pi, Dotnet, Длиннопост, Стратостат

Убедитесь что 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 раза и не горит в чистом виде, но вероятность его воспламенения выше, чем у гелия. Например транспортировать его в багажнике авто - я бы не стал. У нас некоторые курят :) Значит нужен прицеп (и фаркоп). А его аренда/покупка полностью ликвидируют выигрыш в цене.