常田です

IoTが流行り最近IoT関連のIT勉強会に参加すると多くのWebエンジニアの方が参加されていますね。今回の利用しているマイコンボードもWebエンジニアにはお馴染みのJavaScriptで制御することが出来ます。

今回はそんなJavaScriptで利用できるマイコンボード「Tessel」を使って簡単な遠隔Lチカを実施してみたいと思います。

  • Tesselは、簡単なJavascriptで制御が出来るマイコンボードになっています。またRaspberryなどと異なりモジュールをパズルのように接続することで利用できるので簡単に取り扱えるという点でも興味深いです。

NewImage

今回実施する内容は

  • Tessel の開発環境の導入
  • MQTTブローカー (Mosquitto)の導入
  • PC端末からのメッセージ送信によるTesselのLEDの点灯(Lチカ)

を行います。

Tessel開発環境の導入

Node.jsの導入

今回は、Macbook(MacOS 10.11beta)を利用しているためBrewが上手く動くことが出来ませんでしたので Nvmから導入いていきたいと思います

$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm install v0.12.6
$ nvm use v0.12.6
$ node -v
v0.12.6

次回以降のために環境変数を読み込んでおくと便利です。

Tesselのライブラリの導入

tesselのライブラリはnpmを利用して導入します。

$ npm install -g vessel

これで導入は終わりです。

$ tessel
Tessel CLI
Usage:
   tessel list
   tessel logs
   tessel run <filename> [args...]
          run a script temporarily without writing it to flash
          -s push the specified file only (rather than associated files and modules)
   tessel push <filename> [options]
          see 'tessel push --help' for options list
   tessel erase
          erases saved usercode (JavaScript) on Tessel
   tessel repl
          interactive JavaScript shell
   tessel wifi -n <ssid> -p <pass> -s <security (wep/wpa/wpa2, wpa2 by default)>
   tessel wifi -n <ssid>
          connects to a wifi network without a password
   tessel wifi -l
          see current wifi status
   tessel stop
          stop the current script
   tessel check <file>
          dumps the tessel binary code
   tessel blink
          uploads test blinky script
   tessel update [--list]
          updates tessel to the newest released firmware. Optionally can list all builds/revert to older builds.
   tessel debug [script]
          runs through debug script and uploads logs
   tessel version [--board]
          show version of tessel cli. If --board is specified, shows version of the connected Tessel

このコマンドを利用してUSBで接続されたTesselに対してプログラムを実行したりWifiの設定を行ったりします。

$ tessel version --board
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
INFO Serial #: TM-00-04-f000da30-00554f4a-68342586
INFO Wifi Version: 1.28
INFO Firmware Commit: 5c46cb0
INFO Runtime Commit: f33115d
INFO Firmware Build: 0.1.26

Lチカ

ここではまず本体に付いているLEDを単体で点滅させてみます。

$ mkdir tessel-code
$ cd teasel-code
$ nam init -y

この中に点灯させるためのプログラム”blinky.js”を作成します。

// Import the interface to Tessel hardware
var tessel = require('tessel');

// Set the led pins as outputs with initial states
// Truthy initial state sets the pin high
// Falsy sets it low.
var led1 = tessel.led[0].output(1);
var led2 = tessel.led[1].output(0);

setInterval(function () {
    console.log("I'm blinking! (Press CTRL + C to stop)");
    // Toggle the led states
    led1.toggle();
    led2.toggle();
}, 100);

USB経由でTesselを接続させた状態で以下のコマンドを実行しましょう

$ vessel run blinky.js

光りましたでしょうか?成功していればLEDが交互に点灯している状態になります。これはtessel側のRAMにプログラムが転送されて実行されます。

Wifiの設定

今回はWifi経由で、MQTTブローカーと通信するようにするためWifiの設定を行います。TesselはWifiモジュールを内蔵しているので特に追加の機材なく利用が出来ます。

TesselのWifiはたまに不安定な動きをするので環境が変わる場合には気をつけましょう。

また、TesselのWifiは本体の電源をきっても書き込まれているので消えないので更新したい場合には-dで任意に削除する必要があります。

$ tessel wifi -d
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
Erasing saved wifi profiles
Erased wifi profiles

$ tessel wifi -n networkssd -p password
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
INFO Connecting to "networkid" with wpa2 security...
INFO Acquiring IP address.
.
INFO Connected!

IP   192.168.0.10
DNS  192.168.0.1
DHCP     192.168.0.1
Gateway  192.168.0.1

MQTTブローカー (Mosquitto)の導入

今回はSoftLayer上の一番小さい仮想サーバでMQTTブローカーのOSSである「Mosquitto」を実行して利用します。

$ slcli vs create -D iot.com ¥ 
-H mqtt-blocker ¥
-c 1 ¥
-m 1024 ¥
--billing hourly ¥
-d tok02 ¥
--disk 100 ¥
--tag "IoT" ¥
-o UBUNTU_LATEST_64

本格的にIoT環境でMQTTを利用したい場合には他の選択肢もあるのですが今回はTesselから簡単に利用したいというだけの目的なので簡単な方法で進めます。

# apt-get install mosquitto

設定は /etc/mosquitto/mosquitto.conf に格納されています。今回は簡単に利用してみたいと思うのでログを標準出力で出すようにしておきます。以下の内容を反映させて下さい

log_dest stdout
log_type debug
connection_message true
log_timestamp true

実行は service でも起動しますが今回は単純なプロセスとして起動します。

# /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

PC端末からのメッセージ送信によるTesselのLEDの点灯(Lチカ)

構成としては、MAC(パブリッシャー)としTessel(サブスクライバー)として動作させます。MAC側からメッセージを送るとTessel側のLEDが光る様にします。

MQTTライブラリの導入

最新のバージョンでは上手く動かなかったので古いバージョンのMQTT.jsを導入して利用します。

$ npm install mqtt@0.3.13

Tessel(サブスクライバー)側のプログラム

トピック「message」を購読して文字列を受信したらLEDを点灯させるようにします。

mqtt-sub-led.js として作成

var mqtt    = require('mqtt');
var tessel  = require('tessel');


client  = mqtt.connect('mqtt://mqttblocker:1883');
var led1 = tessel.led[0].output(1);
var led2 = tessel.led[1].output(0);

client.subscribe('message');
client.on('message', function(topic, message, packet) {
            console.log(topic + ": '" + message);
            led1.toggle();
            led2.toggle();
});

MAC(パブリッシャー)側のプログラム

matt-pub.jsとして作成

var mqtt    = require('mqtt');

client  = mqtt.connect('mqtt://mqttblocker:1883');

setInterval(function() {
        client.publish('message', Date.now().toString());
}, 1000);

実行

USBでTesselを接続しておき以下のコマンドを実行します。

$ tessel push mqtt-sub-led.js

クライアント側であるMAC(パブリッシャー)のコマンドを実行します。

$ node mqtt-pub.js

この段階でLEDが交互に点灯していると思います。この時のMosquitto側のログは次のようになります。

1436377877: Sending CONNACK to mqttjs_2a2c1548f840b722 (0)
1436377877: Received SUBSCRIBE from mqttjs_2a2c1548f840b722
1436377877:     message (QoS 0)
1436377877: Sending SUBACK to mqttjs_2a2c1548f840b722


1436377938: Received PINGREQ from mqttjs_2a2c1548f840b722
1436377938: Sending PINGRESP to mqttjs_2a2c1548f840b722
1436377978: Sending CONNACK to mqttjs_6d2c22bb23b19ba9 (0)
1436377979: Received PUBLISH from mqttjs_6d2c22bb23b19ba9 (d0, q0, r0, m0, 'message', ... (13 bytes))
1436377979: Sending PUBLISH to mqttjs_2a2c1548f840b722 (d0, q0, r0, m0, 'message', ... (13 bytes))
1436377980: Received PUBLISH from mqttjs_6d2c22bb23b19ba9 (d0, q0, r0, m0, 'message', ... (13 bytes))

まとめ

今回は特にセンサー等が付いていないので標準のLEDのみを点灯させましたが基本的なデバイスの動作を確認することが出来ました。1台で実施していると面白みが無いですがこれが100台のTesselがあれば同時に100個のLEDを点灯させることが出来ます。このように1対Nで通信が出来るのがMQTTの利便性となり面白いですね。
Tesselのセンサーを購入したらまた別の検証をしてみたいと思います。