Работа с микроконтроллерами в OpenBSD
Контроллер esp8266
В качестве хорошего примера, разберём создание gemini капсулы на базе микроконтроллера esp8266 - это один из первых мк с wifi и самый доступный по цене, за что его и полюбили многие DIY-щики. Чип работает на 80Mhz но может разгонятья до 160, RAM около 100Кб, ROM обычно 2-4МБ. Этого хватает для работы простого gemini-сервера на минималках.
Для этой цели был заказан самый дешевый МК на маркетплейсе с самой быстрой доставкой до самого близкого ПВЗ. Им оказался ESP-12F c usb-c.
Есть готовый проект:
https://github.com/Astrrra/ESP8266GeminiServer
Он написан в Arduino IDE которой нет в OpenBSD.
Но обсд не была бы обсд, если бы там не было простого решения данной проблемы.
Подготовка
Установка необходимых пакетов:
- библиотеки arduino для esp8266
- утилита для прошивки
- makefile который заменяет arduino ide (совместим только с gmake)
Подключение и права
После подключения МК по usb нужно посмотреть dmesg
Тут видно что плата подключена и доступна через /dev/ttyU0,
это устройство должно быть указано далее в Makefile проекта
Пользователя нужно добавить в группу dialer:
иначе для прошивки понадобится doas
Некоторые команды makeEspArduino
Главный командный центр находится в файле:
/usr/local/share/makeEspArduino/makeEspArduino.mk
Основные его команды:
- help - справка по всем командам и переменным
- flash - сборка + прошивка МК
- monitor - вывод отладки через последовательный порт
(Ctrl-] - выход)
- run - все вышеперечисленное
- info - Show location and version of used esp Arduino
info показывает настройки, используемые при сборке проекта:
- list_boards - посмотреть список поддерживаемых плат:
Настройки проекта
Настройки сборки "по умолчанию" прописаны в файле:
/usr/local/share/makeEspArduino/makeEspArduino.mk
Настройки, специфичные для разных моделей плат, перечислены в файле:
/usr/local/share/arduino/hardware/espressif/esp8266/boards.txt
Моего ESP-12F в писке не оказалось, но там был ESP-12E, который является ближайшим его родственником, по этому выбрал nodemcuv2.
Чтобы задать свои значения, нужно создать свой Makefile:
может потребоваться переопределить значения переменных:
Далее будет достаточно скопировать этот Makefile в директорию любого arduino-проекта рядом с .ino файлом и запустить gmake run.
Gemini server
Сертификат и настройки
Генерация сертификата для gemini.domain.com на 10 лет:
После этого нужно вставить содержимое key.pem и cetr.pem в config.h
И тамже прописать настройки wifi и домен.
В файле gemserv.ino в строке 38 поставить скорость порта, такую же как на хосте (по умолчанию 115200):
littlefs
Для работы проекта Astrrra/ESP8266GeminiServer потребуется старая версия утилиты mklittlefs.
путём проб и ошибок выяснилось что в пакетах OpenBSD эта утилита слишком новая для данного проекта.
В результате получится нужная версия mklittlefs.
Скопируйте mklittlefs в папку проекта ESP8266GeminiServer.
Финальный Makefile
При копировании не забудьте что в Makefile нужны tab-ы
Еще можно добавить/отредактировать файлы в data/gemini (содержимое капсулы)
Сборка и прошивка
Прошивка состоит из двух частей: сам код и образ littlefs.
Сборка, прошивка и запуск с выводом через последовательный порт:
Вначале может выводиться мусор и иногда требуется подождать несколько секунд прежде чем прошивка запустится.
Если видно ip адрес полученный по wifi, то всё ок!
Если ip не появился, то попробуйте перезагрузить контроллер, обычно на плате есть кнопка reset.
Выход из монитора последовательного порта: ctrl-]
Cборка и прошивка образа littlefs:
Если все сделано верно, то капсула станет доступной по ip, который было видно после `gmake run`
Далее при редактировании содержимого капсулы не нужно перепрошивать всё, достаточно только `gmake flash-fs`.
Проверить можно любым клиентом, но из-за медленной выдачи некоторые клиенты глючат.
Проверка:
Заключение
- В OpenBSD вполне неплохо можно работать с современными микроконтроллерами.
- Отсутствие Arduino IDE не является помехой.
- Для gemini капсулы хватает самого недорогого микроконтроллера.
Если у вас получилось проделать выше описанное и есть постоянный ip адрес или настроен на роутере DynDNS, то вы можете пробросить порт 1965 и поделиться ссылкой с друзьями (не забудьте прописать ваш домен в config.h и при генерации сертификата).
Моя домашняя капсула на esp8266 (временно не доступно)
Благодарности
Спасибо:
- @aexyel за поддержку, тестрирование и редактуру.
- Astrrra за ESP8266GeminiServer
- Тео и разработчикам за отличную ОС!