arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.02.08

JavaScriptで開発できる!Mongoose OSでNefry BTをLチカしよう

森田

Nefry BT
    このエントリーをはてなブックマークに追加  

唐突ですが、森田(@morita_pac)と申します。

ヘビーNefryBTユーザです。持ち歩いていろんな場所でNefry BTを利用したり、ケースを作ったりもしています。

通常Nefry BTはArduino言語でプログラムするのですが、今回はJavaScriptで書き込めるようにしたいと思います。

※この記事内のプログラムはNefy BT(無印)向けです。Nefry BT R2向けのプログラムは別途準備中です。

JavaScriptで開発できるMongoose OSとは

今回はMongoose OSというIoTのプロト開発を簡単にできるサービスを利用します。

▲ Mongoose OS公式サイト

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を使ったディスプレイの表示方法をご紹介しようと思います。

    このエントリーをはてなブックマークに追加