必要であれば数値を変更してピン・アサインを変えることができます。rf24bbを走らせます。Arduino側もスタートさせておきます。間の通信を確認することができました。管理人4さて、シリアルモニタに温度を表示させるだけではつまらないので、現在動いている自宅サーバにログを取って、その結果をweb上からグラフにして表示させてみることにします。Kenji.Yさんが構築された素晴らしいシステムには遠く及びませんが、とにかく頑張りましょう。Getメソッドでサーバにデータをcsv形式で記録し、それを基にグラフ作成です。グラフの描写はhighstockで行うことにしました。サーバ側のコードはphpで書きました。これは、Mapo堂さんの記事を参考にさせていただきました、ありがとうございます。tempera_log.php[PHP][/PHP]動作確認のためにブラウザからhttp://サーバアドレス/パス/tempera_log.php?tempera=1234.5などとアドレス欄に入力してtempera_log.csvが作成され、数値が記録されるか確かめます。私の場合データの投稿はLAN内からのアクセスですので、外部からこのファイルにアクセスできないようにアクセス制限を掛けておきました。将来仮に、インターネット側からデータを送らなければいけないときは、安全性を考慮して別の手立てをしなければならないでしょう。ログファイルの置かれているディレクトリはwebサーバを動かしているユーザーから書き込む事ができるようにアクセス権を設定します。私はいつもこのことで失敗してしまいます。(学習能力がまるで無い)続いて、先日作成したRx_data.inoにwebサーバアクセス用のコードを付け加えます。Examplesにあるwebclientスケッチを元に作成しました。failed”);}client.stop();[/C]さて最後に一番手こずったのがグラフ描写です。今回試したhighstockは以前使ったRRDtoolsとは違いJavaScriptで書かれていて、クライアント側でグラフを描くものです。Highsoft社が開発元で、個人利用であればフリーで使うことができます。姉妹版のhighchartsというライブラリもあって、豊富な種類かつ表現豊かなグラフを描くことができます。highstockは時系列のデータに対して相性が良いようです。こちらからライブラリをダウンロードして適切なディレクトリに解凍して設置します。ドキュメントを参考にしてプログラムを組んだのですが、CSVファイルの取り込みがどうしてもうまくいかなくて苦労しました。サポートフォーラムの中を必死に探してようやく動かすことができました。すると、もっと根本的な恥ずかしい間違いを犯しているかもしれません。このソフトに関しては日本語の資料があまりなく、へっぽこメモさんのwebに助けていただきました。ありがとうございます。highstock.jsとtempera_log.csvのファイルのパスに注意します。文字コードセットをUTF8で保存します。管理人11無事DS18B20+センサを使って温度を計測することができましたので、NRF24L01+無線モジュールをつかって無線でデータを飛ばすことにします。送り手側は電池駆動で試してみました。将来他の事例にも応用が利くと思います。今回の実験のためにもう一台Arduino互換機を作る事にしました。コンデンサ、ピンソケット等、必要最小限の部品を購入して組み立てました。USBインターフェースと電源レギュレーターは省略します。IDEからブートローダとスケッチ双方が書き込めますので大変便利です。昇圧型DC-DCコンバーター(3.3Vタイプ)を仕入れました。入力電圧が0.7~3.3V出力電圧が3.3V最大出力電流が200mAという性能です。広告には電解コンデンサを1個追加するだけで使えると書いてありました。DC-DCコンバータから供給するように配線します。送信側ハードですハードは整いました。RF24ライブラリにバンドルされている「pingpair_sleepy」スケッチを基にして作りました。この「pingpair_sleepy」は電池駆動のために消費電力を抑えるAtmegaのスリープモードとウオッチドッグタイマを利用しています。パワーダウンモード5種類あって、パワーダウンモードが一番消費電力が少ないモードになっています。スリープモードから復帰するためにWatchdog(WDT)タイマーを使って割り込みを発生させます。ウオッチドッグタイマーは、スリープモード中でも動いている内蔵128KHz発信器のクロックをカウントして指定のタイムアウト時に割り込み又はシステムリセットを行う機能を持ちます。タイムアウト時間は16ms,32ms,64ms,128ms,250ms,500ms,1s,2s,4s,8sの中から選ぶことができまして、またそれをループさせることにより任意の間隔で一連の処理を行うことができます。setup_watchdog()のパラメータでタイムアウト時間を指定し、sleep_cycles_per_transmissionの値の倍数の期間だけスリープモードを繰り返すように組んであります。内蔵発信器のクロックなので時間の精度はあまり良くないようです。参考にさせていただきました。awawaさんありがとうございました。75として、5分に一回データを送るように設定しました。以下にarduino1.0用に作成したスケッチを記述します。(ロールピン)の部分を削除した所です。私のハードがNRF24L01+無線モジュールのCE,CSNがそれぞれデジタル8,9ピン、DS18B20+温度センサのDQがデジタル6ピンにつががっていますので、スケッチの該当する部分もそれに合わせてあります。温度センサの解像度は10bitに設定してあります。Rx_data.zipこのスケッチを動かすためには前述のOneWireライブラリとRF24ライブラリをインストールする必要があります。送信側と受信側双方をセットして動かすとシリアルモニターに温度が無事表示されました。シリアルモニタの通信速度はNRF24L01+無線モジュールの関係で57600bpsになっています。実際に回路の電流を測ってみると、待機時に流れる電流が約0.2mAでした。どのくらい電池が持つか計算してみましょう。こちらの記事を参考にさせてもらいました。計算では結構長く電池が持ちそうです。この期間についても検証してみたいと思っています。2012年8月17日まで、電池交換なしで5.5ヶ月間動き続けました。8月17日に落雷が原因で受け取り側のPC(サーバ)が不調にならなければ、もっと長い期間の記録になったはずでした。管理人11NRF24L01+を使って無線実験が成功したので、実用的な用途に応用です。本当は家の中の消費電力を計測したいのですが、他の方の製作記事を拝見すると結構大変そうです。今の私には少々荷が重すぎるようですね。手始めに気温を測る温度計に挑戦です。これなら何とかいけそうです。冷静になって考えると”気温を測ってどうするの?”という素朴な疑問がわいてきました。「実用的な用途」と言えるかどうかも論議が必要です....結局、結論がなかなか出てきそうにないので、先に進むために今そのことは考えないことにします。温度を測るセンサーもいろいろあって迷いますが、秋月電子の広告を見て「1wireデジタル温度センサー」という文字が目にとまりました。値段も1つ300円とお手頃です。他の温度センサーと比べて精度が良いみたいですね。電子工作の部屋さんのWeb中にDS18B20+の説明が書かれていました。マニュアルの日本語訳もされています。すごいですね、頭がさがります。ありがとうございます。調べて行くとArduinoとの相性も良さそうな事がわかりました。2.1)このライブラリをダウンロードします。zipファイルを解凍してできる「OneWire」フォルダをフォルダごとAduino1.0の「libraries」ディレクトリにコピーすると使えるようになります。Arduino単体で温度が読み取れるか試してみましょう。ブレッドボードにDS18B20+を配線します。このOnWireデバイスは、一つ一つのデバイスに64ビットのアドレスが割り振られているとのことです。ワンワイヤーと言っても現実には通信に2本の線が必要(パラサイトモード時)なのですが、カスケードにして複数つなぐことができるそうです。トランジスタ風のパッケージの中に、機能がぎっしり詰まっていますね。今回私は、DS18B20+の2番ピン(DQ)はArduinoのデジタル6番ピンにつなぎました。ブレッドボードに配線をすませて、ライブラリ付属のサンプルスケッチ「DS18x20_Temperature」を実行します。10この行は、自分の環境に合わせ、6に変更しておきました。これでシリアルモニターに現在の気温が表示されるはずです。スケッチを走らせると瞬時に気温が計測され、表示されます。センサーを指で触ると体温に反応して表示される温度が刻々と変化します。応答性能もよさそうです。ちなみに配線を間違えると85°Cの表示がされ、そこから微動だにしません。(なぜこのことを知っているかは秘密です)資料を見ると85°Cはパワーオンリセット時にセットされるデフォルト値みたいです。配線には気をつけましょう。壊れなくて良かったです。先ほどのPJRCさんのwebに、このスケッチには氷点下以下が測れないというBugがあると書かれていましたので、このスケッチを修正してみました。接続するDS18B20+は1つなので、アドレス指定の部分は削除してしまいました。動くか否か心配なのでテストをすることにしました。昨日まで冷え込んでいたので夜明け前なら外気温は氷点下なると見込んで測ってみました。残念ながらあとわずかの所で氷点下になりません。2~3日繰り返しましたが徒労に終わりました。このまま待っていると来冬になってしまいそうなので、DS18B20+を簡単なプローブにして氷と塩を使い測ってみました。小学校3年生以来ですね。Resolution)は9,10,11,12ビットのいずれかで設定することができ、それぞれ0.5°C,0.25°C,0.125°C,0.0625°C単位で測ることができます。設定をしないと12ビットになります。解像度が大きくなるほど温度をデジタルデータに変換する時間がかかりますので、電池駆動で消費電力を少なくしたい時は解像度を低く抑えた方が良いかもしれません。J.Colizさんが2.4GHz帯(ISMバンド)の電波利用状況を計測するスケッチを書いてくれました。RF24ライブラリをインストールした後、[Examples]-[RF24]-[scanner]でロードできます。ArduinoにnRF24L01L+無線モジュールをセットし、スケッチを走らせるとシリアルモニタには下記のように表示されます。RF24/examples/scanner/に続く2行はチャンネル(RF_CH)を表示しています。このチャンネルは縦に読むのがミソで、十六進数で00~7fの間、2.4GHz帯の1MHzごと、128CH分が表示されています。次の行からはスキャンした時点で使われている電波の強度を表示しています。Stumblerというものがあり、同時に計測してみました。b/g/n規格の物は2.4GHz帯を使用します。私の所は郊外で、家も少ない訳なのですが、それでも結構電波が飛んでいますね。下の行が私の使っている無線ルータです。無線LANの11CHを使っていて、この中では一番シグナルが強いです。ややっこしいのですが、無線LANのチャンネルは上記のチャンネルとは異なります。2.4GHz帯の無線LANの電波の割り当ては、第1CHの中心周波数が2412MHzで、それ以降は5MHzずつ中心周波数が高くなり13CHまで使われています。使う帯域は22Mhzですので隣どおしのchはかなり重なってしまいます。b/gの無線LANを使うには、3つの組み合わせしかなかったと思います。上記無線LANの11chは中心周波数が2462MHzですので、2451MHz~2473Mhzを使っている事になります。これは、ちょうどシリアルモニタに表示されたピンクのアンダーラインの所に該当します。双方を比較してみると、Arduinoで計測した方が明らかに詳しく測ることができますね。2.525GHzと書いてあります。このスケッチを使って無線LANや他の電波と干渉しないようにnRF24L+をセットする事ができます。ちなみにこのRF24ライブラリはデフォルトで76CH(0x4C)、2476MHzを使うようになっています。管理人56Atmega328P-PUと無線ユニット前回は失敗していまいましたが、こりずに挑戦です。今回もまたebayから仕入れた品物のお話です。Semiconductor社のnRF24L01+というチップを使った無線ユニットです。Arduino」というタイトルで売っていました。最大の特徴はその安さです。私が購入した時は2個セットで約$6(送料込)でした。小型で、アンテナもユニットの基盤にプリントされています。この製品の特徴は無線LAN等に使われている2.4GHzのISMバンドで通信を行う通信速度を250Kbs,1Mbps,2Mbpsから選ぶ事ができる1.9V-3.6Vで動作する。(※5Vをかけると壊れてしまう。送信1mw時11.3mA、受信2MBps時13.5mA他にも超低電力消費モードがある事や、最大1台対5台の通信が出来ること(MultiCiever機能)がデータシートに記載されていました。周波数は2.400GHz~2.525GHz間で1MHz単位で変えることができます。一定出力以下のISMバンドの通信機器は免許不要ということですが、日本国内で使用するためには認可が必要みたいですね。この製品はそのような認可はとってないでしょう。個人的にちょっと実験するだけならば問題にはならないでしょう。残念ですが日本国の法律に抵触する可能性がありますね。善良な市民の皆さんは許可された国に行き実験しましょう。Duinoさんのwebを参考にさせていただきました。見て気付きましたが、このページには私が購入したタイプとピン配置が違う製品が記載されています。わかりませんが、こちらの図のジグザグアンテナの方が良く電波が飛びそうに見えます。これは早くも失敗だったでしょうか?気を取り直して、本文を良く読むと、Arduinoでこの無線ユニットを使うために2つのライブラリが作られている事がわかりました。1つはRF24ライブラリ、もう1つはMirfライブラリだそうです。こちらのページにRF24ライブラリのダウンロード先が書いてありました。ひとつのMirfライブラリはこちらのページに情報があります。1.0環境では現時点で動作しませんでした。(0023環境では動きました)ここから後の作業は、このブログタイトル通り試行錯誤でした。いかんせん初心者ですので誤りがあるかもしれません。記述に誤りがあった時には御指摘いただければ有難いです。NRF24L01+をより活用することができると書いてあったRF24ライブラリを使って通信を試みます。こちらからRF24ライブラリをダウンロードします。GZ)ダウンロードしたファイルを展開してできるフォルダ名(現時点ではmaiacbug-RF24-94635e8)をRF24にリネームする。以下にコピーする上記の手順でライブラリの登録ができました。nRF24L01+ユニットとArduinoとの結線です。RF24ライブラリ作者であるmaniacbugさんのwebに載っていました。Duinoさんのwebに書かれている結線とはCE,CSNの配線が異なっています。デフォルトでRF24ライブラリを使用するならば、上記が正解みたいです。CE,CSNのピンアサインは変えることができます。最初ブレッドボードで実験しようとしたのですが、ピンの間隔は一般的な2.54mmなのですが列の間隔が足りなくてブレッドボードではうまくいきませんでした。(ちょっと考えれば分かりそうなものです。)というわけで今回は片側がオス反対側がメスのブレッドボード用のジャンパワイヤーで配線しました。実験には同じセットが2台必要になります。1.0の環境で実験開始です。IDEのメニューからサンプルスケッチを試します。[File]-[Examples]-[RF24]-[GettingStarted]を、無線ユニットをつないだ2台のArduino双方にアップロードします。以下略このようなステータスが表示されます。backモードですので、’T’をタイプしてSendボタンを押します。以下略このように表示されれば成功です。ミリセコンド単位でpingのディレイが表示されました。出力が1mWということで、どのくらいの飛距離がでるか実験してみました。デフォルトの1MBpsで室内障害物無しの条件で約10mは全く問題無しでした。外に出て木造建物の壁1枚を隔て約15m程度はなれた所で限界が来ました。いろいろな環境条件によって変わると思いますので、これはごくおおざっぱな参考値です。データシートには256Kbpsにすると消費電力は増えるが受信感度が増すという内容の記述がありました。距離的にちょっと心もとない気もしますが、使う用途によっては十分実用になると思います。以下の事柄は私の環境に限ったことかもしれません。ジャンパー線を外しプロトシールドにピンソケットを付けて実験してみました。φ0.26mmのジュンフロン線で配線をしたのですが、最初全てのパケットがタイムアウトになってしまいました。一瞬言葉を失いましたが、冷静に戻った後、モジュールにつながる電源の3.3VとGNDの配線を太いものにしてようやく動作しました。電源周りに気を付けた方がよさそうです。現在はさらにバイパスコンデンサを取り付け、他の信号線も太い配線にしました。