SparkでMQTT

よくIoTでMQTTとかってあるけど、実際にどんな感じで使うのか?という事で…自分がよくやる環境について書いておく。

– 環境
サーバ : Ubuntu 14.10
端末 : Spark

– SparkのLEDをMQTTでチカチカさせてみよう

まず最初にSparkのLEDを光らせる。
1. mosquittoをUbuntuにインストール
サーバにMQTTサーバであるmosquittoをサクっとインストール。

apt-get install mosquitto mosquitto-clients

2. SparkでMQTTを使う
まずはMQTTのライブラリを探す。ライブラリのタグからMQTTと入力すると出て来る。
pic1

ライブラリの”MQTTTEST.INO”を選択して”USE THIS EXAMPLE”をクリック。そして、以下の”server_name”の所にさっき立てたMQTTサーバのIPかドメインを設定する。

# MQTT client("server_name", 1883, callback);
# IPの場合
byte server[] = { 157,XXX,XXX,XXX };
MQTT client(server, 1883, callback);

# ドメインの場合
MQTT client("www.hogehoge.com", 1883, callback);

3. LEDを光らせてみる
サーバ上でコマンドを実行すると、SparkのLEDが変わる。

mosquitto_pub -h localhost -t inTopic -m RED
mosquitto_pub -h localhost -t inTopic -m BLUE
mosquitto_pub -h localhost -t inTopic -m GREEN
mosquitto_pub -h localhost -t inTopic -m OTHER

Spark側でSubscribeしている”inTopic”に向けてメッセージを投げている。サーバ側でoutTopicを見ていると起動時に”hello world”が流れてくると思われ。

– もちょっと面白く使いたい
JavaScriptからWebSocketでMQTTを直撃で叩きたいという気持ちになると思われ。まぁ、これもサクっと簡単に出来る。よくあるlighttpd+mod_websocketでサクットやる。

1. mod_websocketを動かす
とりあえずサクっと動かすって事で、lighttpd+mod_websocketをシングルで動かす。

apt-get install gcc make libpcre3-dev zlib1g-dev libbz2-dev automake libtool openssl libssl-dev unzip g++ libev-dev libev4 pkg-config
git clone git://github.com/nori0428/mod_websocket.git
cd mod_websocket/
./bootstrap
sh ./makesample.sh
cd sample
./sbin/lighttpd -f ./etc/lighttpd.conf

2. Webサーバ上でPahoを動かす
PahoはEcilpseで提供されているMQTTのライブラリでJSの他にも色々あったりする。最初に使ってみる物としては多いと思われ。

wget http://ftp.pgpi.org/pub/eclipse/paho/1.0/paho.javascript-1.0.1.zip
unzip paho.javascript-1.0.1.zip
cd paho.javascript-1.0.1/

# 以下のHTMLをindex.htmlとか適当に追加
# Paho.MQTT.Clientの所でIPを自分のサーバに向ける
<html>
<head>
<script type="text/javascript" src="mqttws31.js"></script>
<script type="text/javascript">
var client;
var form = document.getElementById("tutorial");
function doConnect() {
    client = new Paho.MQTT.Client("IP Address", 8080, "ClientId");
    client.onConnect = onConnect;
    client.onMessageArrived = onMessageArrived;
    client.onConnectionLost = onConnectionLost;
    client.connect({onSuccess:onConnect});
}

function doSubscribe()
    client.subscribe("/outTopic");
}

function doSend() {
    ledcolor = ["RED", "BLUE", "GREEN"];
    message = new Paho.MQTT.Message(ledcolor[Math.floor(Math.random() * 3)]);
    message.destinationName = "/inTopic";
    client.send(message);
}

function doDisconnect() {
    client.disconnect();
}

function onConnect() {
    var form = document.getElementById("example");
    form.connected.checked= true;
}

function onConnectionLost(responseObject) {
    var form = document.getElementById("example");
    form.connected.checked= false;
    if (responseObject.errorCode !== 0)
    alert(client.clientId+"\n"+responseObject.errorCode);
}

function onMessageArrived(message) {
    var form = document.getElementById("example");
    form.receiveMsg.value = message.payloadString;
}

</script>
</head>
<body>
<h1>MQTT Messaging.</h1>
<form id="example">
<fieldset>
<legend id="Connect" > Connect </legend>
Make a connection to the MQTT
<br>
<input type="button" value="Connect" onClick="doConnect(this.form)" name="Connect"/>
<input type="checkbox" name="connected" disabled="disabled"/>
</fieldset>

<fieldset>
<legend id="Subscribe" > Subscribe </legend>
Make a subscription to topic "/outTopic".
<br> <input type="button" value="Subscribe" onClick="doSubscribe(this.form)"/>
</fieldset>

<fieldset>
<legend id="Send" > Send </legend>
LED show/down.
<br>
<input type="button" value="Send" onClick="doSend(this.form)"/>
</fieldset>

<fieldset>
<legend id="Receive" > Receive </legend>
Publish touch value.
<textarea name="receiveMsg" rows="1" cols="40" disabled="disabled"></textarea>
</fieldset>

<fieldset>
<legend id="Disconnect" > Disconnect </legend>
Now disconnect this client from the server.
<br> <input type="button" value="Disconnect" onClick="doDisconnect()"/>
</fieldset>
</form>
</body>
</html>

んでページを見てみるとこんな感じに。Connectして接続してMQTTのPub/SubがJS経由でサクっと出来る。

Arduinoで使うモータドライバ

よくArduinoでモータードライバといったら、東芝のTA7291Pあたりを買って…というケースが多いけれど、ふとROHMのBD6211F-E2イケんぢゃね?と思って使ってみたら…イケてるよ、これBD6211F-E2。

– TA7291PとBD6211F-E2の比較
まずは写真で見るとこんな感じ。一番左がTA7291P、真ん中がBD6211F-E2をSOP8にハンダしたもの、一番右がBD6211F-E2を実装したスイッチサイエンスさんのもの

まず思うのがサイズの小ささ。小さくていい感じ。そして何より安い。秋月さん価格で。
– TA7291P 300円/2個
– BD6211F-E2 100円/個
SOP8は9枚入りで100円だから、はんだ付けの手間くらいで、BD6211F-E2の方が良い。そして、TA7291PはVCC:4.5V-20Vなのに対して、BD6211F-E2:3.0V-5.5V。この3.0Vというのが自分的にはとっても魅力的。はんだの手間が面倒なら、スイッチサイエンスさん所からゲットしても良いと思う。

安い、小さい、3.0Vからという良いことづくめで使ってみることに。

回路や設定はこちら、BD62xxFモータードライバ(スイッチサイエンスさんのページから。)

よく利用されるDCモータのFA-130をつなげた感じはこんな感じ。

めっちゃ良い。良い。とっても良い。

スイッチサイエンスさんのを使うとこんな感じ。(BD6211F-E2のVREFがVCCに出荷時に接続されてあるから、もっと便利に)

良い。めっちゃ良い。これ好き。

小さいのは良い。何か実装しやすいし、めっちゃ良い。

ソレノイドを使う

モーターやサーボ、ステッピングモータに比べるとあまり情報がアップされていないソレノイド。大抵、12Vあたりで使われる事もあるみたいで、あまり使用頻度が高く無いのかも。

ちょっと使ってみようと思い、安い5Vで動くSparkfunのソレノイドをゲットした。

Solenoid – 5v (small)この子だけど千石さんでもゲットできる。

正式な型番はZHO-0420L/Sでゲットしたのはプッシュタイプ。戻りバネも付いているからサクっと簡単に使える。5Vな仕様だけど、19Vくらいまで流せるみたい。パワーが欲しい時は大きめで流しても良いかも。

んで、接続するとこんな感じ。

NPNトランジスタ(2SC3964), ソレノイドが戻る時に発生する電流制御用のダイオード(1N5818)を使って、5V電源はArduinoから利用する。コードはこんな感じ。

void setup(){
  pinMode(3, OUTPUT);
}

void loop(){
  digitalWrite(3, LOW);
  delay(1000);
  digitalWrite(3, HIGH);
  delay(100);
}

ちょっとコードは違うけど、こんな感じの動き。リズムを作れたりする。