Как превратиться из энтерпрайз-джависта в хоббиста-разработчика прошивок

 Публичный пост
20 мая 2024  526

Интро

Последние 10 лет я провёл в большом кровавом FinTech, разрабатывая софт на Java c хипами на десятки гигабайт. Примерно столько же времени я ковыряюсь с 3д-принтерами и всяким DIY, а последние полгода делаю форк прошивки для китайского дисплейчика для 3д-принтеров KNOMI.

Цель этого поста - дать небольшой high level overview о том что вообще бывает из hardware и как вообще начать делать что-то (вечерами) более веселое чем перекладывать JSON в Kafka микросервисом в K8s, не умея паять, и не разбираясь в электронике и схемотехнике.

А зачем?

  • Во-первых - это весело, и невыразимо круто держать в руках что-то, что ты сделал в реальном мире.
  • Во-вторых - имхо такой опыт полезен для любого энтерпрайз разработчика. Когда ты привык засовывать XML в JSON и раскидываться гигабайтами памяти - ограничения микроконтроллеров очень отрезвляют и напоминают о бережном обращении с ресурсами.

Пример - прошивка устройства с WiFi, вебсервером, SPA- приложением со всеми ресурсами, поддержкой дисплея, и REST API client-ом с десерализацией JSON - занимает всего 1.1 МБайт! (и ей хватает 300 кбайт памяти чтобы работать!)

Что купить?

Нет, речь не про Arduino (про который вы конечно же слышали).
Мы будем писать прошивку для микроконтроллера, поэтому вкратце о том что существует:

8-битные - AVR, PIC.

Супер-дешевые и простые. Весь бренд Arduino взлетел на том, что взял AVR ATMega328p, приделал к ней дружелюбную обвязку (USB-порт для подключения к комплюктору и Dupont-разъёмы для подключения светодиодиков). Стартовать с них мы не будем, потому что сейчас не 2010 год и есть масса более интересных решений.

32-битные ARM - STM, MediaTek, и прочие Raspberry PI PICO

Мощные и универсальные. Скорее всего на этой же архитектуре (но вероятно другой версии/редакции) работает ваш телефон, роутер, и половина техники с дисплейчиками вокруг вас. Есть шанс что там будет даже работать Linux.
А ещё они (на самом деле не только они, но..) обычно содержат в себе поддержку USB-стека - т.е. можно заставить их притвориться флешкой / джойстиком / ещё чём. Этот вариант тоже отметаем - слишком сложно и дорого для старта.

Специализированные - ESP8266, ESP32 и аналоги.

Китайская компания Espressif в 2014 году сделала супер-дешевый программируемый SoC (System-on-Chip) с WiFi - ESP8266. Как Arduino, только с WiFi. Скорее всего все умные лампочки и умные розетки у вас работают с помощью ESP8266. Шутка ли - за условный 1$ и немного кода производитель может сделать устройство "умным".

В 2016 году вышло обновление - ESP32, и позже начали выпускаться разные модификации - в т.ч. с другим набором инструкций (RISC-V вместо проприетарной Xtensa). В одном модуле у вас может быть и BlueTooth, и WiFi, и ZigBee, и ещё куча интерфейсов - хоть дисплей с тачскрином подключай - в общем раздолье.

К счастью система настолько популярна, что уже есть десятки различных DevBoard - по сути готовых устройств, с батарейкой, с каким-то набором датчиков (и даже дисплеями), и как правило с образцом прошивки на гитхабе, и в которые вы легко сможете залить свою.

Как выбрать модификацию ESP32:

  • По дефолту - ESP32-S3 - 2 cpu, 240mhz, 512Kb ram, 384kb rom, WiFi 2.4 b/g/n, bt5le
  • +RISC-V + power -> ESP32-C6: 1 core RISC-V 160MHz, 1 core RISC-V 20Mz, 512Kb ram, 320Kb rom, WiFi6 2.4ghz (b,g,n,ax), Thread+Zigbee, BT 5.3 LE

Соответственно можно искать на Aliexpress по запросу ESP32 dev board - и утонуть в вариантах. Один из популярных производителей подобного - это M5Stack - можете посмотреть например на M5Stack Dial (35$) или LilyGo.

M5 Dial - оно крутится, сенсорный экранчик, WiFi - ну милота же!
M5 Dial - оно крутится, сенсорный экранчик, WiFi - ну милота же!

На чём писать?

Традиционно Espressif поставляет своё SDK - для C/C++.
Хотя это рекомендованный производителем способ - он мягко говоря не дружелюбный - поэтому расскажу о других опциях.

  • Arduino ESP32 core - то же C/C++ но со всей экосистемой библиотек для Arduino и удобными абстракциями вида WiFi.Connect("SSID", "my-password").
  • MicroPython - да-да. По сути прошивка - интерпретатор python. Сам я не пользовался - поэтому много рассказать про неё не смогу.
  • Rust - esp-rs. Сам ещё не пробовал, но обязательно попробую в будущем.

Для самого простого старта начала - берите Arduino ESP32 core.

Какую IDE поставить?

Для всяких arduino и esp32 стандарт де-факто - это либо Arduino IDE либо Platformio. Первое это по сути блокнот с возможностью залить прошивку в устройство, а второе - это надстройка для вашей IDE - VS Code / CLion.

Если у вас уже есть подписка от JetBrains на все продукты - то смело ставьте CLion и PlatformIO extension. Иначе - придётся ставить Visual Studio Code + опять же extension.
Формат проекта PlatformIO - это файл platformio.ini который описывает под какие платформы (устройства) компилировать прошивку, и т.д.

Arduino IDE тоже стоит поставить - просто чтобы иметь возможность залить прошивку-пример от производителя. Узнать их можно по расширению файла .ino.
up: мне подсказали что можно поставить плагино Arduino в VS Code и не ставить всю Arduino IDE.

Как подключить устройство к компьютеру?

Пока вы не закодили обновление прошивки по WiFi - к компьютеру ваш купленный девайс придётся подключать кабелем. Почти наверняка это USB, который обнаружится в вашей системе как COM-порт.
COM-порт это на самом деле всего 4 кабеля - питание, земля, передача данных, и приём данных. Почти как модем или терминал. Очень просто для реализации на чипе, ощутимо проще чем весь USB-стек. Поэтому обычно на платах ставят чип-преобразователь (FTDI FT232 / CH340) из USB в COM (так же встречается название USB-RS232) между разъёмом для кабеля и собственно самим ESP32.
Именно поэтому же не получится заставить притвориться ваш ESP32 каким-то креативным USB-девайсом (типа джойстика, или флешки, или клавиатуры).

Дебаг

В этот же терминал прошивка может отправлять логи (да-да, логи пишем по дефолту в обычный stdout - никаких вам Splunk/ElasticSearch).
А вот с настоящей отладкой всё сложнее. Дебажить в риалтайме можно - обычно на чипах для этого есть специальные выводы / контакты, куда надо подключить JTAG дебаггер - ещё одну плату, т.е. в нашем случае это ESP-Prog.
Ну или надеяться на отладку через println в stdout :). Учитывая что стектрейс в случае фатальной ошибки тоже выводится туда - можно довольно успешно жить и в такой парадигме.

Поехали!

Пришло устройство - что дальше? Скорее всего вместе с девайсом пришла какая-то инструкция, со ссылкой на github с примерами. Выкачиваем, открываем IDE, экспериментируем, повторяем.

Вы же уже разработчик - допилить код из примера до чего-то другого вы точно сможете :)

А если чего-то не хватает - то библиотеки-зависимости можно поискать здесь:

Что дальше?

Зависит от того что вы захотите сделать - будь это настольный показыватель курса биткоина, фитнесс-браслет с OTA-кодами, или нечто ещё более интересное.

Что ещё можно исследовать:

  • узнавать больше про платформу - например как сделать обновление-по-воздуху, авто-обновление
  • классическую электротехника и самому сделать печатную плату (и заказать её в том же PCBWay. К счастью, рынок достаточно вырос чтобы почти любой этап можно было отдать на аутсорс)
  • тысячи разных датчиков - от магнитного поля и ускорения до сканеров RFID
  • разные протоколы - CAN, SPI, I2C, 1wire, ...
  • механика - а что если подключить мотор(ы) и научить девайс двигаться?
  • печатать самому корпуса под ваши поделки
  • реверс-инженеринг существующих устройств - например вставить ESP32 в какое существующее устройство, почитать логи через Tx/Rx разъёмы с платы производителя.
  • другие микроконтроллеры - с AI-ядрами, ARM, промышленные реле или контроллеры дома-дурачка
  • подписаться на hackaday - там постоянно новые интересные девайсы
  • ...

Удачи, и пишите в комментариях что хотите сделать. А когда сделаете - напишите об этом статью и угостите меня пивом, если что-то из этого было полезно :).

3 комментария 👇

Меня как Embedded SW Developer бомбит внутри от твоего поста, но я оставлю это внутри. Ну примерно как если бы я начал писать - "ребята я тут в качестве хобби решил на яве джсоны перекладывать и смотрите, что я вам сейчас нового расскажу".
С другой стороны - у меня самого нет времени писать туториал по своей сфере уже года два как, поэтому я заткнулся и желаю тебе удачи.

  Развернуть 1 комментарий

Привет Кирилл^^
Расскажи какие девайсы сам уже сделал/перепрошил?

  Развернуть 1 комментарий

Hey, Sam!
На самом деле не так много всего - последние пару лет в основном занят выживанием в Берлине, не до того :). Уверен, у тебя намного больше крутых проектов сделано!
Собственно вот последнее что прямо увлекло - это тот форк KNOMI который полностью переписал. Увлекательно было узнать как рендерить анимированную гифку, когда нету памяти для фреймбуфера. Ещё сделал клёвый механизм дистрибуции прошивки на Rust - тупо бинарник в Github Actions который содержит в себе уже все нужные собранные прошивки, и сам всё сделает :).

Ещё давно когда-то вставлял esp8266 в датчик воздуха - там были Rx/Tx пины с отладочной информацией, надо было протокол реверснуть чтобы отправлять данные по сети куда-то, вместо того чтобы показывать на дисплее.

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб