温湿度センサ DHT11を試す。2015/01/29 01:15

温度と湿度が手軽に得られるモジュールを探していた。
秋月で520円程度で売られていた温湿度センサモジュールDHT11を使用した。
http://akizukidenshi.com/catalog/g/gM-07040/

DHT11により計測された温度、湿度はデジタル出力で得られる。
適当なライブラリを使わないと、データが得られない。
分解能は湿度:1%、温度:1℃。細かい値は得られない。

以下のサイトではDHT11について、あまりよろしくない性能である事の記載があったが、
その事は購入後に知った(泣)。参考程度にわかれば良いとあきらめる。
http://www.geocities.jp/bokunimowakaru/diy/arduino/humidity.html

秋月のDHT11はDF ROBOTという中国の会社がモジュール化した製品であり、
DF ROBOTのサイトに載っているArduinoライブラリをそのまま使用し、
サンプルもそのまま使う事で値が得られる。DATAは4番PINに入れる。
https://www.dfrobot.com/index.php?route=product/product&product_id=174

本体から伸びる線のどれが何なのか、説明情報がなく不親切な感じだが
なんとなく赤=Vdd、黒=GND、緑=DATAとしてつなげてsampleスケッチを動かしてみると
値が得られた。

Lチカ並みのお手軽さなのはありがたい。
VCCは3.3~5.5Vなので、3.3Vマシンでもそのまま使える。
DHT11のデータシートではDATAとVdd間に5KΩ入れる事に
なっているが、モジュール内に内蔵されているようなので無視して使える。


Raspberry Piで顔検出(準備:Linuxマシンで顔検出)2014/12/23 05:43

arduinoよりもパワフルで、いろいろできそうなRaspberry Pi(ラズベリーパイ)を使って、ロボットの目を作りたい。
ラズベリーパイを使った顔検出の事例が既に幾つかあるので、まずはそれを真似してやってみようと思う。
Raspberry Pi に USB Camera をつないでいろいろやってみた
http://blog.goo.ne.jp/roboz80/e/16ea5be9a9eaf370046035be841b4bfd

raspberrypi/OpenCVを使って顔認識しました
http://www.pwv.co.jp/~take/TakeWiki/index.php?raspberrypi%2FOpenCVを使って顔認識しました

事例ではopenCVを使っている。openCVは、C、C++、pythonで使用可能な画像処理用のライブラリで、簡単な顔認識(顔領域の検出)はすぐに出来る。ラズベリーパイが手元にないが、やってる事はLinuxマシンでopenCV使って処理する事なので、古PCをラズベリーパイに見たてて、ubuntu+openCVの環境を作って顔認識してみることにした。

ubuntu 14.0.4を入れる。インストール後、openCV 2.3.9を入れる。サンプルソースを入手して動かしてみる。これだけの作業だが、いくつかつまづいたのでメモする。

(1)ubuntuインストールディスク作成でつまづく
【事象】インストール用のISOイメージをダウンロードして、DVD-RWへ焼く。ディスクを読み込ませてインストールしようとするが、おかしなエラーが出る。
【原因】メディアが傷ついていて焼き込み失敗していた。
【対策】ディスクをよく拭いてリトライしたら成功。ありがちな事象だが、ディスクに問題が有る事にしばらく気づけなかった。DVDライティングソフトの実行オプションで、焼き込み終了するとシャットダウンするようにしていたが、こうすると途中でエラーになろうがシャットダウンしてしまうので、出来上がったディスクに問題があるかわからない。そのまま出来上がったディスクを使って(正常に焼けたと思い込んで)ubuntuインストールしようとするが、おかしなエラーが出て先に進まない状態になっていた。

(2)ubuntuインストール時のパーティション設定でつまづく
【事象】DVDからubuntuをブートするが、HDDにインストールしようとすると、入ってるはずのwindowsが認識されない。ubuntu用のパーティションをwindowsとは別に用意してデュアルブートするつもりが、クリーンインストールしようとしてしまう。
【原因】windows側でubntu用の領域割当をしていたのがダメだった。
【対策】Windows側で割り当てた領域はクリアして未使用状態とした上でリトライすると、windowsを認識し、ubuntu用に用意していた空きパーティションにインストール出来た。

(3)ubuntuをインストールするが、重すぎる
【事象】古いネットブック(Atom N280マシン)にインストールしたが、動きが重すぎる。
【対策】必要以上にでかい壁紙(2560×1600)指定を単色壁紙に変えると幾分マシになった。他にもっとマシな方法もあると思うが、シロウトにはわからない…

(4)openCVのインストールでつまづく
【事象】大雑把にopenCVのUNIX用ファイルをダウンロード、ローカルフォルダに展開、インストール、という流れだが、インスール時にcmake/makeでインストールする事、opencv以外のモジュールが要る事などでつまづく。
【原因】ubntuでcmake/makeによるソフトインストール経験が無い
【対策】以下のページに従い実施する事で、opencvをインスールして簡単なテストコード実行によりUSBカメラの画像を表示する所までたどり着けた。
http://hmatsudaiac.wix.com/venus-robotix#!set-opencv-linux/cwe1
なるべく簡単な方法を探して、他のサイトに記載された方法を幾つか試してみては、途中エラーになって行き詰まり、原因確認したり何度もリトライしていた。当たり前の事としてインストールする過程の一部が省略されていたり、opencvインスールの前の下準備作業(関連ソフトの事前インスールなど)の記載が無いのが原因だった。

opencvを使った顔検出サンプルソースを入力してコンパイル、実行し、lena画像を使って冒頭の検出結果が得られた。(おかしな所も顔検出されてしまったので、チューニングは要りそうだ)

ArduinoとM2M/IoT2014/11/26 00:53

最近流行りのキーワードであるM2M/IoTという言葉で、ちょっと前に作ったArduinoプロジェクト(ザリガニ生命維持装置)を整理してみる。

■システム構成

■機能配置
(1) センサーデバイス(arduinoFIO)
  センサーより情報取得、Iotゲートウェイ(指定HOST)に送信
  センサー情報に基づき、冷却ファンをコントロール
(2) Iotゲートウェイ(Arduino+EthernetShield+XBeeShield)
   センサーデバイスへのデータリクエスト(指定なしBroadcast)
   センサーデバイスからの応答受信
   データ保存クラウドサービスへのデータPOST
(4) データ保存クラウドサービス(thingspeak)
    受信データのDB格納
    データ参照リクエストに対するデータ提供
(5) データ分析クラウドサービス(Google Chart tools)
    データ保存クラウドサービスから取得したデータをグラフに加工して、モバイルデバイスへ提供
(6) モバイルデバイス
    データ保存クラウドサービスへのデータ提供リクエスト
    データ分析クラウドサービスへの加工データ提供リクエスト

最近の言葉を使うと、素人の作るArduinoプロジェクトも急に最先端な感じが出てくるが、プロジェクトはは2010年の段階で実現可能だった(ただ忙しくてサボっていただけ)事を考えると、それほど目新しい事でもない気がする。

M2M/Iotに関して今ホットな話題は、(1)-(2)間の通信プロトコルの標準化。以下3つの方式があり、それぞれ関わっている会社が違う。それぞれM2M/Iotを実現する上で汎用的かつ軽量な設計を目指しており、標準化をめざしている。ググるといろいろ情報が出てくる。
MQTT(Message Queue Telemetry Transport)
CoAP(Constrained Application Protocol)
Thread

残念ながら今回のプロジェクトで取った手段は、メタデータもなく何の汎用性もない固定フォーマットのテキストをやり取りする手段で実現している。策定されているIoT用プロトコルを使って通信ができるとよいが、理解が足りないので追々実施したい。

また、今回のプロジェクトはセンサーから得られたデータをモバイルで見て、行き止まりになっている。ここで複数のセンサーから得られた情報を統合し、予測サービスと組み合わせて、この先何が起こりうるかを予測し、アクション出来るような仕掛けにしたい。
ここまでできると、Iotではなく、GEが掲げているIndustrial Internet のようなレベルのサービス(下図)と言える。GEの場合、扱う製品がジェットエンジンだったりするし、目的は故障の発生を事前に予測し、前もってメンテナンスをする事で、製品の稼働率を上げ、顧客満足度に寄与するところにあると思う。
ホビーで使える適当な予測サービスがネット上にあるかどうかわからないが、元の情報発信元に対してなんらかのフィードバックがかかるようなシステムにしたい。

【arduinoメモ】シフトレジスタ74HC595を使用して3線でLCDを表示する2014/10/09 23:33

arduinoのLCDライブラリを使えば、簡単な記述でLCDに文字を表示出来る。
ただしDigitalピンを6本使う。なるべく使用するピンの数を少なくしたい。

■事前準備
下記からダウンロードしたLCDライブラリでarduinoのLCDライブラリを上書きする。
<https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home>
ライブラリには2線用、3線用、I2C用などがあるが、3線用をつかう。ヘッダ宣言は以下を使う。
#include "LiquidCrystal_SR3W.h"

■配線図
シフトレジスタ(74HC595) -LCD(SD1602VBWB)間の接続
Qa0  - 11
Qb1  - 12
Qc2  - 13
Qd3  - 14
Qe4  - 6
Qf5  - 5
Qg6  - 4
※SD1602VBWBの場合、実際のピンの順番は左から14-1、16、15となるので注意

■スケッチ
スケッチ上でLCD定義する時に、通常は
  LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
  ※引数は(rs, enable, d4, d5, d6, d7)

と記述する所を
   LiquidCrystal_SR3W lcd(7, 8, 9);
   ※引数は(uint8_t data, uint8_t clk, uint8_t strobe)

とすればよい。

あとはLCDライブラリと同じように使える。
  lcd.print("hello, world!");
とすれば、その通り表示される。

使用したLCD(SD1602VBWB)はバックライトが機能する。
右端が15ピン(バックライト用VCC、上限3.3V)と16ピン(GND)。
LCDの外周までブルーに光る様がトロンみたいでカッコイイ。
上記のスケッチはこちら


■その他 arduino FIO上で3Vで動作可能か確認する。
LCDのVCCは5V必要。FIOは3.3Vなので、3.3Vを5Vに昇圧してLCDのVCC(ピン2)に入れる。
他のピンは3.3Vでも動くので同じ構成で試す。
これでも動く。実際にやるならUSBから5V取ってLCDのVCCにつなげた方が楽。
FIOつかったプロジェクトに適用したい。

thingspeakのデータをgoogle chartで表示する2014/09/08 00:10

arduinoからthingspeakへ送ったデータをGoogle Chartで表示する。

arduinoからthingspeakへポストしているザリガニ水槽の水温、冷却装置の作動状況、CDSセンサのレベル値を取得して、1つのグラフ上に表示した図。グラフは15秒おきにリフレッシュする。100行に満たないちょっとしたJavaScriptの記述で実現できる。
htmlソース, scriptソース
thingspeakへ送ったデータは所定のリクエストをする事で取得できる。データが取得できれば、それをもとにGoogle Chart を使って好きな形へグラフ化できる。 もともとthingspeakだけでもグラフ表示はできるが、Google Chart を使えばよりリッチな表現ができる。thingspeak側でよくあるサンプルが、最新のデータをアナログメーター形式で表示してくれるものだ。

これはthingspeak上で紹介されている説明サンプルを参照して、thingspeakプラグインのソースをコピペすればすぐにできるが、今回は複数の環境値を1つのグラフ上にわかりやすく表示する事を試した。これによってthingspeakの複数のchartや複数のchannelの値を取得して1つのグラフ上に表現する事が出来るようになる。実施は以下2ステップ。

(1) thingspeakへ送ったデータをJSON形式で取得
thingspeakの説明の中にfeedのリクエスト方法の記載がある。このルールに従ってリクエストを送れば好きなデータが好きな形式で取得できる。形式はJSON、XML、CSVが選択可能だが、javascriptで処理するならJSON形式がやりやすいと思う。
例として、Channel 441の直近40個のデータをJSON形式で取得する場合、

https://api.thingspeak.com/channels/441/feed.json?results=40

と記述する。ブラウザにURLを入力してリクエストすると、生のデータが見える。


これでJSON形式のデータは表示できた。JSON形式を理解していないと、ぱっと見わかりにくい文字列に見えてしまうが、JSONを理解するのに役立つサイトがたくさんある。
  • jQueryでjsonデータを扱ってみる【入門編】

  • そしてJSONデータを取得して、個々の値に簡単にアクセスするためにJQueryを使用する。JQueryを理解するのに役立つサイトがこれまた沢山ある。
  • JQuery入門講座
  • ※その他メモ
  • JSONデータの取得はJQueryの$.getJSONを使う
  • $.getJSON() の説明
  • JQueryを使うので、当然ながらJQueryを使うための宣言が必要
  • 各データの登録日時はfeedsの"created_at"項目に自動的に格納されている。
  • feedsの"created_at"はJavascriptのdate型でdatestringとして読み込ませる事ができる。
  • 例: 先頭のfeedに格納されたデータの登録日時を変数にいれる
    var LW_a = new Date(data.feeds[j].created_at);

    (2) 取得したJSON形式データを使ってGoogle Chartで表示
    GoogleChartでグラフ表示をするには、取得したJSONデータをChart表示用のデータに入れて、あとはGoogleChartのお作法に則って表示させればよい。GoogleChart自体はそれほど難しくなく、Javascript初心者でも簡単に扱えると思った。
    作成に当たり参照したサイトを以下記載。
  • AjaxTower Google Chart API入門
  • プログラマーズ雑記帳 Google Chart Tools の使い方
  • Google Chartsで左右2つのY軸を使った折れ線グラフを描画する方法
  • arduinoからmodem電源をon/offして再起動させる2014/08/10 00:51

    モデムのON/OFFをarduinoで制御する。

    <背景・目的>
    使用しているモデムは時々フリーズする。インジケータのLEDはチカチカしてるが、PCからモデムの制御画面にアクセスしようとしても反応が無い状態になる。こうなると何をしても無駄なので、その都度電源を抜き差しして対応していた。
    作成中のザリガニ生命維持装置では、Arduino+Ethernetで、データログを1分毎にthingspeakへPOSTしているが、モデムがフリーズ状態になってデータPOST出来ず、データが抜け落ちている様子がよくわかるようになった。電源抜き差しと同じ事をarduinoでしたい。

    <対応内容>
    ターゲットのモデムはACアダプタから電源供給されている。
    2.1mm標準DCプラグ+ジャック+リレー
    の回路を作り、ACアダプタとモデム本体の間にはさんで中継するようにする。リレーをarduinoで制御して、モデムへの電源供給を遮断すれば、モデムは電源OFFとなる。。
    制御と言ってもリレーでON/OFFするだけなので、電源を抜き差しするのと変わらない。
    普段は通電している状態とし、thingspeakへのデータPOSTに連続失敗したら、モデムフリーズとみなして電源を一定時間OFFにし、再びON状態にする。

    <仕様>
    リレーはリード線でarduinoの8ピンに接続。
    1分毎にthingspeakへPOSTする際、アクセス失敗したらエラーをカウントする。5回連続失敗したらモデムフリーズとみなして8ピンを5秒間ONにし、再びOFFにする。
    その他は以前作成したザリガニ生命維持装置親機と同じ。
    (親機スケッチ更新版)


    <動作確認>
    arduinoを電源ONにし、thingspeakへ1分おきにデータPOSTされる事を確認したら、LANの線を抜いて通信不能な状態にする。5分待って、モデムの電源がON/OFFされる事を確認する。
    このやり方でテストを行い、予定通りmodem電源が切断され、再起動される事を確認した。
    なお、モデム電源はDCではなくAC電源だったが、プラグ形状はDC用だったのでこのやり方で問題なかった。