На хабре достаточно часто публикуют статьи о различных проектах на основе популярного чипа ESP8266, поэтому не буду рассказывать о нём самом.
Сразу к сути: мы разработали новую прошивку для данного устройства, предлагающую использовать для разработки язык JavаScript. Но, Smart.js это не только прошивка-интерпретатор JS, это ещё и различный «обвес» для работы с оборудованием и облачная инфраструктура.
За подробностями — прошу под кат.
Сразу оговорюсь, что эта статья — обзорная, в ней я постараюсь рассказать о том, что умеет Smart.js, и очень мало коснусь того, как это всё устроено. Если будет интерес узнать как оно работает — это может быть темой следующей статьи (а еще можно посмотреть исходники).
Итак, что же у нас под капотом?
Прежде всего это движок JS по имени V7, разработанный Cesanta. Не останавливаясь на нём слишком подробно, отмечу лишь, что этот движок изначально разрабатывался для встраиваемых платформ, поэтому отличается маленьким размером, небольшим потреблением памяти, отличной портабельностью и высокой степенью конфигурируемости. Однако, просто JS интерпретатор на ESP8266 был бы вещью в себе, поэтому Smart.js умеет общаться с внешним миром.
- I2C. Описание API можно прочитать на гитхабе, так же есть два примера «драйверов» устройств (температурный датчик и EEPROM). I2C реализован посредством bit-bang, особенностей в нём быть не должно;
- SPI. ESP имеет два SPI интерфейса, в документации к устройству они называются SPI и HSPI, где HSPI, вроде как, обозначает Hardware SPI. «Просто» SPI используется самим чипом для работы с флешом, в итоге он постоянно занят. Можно туда влезть с bit-bang'ом, но пока этого делать не стали, ограничились поддержкой HSPI (кстати, есть отличный блог про ESP, в котором много рассказывается про SPI, рекомендую). Описание нашего API всё там же;
- WiFi. Было бы странно не поддерживать WiFi. Поэтому поддерживаем;
- Файловая система. Имеется, базируется на SPIFFS;
- Так же есть API для работы с GPIO и простой HTTP клиент;
- … и набор различных вспомогательных функций.
В общем, если будет интересно — прочитайте readme, мы постарались описать всё, что есть.
Теперь немного о быстром старте.
Скачиваем со архив Flash'n'Chips. Flash'n'chips — это «фирменный» прошивальщик. Можно использовать любой, но Flash'n'chips сразу генерирует device id и пароль необходимые для подключения к облаку. Есть версия под OS X и Windows.
Кроме самого прошивальщика в архиве лежит «релизная» (т. е. Альфа) прошивка.
Подключаем ESP8266 к USB, запускаем Flash'n'chips, и видим примерно такую картинку:
Жмём «Load firmware» — и прошивка зальётся на устройство. В зависимости от того, какая у вас ESP, могут потребоваться дополнительные телодвижения. Я, например, использую простейшую ESP01, так что перед прошивкой мне надо подключить GPIO0 к GND.
Подключаемся терминалом. (В Flash'N'Chips есть и встроенный, мне привычнее picocom, но это не принципиально). Скорость — 115200.
В этой консоли можно сразу же набирать JS код. («smartjs NNN/MM$» — это приглашение командной строки, NNN — количество свободной памяти, MM — количество памяти потребляемое в данный момент непосредственно интерпретатором).
Выглядит как обычная консоль.
При нажатии Enter команда выполняется и её результат выводится в консоль, т.е. можно обойтись без множества “print”. Другой способ написать и запустить JS код — это набрать его в любимом редакторе, сохранить в файл и загрузить на устройство. Проще всего это сделать с помощью всё того же Flash'n'Chips — в комбобоксике Select Action выберите «Upload file».
Теперь файл можно выполнить посредством команды File.load(«имя файла»), набрав эту команду в консоле, или добавив её в файл init.js (тогда файл автоматически выполнится при старте устройства).
Прошивкой для ESP8266 Smart.js не ограничивается. Как я уже писал выше, ещё есть облако, куда можно оправлять данные с устройства, хранить их там, забирать их оттуда, ну или просто смотреть на графики. API для отправки данных в облако прилагается.
Для быстрого старта мы записали небольшое видео:
Т.е. если вам нужно, например, мониторить температуру в квартире, то почти ничего не придётся делать. Достаточно подключить к ESP датчик температуры, написать “драйвер” (или взять готовый) на JS, зарегистрироваться в облаке, написать небольшой скрипт считывающий температуру и отправляющий его в облако. А потом заходить на сайт и смотреть на график.
Безусловно, прошивка будет работать и без облака. Но с облаком удобнее, часть рутинной работы отсекается. На гитхабе есть ссылка на облако, a если у вас есть гитхабовская же или G+ учётка, то регистрация в нём уложится в пару кликов.
Ну а если вам не хватает каких-то функций, то всегде можно воспользоваться C. Можно просто написать новую функциональность на C, никак не связывая его с JS. При этом останется возможность использовать почти все API которые есть (в большинстве случаев JS API — тонкая обёртка над сишными функциями), кроме того, можно пользоваться функциями ESP SDK. Собрать прошивку из исходников не сложно, благодаря наличию образов docker.
Можно расширить JS. Для этого пишем на C необходимую функциональность, а потом делаем её доступной в JS. Это тоже не сложно :).
Для тех, что имел дело с ESP8266 Smart.js покажется похожей на NodeMCU. Спорить не буду — пока похоже. Но у нас большие планы по развитию Smart.js и по портированию на другие устройства, так что со временем, я думаю, сходства будет всё меньше.
Кстати о наших планах. Сейчас статус Smart.js — ALPHA 1. Следующий релиз намечен на осень (что, разумеется, не мешает желающим собирать прошивку из исходников с любой периодичностью). К осени мы увеличим объём доступной для пользователя памяти, сделаем обновление скриптов из облака (т. е. теоретически можно будет вообще никогда не подключать ESP8266 к компьютеру), сделаем порт на другие платформы и тд.
А сейчас же нам важно получить фидбек. Нравится ли? Чего не хватает? Что лишнее? Интересно ВСЁ!
Так что — качайте прошивку — пробуйте, мы будем рады. Лицензия двойная, GPLv2 для всех желающих и коммерческая для тех, кому не подходит GPL и/или нужна поддержка.
Автор: athree