昨日からためしているのだけど..
くるくる回ってるだけで、ちっとも開かない..
NodeREDやその先のCloudantを見るとデータは入り続けているので
MQTTブローカ自体の機能がだめになったわけではないようだ。
で、Chromeのデバッガで調べてみたら
ja系のファイルがいくつかサイトにないらしく
開かないようだ。
つーか、日本語化しようとしたけど、デプロイ失敗しわすれたってかんじか..
で、Twitterサイトにも落ちてること連絡したけど..まだなおらない..
たのむよIBM..
にしても、全然日本人が騒がないのはなぜなんだろう..
Bluemix ChallengeとかでIoTやってる奴とかいていいはずなのに..
p.s.
AngularJSつかってるとこは、さすが先進的..
Single Page Frameworkは、いずれやらんとなあ..
そういやGWTはSingle Pageにはいるんだろうか..
p.s.
2015/06/29
朝画面見たら治っていた。
といっても日本語化する気は毛頭なく
ja→enへそのままディスパッチしているだけ..
期待した私が悪うござんした。
新機能も追加されたわけではないのになんで画面が変わったのかな
とおもっていたら、どうもBluemixのカタログに登録されたかららしい..
といってもサービス化してもibmcloud.comなのはかわらずだけど...
仕事上でわかったことのうち顧客に関わる情報が無い物、一般公開して差し障りのなさそうな事をたまーに投稿しています。 ちなみに、記事上に載せた私が書いたコードは、用途問わず再利用いただいてかまいませんが、保障は一切いたしませんので、あしからず。 ですます調の記事とである調の記事が混ざりますが..こちらも、あしからず。
Translate
2015年6月26日金曜日
2015年6月19日金曜日
Proxy環境でcfコマンドを使用する
忘備録として。
Bluemix上にボイラプレート(よく使われる複数のビルドパックのセット)からNodeRED Starterを選択せずに、単独のビルドパックNode.jsを使う場合、開発PC上にcfコマンドが必要になる。
cfコマンドは以下のサイトからダウンロードできる。
https://github.com/cloudfoundry/cli/releases
IBM ID harahara@hara2.com(パスワード:fugafuga)で登録したBluemix上(米国南部)にNode.jsをアプリID"dokidoki"で作成した場合、
以下の手順でデプロイする。
・Node.jsビルドパックでアプリID"dokidoki"としてさくせした際に表示されたcfコマンドとスタートアップのダウンロードを済ませておく。
スタートアップの圧縮ファイルは、最初にデプロイするデフォルトディレクトリに使用する。
・DOSプロンプトを起動
・cd <スタートアップ展開先> ←アプリIDディレクトリdokidoki直下へ移動する
・set http_proxy=http://proxy.harahara.com:8080/ ←proxy環境の場合のみ
・set https_proxy=http://proxy.harahara.com:8080/ ←proxy環境の場合のみ
・cf login -a -a https://api.ng.bluemix.net -u harahara@hara2.com -p fugafuga ←ヨーロッパの場合はhttps://api.eu-gb.bluemix.net
・cf dokidoki -o harahara@hara2.com -s dev ← デプロイ先を指定する
・cf push dokidoki ← フォルダ内のリソースがデプロイされる
後はローカルPC上で開発作業→cf push dokidokiの繰り返し。
最後にログアウトする場合は、cf logoutでOK。
現時点でデプロイ先がどこかを確認する場合は、cf api~を使う。
複数のIBM IDを乗り回している場合は、この確認をしないでpushして「あっ」となる可能性あり。要注意。
2015年6月9日火曜日
IBM IoT Foundation Trial版上のPublishデータをJavaScriptで取得してグラフ表示する
IBM IoT Foundation Traial版にようやくArdinoのセンサデータを常時送信できるようになったので、データを使う方を考えないと..
とりあえずいろいろ分析とかするより、まずカッコイイグラフで表示させてやろうか..
で検索の結果、"かっこいいグラフ"は書籍「インタラクティブデータビジュアライゼーション」
でも紹介されている
D3 Data-Driven Documents
http://d3js.org/
と、D3を使って水位表示によさげな
D3 Liquid Fill Gauge
http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6
を使うことにした。
D3サイトから d3.min.js を、Liquid Full Gaugeサイトからは liquidFullGauge.js をダウンロード(もしくはコピペ)してローカルへ配置する。
JSONデータをオブジェクト化する $.parseJSON() を使いたかったので、JQueryもダウンロードしてローカルへ配置した。
Paho
https://eclipse.org/paho/
の Java client and utilities からJavaScriptライブラリをダウンロードしてローカル配置した。
jQuery
https://jquery.com/
以下、作成したindex,html ファイル。ライブラリのパスは、各自の環境に合わせて変更すること。
<注意>
以下のHTMLだとAPI Key とAuth Tokenが全世界にバレバレになるので、インターネット上のHTTPサーバには決して載せないこと。
あくまで、ローカルPCからダイレクトにブラウザで実行して見るか、FW設定で1883を開けてイントラのHTTPサーバ上にのせるとかで対処のこと(inputタグで入力させる方法もある)。
<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="UTF-8">
<title>Water Level</title>
<script src="d3/d3.min.js" language="JavaScript"></script>
<script src="liquidFillGauge.js" language="JavaScript"></script>
<script src="paho/mqttws31.js" language="JavaScript"></script>
<script src="jquery/jquery-1.11.3.min.js" language="JavaScript"></script>
<style>
.liquidFillGaugeText { font-family: Helvetica; font-weight: bold; }
</style>
</head>
<body>
<svg id="fillgauge" width="19%" height="200"></svg>
<script language="JavaScript">
// MQTTブローカ(IBM IoT Foundation Trial)
var hostname = "組織ID.messaging.internetofthings.ibmcloud.com";
var port = 1883; // ポート
var client_id = "a:組織ID:water"; // a:組織ID:アプリID(自由..らしい)
var user_name = "a-組織ID-xxxxxxxx"; // API Key生成時の"Key"
var pass = "xxxxxxxxxxxxxxxxxx"; // API Key生成時の"Auth Token"
//購読トピック指定
var topic = "iot-2/type/+/id/デバイスID/evt/+/fmt/json";
// MQTTブローカクライアント
client = new Paho.MQTT.Client(hostname, port, client_id);
// コールバック時間数を定義
client.onConnectionLost = onConnectionLost; // 接続喪失時
client.onMessageArrived = onMessageArrived; // subscribe該当データが到着時
// MQTTブローカへ接続(認証あり)
client.connect({onSuccess:onConnect, userName: user_name, password: pass});
// 接続時
function onConnect() {
console.log("onConnect");
// 購読対象トピックを渡してSubscribe開始
client.subscribe(topic);
}
// 接続喪失時
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:"+responseObject.errorMessage);
}
}
// subscribe指定したトピック該当データが到着時
function onMessageArrived(message) {
console.log("onMessageArrived:"+message.payloadString);
// 水位データをメッセージから抽出
var waterLevel = Number($.parseJSON(message.payloadString).d.waterLevel);
// グラフ設定(共通)
var config = liquidFillGaugeDefaultSettings();
config.circleThickness = 0.1;
config.circleFillGap = 0.2;
config.textVertPosition = 0.8;
config.waveAnimateTime = 2000;
config.waveHeight = 0.3;
config.waveCount = 1;
config.maxValue = 171; // 満水時上限を指定する
config.displayPercent = false;
// 30以下で赤表示
if(waterLevel<=30){
config.displayPercent = false;
config.circleColor = "#FF7777";
config.textColor = "#FF4444";
config.waveTextColor = "#FFAAAA";
config.waveColor = "#FFDDDD";
}
// グラフ表示
loadLiquidFillGauge("fillgauge", waterLevel, config);
}
</script>
</body>
</html>
組織IDは、IBM IoT FoundationのTrial版を登録した際に決まる文字列。
ドキュメントだと認証ありだと8883か443とか書いてあったので、ずっとそっちを指定していてはまってしまった。1883にしたら動いた。
認証は IBM IoT Foundation コンソール上で API Key を生成して API Key と Auth Token (一度しか確認できない) をメモっておく。
関数onMessageArrived()の引数messageは、 Paho.MQTT.Message クラスオブジェクトで、Stringかバイトでしか受け取れない。ので、jQueryを使ってStringになっているJSON文字列を変換させて使用している。
Class Paho.MQTT.Message リファレンス
http://www.eclipse.org/paho/files/jsdoc/symbols/Paho.MQTT.Message.html
変数topicの"+"はワイルドカード指定をあらわす。
topicの文字列をうまく書き換えてやれば、ほしいデータをsubscribeすることができる。
実際に表示させると以下のようになる。
ぬふー...このペースじゃ全然終わらんぞ..
2015年6月4日木曜日
Bluemix上のNode-RED画面に「Error: Lost connection to server」と表示される
BluemixでIoTボイラープレートを選択して、Node-REDのフローエディタを開くと、以下のようなメッセージが表示されて、ibmiotノードなどを使ってサーバへ接続しようとしても全然つながらない..
で、よく知っている人に聞いたら、httpsではなくhttpだとこのようなメッセージがでるらしい..
再度先頭のURLをhttpsになおして通信したら、素直につながった..
..このページのリンク誤りなんでないの?
ムカ着火インフェルノ!
..すみません、使ってみただけです..
PubSubClientライブラリを使ってArduinoからIBM IoT Foundationトライアル版へセンサデータを送信する
IoTのデモなどのためにIBM IoT Foundationと接続する場合、一番手っ取り早いのがQuickStartだ。
なので、これまではQuickStartを使っていたのだけど、そろそろSaaS(?)版の本物に近い環境での接続を試しておかないと、いざ仕事になった時にこまる。
ということでMQTTブローカの先をトライアル版の環境に変更することにした。
トライアル版を使用するには、IBM IoT Foundationサイトから「Sign up」を押して、IBM Cloud Marketplaceの「Go to Market」ボタンを押し、
Internet of Things Cloud というサイトからFree Trial 「TRY NOW」ボタンを押してIBM IDを登録(すでに持っていれば既存IDで接続)する。
有料版もあるが、執筆時点でリージョン日本ではオープンになっていなかった。
登録が完了するとメールがおくられてくるのでその中のLunch Serviceリンクを踏む。
https://internetofthings.ibmcloud.com/を開いて、ログインしてもよい。
ログインすると右上のアイコンが人マークになるのでこの人型アイコンをクリックする。
するとYOUR ORGANIZATIONに1つ組織が構築されているのでこの組織名文字列リンクを踏む(この組織名は、接続先URLの先頭の文字列となる)。

Devicesタブを選択する。

Add Deviceリンクを押し、デバイス登録画面を開く。

デバイスタイプの文字列を適当に入力する。私は使用デバイスの名称(arduino)にした。
Device IDにはMACアドレス(小文字コロンなし)を入力し、Continueボタンを押す。

表示された情報を記録し、Doneボタンを押す。

表に追加したデバイスがあらわれ、すでに接続済みであれば先頭のマークが緑色になる。LastEventの+マークを押せば、接続した履歴が表示される。接続されていない場合は赤い■マークがかわりに表示されている。
Arduino側のプログラムはtokenを使った認証が必要となる。先ほとデバイス登録直後メモした情報を使用する。
PubSubClientライブラリを使ったプログラムについては、
Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する
に書いた記事を参考のこと。
PubSubClientオブジェクトの生成部分が以下のようになっている場合、
PubSubClient client(serverName, 1883, 0, c);
serverNameを「<組織名>.messaging.internetofthings.ibmcloud.com」に変更する。
次に、PubSubClientオブジェクトのconnect()を実行する箇所は、引数3つの関数に変更する。
client.connect(clientName, userName, password);
clientNameは「d:<組織名>:<デバイスタイプ>:<デバイスID(MACアドレス小文字コロンなし)>」を指定する。
userNameは、「use-token-auth」という固定文字列を指定する。
passwordは、デバイス登録直後にメモしたauth-token値を指定する。
トピック名の指定方法はQuickStartの際の記述方法と同じなので省略する。詳細は以下のサイトを参照のこと。
MQTT client connection
https://docs.internetofthings.ibmcloud.com/messaging/mqtt.html#mqtt-client-connection
2015年5月29日金曜日
Arduino YUN のファームウェアを更新する
2015/12/22追記
現在のArduino YUNのファームウェアは、以下の手順ではアップロードできない。
どうもイメージサイズが大きくなりwgetしても展開できないようになったらしい..
今現在サイトにかかれている手順では、PC上でブラウザ経由でイメージを
ダウンロードして、そのあとmicroSDへ格納、YUNの裏側にあるスロットにセット
してminiUSBケーブルをPCに接続し通電、EtherかWiFiかどっちでもいいので
YUNのIPアドレス先へsshすると、microSDが自動的に/mnt/sd1以下にマウント
されているのでsysupgradeすればよい..らしい。
実は、試してません。手持ちのYUNは全部アップデートしちゃってるので..
だめだったりしたら、ごめんなさい..
p.s.
スイッチサイエンス社の通販ならファームをアップデートしたやつが入手できるらしいです..
------
Arduino Ethernet Shield2 を手に入れた時、最新のArduino IDEを入手するために http://arduino.org/ のDownloadサイトへ入った時、YUNのファームウェア更新云々の文言があったのだけど、見て見ぬふりをしていたが、ようやく重い腰を上げて更新した。
簡単な方法を推奨していたので、もちろん簡単な手順の方で更新した。
手順は以下のとおり。
--------
- Arduino YUNを起動する(WiFiでも、EthernetでもよいがIPアドレスは確認しておく)
- PCをArduino YUNと同一のセグメントのネットワーク上に配置する
- PCからターミナル接続ソフトウェアでSSH接続する(rootのデフォルトパスワードはarduino)


以下のようにコマンドを実行する
root@Arduino:~# cd /tmp
root@Arduino:/tmp# wget http://download.linino.org/linino_distro/master/latest/openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
--2015-05-29 14:19:48-- http://download.linino.org/linino_distro/master/latest/openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
Resolving download.linino.org... 88.198.63.58
Connecting to download.linino.org|88.198.63.58|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16073654 (15M) [application/octet-stream]
Saving to: `openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin'
100%[===================================================================================================================>] 16,073,654 448K/s in 38s
2015-05-29 14:20:26 (417 KB/s) - `openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin' saved [16073654/16073654]
root@Arduino:/tmp# sysupgrade -v openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
Saving config files...
etc/uhttpd.crt
etc/uhttpd.key
etc/uhttpd.key
etc/uhttpd.crt
etc/sysctl.conf
etc/shells
etc/shadow
etc/rc.local
etc/profile
etc/passwd
etc/inittab
etc/hosts
etc/group
etc/dropbear/dropbear_rsa_host_key
etc/dropbear/dropbear_dss_host_key
etc/config/wireless
etc/config/uhttpd
etc/config/ucitrack
etc/config/ubootenv
etc/config/system
etc/config/network
etc/config/luci
etc/config/fstab
etc/config/firewall
etc/config/dropbear
etc/config/dhcp
etc/config/arduino
Sending TERM to remaining processes ... uhttpd dbus-daemon dnsmasq thd ntpd uSD aemon syslogd klogd hotplug2 ubusd netifd
Sending KILL to remaining processes ... uhttpd
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...
Writing fromto firmware ...
Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...
Writing fromto firmware ... [w]TRX header not found
Error fixing up TRX header
Upgrade completed
Rebooting system...
根気よく待つとSSH接続が切れる。切れたら、再度Arduino YUNへSSH接続し直す。
..あきらかに、更新されたかのようなアスキーアートが表示される。
..Web UIもかっこよくなってる.. ファームのくせに、生意気だ;-p
2015年5月28日木曜日
Intel Edison for Arduino上の光センサデータをIBM IoT Foundation QuickStartへ送信する
前の記事
Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する
ではArduino YUNを使ったのだけど、今回はIntel Edison Kit for Arduinoで試してみた。
ただ、DHTライブラリをつかおうとすると、ヘッダファイルに埋め込まれた"#error CPU SPEED NOT SUPPORTED"にひっかかってしまったので、以下の光センサを使った。
スイッチサイエンス:Grove - 光センサ
配線はほぼDHTの場合と同じ。オス・オスのジャンパ線で以下のように結線した。
- 光センサ側GND(黒)→Edison(Arduino)GND
- 光センサ側VCC(赤)→Edison(Arduino)5V
- 光センサ側SIG(黄)→Edison(Arduino)A0
Edisonのほうは、前に書いた記事
Intel Edison をセットアップしてLチカまで持っていく
を済ませて、PuTTYから「configure_edison --setup」を実行して初期設定をすませておいた状態のものを使った。
Edison用のArduino IDE(執筆時1.6.0)を起動して、ボードを「Intel Edison」、ポートを「Intel Edison Virtual COM Port」のCOM番号を選択しておく。ライブラリは前の記事を参考のこと。
Sketchプログラムは、以下のとおり。
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
// Intel Edison Kit for Arduino
// MAC アドレス(PuTTYでifconfigすればわかるので書き換える)
byte mac[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char macstr[] = "xxxxxxxxxxxx";
// WiFi(環境に合わせて書き換える)
char ssid[] = "XXXXX";
char pass[] = "XXXXXXX";
// クライアントオブジェクト
WiFiClient c;
// 光量センサ
// LIGHT sig ピン
#define LIGHTPIN A0
float lightLevel = 0.0;
// MQTTブローカ
// PC (mosquitto)
//byte localserver[] = {192, 168, 1, 13 };
// IBM IoTF quickstart
char servername[]="messaging.quickstart.internetofthings.ibmcloud.com";
String clientName = String("d:quickstart:arduino:") + macstr;
String topicName = String("iot-2/evt/status/fmt/json");
// MQTTクライアントオブジェクト
//PubSubClient client(localserver, 1883, 0, c);
PubSubClient client(servername, 1883, 0, c);
void setup() {
// シリアル初期化
Serial.begin(9600);
while (!Serial) {
; // 待機
}
Serial.println("Start serial");
// WiFi 初期化
WiFi.begin(ssid, pass);
Serial.println("Start wifi");
// 待機
delay(2000);
}
void loop() {
char clientStr[34];
clientName.toCharArray(clientStr,34);
char topicStr[26];
topicName.toCharArray(topicStr,26);
getData();
if (!client.connected()) {
Serial.print("Trying to connect to: ");
Serial.println(clientStr);
client.connect(clientStr);
}
if (client.connected() ) {
String json = buildJson();
char jsonStr[200];
json.toCharArray(jsonStr,200);
boolean pubresult = client.publish(topicStr,jsonStr);
Serial.print("attempt to send ");
Serial.println(jsonStr);
Serial.print("to ");
Serial.println(topicStr);
if (pubresult)
Serial.println("successfully sent");
else
Serial.println("unsuccessfully sent");
}
delay(5000);
}
String buildJson() {
String data = "{";
data+="\n";
data+= "\"d\": {";
data+="\n";
data+="\"myName\": \"Intel Edison for Arduino Light\",";
data+="\n";
data+="\"lightLevel\": ";
data+=(int)lightLevel;
data+="\n";
data+="}";
data+="\n";
data+="}";
return data;
}
void getData() {
int sensorValue = analogRead(LIGHTPIN);
lightLevel = (float) (1023-sensorValue)*10/sensorValue;
}
前の記事に書いたとおりIBM IoT FoundationのTry QuickStartからMACをアドレスを指定してしばらく待つと、グラフ表示される。
光センサの補正は、どこかの本で書いたものを使ったが、補正は必要かな。
Arduino IDEのWiFiライブラリがつかえるのがありがたい。これでWiFi接続がとっても簡単。
でも本当はmarrとかをJavaScriptで書かないとダメなことはわかっているんだけど..
しかもEdisonでpsしたら、mosquittoあがってるし..ブローカとしてEdisonを使ってあげるのが正しい?!
2015年5月27日水曜日
Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する
MQTTを試そうといろいろ調べていくうちに、ふと次のIBM社のサイトが検索に引っかかった。
簡単にいえば、Arduino UNOにEthernetシールドと温湿度一体型センサDHT11をつないでIBM IoT FoundationのQuickStart(MQTTブローカ)にデータを送信するデモを作ることができるというもの。
で..どうせこれからもIoTデモを作っていくなら、EthernetとWiFi両方付いているArduino YUNのほうがすっきりするんじゃないの?とない頭をまわし、Arduino YUNを手に入れた。
先の記事でWiFi設定したのはこのためだ。
SketchプログラムはYUNになるとEthernetライブラリ(EthernetクラスやEthernetClientクラス)は使わずにかわりにBirdgeライブラリ(BridgeクラスとYunClientクラス)に差し替えなければならない。
また、どうせセンサを入手するなら裸のセンサをダイレクトに繋がずに、Groveキットになっているものをつかえば、プルアップ抵抗も組み付けてくれているのでよいかな、しかもGroveキットにDHT22というDHT11より精度の上の製品が出ているので、こっちを使うことにした。
GROVE - デジタル温度・湿度センサPro SEN51035P
https://www.switch-science.com/catalog/819/
Arduino YUNとSEN51035Pは、赤・黒・黄のオス・オスのジャンパ線3本用意して、以下のように接続した。
SketchプログラムのほうもDHT11ライブラリではなく、製品Wiki にのっていた以下のライブラリを使用した。
書き換えたScketctプログラムは、以下のとおり。
YUNに書き込んで、シリアルコンソールを開いた後、IBM IoT FoundationのQuickStartサイトにMACアドレスを入力するとグラフが表示される。
MQTTブローカへ接続するためのライブラリだが、PubSubClientライブラリのほうがPahoライブラリより軽いので、Arduinoにはこっちのほうがよいかもしれない。
Arduinoを使ってみて気づいたが、メモリを75%以上使ったプログラムは、複数回実行しても同じ動作をしてくれないことがあり、開発者をこまらせてくれる。
回路側の合計アンペア数はこえるとピタッと止まるが、途中まで通信できていたのに途中からエラーになったりする。
メモリ潤沢なWebアプリ開発者がArduino快活すると、これまで使ったことのない筋肉を突然使って筋肉痛起こしているような感覚になる..
Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する
第 1 回 回路を組み立てて環境を構築する
http://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot1/
第 2 回 スケッチを作成して IBM IoT Foundation Quickstart に接続する
http://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot2/
簡単にいえば、Arduino UNOにEthernetシールドと温湿度一体型センサDHT11をつないでIBM IoT FoundationのQuickStart(MQTTブローカ)にデータを送信するデモを作ることができるというもの。
で..どうせこれからもIoTデモを作っていくなら、EthernetとWiFi両方付いているArduino YUNのほうがすっきりするんじゃないの?とない頭をまわし、Arduino YUNを手に入れた。
先の記事でWiFi設定したのはこのためだ。
Arduino YUNのWiFi設定を有効にする
http://fight-tsk.blogspot.jp/2015/05/arduino-yunwifi.html
SketchプログラムはYUNになるとEthernetライブラリ(EthernetクラスやEthernetClientクラス)は使わずにかわりにBirdgeライブラリ(BridgeクラスとYunClientクラス)に差し替えなければならない。
また、どうせセンサを入手するなら裸のセンサをダイレクトに繋がずに、Groveキットになっているものをつかえば、プルアップ抵抗も組み付けてくれているのでよいかな、しかもGroveキットにDHT22というDHT11より精度の上の製品が出ているので、こっちを使うことにした。
GROVE - デジタル温度・湿度センサPro SEN51035P
https://www.switch-science.com/catalog/819/
Arduino YUNとSEN51035Pは、赤・黒・黄のオス・オスのジャンパ線3本用意して、以下のように接続した。
- SEN51035P GND(黒) と Arduino YUN GND
- SEN51035P VCC(赤) と Arduino YUN 5V
- SEN51035P SIG(黄) と Arduino YUN A0
SketchプログラムのほうもDHT11ライブラリではなく、製品Wiki にのっていた以下のライブラリを使用した。
Arduino library for the DHT series temperature&humidity sensors
https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor
書き換えたScketctプログラムは、以下のとおり。
#include <SPI.h>
#include <Bridge.h>
#include <Console.h>
#include <YunClient.h>
#include <DHT.h>
#include <PubSubClient.h>
/*
* Arduino YUN
* + 温湿度センサ DH22 (SIG -> A0)
*
* IBM IoT Foundation
* https://internetofthings.ibmcloud.com/
* -> Try QuickStart
* -> MAC:b4218af800a8
*/
// Arduino YUN
// MAC アドレス(要書き換え)
byte mac[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char macstr[] = "xxxxxxxxxxxx";
// クライアントオブジェクト
YunClient c;
// 温湿度センサ
// DHT sig ピン
#define DHTPIN A0
// センサ種類
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// センサオブジェクト
DHT dht(DHTPIN, DHTTYPE);
float tempF = 0.0;
float tempC = 0.0;
float humidity = 0.0;
// MQTTブローカ
// PC (mosquitto)
//byte localserver[] = {192, 168, 1, 13 };
// IBM IoTF quickstart
char servername[]="messaging.quickstart.internetofthings.ibmcloud.com";
String clientName = String("d:quickstart:arduino:") + macstr;
String topicName = String("iot-2/evt/status/fmt/json");
// MQTTクライアントオブジェクト
//PubSubClient client(localserver, 1883, 0, c);
PubSubClient client(servername, 1883, 0, c);
void setup() {
// シリアル初期化
Serial.begin(9600);
while (!Serial) {
; // 待機
}
Serial.println("Start serial");
// センサオブジェクト初期化
dht.begin();
Serial.println("Start dht");
// Bridge 初期化
Bridge.begin();
Serial.println("Start bridge");
// 待機
delay(2000);
}
void loop() {
char clientStr[34];
clientName.toCharArray(clientStr,34);
char topicStr[26];
topicName.toCharArray(topicStr,26);
getData();
if (!client.connected()) {
Serial.print("Trying to connect to: ");
Serial.println(clientStr);
client.connect(clientStr);
}
if (client.connected() ) {
String json = buildJson();
char jsonStr[200];
json.toCharArray(jsonStr,200);
boolean pubresult = client.publish(topicStr,jsonStr);
Serial.print("attempt to send ");
Serial.println(jsonStr);
Serial.print("to ");
Serial.println(topicStr);
if (pubresult)
Serial.println("successfully sent");
else
Serial.println("unsuccessfully sent");
}
delay(5000);
}
String buildJson() {
String data = "{";
data+="\n";
data+= "\"d\": {";
data+="\n";
data+="\"myName\": \"Arduino DHT22\",";
data+="\n";
data+="\"temperature (F)\": ";
data+=(int)tempF;
data+= ",";
data+="\n";
data+="\"temperature (C)\": ";
data+=(int)tempC;
data+= ",";
data+="\n";
data+="\"humidity\": ";
data+=(int)humidity;
data+="\n";
data+="}";
data+="\n";
data+="}";
return data;
}
void getData() {
humidity = dht.readHumidity();
tempF = dht.readTemperature(true);
tempC = dht.readTemperature(false);
}
YUNに書き込んで、シリアルコンソールを開いた後、IBM IoT FoundationのQuickStartサイトにMACアドレスを入力するとグラフが表示される。
MQTTブローカへ接続するためのライブラリだが、PubSubClientライブラリのほうがPahoライブラリより軽いので、Arduinoにはこっちのほうがよいかもしれない。
Arduinoを使ってみて気づいたが、メモリを75%以上使ったプログラムは、複数回実行しても同じ動作をしてくれないことがあり、開発者をこまらせてくれる。
回路側の合計アンペア数はこえるとピタッと止まるが、途中まで通信できていたのに途中からエラーになったりする。
メモリ潤沢なWebアプリ開発者がArduino快活すると、これまで使ったことのない筋肉を突然使って筋肉痛起こしているような感覚になる..
2015年5月26日火曜日
Arduino YUNのWiFi設定を有効にする
Arduino UNOにわざわざWiFiシールド装備して苦労するなら、最初から標準装備しているマイコンボードを選べばいい..と軽い気持ちでArduino YUNに手を出してしまった。
スイッチサイエンス:Arduino YUN
https://www.switch-science.com/catalog/2210/
そしたら、がっつりはまってしまった。
Arduino YUNは、内部に2つのプロセッサを持っている。
1つはUNOと同系列のATmega32u4、こちらは本体に付いているmicro USBコネクタをケーブルで母艦PCにつないで開発できるようになっている。
で、もうひとつはLinino AR9331、こちらがWiFiやEthernet、SDカード、USBホストコネクタを管理しており、これらをATmega32u4から使用する場合、ブリッジ経由で接続することとなど。
具体的にいうとArduino IDEでSketchプログラムをかくとき、Arduino UNOにシールドを装備させてEthernetやWiFiを使う場合は、EthernetClientクラスやWiFiClientクラスを使っていたが、Arduino YUNで開発する場合はBridgeライブラリを経由して使わなくてはならない(Bridge.begin()してYunClientクラスかYunServerクラスを使って通信処理を実装する)。
購入直後のArduino YUN のWiFi設定ではどこにも接続できないので、最初に設定を変更する。変更手順は、以下のとおり。PCだけでなく有線接続も可能なWiFiルータが必要となる。
- PCをWiFiルータ(LAN側)に接続する
- 有線でWiFiルータ(LAN側)に接続する
- PC上でブラウザを起動する
- 「http://arduino.local」を開く
- パスワードに「arduino」と入力しログインする
- CONFIGUREボタンを押す
- PASSWORD欄に新パスワードを入力する
- CONFIRM PASSWORD欄に同じ新パスワードを入力する
- ここで「advanced configuration panel (luci)」を選択するとより細かい設定が可能なWeb画面が表示される。
- タイムゾーンを「Asia/Tokyo」に変更する
- DETECTED WIRERESS NETWORKS欄を変更して接続したいWiFiルータのSSIDを選択する
- PASSWORD欄にパスフレーズ文字列を入れる
- CONFIGURE & RESTARTボタンを押す
もし、失敗したら本体のUSBコネクタ横にあるリセットスイッチを長押しすれば良い。
2015年5月25日月曜日
Arduino WiFI Shieldの動作を表示させつつArduino IDEで開発する
Arduino 上にArduino WiFi Shieldをのせて、IDEで開発する際にうまく動作しなかった場合、どこで躓いているかを調べるのは意外と面倒だ。
Arduino IDE自体に本体エミュレーション機能とかがあれば便利なのだけど、執筆時点のIDEにはそんな機能は存在しない。
となるとログがわりにSerial.println()を1行ごとにかませて、どこまで動いているかを調べていくしかないのだけど、WiFi通信の場合、そもそもルータが見えているのか、SSIDが間違っているのか、パスフレーズがだめなのかなどのミスの特定はこの方法でもむづかしい。
このような場合、Arduino WiFi ShieldのファームウェアオプションだったFTDIアダプタを入手して母艦PCに別途シリアル接続させ、こっちのポートから動きをモニタすればよい。
私はスイッチサイエンス社から以下のリンク先のFTDI変換アダプタを入手した。
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
https://www.switch-science.com/catalog/1032/
このアダプタはmicroUSBメスのインタフェイスとPCを繋がないといけないので、別途ケーブルも必要となる。
接続する手順は、以下のとおり。
- アダプタに、microUSBケーブルを接続する
- microUSBケーブルをPCに接続する
- デバイスマネージャを開き、「ポート(COMとLPT)」の「USB Serial Port」のCOM番号を確認する(プロパティ>全般タブ>製造元:FTDI)
- PC上でPuTTY.exeを起動する
- 「Serial」をチェックし、「Serial line」を先ほど確認したCOM番号に、「Speed」を「57600」に変更して、「Open」ボタンを押す
- PuTTY画面でEnterキーを2度ほど押して、プロンプトを表示させる
- プロンプトで「help」と入力すると、利用可能なコマンド一覧を参照できる
- 「status」と入力すると、現時点のステータスが参照できる
- 「debug on」と実行しデバッグモードをオンにしてから、このままコンソールを開けながら、Arduino IDEでアプリを動かすと、WiFiシールドの動作を確認することができる
..Serial.println()埋め込むほうが早いよね..これだと..
COMポート複数使うので迷うし..
2015年5月21日木曜日
純正(?)のArduino WiFi Shieldのファームウェアを更新する
ArduinoでWiFiを使いたいのだけど、目的であるIoTのデモがArduino社製のWiFiシールドでの動作が前提となっており、プログラム変更が面倒だったので、おもいきって購入した。
Arduino WiFi Shield
http://www.arduino.cc/en/Main/ArduinoWiFiShield
純正なんだからIDEのライブラリも追加せずにさくっとつながるのかな..と思っていたら、なんとファームウェアの更新を先にしないとダメなことがわかった。
※先のリンクの先頭の方にかかれた文章と翻訳
The firmware for the WiFi shield has changed in Arduino IDE 1.0.4.
It is strongly recommended to install this update per these instructions
Arduino IDE 1.0.4以降、WiFiシールドのファームウェアが更新されています。
手順どおりに最新版をインストールすることを強く推奨します。
なおPCにはArduino IDE最新版がインストールされている前提とする。
以下、更新手順である。
- PC上でブラウザを起動する
- ブラウザで「http://www.atmel.com/tools/FLIP.aspx」を開く
- Windowsを使用している場合、「FLIP 3.4.7 for Windows (Java Runtime Environement included)」をダウンロードしてインストールする
- すでにWiFiシールドをArduino本体と接続しているのであればはずしておく
- PCとArduino本体を接続しているのであればはずしておく
- WiFiシールド上の唯一の繋がっていない状態のジャンパ(J3というらしい)を付属のショートプラグでショートさせる
- miniUSBケーブルでPCとWiFiシールドを接続する(Arduino本体は外しておく)
- ドライバインストールでエラーが出たら、Flipをインストールした先の「C:\Program Files (x86)\Atmel\Flip 3.4.7\usb」にあるドライバをインストールする(手順省略)
- DOSプロンプトを開き「cd C:\Program Files (x86)\Atmel\Flip 3.4.7\bin」を実行して、batchisp.exe のあるフォルダに入る
- DOSプロンプトから「batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer <Arduino IDEインストール先>\hardware\avr\firmwares\wifishield\\wifi_dnld\Release\wifi_dnld.elf program verify start reset 0」を実行する
- DOSプロンプト上に黄色い文字で「Summary: Total 11 Passed 11 Failed 0」と出て、WiFiシールド上のDATA LEDが青点灯するまで待機する
- DOSプロンプトは後でもう一度使用するので立ち上げたままにしておく
- WiFiシールドからmicroUSBケーブルをはずす
- WiFiシールド上のJ3ジャンパのショートプラグを抜いて、入手時の状態(片側だけに挿しておく)に戻す
※FTDI変換アダプタをつかってFTDI接続してシリアル接続ツールでバージョンを確認する (オプション、省略)
- WiFiシールドのジャンパ(J3)を付属のショートプラグで再度ショートさせる
- WiFiシールドとPCmini USBケーブルで接続する
- DOSプロンプトに戻り「batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer <Arduino IDEインストール先>\hardware\avr\firmwares\wifishield\\wifiHD\Release\wifiHD.elf program verify start reset 0」を実行する
- DOSプロンプト上に黄色い文字で「Summary: Total 11 Passed 11 Failed 0」と出るまで待機する
- WiFiシールドおよびPCとからmini USBケーブルをはずす
- WiFiシールド上のJ3ジャンパのショートプラグを抜いて、入手時の状態(片側だけに挿しておく)に戻す
ここまで。
上記手順は、以下のサイトを参考にした。
http://www.binarytaskforce.com/Weblog/2013/09/21/arduino-wifi-firmware-update/
FTDI変換アダプタは、あったほうが手順がうまくいってるか確認できるので、本当はやったほうがいいのだろうけど、Arduino社サイトにはかかれていないんだよなあ..
FTDI USB変換アダプタの使い方は以下の記事を参考のこと:
Arduino WiFI Shieldの動作を表示させつつArduino IDEで開発する
http://fight-tsk.blogspot.jp/2015/05/arduino-wifi-shieldarduino-ide.html
p.s.
ファームウェアを導入しないで(1.0.4より前のバージョンのママ)WiFiシールドを使おうとしたが、ルータ接続まででそれ以降のWiFiClientのconnection(domain, port)がtrue(1)にならなかった。
できるだけ、更新したほうが良さそうだ。
登録:
投稿 (Atom)
Google Colab相当の環境をローカルPC上のDocker Composeで実現する
Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...














