Кишеньковий планетарій. Як створити гаджет для відстежування руху планет
Привіт! Мене звати Дмитро, і я Delivery Director в компанії Levi9. Я завжди захоплювався астрономією і хотів мати підручний гаджет, який би показував, як рухаються планети Сонячної системи в реальному часі. Так народився мій кишеньковий планетарій на базі мікроконтролера Raspberry Pi Pico, що відображає поточне положення планет у нашій Сонячній системі. В цьому матеріалі хочу детальніше поділитися принципом його роботи та технічною специфікою, а також власним прикладом довести дві речі:
- Raspberry Pi Pico може виводити корисну, кольорову графіку з потужним FPS.
- Написаний на Python код може добре працювати на мікроконтролерах.
Чим є девайс
Століттями астрономи використовували орбіти, щоб моделювати рух планет навколо Сонця. Насправді механічні моделі Сонячної системи виникли близько 150 року до нашої ери, але свою назву вони отримали, коли англійський дворянин Чарльз Бойл, четвертий граф Орері, замовив у 1713 році власний планетарій за проєктом годинникарів Джорджа Грема і Томаса Томпіона.
Мій пристрій здатний відображати дані про Сонячну систему в режимі реального часу — виводить на дисплеї вісім планет, які рухаються визначеним шляхом. Працює як з RTC-модулем, так і без нього, якщо використовувати при розробці Raspberry Pi Pico W. Щобільше, девайс може працювати і як звичайний годинник.
Якщо придивитися, то з правого боку на екрані можна побачити попереднє розташування Плутона. На перший погляд, планета просто рухається заздалегідь визначеною траєкторією без прив’язки до інших процесів у програмі, але це не так. Завдяки «стрибкам» Плутон відраховує секунди, а його рух продиктований чітким алгоритмом. Так, чим більше секунд залишається до наступної хвилини, тим вище Плутон підстрибує. А безпосередньо перед зміною хвилин на циферблаті планета котиться вниз екрану, досягаючи «землі».
Технічний бік питання
Для реалізації такого проєкту я обрав Raspberry Pi Pico. Це доволі бюджетна плата, що має потужний мікроконтролер. Це маленький комп’ютер із невеликим обсягом пам’яті та обмеженими можливостями підключення додаткових гаджетів, як клавіатура чи монітор. Взагалі, мікроконтролери — це дивовижна річ. Лише уявіть, що такий крихітний об’єкт може виконувати ваші команди та робити практично все з надзвичайно низьким енергоспоживанням.
Дізнавшись про мікроконтролер RP2040 і перевіривши його характеристики, я зрозумів, що його точно треба спробувати. Ця плата — перша в лінійці Raspberry Pi Foundation на базі RP2040, яку вони розробили самі. Було цікаво протестувати — зокрема, наскільки вона ефективна у порівнянні зі старішими «гравцями». Крім того, плата доволі потужна і має доволі цікавий підхід до імплементування власних протоколів PIO (не використовується в цьому проєкті).
Оскільки всі мікроконтролери мають лімітований обсяг памʼяті та ресурсів, здебільшого для їхнього програмування використовують С. Так, він більш низькорівневий і дозволяє краще впливати на використання памʼяті та використовувати обчислювальні цикли мікроконтролера. Мені це часто допомагає в розробці й написанні відповідних програм. При цьому для програмування мікроконтролера в цьому проєкті я захотів використати MicroPython замість C. MicroPython — це обмежена версія Python для мікроконтролерів, яка робить написання програм швидшим, простішим і навіть більш кросплатформеним. Але важлива примітка: вона не дозволяє контролювати памʼять і використовує значно більше ресурсів для інтерпретатора.
Окрім Pico, для проєкту потрібен модуль RTC, який Pico перевіряє для обчислення розташування планет. Я використав ще два основні компоненти: модуль розширення Waveshare Precision RTC з вбудованим чіпом DS3231 та Pimoroni Pico Display Pack. Це дозволяє пристрою обчислювати положення планет на основі поточного часу і дати. Після підрахунків девайс одразу показує планети та їхні відносні кругові орбіти на дисплеї. Найкрутіше те, що для цього не потрібні жодні зовнішні дані. Положення планет розраховуються на борту, і єдине, що знає система — це поточний час, який надходить з модуля RTC. Замість того, щоб покладатися на внутрішній годинник RP2040, модель використовує зовнішній годинник реального часу DS3231, який після налаштування можна підтримувати за допомогою додаткової батарейки. Поточну дату можна налаштувати за допомогою кнопок на циферблаті.
Звичайно, куди ж в процесі розробки без челенджів! Одним із сюрпризів стало те, що в дефолтній бібліотеці не було функції для малювання кола — довелося імплементувати власноруч. До того ж враховуючи, що всі планети я створював попіксельно на планшеті сам, то потрібно було мати доступ до цих даних на мікроконтролері. Вирішив обгорнути все в код через конвертування картинок в байти. Так вдалося тримати масив як const, а MicroPython оптимізував процес і пришвидшив роботу з тими даними.
Tips, які полегшать роботу
Як бачите, зібрати аналогічний девайс відносно просто за три кроки:
- Зібрати компоненти по принципу «сендвіча». Для цього вам знадобляться Raspberry Pi Pico, Precision RTC DS3231, Pico Display Pack, Pico Header Pack.
- Завантажити код і налаштувати RTC.
- Надрукувати корпус на 3D-принтері.
Щоб ще більше спростити технічну реалізацію всім охочим спробувати свої сили, вихідний код проєкту я розмістив на GitHub.
Проєкт можна розвивати та трансформувати: від додавання інших небесних тіл, моніторингу сходу й заходу сонця до використання батарейок для живлення та переходу на e-ink екран. В мене, наприклад, цей прилад ліг в основу іншого проєкту — Raspberry Pi Based Sun Tracker, про який я розповім у наступних статтях.
19 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів