JavaScriptで開発できる!Mongoose OSでNefry BTをLチカしよう
唐突ですが、森田(@morita_pac)と申します。
ヘビーNefryBTユーザです。持ち歩いていろんな場所でNefry BTを利用したり、ケースを作ったりもしています。
通常Nefry BTはArduino言語でプログラムするのですが、今回はJavaScriptで書き込めるようにしたいと思います。
※この記事内のプログラムはNefy BT(無印)向けです。Nefry BT R2向けのプログラムは別途準備中です。
JavaScriptで開発できるMongoose OSとは
今回はMongoose OSというIoTのプロト開発を簡単にできるサービスを利用します。
Mongoose OSでは、ESP32やESP8266へJavaScript(mJS)でコードを書き込めます。 さらには、セキュアで、AWS IoTやGoogleのCloud IoT Coreなどとも連携設定がシンプルにできます。
Mongoose OSをインストールしている間は元のNefry BTのプログラムは利用できなくなります。(Arduino IDEで書き込むことですぐに戻せます。)
Mongoose OSの開発環境をセットアップ
Windowsの場合
Download Pageから、exeをダウンロードするだけで使えます。(アンチウイルス系のソフトが反応するかもしれません。)なお、以降MacOSでの説明になります。
Mac OSの場合
Download Pageの、MacOS/Linuxのcurlコマンドをターミナルで実行します。
$ curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash
ターミナルで以下のようになれば無事完了です。開く場合は、Runの/xxx/.mos/bin/mos
を実行するとWeb UIが開きます。
$ curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash
Downloading https://mongoose-os.com/downloads/mos-release/mac/mos ...
########################################################################
100.0%
Installing into /xxx/.mos/bin/mos ...
Adding /xxx/.mos/bin to your PATH in /xxx/.profile
SUCCESS: /xxx/.mos/bin/mos is installed.
Run '/xxx/.mos/bin/mos --help' to see all available commands.
Run '/xxx/.mos/bin/mos' without arguments to start a simplified Web UI installer.
いざ、Mongoose OSをNefry BTに入れてみよう
Nefry BTをUSBポートに差し込み、Mongose OSとサンプルコードをFlashします。(次回起動時は、ポート選択のみで利用可能です。)
Mongoose OSのWeb UIは、ブラウザで開きます。①②③の設定が完了すれば無事、JavaScriptで書き込む準備完了です。
①は、Nefry BTのポートを選択します。ポートが見つからない場合はUSBを認識させるためのドライバをインストールする必要があります。 ②では、Platformで「esp32」とapp「demo-js」を選択し「Flash」ボタンをクリックし、処理が終わるまで待ちます。 ③では、Wi-fi設定を行います。(今回は必須ではないです。) 全ての設定が完了したら、「Done」ボタンをおしてdevice setupを閉じます。
4. 基本的なWeb UIとサンプルプログラム
Web UIについて
まず、画面左側Device Filesを選択します。すると、init.jsが選択され、メインプログラムが表示されます。init.jsファイルをメインで編集します。
編集後、書き込みたい場合は、Save + Rebootボタンで行えます。このコードやファイルの情報は、端末から読んでいますので、コードを書き換えたら、書き込む前にバックアップを取っておくことをお勧めします。
サンプルプログラムについて
デフォルトプログラムを僕の感性でコメントしましたので、ご確認ください。なお、色々と制限付きのJSなので、仕様はこちらで確認ください。
// 利用するAPIを読み出します。Flashした時点のサンプルAPIが呼ばれています。
// 各APIの仕様やサンプルは画面左のファイル一覧で参照可能です。
load('api_config.js');
load('api_events.js');
load('api_gpio.js');
load('api_mqtt.js');
load('api_net.js');
load('api_sys.js');
load('api_timer.js');
// 変数宣言はletのみです。const, varは使えません。
let led = Cfg.get('pins.led');
let button = Cfg.get('pins.button');
let topic = '/devices/' + Cfg.get('device.id') + '/events';
print('LED GPIO:', led, 'button GPIO:', button);
let getInfo = function() {
return JSON.stringify({
total_ram: Sys.total_ram(),
free_ram: Sys.free_ram()
});
};
// 1秒おきにLEDをチカチカさせてます。ついでにチクタク時を刻んでいます。
GPIO.set_mode(led, GPIO.MODE_OUTPUT);
Timer.set(1000 /* 1 sec */, Timer.REPEAT, function() {
let value = GPIO.toggle(led);
print(value ? 'Tick' : 'Tock', 'uptime:', Sys.uptime(), getInfo());
}, null);
// リセットボタンではない方のボタンを押すとMQTTでpublishします。
GPIO.set_button_handler(button, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 200, function() {
let message = getInfo();
let ok = MQTT.pub(topic, message, 1);
print('Published:', ok, topic, '->', message);
}, null);
// ネットワークモニタです。
Event.addGroupHandler(Net.EVENT_GRP, function(ev, evdata, arg) {
let evs = '???';
if (ev === Net.STATUS_DISCONNECTED) {
evs = 'DISCONNECTED';
} else if (ev === Net.STATUS_CONNECTING) {
evs = 'CONNECTING';
} else if (ev === Net.STATUS_CONNECTED) {
evs = 'CONNECTED';
} else if (ev === Net.STATUS_GOT_IP) {
evs = 'GOT_IP';
}
print('== Net event:', ev, evs);
}, null);
Nefry BTのフルカラーLEDを点灯しよう
やっと本題に入ります。
Mongoose OSでは、様々なオープンソースコードがあり、それをインポートすることができます。今回は、NefryBTのフルカラーLEDを点灯させるためにNeoPixelのサンプルコードを入手します。
画面左のProjectsを選択し、Importをクリックします。
App Managerのサーチ部分に「neopixel」と入力し、HARDWAREから「example-neopixel-js」をimportします。完了したらApp Managerの画面を閉じます。 次に、サンプルプログラムをNefryBTに書き込みます。
今ImportしたAppが選択されていることを確認し、①Rebuildアイコンと②Flashアイコンを処理が完了次第、順番にクリックすることで書き込み完了です。(それぞれ少々時間がかかります。)
Device Filesのinit.jsの内容を以下の内容に書き換えます。Nefry BTのボタンを押したらフルカラーLEDが点灯するという内容のプログラムです。
※なお、R2に関しては動作確認中ですので、確認次第内容を変更いたします。
load('api_config.js');
load('api_events.js');
load('api_gpio.js');
load('api_sys.js');
load('api_timer.js');
load('api_neopixel.js');
// 今回は一部しか利用していませんが、NefryのピンNoです。
let pin = {
"nefrybt":{
"sw": 4,
"d0":22,
"d1":21,
"d2":23,
"d3":19,
"d4":18,
"a0":25,
"a1":26,
"a2":32,
"a3":33,
"a4":27,
"a5":14,
"a6":13,
"a7":35,
"LED":16
},
"nefrybtR2":{
"sw": 4,
"d0":22,
"d1":21,
"d2":23,
"d3":19,
"d4":18,
"d5":25,
"d6":26,
"d7":13,
"d8":14,
"a0":33,
"a1":32,
"a2":39,
"a3":36,
"LED":16
}
};
// フルカラーLEDのピンと個数、オーダーを指定しています。
let Lpin = pin.nefrybt.LED, numPixels = 1, colorOrder = NeoPixel.GRB;
// api_neopixel.jsに基づき初期化を行います。
let strip = NeoPixel.create(Lpin, numPixels, colorOrder);
strip.clear();
strip.setPixel(0,0,0,0);
strip.show();
// ボタンを押したら赤色をつけます。setpixel(0,0,0,0)は、ピクセルナンバーとRGBになっています。Redの数字は20としていますが、数字をあげるとかなり明るくなります。
// GPIO.set_button_handlerの仕様は、
GPIO.set_button_handler(4, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 200, function() {
strip.clear();
strip.setPixel(0,20,0,0);
strip.show();
}, null);
困った時は
Q. DeviceLogsにエラーがでている。
A. Mongoose OS画面右上のdevice setupより、ポートを選択し直してください。それでも治らない場合は、ターミナルにて、control+c
でMongoose OSを一度終わらせて、再起動をしてみてください。
それでもエラーが発生する場合は、一度Arduino IDEからNefry BTをボードに選択し、何も書いていないコードで書き込み直してください。なお、Nefry BTの状態に戻したい場合もArduino IDEから書き込むことで初期状態にもどせます。
まとめ
Nefry BTをJavaScriptでプログラムして、LEDを点灯させるところまでできました。
ディスプレイも表示させることができるので、次回は、Mongoose OSを使ったディスプレイの表示方法をご紹介しようと思います。