/lost+found/amanoese

作られては忘れられていくコードや日常のための日記

2021年のIoT(no internet)開発について、JavaScriptで書いてマイコン用バイナリを生成できる「Moddable」でいきたいと思います

寒い季節になると何故かマイコンでなにか作りたくなりますね。
久しぶりの開発にあたり、2021年3月現在どの言語やライブラリ使うと面白いかなとか個人的な主観でまとめたものです。
ただ、仕事で組み込み開発とかやってるわけでもなくフロントエンドやサーバーサイドの開発などの経験しかないので、低レイヤは素人同然です。

開発嗜好

  • JavaScriptが好き
  • GoとRustに興味ある
  • C言語系は怖い避けたい(実装済のコードを参考程度に読むのは良いのですが…書けないので……)
  • かつてFirmataを利用したフレームワークを利用し、Raspberry Piで開発したことはあるので、ボードに直接バイナリ書き込み?できるやつが面白そう

私見なまとめ

個人的に面白いかつ良さそうなのハードウェアとフレームワークの組み合わせ?は下記3つ。

  • JavaScriptマイコンに書き込め!な「M5StackかM5StickC」で「Moddable」使う
  • JavaScriptでIoTやりたいだけなら「Raspberry Pi Zero WH(かW)」と「Johnny-Five」
  • インターネット使わないなら「Seeeduino XIAO」と「TinyGo」
フレームワーク Moddable Mongoose OS IoT.js Espruino Cyron.js Johnny-Five TinyGo Embedded Rust
言語 JS(ES2020) JS(ES2015) JS(ES2015)? JS(ES5) JS(Node.js) JS(Node.js) Go Rust
JavaScriptエンジン XS mjs JerryScript Espruino V8(※1) V8(※1) - -
サポートハードウェア ESP8266,ESP32系など ESP8266,ESP32系など 3つ? 多数 多数 多数 多数 多数

※1 Cyron.jsとJohnny-Five については、Firmataを使った通信でホストからマイコンを操作する形態なため、マイコン単体では動作出来ないことに注意

最高なのはModdable!いかすぜ!マイコンJavaScript動く時代!
インストールが少し手順多い以外は欠点らしい欠点がない!
もしかしてハードウェアシュミレータつかえばスタバでも開発出来たりする?


Moddable

JavaScriptマイコンが動かせる!すごい!
JavaScriptエンジンのXSはES2020にほぼ対応しているらしい
サポートデバイスは結構多い…M5Stack系を使うのが無難そう。Raspberry Pi Picoサポートもそのうちリリース…される?
ハードウェアシュミレーターやデバッガがついてきていたれり尽くせり…実機がなくてもある程度開発できたりするのか…?

個人的はPocoがお気に入り。
まるでHTMLのCanvasを扱ってるかのようにLCDを操作できる抽象化はWeb開発経験者の心にはささるものがある。

DOM操作の用に扱いたいもしくは良い感じにコンテンツを表示したいならPiuを使うといいぽいですが…うーんこっちは少し無理やり感あるような……それにしても複雑なコンテンツを簡単な実装で表示できるのは凄いです。

Moddable Techが開発主体らしいけど、License見る限りOSSを推進してるぽく楽しそうな雰囲気。

https://www.moddable.com/www.moddable.com

あと日本語で本書いている方がいた。すごい!

Mongoose OS

JavaScriptマイコンが動かせる!すごい!
mjsで動かすらしくES6(ES2015)は対応らしい。
AWSパートナーなので、AWSで開発が捗るとかなんとか

サポートデバイスがまだ少ないぽい。 技適的に大丈夫で日本国内で入手容易なのは「ESP32 Devkit-C」かな?
あと、mjsGPL v2なのでバイナリ配布する際は Mongoose OSの商用ライセンスを購入しない限りソースコード公開必須…なのかな?Apache 2.0とも書かれてるしわからない…

mongoose-os.com

JerryScript(IoT.js)

JerryScriptがすごそう!(よく分かってない)
組み込み向けぽいIoT.jsプロジェクトを除くとサポートデバイスが少ない。
https://github.com/jerryscript-project/iotjs

Sumsungが開発してたプロジェクトをOSSにしたぽい
https://www.infoq.com/jp/news/2015/08/iotjs-jerryscript-samsung/

開発状況みるにJerryScriptがメインのプロジェクトで、マイコン向けのIoT.jsの開発は活発じゃなさそうな……

iotjs.net

Espruino

詳しくしらべてないけど、サポートデバイスも多いし実はこれが正解なのかもしれない。。。

JavaScriptエンジンはES5相当ぽい

専用ボードのみかとおもったけど、ESP32もいけるぽい

www.espruino.com


以下は昔使っていて面白かったやつ
直接書き込める軽量なバイナリをJavaScriptで生成できなかった?時代だったのか、そういうの知らなかっただけなのか…


Cyron.js

gobotの派生プロジェクトでしょうか?
初めてRaspberry Piでセンサーとか使う開発したときに使ったしたフレームワークです。
2016年?とかだったたかJohnny-Fiveのサポートするボードやライブラリが少なかったころは、JavaScriptで開発する一番良い選択肢だった記憶です。
競合のJohnny-Fiveの勢い押されたのか2021年3月現在の開発状況は……
Aruduinoを使いたい場合は、Firmataを利用するのでJohnny-Fiveと同じく、ホストなしでの動作はできない。

cylonjs.com

Johnny-Five

対応デバイスの多さ、対応センサの多さ。
Aruduinoを使いたい場合は、Firmataを利用するのでCyron.jsと同じく、マイコン単体での動作はできない。
しかしRaspberry Piで開発するなら話は別でサポートするコンポーネントの多さから、最高の選択肢の一つになる。

johnny-five.io


以下はJavaScriptでない方々


TinyGo

曰く、Go言語でマイクロコントローラとかWasmとかで使用するためのコンパイラらしい。
サポートデバイスもたくさん。
2020年の年末にLCDとかセンサつなげて動かして楽しんだりした。
ただ、WiFiやBlootoothのサポートが微妙ぽい?
あとI2CやPWMのサポートが微妙なデバイスも多い?
通信とかしないプロダクト開発だと面白い選択肢かも

tinygo.org

Embedded Rust?

avr-rustが本家のRustに統合された?とかなんとか
awesome-embedded-rustを見るだけで楽しい。
Rustわかんないけど、書けると楽しそう。Rust勉強していつか使いたいと思ったり。


ハードウェアとか

  • Seeeduino XIAO
    Arduino互換ボードでめっちゃ安い。
    WiFiなどの通信機器が搭載されていないため、技適を気にせず適当に買える。
    通信とかがいらない開発するならコレだと思う。

  • M5StickC
    M5Stackより安い。というよりESP32系のUSB-シリアル変換IC載せたボードより安い気がする。
    Pinの数が気にならないプロダクトはこれで良いのでは?

  • M5Stack
    なにげにRaspberry zeroより高いけど、検索するとサンプルコードや書籍も多くてドキュメントに困らないイメージ。
    値段については一度M5Stackで開発してからESP32,ESP8266系のボードにコンパイルし直せば安く運用できたりすると思うので、開発用として一家に1台は持っておくのが良さそう。

  • Raspberry Pi Zero WH
    小さくて安くてGPIOピンがついたARM CPUのPC。WiFiが使える。
    お一人様1人1個までの制限がWにはあったがWHにはない…のかな。
    はんだごて持ってる人はWでも良いと思う。

感想とか

JavaScriptで組み込み開発はJavaScriptエンジン(Node.js)がボトルネックになってバイナリ生成してマイコン単体で動かすのは無理だと思ってたのに、2021年3月現在では低リソース用のJavaScriptエンジンが多数あって驚いた。

JavaScriptエンジンを調べたら思いのほか多くて驚いたり。
https://en.wikipedia.org/wiki/List_of_ECMAScript_engines

知識不足のため間違っていることも多いかと思いますで、
優しい方はコメントで教えて下さると幸いです。

TinyGoとModdableはちょっとだけ触ったよって話

実際に触ったの2つだけやんって話で、触ってない他のフレームワークのほうが良い説もある。

  • Moddable 公式のサンプルコードが「M5StickC」対応だったのか、持っていた「M5StickC Plus」のディスプレイがうまくつかなかったのでSSD1306使って遊んだ。

  • TinyGo

  • Cyron.jsは燻製器の温度制御に使った日があったな…という思い出