На хабре достаточно часто публикуют статьи о различных проектах на основе популярного чипа ESP8266, поэтому не буду рассказывать о нём самом.

Сразу к сути: мы разработали новую прошивку для данного устройства, предлагающую использовать для разработки язык JavаScript. Но, Smart.js это не только прошивка-интерпретатор JS, это ещё и различный «обвес» для работы с оборудованием и облачная инфраструктура.

image

За подробностями — прошу под кат.

Сразу оговорюсь, что эта статья — обзорная, в ней я постараюсь рассказать о том, что умеет 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.
И линукс.
Пользователям Linux предлагается собрать всё самим, но это просто, да и привычные они.

Кроме самого прошивальщика в архиве лежит «релизная» (т. е. Альфа) прошивка.

Подключаем ESP8266 к USB, запускаем Flash'n'chips, и видим примерно такую картинку:

image

Жмём «Load firmware» — и прошивка зальётся на устройство. В зависимости от того, какая у вас ESP, могут потребоваться дополнительные телодвижения. Я, например, использую простейшую ESP01, так что перед прошивкой мне надо подключить GPIO0 к GND.

Подключаемся терминалом. (В Flash'N'Chips есть и встроенный, мне привычнее picocom, но это не принципиально). Скорость — 115200.

Видим консоль.
Старались сделать её максимально удобной, но башу сотоварищи пока проигрываем.

В этой консоли можно сразу же набирать JS код. («smartjs NNN/MM$» — это приглашение командной строки, NNN — количество свободной памяти, MM — количество памяти потребляемое в данный момент непосредственно интерпретатором).
Выглядит как обычная консоль.

image

При нажатии 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)


  1. Delsian
    24.07.2015 14:50

    А имплементировать в gpio.js еще какой-то хелпер для PWM или псевдопвм — есть возможность?


    1. Delsian
      24.07.2015 14:54

      кстати, "… и набор различных вспомогательных функций." возвращает 404


      1. athree Автор
        24.07.2015 15:01

        Видимо набор не готов :)
        Я поправил ссылку.


    1. athree Автор
      24.07.2015 15:05
      +1

      В сишном коде ничего связанного с PWM сейчас нет (ещё). А делать его в JS — не уверен, что получится, тайминги будут плавать.
      Но в планах есть добавить PWM в сишный код.


  1. Yavanosta
    24.07.2015 14:58
    +1

    А отправлять на свой сервер данные можно?


    1. athree Автор
      24.07.2015 15:08
      +1

      Вы что имеете ввиду? Развернуть облако по образу нашего и туда данные отправлять? Тогда ответ «пока нет» (но планируется что-то такое)
      А если просто отправить HTTP запрос куда-то, то это можно. Методы для отправки HTTP GET/POSТ в наличии.


  1. jonic
    24.07.2015 14:58

    Опередили блин :) Похоже пора торопится :)


    1. jonic
      24.07.2015 15:05

      Хотя за идею движка спасибо


      1. athree Автор
        24.07.2015 15:09

        Ммм… Опередили с чём?


        1. jonic
          24.07.2015 15:16

          с первого дня как я увидел esp8266 я понял что ему нужен JS и грамотная обвязка вокруг. Хотя конечно принципиальная идея похожа, остальное у нас уже рознится (возможно) :) у меня совершенно другой идеологический подход к проектированию на ESP, можете следить за небольшим конкурентом здесь: github.com/wip-studio/esp.js. Я очень долго не мог определится с движком, есть TinyJS который тем не менее довольно таки прожорливый для esp, хоть мне и подсказали его порт под esp, я думал как сделать более требовательный к RAM движок, а v7 я как то не смог нагуглить.


  1. Indemsys
    24.07.2015 15:50

    Чем ваш движок лучше или отличается от этих:
    tessel.io
    www.espruino.com
    в контексте выполнения его на Cortex-M?

    И как отлаживать скрипты? Есть IDE с отладчиком под ваш движок?


    1. athree Автор
      24.07.2015 16:04

      Разве Tessel имеет отношение к ESP8266?
      Или вы конкретно про V7?


      1. Indemsys
        24.07.2015 16:11

        Я про V7.
        Чем этот интерпретатор отличается от других.
        Или это просто рефакторинг кого-то из тех двух?


        1. athree Автор
          24.07.2015 16:13

          Нет, он с нуля написан.

          Чем лучше? Здесь достаточно «рекламный» ответ получится.
          V7 заточен под 1) минимальный footprint 2) легкое API для встраивания.
          и footprint мы собираемся понижать по мере возможностей
          В ближайших планах — переход от AST на байткод, например.

          Ну и фатального недостатка нет, опять таки.


  1. dimastd
    24.07.2015 15:50

    Описание на русском планируется?


    1. athree Автор
      24.07.2015 16:00
      +3

      Если честно — нет…


      1. dimastd
        24.07.2015 16:12

        Жаль…


  1. raid
    24.07.2015 16:10

    Круто!

    Каковы плюсы относительно NodeMCU помимо того, что это JS?


    1. athree Автор
      24.07.2015 16:23

      Спасибо! :)

      Говорить о плюсах альфа версии сложно. Есть вещи, в которых NodeMCU сильнее.
      Но я верю, что к альфе2-бете-релизу мы с делаем smart.js лучше чисто технически (ну и идеологически).

      А сейчас… JS вместо Lua, как вы правильно заметили (для _меня_ это достоинство), облако у нас удобное (реально удобное), к прошивке можно gdb подключаться (если шмякнется), по моему консоль поудобнее, как мне кажется I2C & SPI работают постабильнее…
      Как то так.
      На самом деле, мы как раз сейчас занимаемся сбором мнений — что лучше и почему :)


      1. raid
        24.07.2015 17:16

        NodeMCU часто ругают за нехватку памяти. Основываясь на личном опыте, могу сказать, что памяти для программ в целом хватает, а вот на проблемы с ОЗУ натыкаешься достаточно быстро.
        Как у вас с этим?


        1. athree Автор
          24.07.2015 17:20

          Свободной памяти не густо, да.
          Сейчас занимаемся её увеличением.

          Но я не знаю (не сравнивал) расхода памяти NodeMCU именно при выполнении скриптов. V7 достаточно скромно себя ведёт, в этому плане.
          Поэтому — не однозначно, могу предположить что не многим лучше, но могу лишь добавить, что память — одно из приоритетных направлений сейчас.


  1. dimastd
    24.07.2015 16:10

    Может быть вопрос не совсем к месту, но всё же спрошу. Как Вы думаете, имеет ли право на существование, устройство представляющее из себя Ардуину совмещённую (на одной плате) с ESP?
    То есть, ардуина остаётся ардуиной, а ESP служит средством связи с внешним миром. Обмен данными между ними по УАРТ.

    Как-то вот так…


    1. athree Автор
      24.07.2015 16:18

      Право на существование имеет ;)
      Вопрос в том — чего вы хотите достичь.
      И какая Arduina.
      Потому что, например, по сравнению с той же Mega у ESP и памяти больше, и флеша больше и Wifi имеется. Т.е. зачем ей нужна Ардуина — вопрос открытый.
      Кроме того, на _мой_ взгляд, если использовать стандартную прошивку (с AT-командами, которая) и работать через UART получается не слишком удобная (для разработки) штуковина. Как по мне — какой-нибудь Arduino WiFi Shield работающий по SPI или ещё как будет поудобнее.


      1. dimastd
        24.07.2015 16:33

        Спасибо.
        Собственно идея и заключается в том, чтоб сделать плату в форм-факторе Ардуины, с ардуиновской IDE (програмирование для домохозяек) и при этом нет необходимости докупать изернет/wifi шилд.

        Стандартная прошивка никуда не годится, поэтому и необходима надёжная прошивка, которая бы несла в себе сервер и могла передавать команды по УАРТу в ардуину и обратно.

        Я это к тому, что себестоимость ардуины вырастает всего на 150р., при этом функционал растёт в геометрической прогрессии, а программирование «дивайса» остаётся на прежнем уровне (домахозяйки).

        Что по этому поводу думаете Вы и другие читатели?


        1. athree Автор
          24.07.2015 16:36

          Есть порт Arduino IDE для ESP8266, он маскирует разработку под ESP и делает её похожей на Arduino, там даже либы стандартные (для Ардуины) имеются.
          Не смотрели?


          1. dimastd
            24.07.2015 16:51

            Как раз сейчас подошёл к этому, медленно вникаю. Но дело в другом, если рассматривать это с точки зрения обывателя, то получается что — ESP сама по себе не удобна (форма-подключение, даже с учётом существующих переходников), необходимо доп. питание, возня с «доделкой» IDE, а так же нетерпимость ног к 5v.
            Мне кажется эти составляющие и являются «камнями предкновения» для развития ESP. Ведь согласитесь, ESP очень хорошая, полезная и дешёвая вещь, но по прежнему не пользуется широким спросом.


            1. DanNsk
              24.07.2015 18:19

              Какая доделка? Скачать IDE, добавить линк на внешний модуль в настройках. Подключение — 3 резистора. В конце концов можно взять плату где они уже есть и оно питается от USB и есть level конвертеры GPIO.


  1. ignat99
    24.07.2015 22:48

    Вот прошивка (https://github.com/OLIMEX/ESP8266/tree/master/IoT%20Firmware) с JS с примерами приложений для WEB от производителей модулей ESP8266-EVB. Кажется она большим количеством сенсоров и устройств используется.


  1. Sleuthhound
    26.07.2015 22:44

    И что только не делают, чтобы не писать на чистом Си, эээх…