Работа с микроконтроллерами в OpenBSD

Контроллер esp8266

В качестве хорошего примера, разберём создание gemini капсулы на базе микроконтроллера esp8266 - это один из первых мк с wifi и самый доступный по цене, за что его и полюбили многие DIY-щики. Чип работает на 80Mhz но может разгонятья до 160, RAM около 100Кб, ROM обычно 2-4МБ. Этого хватает для работы простого gemini-сервера на минималках.

Для этой цели был заказан самый дешевый МК на маркетплейсе с самой быстрой доставкой до самого близкого ПВЗ. Им оказался ESP-12F c usb-c.

Есть готовый проект:

Он написан в Arduino IDE которой нет в OpenBSD.

Но обсд не была бы обсд, если бы там не было простого решения данной проблемы.

Подготовка

Установка необходимых пакетов:

# pkg_add arduino-esp8266 py3-esptool makeesparduino gmake

Подключение и права

После подключения МК по usb нужно посмотреть dmesg

$ dmesg
...
uchcom0 at uhub3 port 2 configuration 1 interface 0 "QinHeng Electronics USB2.0-Serial" rev 1.10/2.54 addr 3
uchcom0: CH341
ucom0 at uchcom0: usb1.1.00002.0

Тут видно что плата подключена и доступна через /dev/ttyU0,

это устройство должно быть указано далее в Makefile проекта

$ ls -la /dev/ttyU*
crw-rw----  1 root  dialer  66, 0 Sep 17 00:00 /dev/ttyU0
crw-rw----  1 root  dialer  66, 1 Sep 16 22:54 /dev/ttyU1
crw-rw----  1 root  dialer  66, 2 Sep 16 22:54 /dev/ttyU2
crw-rw----  1 root  dialer  66, 3 Sep 16 22:54 /dev/ttyU3

Пользователя нужно добавить в группу dialer:

# usermod -G dialer username

иначе для прошивки понадобится doas

Некоторые команды makeEspArduino

Главный командный центр находится в файле:

/usr/local/share/makeEspArduino/makeEspArduino.mk

Основные его команды:

(Ctrl-] - выход)

info показывает настройки, используемые при сборке проекта:

$ gmake -f /usr/local/share/makeEspArduino/makeEspArduino.mk info

== Build info
  CHIP:        esp8266
  ESP_ROOT:    /usr/local/share/arduino/hardware/espressif/esp8266
  Version:     esp8266
  Threads:     2
  Upload port: /dev/ttyU0
$ gmake -f /usr/local/share/makeEspArduino/makeEspArduino.mk list_boards

Настройки проекта

Настройки сборки "по умолчанию" прописаны в файле:

/usr/local/share/makeEspArduino/makeEspArduino.mk

Настройки, специфичные для разных моделей плат, перечислены в файле:

/usr/local/share/arduino/hardware/espressif/esp8266/boards.txt

Моего ESP-12F в писке не оказалось, но там был ESP-12E, который является ближайшим его родственником, по этому выбрал nodemcuv2.

Чтобы задать свои значения, нужно создать свой Makefile:

CHIP=esp8266
BOARD=nodemcuv2
F_CPU=160000000L
include /usr/local/share/makeEspArduino/makeEspArduino.mk

может потребоваться переопределить значения переменных:

CHIP           Set to esp8266 or esp32. Default: 'esp8266'

BOARD          Name of the target board. Default: 'generic'
- зависит от используемой платы

UPLOAD_PORT    Serial flashing port name. Default: '/dev/ttyU0'
- на каком порту определилась плата, может быть другой номер устройства

UPLOAD_SPEED   Serial flashing baud rate. Default: '115200'
MONITOR_SPEED  Baud rate for the monitor. Default: '115200'

F_CPU          задаёт повышенную частоту чипа (см. *.build.f_cpu=? в boards.txt)

Далее будет достаточно скопировать этот Makefile в директорию любого arduino-проекта рядом с .ino файлом и запустить gmake run.

Gemini server

$ git clone https://github.com/Astrrra/ESP8266GeminiServer.git
$ cd ESP8266GeminiServer

Сертификат и настройки

Генерация сертификата для gemini.domain.com на 10 лет:

$ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 36500 -nodes -subj "/CN=gemini.domain.com"

После этого нужно вставить содержимое key.pem и cetr.pem в config.h

И тамже прописать настройки wifi и домен.

В файле gemserv.ino в строке 38 поставить скорость порта, такую же как на хосте (по умолчанию 115200):

// setup serial
    Serial.begin(115200);

littlefs

Для работы проекта Astrrra/ESP8266GeminiServer потребуется старая версия утилиты mklittlefs.

путём проб и ошибок выяснилось что в пакетах OpenBSD эта утилита слишком новая для данного проекта.
$ git clone --depth 1 --branch 2.5.1-2 https://github.com/earlephilhower/mklittlefs.git
$ cd mklittlefs
$ git submodule update --init
$ gmake

В результате получится нужная версия mklittlefs.

Скопируйте mklittlefs в папку проекта ESP8266GeminiServer.

Финальный Makefile

При копировании не забудьте что в Makefile нужны tab-ы
# Название чипа
CHIP            =esp8266

# Модель платы:
BOARD           =nodemcuv2

# Частота ядра:
F_CPU           =160000000L

# Используемая память:
MEM             ?= 4M2M

# Путь к старой версии утилиты mklittlefs:
MKLITTLEFS      ?= ./mklittlefs

# Где брать настройки платы:
BOARDS_SETTINGS =/usr/local/share/arduino/hardware/espressif/esp8266/boards.txt

# Устройство последовательного порта:
DEVICE          :=/dev/ttyU0

# Размер блока:
BUILD_FS_BLOCKSIZE=8192

# Размер страницы:
BUILD_FS_PAGESIZE=256

# С какого адреса писать образ:
BUILD_FS_START_HEX=$$(grep "^${BOARD}.menu.eesz.${MEM}.build.spiffs_start" \
			 ${BOARDS_SETTINGS} | cut -d"=" -f2 | xargs)
# До какого адреса писать образ:
BUILD_FS_END_HEX=$$(grep "^${BOARD}.menu.eesz.${MEM}.build.spiffs_end" \
			 ${BOARDS_SETTINGS} | cut -d"=" -f2 | xargs)
# Размер образа littlefs:
BUILD_FS_SIZE=$$(expr `printf "%d" ${BUILD_FS_END_HEX}` - `printf "%d" ${BUILD_FS_START_HEX}`)

.PHONY: littlefs.img flash-fs img-clean
.ONESHELL:
# Сборка образа littlefs
littlefs.img: img-clean
	$(MKLITTLEFS) -c `pwd`/data --page ${BUILD_FS_PAGESIZE} \
		--block ${BUILD_FS_BLOCKSIZE} --size ${BUILD_FS_SIZE} $@

.ONESHELL:
# Прошивка littlefs:
flash-fs: littlefs.img
	esptool.py --chip ${CHIP} \
	  --port ${DEVICE} \
	  --baud 115200 \
	  --before default_reset \
	  --after hard_reset \
	  write_flash ${BUILD_FS_START_HEX} littlefs.img

img-clean:
	rm -f littlefs.img

include /usr/local/share/makeEspArduino/makeEspArduino.mk

Еще можно добавить/отредактировать файлы в data/gemini (содержимое капсулы)

Сборка и прошивка

Прошивка состоит из двух частей: сам код и образ littlefs.

Сборка, прошивка и запуск с выводом через последовательный порт:

$ gmake run
...
--- Miniterm on /dev/ttyU0  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

...мусор...

Connected to WiFi
IP address: 192.168.1.105

Вначале может выводиться мусор и иногда требуется подождать несколько секунд прежде чем прошивка запустится.

Если видно ip адрес полученный по wifi, то всё ок!

Если ip не появился, то попробуйте перезагрузить контроллер, обычно на плате есть кнопка reset.

Выход из монитора последовательного порта: ctrl-]

Cборка и прошивка образа littlefs:

$ gmake flash-fs
....
Connected to WiFi
IP address: 192.168.1.105
index.gmi
Sending file: /gemini/index.gmi

Если все сделано верно, то капсула станет доступной по ip, который было видно после `gmake run`

Далее при редактировании содержимого капсулы не нужно перепрошивать всё, достаточно только `gmake flash-fs`.

Проверить можно любым клиентом, но из-за медленной выдачи некоторые клиенты глючат.

Проверка:

echo "gemini://gemini.domain.com/" | nc -e gemini.domain.com -T noverify -c IP-адрес 1965

Заключение

Если у вас получилось проделать выше описанное и есть постоянный ip адрес или настроен на роутере DynDNS, то вы можете пробросить порт 1965 и поделиться ссылкой с друзьями (не забудьте прописать ваш домен в config.h и при генерации сертификата).

Моя домашняя капсула на esp8266

Благодарности

Спасибо:

⬅ Назад