Сразу к сути: мы разработали новую прошивку для данного устройства, предлагающую использовать для разработки язык 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 и/или нужна поддержка.
Комментарии (29)
jonic
24.07.2015 14:58Опередили блин :) Похоже пора торопится :)
jonic
24.07.2015 15:05Хотя за идею движка спасибо
athree Автор
24.07.2015 15:09Ммм… Опередили с чём?
jonic
24.07.2015 15:16с первого дня как я увидел esp8266 я понял что ему нужен JS и грамотная обвязка вокруг. Хотя конечно принципиальная идея похожа, остальное у нас уже рознится (возможно) :) у меня совершенно другой идеологический подход к проектированию на ESP, можете следить за небольшим конкурентом здесь: github.com/wip-studio/esp.js. Я очень долго не мог определится с движком, есть TinyJS который тем не менее довольно таки прожорливый для esp, хоть мне и подсказали его порт под esp, я думал как сделать более требовательный к RAM движок, а v7 я как то не смог нагуглить.
Indemsys
24.07.2015 15:50Чем ваш движок лучше или отличается от этих:
tessel.io
www.espruino.com
в контексте выполнения его на Cortex-M?
И как отлаживать скрипты? Есть IDE с отладчиком под ваш движок?
athree Автор
24.07.2015 16:04Разве Tessel имеет отношение к ESP8266?
Или вы конкретно про V7?Indemsys
24.07.2015 16:11Я про V7.
Чем этот интерпретатор отличается от других.
Или это просто рефакторинг кого-то из тех двух?athree Автор
24.07.2015 16:13Нет, он с нуля написан.
Чем лучше? Здесь достаточно «рекламный» ответ получится.
V7 заточен под 1) минимальный footprint 2) легкое API для встраивания.
и footprint мы собираемся понижать по мере возможностей
В ближайших планах — переход от AST на байткод, например.
Ну и фатального недостатка нет, опять таки.
raid
24.07.2015 16:10Круто!
Каковы плюсы относительно NodeMCU помимо того, что это JS?athree Автор
24.07.2015 16:23Спасибо! :)
Говорить о плюсах альфа версии сложно. Есть вещи, в которых NodeMCU сильнее.
Но я верю, что к альфе2-бете-релизу мы с делаем smart.js лучше чисто технически (ну и идеологически).
А сейчас… JS вместо Lua, как вы правильно заметили (для _меня_ это достоинство), облако у нас удобное (реально удобное), к прошивке можно gdb подключаться (если шмякнется), по моему консоль поудобнее, как мне кажется I2C & SPI работают постабильнее…
Как то так.
На самом деле, мы как раз сейчас занимаемся сбором мнений — что лучше и почему :)raid
24.07.2015 17:16NodeMCU часто ругают за нехватку памяти. Основываясь на личном опыте, могу сказать, что памяти для программ в целом хватает, а вот на проблемы с ОЗУ натыкаешься достаточно быстро.
Как у вас с этим?athree Автор
24.07.2015 17:20Свободной памяти не густо, да.
Сейчас занимаемся её увеличением.
Но я не знаю (не сравнивал) расхода памяти NodeMCU именно при выполнении скриптов. V7 достаточно скромно себя ведёт, в этому плане.
Поэтому — не однозначно, могу предположить что не многим лучше, но могу лишь добавить, что память — одно из приоритетных направлений сейчас.
dimastd
24.07.2015 16:10Может быть вопрос не совсем к месту, но всё же спрошу. Как Вы думаете, имеет ли право на существование, устройство представляющее из себя Ардуину совмещённую (на одной плате) с ESP?
То есть, ардуина остаётся ардуиной, а ESP служит средством связи с внешним миром. Обмен данными между ними по УАРТ.
Как-то вот так…
athree Автор
24.07.2015 16:18Право на существование имеет ;)
Вопрос в том — чего вы хотите достичь.
И какая Arduina.
Потому что, например, по сравнению с той же Mega у ESP и памяти больше, и флеша больше и Wifi имеется. Т.е. зачем ей нужна Ардуина — вопрос открытый.
Кроме того, на _мой_ взгляд, если использовать стандартную прошивку (с AT-командами, которая) и работать через UART получается не слишком удобная (для разработки) штуковина. Как по мне — какой-нибудь Arduino WiFi Shield работающий по SPI или ещё как будет поудобнее.dimastd
24.07.2015 16:33Спасибо.
Собственно идея и заключается в том, чтоб сделать плату в форм-факторе Ардуины, с ардуиновской IDE (програмирование для домохозяек) и при этом нет необходимости докупать изернет/wifi шилд.
…
Стандартная прошивка никуда не годится, поэтому и необходима надёжная прошивка, которая бы несла в себе сервер и могла передавать команды по УАРТу в ардуину и обратно.
…
Я это к тому, что себестоимость ардуины вырастает всего на 150р., при этом функционал растёт в геометрической прогрессии, а программирование «дивайса» остаётся на прежнем уровне (домахозяйки).
Что по этому поводу думаете Вы и другие читатели?athree Автор
24.07.2015 16:36Есть порт Arduino IDE для ESP8266, он маскирует разработку под ESP и делает её похожей на Arduino, там даже либы стандартные (для Ардуины) имеются.
Не смотрели?dimastd
24.07.2015 16:51Как раз сейчас подошёл к этому, медленно вникаю. Но дело в другом, если рассматривать это с точки зрения обывателя, то получается что — ESP сама по себе не удобна (форма-подключение, даже с учётом существующих переходников), необходимо доп. питание, возня с «доделкой» IDE, а так же нетерпимость ног к 5v.
Мне кажется эти составляющие и являются «камнями предкновения» для развития ESP. Ведь согласитесь, ESP очень хорошая, полезная и дешёвая вещь, но по прежнему не пользуется широким спросом.DanNsk
24.07.2015 18:19Какая доделка? Скачать IDE, добавить линк на внешний модуль в настройках. Подключение — 3 резистора. В конце концов можно взять плату где они уже есть и оно питается от USB и есть level конвертеры GPIO.
ignat99
24.07.2015 22:48Вот прошивка (https://github.com/OLIMEX/ESP8266/tree/master/IoT%20Firmware) с JS с примерами приложений для WEB от производителей модулей ESP8266-EVB. Кажется она большим количеством сенсоров и устройств используется.
Delsian
А имплементировать в gpio.js еще какой-то хелпер для PWM или псевдопвм — есть возможность?
Delsian
кстати, "… и набор различных вспомогательных функций." возвращает 404
athree Автор
Видимо набор не готов :)Я поправил ссылку.
athree Автор
В сишном коде ничего связанного с PWM сейчас нет (ещё). А делать его в JS — не уверен, что получится, тайминги будут плавать.
Но в планах есть добавить PWM в сишный код.