この記事は何?
マイコン向けJavaScript開発環境 “Moddable SDK” をESP32用としてmacOS上に構築する解説記事です。
Maddable-SDK
- Moddable SDKはピュアなJavaScript == ECMAScript でマイコンをプログラムする開発環境です。現在のところターゲットマイコンはESP8266,ESP32,(Gecko)です
- Moddable-SDKはソースコードデバッガ、シミュレータを装備しターゲットマイコン上でREPL (Read-Eval-Print Loop) をも動かせる強力な開発環境です。
- Moddable提供元のインストールガイドに沿ってModdable SDKをビルドしたとき、コンパイルエラーが発生したりpythonモジュールの不足でSDKの動作が止まることがありました。その都度ググって対策を講じて不具合なく動くようになりました。この記事はその時のメモを元にした、エラー無く一気通貫でModdable SDKの環境をセットアップする解説です。
関連記事
- macOS, Linux用のインストーラ(シェルスクリプト)を作りました。
- Moddable-SDKでESP32単体、M5StackをECMAScriptでプログラムした実験記事です。
ここから本編
JavaScript(ECMAScript)でシームレスにIoTを開発する野望
先年、Raspberry Pi からNode.jsとjohnny-fiveでESP8266とWifi通信させて簡単なIoT実験を行いました。このとき、実験システムのプログラムはRaspberry Pi側(サーバ)はNode.jsでJavaScriptを用い、ESP8266側(クライアント)はarduinoのC++を用いました。
ESP8266側でJavaScriptが使えれば2つの言語でプログラムする手間がなくなり便利になるだろうと感じました。また、Web系のフロントエンド・エンジニアがIoTシステムを作るときデバイス側のマイコンがJavaScriptでプログラミングできたら、きっとハードウェア・エンジニアの思いも及ばぬモノを作り上げるのではないかとも思ったりもしました。
…と、言うことでマイコンでJavaScript…正式にはECMAScriptが稼働するオープンソースの環境はないか探索を始めました。
JavaScriptのマイコン開発環境は色々あります。micro:bit, ESPruino, Sparcle, Tessel, obniz などがありますが、特定のマイコンボードに依存せずオープンソースかつフルスペックのECMAScriptが動くものは見つけられませんでした。
Node.js + Johnny-five を使えばホスト側(サーバ側)のJavaScriptプログラムだけでマイコンを制御できますが、マイコンが自律稼働しつつホストと連携するようなシステムは構成できません。
ポットキャスト Rebuild.fm 214回 の”Moddable”の話題
探索をしばし放置していましたが、何気に聞いたポッドキャストrebuild.fm 214回 (1:52:12) の @basuke さんのお話に釘付けになりました。マイコンで標準JavaScript === ECMAScriptが動く環境があるとのことでした。開発元は Moddable Tech. INC. で開発環境”Moddable SDK”はオープンソースで提供されているとのことです。
さっそく、Moddableのwebサイトやmoddableのgithubリポジトリを開いて見ました。何かすごそうな予感。
moddableのドキュメントを読みながらModdable SDKをビルドし動かして見ると、予想を遥かに上回る環境。ホスト上でマイコンのシュミレータが動く。ソースコード・デバッガがある。ECMAScriptの言語仕様を満足している。等々。これを使えば野望を実現できます。 図1
参考:Moddable Tech. INC.が目指しているところ
Moddableの開発者でありPrincipalのPeter HoddieがMediamに、その目指すところを書いています。
原文:Evolving IoT to put the user in control
翻訳:Evolving IoT to put the user in control(google翻訳)
1.準備
- ホストマシン
Moddable SDKを構築したホストマシンと環境構築に用いたソフトウェアは次のとおりだが、ModdableはLinuxやWindowsにも対応している。- Mac-mini macOS ver.10.14.1 Mojave
- Xcode 10.1
- Python 2.7.10
- git tool
- 実験回路
Moddable社純正ボード ESP32/moddable_zero の互換回路 図2
(同様の ESP32 + TFT 構成の M5Stack を実験回路として利用可能)- ESP32マイコンボード
“ESP32 DevKit” or 互換ボードを使用。- 秋月電子通商
ESP32-DevKitC ESP-WROOM-32開発ボード - Aliexpress
esp32 development board
- 秋月電子通商
- TFT液晶
ILI9341コントローラ搭載のSPI接続のものでタッチスクリーン付きのものを使用。- Aitendo
2.8インチ液晶モジュール(SPI)タッチスクリーン付 - Aliexpress
TFT液晶 ILI9341コントローラ タッチスクリーン付
- Aitendo
- 配線接続
- 参照ページ
Display examples using Moddable SDK の ESP32のwiring guideを参照。 - ピン接続表 / 実体配線図 図3
配線接続の注意
ESP32 DevKit C にはGNDとCMDのピンがあり基板上のピン表記の文字が小さくつぶれていてGNDとCMDはよく見ないと誤認する。
- 参照ページ
- ESP32マイコンボード
2.Moddable SDK 構築
- 拙作 Moddable SDK 簡単インストーラ(mac用、Linux用あり)を用いれば以下の操作が全自動で実行されます。
- 参照ページ
- 「ターミナル」アプリケーションを起動。図4
図4
- Moddable SDK XS環境のビルド
アップローダ、シミュレータ、デバッガなどのツール・アプリケーションをビルドします。- Projectフォルダの作成とソースパッケージのクローンを得る。
$ cd ~ $ mkdir Projects $ cd ./Projects $ git clone https://github.com/Moddable-OpenSource/moddable
- 環境変数設定
nanoエディタで動作環境設定ファイル ~/.profileを開く。$ nano ~/.profile
次の2行を追加記述し保存。nanoエディタの使い方
export MODDABLE="/Users/$USER/Projects/moddable" export PATH="$MODDABLE/build/bin/mac/release:$PATH"
- 環境変数設定を有効にするため、ここで一旦「ターミナル」を閉じて再度開く。
printenvコマンドを実行し上記2の環境変数が設定されているか否かを確認する。
~/.profileが正しく記述されているにもかかわらず環境変数が設定されない場合は、~/.profileではなく~/.bash_profileに記述する。 - ビルドツールXcodeの事前準備
XcodeをGUIアプリケーションが生成できるように設定する。$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
“Moddable SDK – Getting Started”には この操作の記述がないがxcodeがコマンドラインツールやiOSアプリ生成の動作設定になっていることがあるので確実を期すためやっておく。
- ビルド
$ cd $MODDABLE/build/makefiles/mac $ make
- デバッガ xsbug の起動確認
次のようにコマンド入力するとデバッガxsbugが開く。図5$ open $MODDABLE/build/bin/mac/release/xsbug.app
- シミュレータの起動確認
- 次のようにコマンド入力するとデバッガxsbugの表示内容が変化する。図6
これは、helloworldのコードが実行状態になりブレークポイントで実行が中断している状態。$ cd $MODDABLE/examples/helloworld $ mcconfig -d -m -p mac
- xsbugのツールバーの”▶”(実行ボタン)をクリックするとコードが実行される。
- xsgugのconsol欄に「hello, world – sample」と表示される。図7
- 同時にシミュレータ Screen Test が表示される。図8
ただし、スクリーンへの描画はプログラムされていないので何も表示されない。 - Screen Test のメニュー size からスクリーンの縦横サイズを変更することができる。図9
- 次のようにコマンド入力するとデバッガxsbugの表示内容が変化する。図6
- Projectフォルダの作成とソースパッケージのクローンを得る。
- USB-Serialドライバのインストール
ESP32 DevKit 搭載のCP210x用のドライバをインストールします。- ダウンロードとインストール
Silicon Labsのドライバ配布ページ「CP210x USB – UART ブリッジ VCP ドライバ」 からmacOS用ドライバをダウンロードし展開してインストールする。
https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers - シリアルポート生成の確認
ESP32 DevKit をUSBポートに接続して次のようにコマンド入力し /dev/cu.SLAB_USBtoUART が表示されることを確認する。$ ls /dev/cu.*
- ダウンロードとインストール
- EPS-IDF環境のセットアップ
ESP-IDFはESP32用のC/C++開発環境です。バイナリコードのビルドに用います。- esptoolのインストール
- esptoolをダウンロードして展開する。
https://github.com/igrr/esptool-ck/releases/download/0.4.12/esptool-0.4.12-osx.tar.gz - 展開生成されたesptoolフォルダをesp32と名前変更する。
- esp32フォルダをホームフォルダ(~/)配下に移動する。
- と、“Moddable SDK – Getting Started”に書かれているがesptoolにアクセスしている様子がないので、単純にホームフォルダ配下にesp32フォルダを作るだけで良い。
- esptoolをダウンロードして展開する。
- ESP32用C/C++コンパイラのインストール
- ESP32 GCC toolchainをダウンロードして展開する。
https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz - 展開生成された xtensa-esp32-elf フォルダを ~/esp32 フォルダ配下に移動する。
- ESP32 GCC toolchainをダウンロードして展開する。
- ESP-IDFのインストール
- ESP-IDF githubリポジトリのクローンを~/esp32フォルダ配下に生成する。
$ cd ~/esp32 $ git clone --recursive https://github.com/espressif/esp-idf.git
- Version 3.1 を使う設定をする。
$ cd esp-idf $ git checkout release/v3.1 $ git submodule update
- 環境変数設定
次の行を~/.profile に追加記述する。export IDF_PATH="/Users/$USER/esp32/esp-idf"
- 環境変数設定を有効にするため「ターミナル」を閉じて再度開く。
- Pythonパッケージマネージャ pip をインストールする。
$ cd ~/esp32 $ sudo easy_install pip
- ESP-IDFで用いるpythonパッケージをインストールする。
$ python -m pip install --user -r $IDF_PATH/docs/requirements.txt $ sudo pip install esptool
“Moddable SDK – Getting Started”にはesptoolのインストールは書かれていないがプログラムアップロード時に「esptool.pyが無い」とエラーが出たのでここでインストールしておく。
- 環境変数設定
次の行を~/.profile に追加記述する。export PATH=$PATH:$HOME/esp32/xtensa-esp32-elf/bin export UPLOAD_PORT=/dev/cu.SLAB_USBtoUART
- 環境変数設定を有効にするため「ターミナル」を閉じて再度開く。
- 【蛇足】ESP-IDFを単独で使ってC/C++でESP32をプログラミングできる –> ESP-IDF programming guide
- ESP-IDF githubリポジトリのクローンを~/esp32フォルダ配下に生成する。
- esptoolのインストール
3.動作テスト
- bars
- barsフォルダに移動。xsbugを起動
$ cd $MODDABLE/examples/piu/bars/ $ open $MODDABLE/build/bin/mac/release/xsbug.app
xsbug.appのエイリアスを生成しアプリケーションフォルダに格納してマウスクリックでxsbugを起動する方法でも可。
- シュミレータにアップロードし実行
$ mcconfig -d -m -p mac
ScreenTestが開きModdable SDK開発メンバーのバーコードと写真がスクロール表示される。図10
- ブレークポイント
- エディタでbarsフォルダ配下のmain.jsを開く
- 14行目にdebugger;を追加記述しファイル保存する。
*/ debugger; import {} from "piu/MC";
- シュミレータで実行すると、ブレークポイント(debugger;と記述した行)でプログラムの実行が一時停止する。
Screen Testが表示されているときは表示がフリーズする。
Screen Testが表示されていないときは何も起こらない。 - xsbugツールバーの”▶”(実行ボタン)をクリックするとプログラムが実行され
Screen Testへの描画が行われる。 - debugger;行をコメントアウトしてファイル保存する。(ブレークポイントの解除)
*/ // debugger; import {} from "piu/MC";
- マイコンボードにアップロードし実行
- 実験回路のESP32 DevKit CをUSBポートに接続する。
- アップロード/実行
$ mcconfig -d -m -p esp32/moddable_zero ;# M5Stackを用いる場合は esp32/m5stack とする
実験回路のTFT液晶に写真などがスクロール表示される。図11
アップロードエラーとなる場合は、再度mcconfigコマンドを投入する。それでもダメな場合は基板のボタン操作でプログラミングモードに遷移させたり、USBコネクタを抜き差しした後mcconfigコマンドを投入する。
- barsフォルダに移動。xsbugを起動
4.ビルドエラー対策
- ~/Project/moddable/ や ~/esp32 フォルダ配下に正しくファイル群をダウンロードしているか確かめる。
- 環境変数が正しく設定されているか確かめる。
- mcconfig実行時に ImportError: No module named ……… が表示されたときはSDKに必要なPythonモジュールがインストールされていないので手動でインストールする。
$ sudo pip install esptool $ sudo pip install future $ sudo pip install pyserial $ sudo pip install cryptography
5.mcconfig のパラメータ
mcconfig [manifest] [-d] [-f format] [-i] [-m] [-o directory] [-p platform] [-r rotation] [-v] \
[ssid="wifi_ssid"] [password="wifi_password"] [screen=screen_driver] [touch=touch_driver]
manifest
: the manifest file. Defaults to themanifest.json
file in the current directory or in the parent directory of the current directory.-d
: to build a debug instrumented version.-f format
: to select the screen pixel format:gray16
,gray256
,rgb332
,rgb565be
orrgb565le
. Defaults torgb565le
. See png2bmp here under.-i
: to build a release instrumented version.-m
: to run make automatically, otherwise mcconfig just generates the make file.-o directory
: the output directory. Defaults to the$MODDABLE/build
directory.-p platform
: to select the platform:esp
,esp32
,win
,lin
,mac
,gecko/mighty
,gecko/giant
,gecko/blue
orgecko/thunderboard2
. Defaults to the host build platform:mac
,win
orlin
.-r rotation
: to select the screen rotation:0
,90
,180
or270
. Defaults to0
. See png2bmp here under.-v
: to trace all commands executed by makessid="wifi ssid"
andpassword="wifi password"
: to specify network credentials and connect to the network before launching the app.screen=screen_driver
andtouch=touch_driver
: to specify a screen or touch driver. See the examples readme for more information on screen and touch driver configuration.- $ mcconfig -d -m -p mac
-d:デバッグ機能付きで -m:自動的にアップロード・パッケージを作る -p mac:アップロード先はmacのシミュレータ $ mcconfig -d -m -p ESP32/moddable_zero -p ESP32/moddable_zero:アップロード先は ESP32/moddable_zero ボード $ mcconfig -d -m -p ESP32/moddable_zero -r 90 -r 90: TFT-LCDの描画を90度回転 $ mcconfig -m -p ESP32/moddable_zero デバック機能無しでビルドしアップロードする。 アップロードが終了するとmcconfigはシリアル・コンソール・モードに遷移する。 コンソール・モード解除は CTRL+]
5.参考ビデオ
6.M5Stackをターゲットにする。
-
- ここまでのModdable SDKの設定ではホストにESP32 DevKit などを複数接続しても1個しか識別しませんのでM5StackだけをUSBボートに接続します。また、M5StackのUSB-SerialはESP32 DevKitと同じCP210xチップを用いているのでデバイスドライバのインストールは不要です。
- Moddable SDK はM5Stackのデバイス定義ファイル(ESP32とTFTなどの外部デバイスとの接続情報を記述したファイル)を標準でもっておりターゲットデバイスにesp32/m5stackを指定すればM5Stackのアップロードモジュールのビルドが行われます。
- 下はサンプルプログラムbarsがM5Stackで動いている様子です。
- M5StackでLチカをやってみました。
ー 来歴 ー
2018.12.19 kimio kosaka macOS, Linux 全自動簡単インストーラを作成 githubにて公開 2018.12.13 kimio kosaka ubuntu-Linux用インストール・シェルスクリプトを追加 2018.12.12 kimio kosaka macOS用インストール・シェルスクリプトを追加 2018.12.07 kimio kosaka M5Stackに関する情報を追加 2018.12.05 kimio kosaka 導入解説記事をアップロード 2018.12.04 kimio kosaka 導入解説記事の制作と実証テスト 2018.12.01 kimio kosaka Middable SDK 環境構築開始 手順不具合記録 2018.11.30 kimio kosaka Moddable SDKの存在を知る 記事の引用についてはこちらをご覧ください