コサカ キミオです。
@kimio_kosaka
https://make.kosakalab.com/
技術教育を専門としています。
ハードウエアやプログラミング実習環境の構築とそれを用いた実習教程/教科書の制作を得意とします。
ハードウェア系の電子本なども出しています。
本日は、「マイコンをJvaScript/ECMAScriptで動かすModdable SDK はイイぞ」という お話をします。
![moddable-sdk.003.png](https://qiita-image-store.s3.amazonaws.com/0/144875/954611f9-1130-a83b-6cbf-550d6708e8aa.png) Moddaable-SDKとは、 マイコンをJavaScript/ECMAScriptでプログラムするクロス開発環境です。 米国ベンチャー [moddable tech. inc](http://www.moddable.com/)が開発し、 オープンソース[Moddable-OpenSource/moddable](https://github.com/Moddable-OpenSource/moddable)で提供されています。
![moddable-sdk.004.png](https://qiita-image-store.s3.amazonaws.com/0/144875/89f66770-7211-de0e-4494-499874a95df0.png) マイコンをjavascriptで動かすのなら[nodeとjohnny-five](http://johnny-five.io/)があります。 過去にnodeとj5を使って図のような[twitterと連携する電光表示板](https://make.kosakalab.com/web-archives/j5_esp8266_iot/)を作ろうとしました。 しかし、うまく行きませんでした。
![moddable-sdk.005.png](https://qiita-image-store.s3.amazonaws.com/0/144875/ebd28913-35a1-6390-d295-8c4ee9d989fa.png) その原因は、nodeとJ5は、通信オーバヘッドが大きく制御が間に合わなかったのです。 また、サーバとマイコンをwifiリンクさせたが、j5を使うと、マイコンが自立して動いていないのでWifiが切れたときは再接続できず手も足も出せない事態となりました。 wifiを使うとき自動再接続できないモノは実用に耐えません。 結局、サーバーはnodeで マイコンはC++でプログラムを書いてサービスを完成させました。
![moddable-sdk.006.png](https://qiita-image-store.s3.amazonaws.com/0/144875/c28011f7-1680-be3d-b776-ac6355b16859.png) 2つの言語間を行き来してプログラムを書くのはかなり面倒でした。
![moddable-sdk.007.png](https://qiita-image-store.s3.amazonaws.com/0/144875/6894e6d6-2fc4-0e89-d953-73ceddbb1543.png) nodeとJ5のようにJavaScriptでマイコン用のプログラムが書けて、かつ、マイコンが自立して動く環境がないか探していました。
![moddable-sdk.008.png](https://qiita-image-store.s3.amazonaws.com/0/144875/1cdbe267-afcb-b01e-1510-9aa15d4e2633.png) たまたま聞いていたポッドキャスト「[rebuild.fm 214回](http://rebuild.fm/214/#t=1:52:12)」でJavaScriptでプログラムが書けてマイコンを自律して動かせる環境moddableの話題がありました。 速攻、moddableにトライしてみました。 ECMAScriptの言語仕様をほぼ完全に満足していてevalなども標準で実装されています。 Moddable techはエンジニア7人ほどの小さなベンチャーですが、ECMAScript標準化団体[TC39のメンバー](https://www.ecma-international.org/memento/spc.htm)を出したり[TC53のチェア](https://www.ecma-international.org/memento/tc53.htm)を担当していて標準化に意欲的です。
Lチカプログラム
Blink.js
import Timer from 'timer' // タイマーモジュールを使う
import Digital from 'pins/digital' // デジタルピン制御のモジュールを使う
let led = 5 // IO5(入出力ピン5番)を指す値を変数ledに代入
let sts = true // 変数stsはLEDのON-OFF状態を格納。false:OFF, true:ON
// Blink LED
Timer.repeat(() => { // repeatメソッドで{}範囲を無限ループ
Digital.write(led, sts) // ledが指すピンをstsの状態にする
sts = !sts // stsの論理を反転する。(not処理)
}, 1000) // ループ1回毎に1000ミリ秒待つ
![moddable-sdk.009.png](https://qiita-image-store.s3.amazonaws.com/0/144875/dafa5ed3-7c94-9609-c34f-adf4546aa30d.png) このSDKは特定の製品に依存しません。対象とするマイコンが搭載されていて、その製品のハードウェア仕様がわかれば、デバイス・コンフィグを書いて開発対象にすることができます。
![moddable-sdk.010.png](https://qiita-image-store.s3.amazonaws.com/0/144875/1e12ceff-673e-6541-0e5c-d3e53fb24e97.png) Moddable SDKはソースコードデバッガを持っています。 パソコンのデバッガからボタンクリックでマイコン上のプログラムの実行制御ができます ステップ実行もできるので、変数の値の変化や条件分岐の様子などを見ることができます。
![moddable-sdk.011.png](https://qiita-image-store.s3.amazonaws.com/0/144875/53250e18-934d-b764-932f-3dfe7425e39e.png) 残念なところは - インストールがかなり面倒くさいです。ツール群をかき集めきてソースコードからビルドします。1990年代のフリーソフトのインストールを彷彿とします。 - 自前で[インストールスクリプト](https://github.com/kimio-kosaka/Moddable_fun/tree/master/Installer)を書きました。これで、だいぶインストールが楽になりました - 統合開発環境のようなヤワなものはありません。ターミナル・シェルからコマンド叩いて使います。 - ターゲットマイコンは現在ESP32などのESPシリーズにしか対応していません。ARMに対応させようとしているのが伺えるので今後に期待です。 - サンプルが沢山付属していますが解説がありません。ただし、装備されているモジュールなどのドキュメントは充実しているのでソースコードをじっくり読めば何をやっているかは把握できます。
![moddable-sdk.012.png](https://qiita-image-store.s3.amazonaws.com/0/144875/4b32c89f-8777-1534-ca42-548f613b3cc9.png) 一通りさわって,IoTの基本であるwebSocketでのデータ交換をやって見ました。ついでにwifiとソケットリンクの自動リカバリ機能も付けました。 Qiitaにその様子を備忘としてアップました。Qiitaでmoddableを検索すると出てきます。
![moddable-sdk.013.png](https://qiita-image-store.s3.amazonaws.com/0/144875/35991f22-3062-995a-b737-7fd23b7ef740.png) [長いタイトルの記事がそれ](https://qiita.com/kimio_kosaka/items/3102911f4d09b16583b3)です。自前インストーラへのリンクもここにあります。Moddableに興味のある方はぜひご覧ください。 以上で発表を終わります。