Translate

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シールドはいらなさそうだ。

2015年5月12日火曜日

Intel Edisonを初期化する方法(母艦:Windows)

母艦がWindows7を使ってIntel Edison上のアプリを開発している際にパスワードを忘れたり、いろいろいじりすぎて初期状態にもどしたくなることがある。

工場出荷状態に戻せればいいのだけど、最初にイメージをファイル化する方法がわからないので、ここでは最新のYocto(Edison上で動作するLinux)イメージを導入して初期化する方法で対処することにした。

-----------
  1. Windows7 PC上のブラウザでIntel Edison開発ボード公式サイト(日本語)を開く。
  2. 「ダウンロード&ドキュメント」を選択する。
  3. 「Intel Edison Software」を選択する。
  4. 「Intel Edison® Board Firmware Software Release 2.1」(執筆時)の「Release 2.1 Yocto complete image」(執筆時)を選択する。
  5. 「OK」ボタンを押してLinuxイメージをダウンロードする。
  6. 圧縮ファイルを展開して、Windows7 PC上の適当なローカルディレクトリ(例えば、C:\temp\edison-image-ww18-15)へ置く(直接Edison上に展開しないこと)。
  7. Windows7 PC上のブラウザからdfu-util.exeをダウンロードする。
    ダウンロードしたdfu-util.exeを先ほど展開したローカルディレクトリに置く(C:\temp\edison-image-ww18-15直下へコピー)。
  8. Windows7 PC上でDOSプロンプトを立ち上げる。
  9. ローカルディレクトリへ移動する(cd C:\temp\edison-image-ww18-15)。
  10. flashallコマンドをオプション無しで実行する。
  11. DOSプロンプト上に以下のメッセージが出たら、Windows7 PCのUSBケーブルを2本ともIntel Edison for Arduinoボードに接続する。すでに接続済の場合は、一旦すべてのケーブルを外し、付け直す。
Using U-boot target: edison-blankrndis
Now waiting for dfu device 8087:0a99
Please plug and reboot the board
  • 再接続が間に合わなかった場合は以下のようなメッセージが表示されるのでflashallコマンド実行からやりなおす。ほかにドライバ未インストールなどの問題があるかもしれないので注意すること。
Dfu device not found Timeout
Did you plug and reboot your board?
If yes, please try a recovery by calling this script with the --recovery option

2015年4月27日月曜日

Intel Edison をセットアップしてLチカまで持っていく




IoTの波に巻き込まれてしまい、
Arduinoをはじめることになった。

..が、Arduinoでは盾(シールド)を装備しないと
BLEやWiFiが使えない..

で、どうせやるならIntel Edison Kit for Arduinoでやれば
Arduino開発環境でできるみたいだし
WiFiも使えるかもしれない..
..ということではじめることにした。

1. 必要なもの


  • インターネットに繋がるPC(使ったのはWindows7)
  • 7z形式展開ツール、PCにインストールしておくこと
  • PuTTY.exeをダウンロードし、適当な場所へ置く
  • Intel Edison Kit for Arduino

  • USBケーブル(USB2.0 Aオス - Micro B)×2


道具としてはラジオペンチがあると便利。

あとUSBケーブル2本ない場合は、別途電源を用意する必要がある。1本だと電源不足でEdison上のLinuxが一向に起動しない。電源が足りている場合はIntel Edisonボードの近くの緑LEDが点灯する。


PC、ラジペン、ACアダプタもふくめて全部Amazonで揃ってしまういい時代になった。IoTする場合電子工作パーツも適宜必要になるが、こっちはSWITCH SIENCEや秋月電子なりのサイトで入手可能だ。


2. Edisonのとりつけ


Intel Edison Kit for Arduinoは、SDサイズくらいのEdisonボード本体と、Arduino UNOより一回りちょっと大きいArduinoボードの2つが入っている。
この2つをネジで貼りあわせて、あたかもArduinoのように開発するのだけど、一応何かあるたびにネジ開けるのめんどくさい。なので、EdisonボードとArduinoボードのオモテウラ、を写真でパチパチとっておく。

「Intel Edison What will you make?」側が表なのでこのラベルとArduinoボード側のラベルの文字が同じ向きをするように貼り合わせる。ラベルではない部分を押して、Arduino側のボードに押し込む(最後くいっと差し込まれた感があるまで押しこむ)。

そしてネジの小袋から、一番小さいネジとナット2組とりだし、上側がナットになるようにネジをしめる。


3. デバイスドライバなどのダウンロード


PCに接続する前にデバイスドライバをインストールする。

3.1. FTDI ドライバ

ブラウザで http://www.ftdichip.com/Drivers/VCP.htm を開き、使っているOSのドライバリンクを選択する。
私はWindows7なのでWindowsのsetup executableリンクを押してダウンロードした。
ダウンロードしたファイルを右クリックして、プロパティを開き、全般>ブロックの解除を選択しておくと、保護プログラムに邪魔されなくなるのでやっておく。
あとはダブルクリックして実行し、すべてそのままインストールウィザードを素直に進めれば良い。


3.2. Intel Edison ドライバ

ブラウザで http://www.intel.com/support/edison/sb/CS-035180.htm を開き、Driver softwareのWindows Standalone Driverをダウンロードする。たぶん64bitの方も動くと思うのだが、参考にしたサイトがこっちを選んでいたので、素直に従った。
こちらも、右クリックして、プロパティを開き、全般>ブロックの解除を選択しておく。同様にダブルクリックしてインストールするのだけど、EndPointが邪魔しているようで、インストールに少しだけ時間がかかった。

3.3. Linuxイメージ

同じサイトでIntel Edison上に展開するためのLinuxイメージもダウンロードする。
ブラウザで http://www.intel.com/support/edison/sb/CS-035180.htm を開き、Intel Edison Linux firmware and operating system imageのYocto complete image(もしかしたら名称は変わるかもしれない)リンクを踏んでダウンロードする。
このイメージが7zなので7z展開可能なツールが必要となる。とりあえず適当な場所におき、プロパティを開き、全般>ブロックの解除を選択しておく。

3.4. Arduino IDE

またまた同じサイトにArduino開発ツールをダウンロードできるので、おとしておく。
ブラウザで http://www.intel.com/support/edison/sb/CS-035180.htm を開き、Intel Arduino IDE からOSに合ったリンクを踏む。
このIDEはArduinoのものと全くUIが同じで、Intel Edisonに対応させたものらしい。インストーラ型ではないので、圧縮ファイルを適当な場所に置く。展開前にプロパティを開き、全般>ブロックの解除を選択しておく。そのあと展開してフォルダを適当な場所に移動する。

4. セットアップ

4.1. ドライバの動作確認

USBケーブルを2本とも同じPCへつなぎ、Arduinoボード右下のUSB Bポートにそれぞれつなぐ。
ドライバセットアップがエラーで終わった場合、コントロールパネルのデバイスマネージャを開いてエラーになっているドライバを右クリックして、ドライバの再インストールをおこなう。

おそらく再起動を要求してくるのでシャットダウンして、一旦USB接続を2本ともはずして、起動し、起動完了したら再度USBケーブルを2本とも接続する。

4.2. Yocto complate imageのコピー

接続したままエクスプローラを開いて、Edisonのラベルのあるディレクトリがマウントされていることを確認したら、先ほどダウンロードしたYocto complete imageを展開し、このドライブへ格納する。

4.3. PuTTY.exeによるファームウェア更新

次にコントロールパネルのデバイスマネージャを開き、ポート>Intel Edison Virtual Com Portとポート>USB Serial Portの横に書かれたCOM番号をメモする。
PuTTY.exeを起動する。
Connection TypeをSerialをチェック。
Serial lineのCOM番号を先ほどメモしたUSB Serial PortのCOM番号に変更する。
Speed欄は115200と入力する。
Openボタンを押す
Enterキーを何度かクリックすると、Linuxのログインプロンプトが表示される。
rootでログインする(パスワードなし)。
reboot otaを実行してファームウェアを更新する。
再度プロンプトがでたらPuTTYを終了する。

5. Lチカ実行

5.1 Arduino IDEの設定

PC上のArduino IDEインストール先フォルダのarduino.exeを起動する。
ファイル>環境設定を選択し、参照を押してプログラムのワークディレクトリを指定する(変更しなくても良い)。
ツール>ボード>Intel(R) Edisonを選択する。
ツール>ポート>COM?(Intel Edison Virtual Com PortのCOM番号を指定)を選択する。

5.2 BLink実行

ファイル>スケッチの例>01.Basics>Blinkを選択する。
新しい画面があがるはずなのでその画面左上の右矢印アコンを押す。
コンパイルし、イメージがボード側に格納され、実行されると、電源確認用LEDの近くのLEDが点滅する。

6. Lチカ停止

実は、Arduinoボード側でプログラムを消すことはできない。なにもしないプログラムをボード側に流し込まなくてはならない。
ファイル>スケッチの例>01.Basics>BareMinimumを選択する。
新しい画面があがるはずなのでその画面左上の右矢印アコンを押す。
コンパイルし、イメージがボード側に格納され、実行されると、電源確認用LEDの近くのLEDが消灯する。

--------
簡単だったのだが、1点電源不足だけはまってしまった。
ケーブル2本ない人は結構はまるんじゃなかろうか..




2015年4月15日水曜日

Docker HubのJenkins公式ーメージ インフォメーションを翻訳してみた

Docker Hub上にJenkinsの公式イメージがあったので、インフォメーションを翻訳してみました。


 Docker Hub Jenkins Official Repo
 https://registry.hub.docker.com/_/jenkins/

-------

サポート対象のタグおよびDockerfileへのリンク




このイメージについての詳細情報や履歴は、docker-library/official-images GitHub リポジトリ関連マニフェストファイル(library/jenkins)を参照してください。


Jenkins


Jenkins CI/デリバリーサーバ。

このイメージはLTSリリース版のJenkinsサーバの完全機能を提供します。


イメージの使い方


 docker run -p 8080:8080 jenkins

このイメージを使用すると、/var/jenkins_home上にワークスペースが格納されます。またプラグインや設定含むすべてのJenkinsデータが格納されます。このディレクトリの永続化を希望するとおもいます:

 docker run --name myjenkins -p 8080:8080 -v /var/jenkins_home jenkins

このように実行すると、コンテナ名「myjenkins」のボリュームは永続化されます。

またホストからこのボリュームへのマウントする場合:

最初に、/your/homeがコンテナのJenkinsユーザ(Jenkinsユーザは、通常はuid 102、もしくは-u rootを使用)がアクセス可能であることを確認し、次のコマンドを実行してください:

 docker run -p 8080:8080 -v /your/home:/var/jenkins_home jenkins

バックアップ


ボリュームをマウントしている場合 -いつでも簡単にディレクトリ(jenkins_home)をバックアップすることができます。

ボリュームがコンテナ内部の場合-「docker cp $ID:/var/jenkins_home」コマンドを使ってバックアップが可能です。


ビルドエグゼキュータへのアタッチ


外部にあるマスタ上のビルドを実行することができます。しかし、もしスレーブサーバへビルドをアタッチしたい場合、スレーブエージェントへコネクトする際に「-p 50000:50000」を使用して、ポートをわりあてます。

ここに、多くの良いツールがインストールされたビルドサーバを使用することができるdockerコンテナ例です。


アップグレード

ディレクトリ/var/jenkins_home上のすべてのデータが必要となります。このため管理方法によって、アップグレード方法がかわります。一般的に、外部へコピーし、「docker pull」コマンドを実行して、最新のLTS版を取得し、-vでデータ(/var/jenkins_home)を指定して開始すれば、既存の状態でそのまま使用できます。


サポート対象Dockerバージョン


このイメージは公式にはDockerバージョン1.5.0をサポートしています。

以前のバージョン(~1.0)は基本ベストエフォートでのサポートとなります。


ユーザフィードバック



ドキュメント


ドキュメントは、docker-library/docs GitHubリポジトリjenkins/ディレクトリに格納されています。pullリクエストを実行する前にリポジトリのREADME.mdファイルを確認して下さい。


問題(Issues)


問題や質問がある場合は、GitHub issue経由でコンタクトしてください。


Freenode上の#docker-library IRCチャネル経由でオフィシャルイメージメンテナへ問い合わせることも可能です。


貢献


大小をとわず新機能、修正、もしくは更新をうけつけています;我々はぞくぞくして受け取り、問題解決に最善をつくします。

野心的な貢献の場合は特に、送る前にGitHub issue経由であなたの計画を我々に相談することをすすめます。あなたのデザインのフィードバックや同じことを別の誰かが進めている際の発見のたすけになり、他の貢献者があなたに正しい方向を指し示してくれるチャンスになります。

------



アタッチのところのマスタ・スレーブはJenkinsの機能のことをいっている。
分散ビルドなんてしないので、ここはむししてよさそう。

簡単にいえば/var/jenkins_homeを-vで永続化させて、バックアップがイルならココをとればいいってことか。

Java8やant, maven, ivy, tomcat-lib, junitをはじめとしたテストやデプロイで必要なライブラリをインストールしたいが、それはどうしようかな..docker execじゃ、再起動したらもういちどやらないといかんし..

2015年4月10日金曜日

CentOS上にRedmineサーバ(sameersbn/redmine)をDockerコンテナとして立ち上げる



実はRedmineの公式イメージはDocker Hubにはない(この文章を書いている時点では)。

はじめ自分でDockerfileを書こうとしたのだけど、Subversionと違って難易度が..
gemインストール中にmariadbプロセスが上がっていないとダメな箇所にぶつかって挫折..
素直にDocker Hub上で公開しているイメージを使うことにした。

今回使ったのは sameersbn/redmine

選んだ理由は、単に一番ダウンロードされているから(この文章を書いている時点では)。
この方、Redmine2.6.xと3.0.x両方だしており、しかもこのイメージMySQL/postgreSQL両方サポートしており、しかもmemcachedまで使えるようにしている。
ということで、実用向きだなと勝手に判断した。


今回すでにDocker1.5および最新のdocker-composeをインストールした環境で動かした。

具体的な環境はこちらを参照のこと。


CentOS上には最初rootしかつくっていなかったので、rootで作業する。

Redmineのバージョンは3.0.1もあったが、プラグインのサポート状況から現時点では2.6.3のほうを選んだ。

以下docker-compose.yml

postgresql:
  image: sameersbn/postgresql:9.4
  volumes:
    - /home/10001/postgresql/data:/var/lib/postgresql
  environment:
    - DB_USER=redmine
    - DB_PASS=admin123
    - DB_NAME=redmin
memcached:
  image: sameersbn/memcached:latest
redmine10001:
  image: sameersbn/redmine:2.6.3
  links:
    - postgresql:postgresql
    - memcached:memcached
  volumes:
    - /var/run/docker.sock:/run/docker.sock
    - /usr/bin/docker:/bin/docker
    - /home/10001/redmine/data:/home/redmine/data
  environment:
    - DB_USER=redmine
    - DB_PASS=admin123
    - DB_NAME=redmine
    - SMTP_HOST=smtp_server_fqdn
    - SMTP_PORT=25
  ports:
    - "10001:80"

このファイルと同じディレクトリで「docker-compose up」と実行すればフロントエンドで、「docker-compose up -d」と実行すればバックエンドで動作する。
当然初回はpullするのでとても遅い。

VOLUME指定で、必要最小限の部分はホスト側のファイルシステムを使っており、再起動してもデータは永続化される。

上記のdocker-compose.ymlをそのまま実行すると、Dockerホスト上のポート10001番でHTTPサーバがあがる。

なんでこうしたかというと、各Redmineは別々の人に管理してもらいたいので、ポート番号と同じ名前のユーザ名でCentOSアカウントを作って、そこの上にVOLUME指定先(/home/10001..という部分を選択しており、各管理者にホームディレクトリ上のファイルをWinSCPなどでバックアップしてもらおうかな..と考えたためだ。

Redmineプラグインは後付でもインストールできる。
各自のアカウントでdocker execでログインして~redmine以下のpluginフォルダでgitなりwgetなりでダウンロードして再起動すれば、起動時に反映される。


SMTP_HOSTSMTP_PORTなどの環境変数の部分を書き換えてやればHTTPSにする方法GmailやほかのSSL-SMTPメールサーバなどにも対応できるので、sameersbn/redmine上にあるドキュメントを確認すること。



各社で個別のカスタマイズなどをする場合各ホームのディレクトリ上にカスタマイズ済みファイルをおいておいけばOKだ。うちの会社でも初期構築時Redmineのナマのチケットをつかわずに、ある程度社内で標準化したカスタマイズ済チケットになるように配置してあげている。

Subversionもymlファイル上に書いておいたほうがいいかなとも考えたが、Redmine上で管理する複数のプロジェクトがそれぞれ異なる構成管理サーバを使いたいということもありうるので、やめておいた。

本当は個別にホスト経由でdocker execさせたいのだけど..ホスト上のすべてのイメージやコンテナが見えちゃうからなあ..そうなるとDockerにCloudStackのようなプロジェクトだとかグループだとかの概念をいれてかないといけないし..

..GoogleのKなんとかツールとか使うかなあ..

CentOS7 上に Docker と Docker Compose をインストールする




とりあえずいれてみる。
SELINUXはオフにした。



1. Dockerのインストール

  • vi /etc/selinux/configを実行し「SELINUX=disabled」と編集して保存
  • プロクシ環境の場合、vi ~/.bashrcを実行し最終行に以下の2行を追加し保存
 export http_proxy=http://proxy_server:port
 export https_proxy=https://proxy_server:port
  • reboot
  • プロクシ環境の場合、vi /etc/yum.confを実行して「proxy=http://proxy_server:port」を追加する
  • yum -y update && yum -y install docker
  • プロクシ環境の場合、vi /etc/systemd/system/docker.service.d/http-proxy.confを実行して以下の編集を実施
 [Service]
 Environment="HTTP_PROXY=http://proxy_server:port/"
  • systemctl enable docker
systemctl start docker


2. Docker Composeのインストール

  • curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
 ※プロクシ環境の場合「-x proxy_server:port」をつけてcurlを実行する
  • chmod +x /usr/local/bin/docker-compose


figdocker-composeにかわったのだけど..
figのほうがコマンド短くってよかったなあ..

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...