本セッションの登壇者
セッション動画
よろしくお願いします。「マイコンで動くJavaScript環境をまとめてみる」というタイトルで発表します。
「IoTLT」というコミュニティの主催をしていますのびすけと申します。普段はプロトタイピング専門スクールというプロトタイピング - ものづくりや試作開発ができる人を育てるスクールをやっております。個人の活動として、国内では最大のIoTコミュニティと言われているIoTLTの主催をしていたり、LINE APIエキスパート、Microsoft MVP、IBM Championなどの認定をいただいています。勉強のために居酒屋でアルバイトしたりもしていました。
もともと僕はWebエンジニアで、WebでJavaScriptをガンガン書くような仕事を本業でやっていたんですけど、最近は教育業という形にしています。昔、Webをやっていたこともあって、IoTという文脈が出てきたときにハードウェアにも興味が出始めて、でも今もやっぱりJavaScriptで書けるとすごく嬉しくなります。
IoTの時代分け - 紀元前→古代→中世→近代→現代
これは個人的な感覚のIoT史ということで、紀元前、古代、中世、近代、現代と書いてみました。
IoTLTが行われたのは2015年初頭ぐらいで、日本で電子工作とかがはやり出したタイミングとだいたい同じくらいなのでそこを紀元前として、こんな感じで割り振りました。特筆すべき点はいろいろあるのですが、今回話すところは上のほうの開発ボード/チップで、左のほうからRaspberry PiやArduinoがあったり、当時IntelがEdisonという超小型コンピュータを出していたりとか、中世になるとESP8266というチップが出てきたりとか、これを見ている人は「あったあった」という感じだと思います。
ESP32という開発ボードが出てきてからが近代かなと思っていて、そのあたりからいろいろとスタックが変わってきています。そこに紐付くような形でマイコンボードでJavaScriptを使う流れも少しずつ出始めてきて、今日はその話をしようと思っております。ちなみにこの画像は写真を撮ってツイートしていただいて全然かまなわないですが、時系列などは僕の感覚なので、正しいものと間違っているものがあると思います。そこだけちょっと注意してください。
「JavaScriptでマイコン開発ができると嬉しいよね」という話なんですけど、やっぱりWebやソフトウェアの人からすると、「新しい言語を覚える必要がないよね」「Webの資産を活用できていいよね」という見方になると思います。ただ、これって当時のIoTLTみたいな文脈の前、つまりインターネットにつながる前の電子工作の時代だとそんなに嬉しくはなかったんです。でもIoTが話題になり、電子工作の文脈でもインターネットにつながるのが嬉しいという時代になってくると、やっぱりWebを意識しながら開発できるのはすごく有利になるので、「JavaScriptでマイコン開発ができると嬉しいよね」と変わり、いろいろな取り組みが始まっています。
古代IoT - Raspberry PiとArduinoの二強時代
古代IoT時代のJavaScript(”古代”と言ってますが今でも全然あると思います)ですが、まずはRaspberry PiとArduinoが当時の二強だったと思います。
Raspberry PiやArduinoが何かについては今回はとくにお話ししませんが、Raspberry PiってLinuxが中で動いていて、Wi-Fiが使えて、インターネットにつながるという感じなんですけど、OSのインストールが必要なのでそこが大変でした。ただやっぱりLinuxが動いているので、Node.jsのインストールをして実行し、Node.jsのライブラリでRaspberry Piの中のハードウェアのピンを扱うライブラリとかを入れて使うというのが多かったかなと思います。
一方、Arduinoはマイコンボードで、Linuxが入るわけではないので、パソコンとシリアル通信をして、ホストマシンのパソコンの方でNode.jsを動かして通信をする使い方が多かったです。Arduino言語というものがあって、これを使ってプログラムを書いてコンパイルしてマイコンボードに流し込みます。すごくシンプルなんですけども、Wi-FiもBluetoothもなかったのでIoTをやるにはけっこうつらくて、Node.jsとシリアル通信経由でつなげて何かをやりたいという流れがあったかと思います。この辺が古代IoTです。もっともやっている人は今もいると思うので、”古代”と言うと失礼かもしれません。
当時、Johnny-Fiveというライブラリがありました。今もあります(さっきから「ありました」みたいな過去の話にしていますけど、全然今もあります)。これがホストPC上のNode.jsで動作するようになっていて、VS Codeなどで手元でJavaScrpitを書けるんですけれど、Arduino側で動かすのが基本となっていて、Firmataというプロトコルを使ってシリアル通信で命令を送ります。また、Raspberry Pi上でも動くように後から設定してくれたみたいで、Raspberry Piにインストールするとボード上で動作します。Johnny-Fiveは当時、JavaScriptによる開発ボード界隈を支えていました。ただ、パソコンとシリアル通信をするということはやはりパソコンが必須になるので、なかなか流行に乗りきらなかった印象はあります。Raspberry Piに直接入れるのはさっきも言ったとおりちょっと難易度が高く、やっている人はやっているけれど、Raspberry Piに直接入れるのであれば他の選択肢もいろいろありましたから。
中世IoT - 革命的だったESP8266
中世IoT時代のJavaScriptですが、この時代にESP8266というチップが出てきました。Arduino開発ってシンプルでいい感じなんですけどLinuxが入ってるわけではないのでJavaScriptがそのまま動きません。その当時のArduinoの開発環境のマイコンボードにはWi-Fiがなかったのでネットワークにつながらない、だからIoTできない、みたいなことが多かったんです。そんなころにArduinoの開発環境で革命的なESP8266というチップが出てきて、「これはWi-Fiが載っているらしい→ならネットワーク使えるじゃん!」となりました。Raspberry Pi はWi-Fi使えるけどムズい、ArduinoはシンプルだけどWi-Fi使えないという部分を解消した感じです。チップのメモリもそこそこリッチなので、小さなファームウェアを書き込んでそこでJavaScriptを実行する取り組みもちょっとずつ生まれてきたのがこのタイミングです。
余談ですが、当時のRaspberry PiにはたしかWi-Fiがなくて、Bluetoothが途中から載ってきて、このあたりからJavaScriptでBluetoothがハックできるんじゃないか、みたいな話も出てきて、JavaScriptでWeb BluetoothやWeb USBなど、ブラウザ側に機能として付いてくるものがこのあたりから話題になってきたように思います。
この時代に出てきたのはEspruinoという開発環境です。これはJavaScriptが動く小さなインタプリタです。ESP8266やnRF系統というBluetoothなどに強いマイコンボードチップにも対応しています。公式のボードもけっこう出ていて、(下の図の)右のほうに画像をキャプチャしてありますが、あらかじめこのEspruinoのJavaScriptランタイムがインストールされた、ファームが書き込まれた状態のデバイスが売られてたりします。ただ技適というか日本の電波法の問題でなかなか日本に入ってこなかったものとか、今も海外では流行っているけれど日本には入ってきてないものが多いかなと思います。
最近では腕時計のBangle.jsというのがこの界隈で流行っていて、腕時計の中でJavaScriptが動いていてこれに向けてアプリケーションを書けます。個人的にWeb IDEでプログラムを書くことを何回か試してるのですが、なぜかいつもうまくいかないです。WebシリアルとWeb Bluetoothのどちらかを使う選択になっているのですが、そのあたりがまだ不安定な感じですね。JavaScriptの対応としては今見た感じだとES7/8だから2016、2017までは対応していそうです。Async/Awaitとかは使える、そんな絶妙な感じですね。
こちらのModdable SDKという開発環境は最近けっこう流行っている印象があって、この中世IoTみたいな時代からわりと出てたんですよね。XSというJSのオリジナルランタイムが中で動いていて、ES2021に99%対応しているとサイトに書かれていました。最新のJavaScriptを使って開発をしたい人はこれがいいんじゃないかと思います。
Macや手元のマシンなどホストPCでビルドしてファームに書き込む形なんですけど、僕はちゃんと試せていないのでそこは推測です。スタックチャン(正式名称は半角カタカナ)という右に出してるちょっとかわいい感じのロボットが去年ぐらいからものづくり界隈で流行っているんですが、これに載っているM5Stackという外装つきの開発ボード環境の中身がModdable SDKで作られています。なので、中世IoTの時代から存在しながらも、ここ1、2年でまた再加熱している印象です。
近代IoT - 時代を変えたESP32
近代IoTはESP32というボードがESP8266の後続版で生まれてきて、そこから時代が大きく変わったと個人的には思っています。さっきESP8266の何がすごかったかを説明したとき、「シンプルなArduino開発の感じでWi-Fiが使えるようになったのが良かった」と話しましたが、そこにBluetoothも付いた感じです。ここからESP32のチップをベースにした開発ボードがすごく増えたと思います。
先ほどのスタックチャンも含めてM5Stackシリーズが今すごく話題になっていて、けっこういろいろなデバイスが出ています。まったく別の会社のものなんですが、ESP32を組み込んだ開発ボードで外装まで付いてるんですよね。そこがこれまでとはちょっと違うんですよ。今までだと基板むき出しの開発ボードが多かったんですが、プラスチックの外装やディスプレイが付いた状態なので、M5Stackのままでも商品っぽいものが作れるということで、プロトタイピングで使われるようになってきました。わりとリッチなものなので、ESP32を使っているところだとJavaScriptはもちろんmPythonやmRuby、さらに最近はCircuitPythonといったチップの中で動くランタイムなど、他の言語でも取り組みが多くなっています。
この時代の余談でRaspberry PiがRaspberry Pi Zeroというシリーズが出てきて権威を示すみたいなことをやってました。少し前にRaspberry PiにもWi-FiとBluetoothが付いたのですが、さらに小型化してめちゃめちゃ安くて500円で買えるレベルのものを出してくるという。ESP32が盛り上がっていた一方で、Raspberry Pi側も対抗してこんな感じのことをやっていたのがこの時代でした。
この時代に出てきたMongoose OSというOSが当時ちょっと流行りました。これはけっこう特殊で、MOS
というコマンドを入れてファーム書き込みもするんですけど、最初からWi-Fiの設定までできてしまって、クラウド環境からOver The Air(OTA)、つまりリモートでファームウェアを更新します。IoTに特化している感じですね。最初の書き込みの時点でネットワークに一度つなげて、後はオンラインで全部やっちゃいましょうという形になっています。これがJavaScriptで書けて、mdashというこの会社がやっているクラウドもあるみたいで、そこと連携して使えます。コードは独立していて、VS CodeのプラグインもあってVS Codeでも使えて、なんか最近の開発スタイルを意識したやり方になっているなと思います。JavaScriptエンジンはこの後にお話しするElkというエンジンを使ってるみたいですが、それについては僕はあまり理解していません。
あと、忘れてはいけない存在がobnizというシリーズで、これがまたけっこう特殊です。もともとはファームを組み込んだ状態のボードを売っていたんですね。obnizボードという専用ボードとクラウド実行環境があって、今はobniz osというものをESP32系のチップにインストールして使える形にしています。そっちのほうは僕はあまり使ったことはないんですが、クラウド側で実行するというやり方がけっこう特殊です。手元のパソコンでJavaScriptを実行することもできるんですが、基本はクラウド上にあるobnizのJavaScript実行環境とWebSocketを各デバイスと接続して命令するという形です。最初のほうでお話ししたJohnny-FiveではFirmataというプロトコルでリモートで命令を出す、つまりシリアル通信で命令を出すみたいなことやっていたんですが、(obnizは)それのWeb版みたいな雰囲気がありますね。パソコンとマイコンボードをケーブルでつないでファームを書き込むという作業をすることなくできるので、電子工作初心者の人にはこれがお勧めです。
あと、僕は最近動かしてみたんですけれど**Quick JS**が話題になってる印象があります。ArduinoやPlatform IO(PIO)という開発環境でパソコンの方でビルドして、ビルドしたコードをランタイムも含めてファームウェアに書き込むスタイルになってるんですが、このQuick JS自体は別にESP32向けをうたっているわけでもなく、もともといろいろな場所で動くランタイムという形で出されています。Goのライブラリに組み込めるとか、最近だとWebAssemblyと連携するなど、すごく小さなランタイムという感じですね。
似たようなやつだとDuktapeというのがあります。これはもう本当にコードレベルで組み込むという形で、けっこう特殊な使い方ですね。
これはさっきのElkです。MJSというのもあるみたいなんですが、この辺はちゃんと調べらていないんですが、Mongoose OSのチームがやってるみたいです。
現代 - RISC-Vという新しいトレンドとRaspberry Piのマイコン進出
最近ということで、現代です。ESP32がRISC-Vという新しいアーキテクチャになってオープンな流れになってきていること、RP2040というRaspberry Pi財団が出している新しいチップや最近出てきたRaspberry Pi Picoなど、Raspberry Pi側がマイコンに進出してきていることなどがあります。本家のRaspberry Piシリーズのほうは半導体不足であんまり出てなくて、転売ヤー市場になっているのが最近です。
その中で最近、Kalumaというツールがあるんですよ。RP2040というRaspberry Pi PicoのチップでJavaScriptが動く環境になっていて、中ではJerryScriptというランタイムが動いているらしいんですけど、個人的には開発体験がけっこう良かったです。
npm経由でサードパーティのモジュールを入れたり、バンドルしてコンパイルしてビルドしてフラッシュするみたいなことができたりして、Webのフロント開発のコードをビルドしてデプロイするあたりに似ていて、おもしろいなと思ってます。まだRaspberry Pi PicoにWi-Fiがなくて、Raspberry Pi Pico Wというのはあるんですが日本だとまだ供給が全然ないので、このあたりが来れば一気に流行るんじゃないかなと思います。KalmaでESP32のビルドができたらけっこうおもしろそうですが、GitHubのISSUEで誰かが話題にしてたくらいなので、実現確度は低そうな印象です。総じて今後に期待という感じです。
まとめ
最後に「JavaScriptをどこで動かすか」でタイプ分けしてみました。ファームウェアを事前に書き込んでおいて通信するタイプと、ホストで書いてコンパイルして送り込むタイプと、obnizみたいにクラウドで実行するタイプに分かれます。
まだまだ全体的にニッチな市場ですけど、それでもわりといろいろあるというところでまとめてみました。
- 最近はやっぱりESP32かRP2040系が多いんじゃないかな
- 初心者はobnizがいいのでは
- RISC-V系というオープンソースのチップの流れがいま来ているので、開発環境はまだ整ってないけど、オープン化で安さも出てくるので、今後そこの対応によって人気が分かれるんじゃないかな
というところで、以上になります。ありがとうございました。