Translate

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 from to firmware ...    
 Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...
 Writing from to 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 と 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シールドを使おうとしたが、ルータ接続まででそれ以降のWiFiClientconnection(domain, port)true(1)にならなかった。
できるだけ、更新したほうが良さそうだ。

2015年5月15日金曜日

Windows7 PC(Arduino母艦)上にテスト用MQTTブローカ(Mosquitto)をインストールする

ArduinoでMQTTを扱うシステムを作成する際に、MQTTブローカが必要となるわけですが、いきなりサーバを用意して..はムリなのでローカルで動作するブローカが必要になる。

しらべてみると、MosquittoというOSSが見つかった。どうもArduinoを接続したPC上で動作するBSDライセンスのテスト用のMQTTブローカのようだ。

なので、ためしにArduino母艦にしているWindows7 PCへインストールしてみた。

以下、その際のセットアップ手順です。

1. Mosquittoのセットアップ


Windows7 PC上のブラウザを起動する。

1.1 Visual C++ 2008 再配布パッケージ


Microsoft Visual C++ 2008 再配布パッケージがPCにインストールされていない場合は、次の手順を実施する。


  • ライセンス内容を確認し、同意する場合はチェックをつけて「インストール」ボタンを押す。

  • 「完了」ボタンを押す。

1.2 OpenSSL(libeay32.dll、ssleay32.dll)


Mosquittoは、内部でlibeay32.dllおよびssleay32.dllを使用している。エクスプローラから検索してこれらのファイルが存在する場合は、環境変数PATHが通るかどうか確認し、通っていなければPATHを編集する。

もし、PC上にいずれかでも存在しない場合は、以下の手順を実行する。

  • ブラウザからhttp://slproweb.com/products/Win32OpenSSL.htmlを開く。
  • 「Download Win32 OpenSSL」の「Win32 OpenSSL」最新バージョンリンクを選択する(執筆時は1.0.2a)。
  • 「Win32OpenSSL-<バージョン番号>.exe」を実行する。
  • 「実行」ボタンを押す。

  • 「OK」ボタンを押す。

  • 「Next>」ボタンを押す。

  • ライセンス条項を熟読し、同意してもよい場合は「I accept the agreement」をチェックして「Next>」ボタンを押す。

  • 「Next>」ボタンを押す。

  • 「Next>」ボタンを押す。

  • 「The Windows system directory」をチェックして「Next>」ボタンを押す。


  • 「Install」ボタンを押す。




  • 寄付金を入金しない場合は、すべてチェックを外して「Finish」ボタンを押す。

1.3 pthreads(pthreadVC2.dll)


OpenSSLと同様に、Mosquittoは、内部でpthreadVC2.dllも使用している。エクスプローラから検索してこれらのファイルが存在する場合は、環境変数PATHが通るかどうか確認し、通っていなければPATHを編集する。

もし、PC上にpthreadVC2.dllが存在しない場合は、以下の手順を実行する。

  • ブラウザからhttp://slproweb.com/products/Win32OpenSSL.htmlを開く。
  • pthreads-w32-x-x-x-release.zip」最新バージョンリンクを選択する(執筆時は2.9.1)。
  • ダウンロードした圧縮ファイルを展開、PC上の適当なフォルダに置く。
  • pthreadVC2.dllの格納されているディレクトリのパスをメモする。
  • コントロールパネル>システム>システムの詳細設定を選択する。
  • 「環境変数(N)...」ボタンを押す。
  • 「はい」ボタンを押す。
  • 「環境変数(N)..」ボタンを押す。
  • 環境変数PATHを選択し、「編集」ボタンを押す。
  • 変数値(V)の文字列右端に、半角セミコロン、先ほどメモしたパスを入力し、「OK」ボタンを押す。
  • 「OK」ボタンを押す。
  • 「OK」ボタンを押す。


1.4.  Mosquitto本体



  • ブラウザから、http://mosquitto.org/を開く。
  • 画面右にある「Download」リンクを選択する。
  • 「Binary Installation」>「Windows」の「mosquitto-x.x.x-install-win32.exe」最新バージョンのリンクを選択する(執筆時点では1.4.2)。
  • ダウンロードしたファイルを実行する。
  • 「Next>」ボタンを押す。

  • 「Next>」ボタンを押す。

  • 「Next>」ボタンを押す。

  • 「Install」ボタンを押す。

  • 「Finish」ボタンを押す。

  • エクスプローラで「mosquitto.exe」を検索し、パスをメモする。
  • コントロールパネル>システム>システムの詳細設定を選択する。
  • 「環境変数(N)...」ボタンを押す。
  • 「はい」ボタンを押す。
  • 「環境変数(N)..」ボタンを押す。
  • 環境変数PATHを選択し、「編集」ボタンを押す。
  •  変数値(V)の文字列右端に、半角セミコロン、先ほどメモしたパスを入力し、「OK」ボタンを押す。
  • 「OK」ボタンを押す。
  • 「OK」ボタンを押す。


2.  Mosquittoの起動

  • Windows上でDOSプロンプトを起動する。
  • mosquitto -v」を実行する。

 

3. Mosquittoの停止

  • DOSプロンプト上でCtrl+Cを押す。

ちなみに執筆段階ではDocker Hub上にはMosquitto公式イメージは登録されていなかった。が、非公式ならいくつか上がっているので、こちらを試してもりのもよいとおもう(以下は一例、試してません)。

ansi/mosquitto
https://registry.hub.docker.com/u/ansi/mosquitto/

2015年5月14日木曜日

Arduino UNOにWiFiシールド(WLS06201P)をつないで動作確認する



Arduino UNOにつないだセンサ情報をネットワーク経由で結果を取得するには、WiFi接続しないとなあ..とおもい、以下のWiFiシールドをあまり考えずにAmazonでポチった。

Seeed Wiki:WLS06201P WiFi Shield v1.2





あとで調べると純正のArduino WiFiシールドがあって、

Arduino WiFiShield



私の買ったWiFiシールドはサードパーティ製だった。


しかも..箱を開けると、なんとキット製品だった..





しょうがないので、はんだごてを買ってきてハンダ付けをする..

添付の小袋に、ジャンパピンが2個はいっていたので、もしやとおもいメーカのWikiを調べてみると、WIFI_TXとWIFI_RXをArduinoのデジタルピンへ割り付けないといけないことがかかれていた。


なので、Wiki上にある回線図どおりに WIFI_TXはD2へ、WIFI_RXはD3へ割り付けるジャンパピンを差し込む。





同梱のカバーは、なにがあるかわからないので、とりあえずつけないでおく。

そして、Arduino UNO上ににマウントする。シールド側のピン数のほうがArduinoより少ないが、位置は基板側のラベルに合わせてマウントする。

そしてUSBとPCを接続。

Wikiにかかれていたとおり、次にPCから https://github.com/Seeed-Studio/WiFi_Shield に行き、右下のDownload Zipボタンを押してライブラリをダウンロードする。

展開して、WiFi_Shield-masterフォルダをWiFi_Shieldに改名する。

そしてこのフォルダをArduino IDEディレクトリのlibrariesディレクトリへ移動する。

Arduino IDEを起動させる。

ボードをArduino UNO、ポートを適当に変更する。

ねんのため、BlinkサンプルでLチカ確認。

次に、ライブラリについているサンプルコードwifly_httpで疎通を試す。

ファイル>スケッチの例>WiFi_Shield>Examples>wifly_httpを選択。

Sketchファイルを以下のように変更する。

//#define SSID      "Your-SSID"
//#define KEY       "passphrase"
#define SSID      "<WiFiルータのSSID>"
#define KEY       "<WiFiルータのパスフレーズ>"

本当はTX/RXの割付先の番号を変更する必要があるのだが、Wikiどおりにジャンパピンをさしたのでヘンコウしなくて済んだ。
AUTHもデフォルトのWIFLY_AUTH_WPA2_PSKのままでOKだった。

コンパイルだけ実行してOKを確認し、マイコンボードに書き込む。

シリアルコンソールを開き、動作を確認する。

すぐにはつながらないので、つながるまで待つ。このあたりはWiFiルータとの距離とか環境によって違うと思うが、ArduinoはPCなんかよりも断然スペックが低いのだから処理速度も当然遅い。後で手動でscanを実行してみたが、アクセスポイントのとりこぼしがおおかった。毎回結果が違っていたり、そのへんはプログラム側で対応してあげないとダメだ。

使ったWiFiルータは自宅でホコリをかぶっていたこれだ。プロクシ設定などなしでインターネットに繋がる設定(デフォルト状態)で動かした。





#CloudStackを試しに入れるとき使ったルータだ..

ちなみに私の環境で実行した結果は、以下のとおり。

------- WIFLY HTTP --------
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Failed to join <SSID>
Wait 1 second and try again...
Try to join <SSID>
Succeed to join <SSID>

Try to get url - http://httpbin.org/get?hello=world
------------------------------
Failed to connect.


Try to post data to url - http://httpbin.org/post
-------------------------------
Failed to connect.
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 14 May 2015 08:08:50 GMT
Content-Type: application/json
Content-Length: 272
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

{
  "args": {},
  "data": "Hello world!",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "12",
    "Content-Type": "text/plain",
    "Host": "httpbin.org"
  },
  "json": null,
  "origin": "219.117.226.193",
  "url": "http://httpbin.org/post"
}
*CLOS*

Enter command mode. Send "exit"(with \r) to exit command mode

RESTデータがとれておれば成功だ。

上記のシリアルデータログは、一番早くつながった時のもの。もっととてつもなくかかることもあるのだ。

ちなみにscan結果は、以下のとおり。

SCAN:Found 1
Num            SSID   Ch  RSSI   Sec    MAC Address    Suites
 1                  <SSID> 06 -58 WPA2PSK 10:6f:3f:xx:xx:xx AESM-AES  WPSPB 3104
END:
この結果もほんとうにころころかわる。PCがどれだけ優れたWiFi機能を搭載しているのか身にしみてよくわかった。



なおIDEにデフォルトでWiFiサンプルがはいっているが、おそらくこれがArduino純正用なのだとおもう(試してない)。

Groveコネクタがデジタル、アナログ1つづつついているので、これで済ませられるのであれば、BASEシールドはいらなさそうだ。

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...