NRF24L01+ と DS18B20+と Arduinoでリモート温度計2

無事DS18B20+センサを使って温度を計測することができましたので、NRF24L01+無線モジュールをつかって無線でデータを飛ばすことにします。 送り手側は電池駆動で試してみました。きっと、将来他の事例にも応用が利くと思います。

今回の実験のためにもう一台Arduino互換機を作る事にしました。秋月電子からATMEGA168/328用マイコンボード(1枚150円)、水晶振動子、抵抗、コンデンサ、ピンソケット等、必要最小限の部品を購入して組み立てました。USBインターフェースと電源レギュレーターは省略します。

ATmegaマイコンボードとAVRISP MkII

この基盤にはICSP端子がついていますので、電源とAVRプログラマAVRISPmkII を繋ぐとArduino1.0 IDEからブートローダとスケッチ双方が書き込めますので大変便利です。

さらに秋月電子からは 昇圧型DC-DCコンバーター(3.3Vタイプ)を仕入れました。入力電圧が0.7~3.3V出力電圧が3.3V最大出力電流が200mAという性能です。広告には電解コンデンサを1個追加するだけで使えると書いてありました。

センサー、無線モジュールの他にMCUの電源も DC-DCコンバータから供給するように配線します。

送信側ハードです

ハードは整いました。ソフトウエアはJ. Colizさんが書かれた RF24ライブラリにバンドルされている「pingpair_sleepy」スケッチを基にして作りました。この「pingpair_sleepy」は電池駆動のために消費電力を抑えるAtmegaのスリープモードとウオッチドッグタイマを利用しています。

ATmegaのスリープモードは

SLEEP_MODE_IDLE  アイドルモード
SLEEP_MODE_ADC   ADCノイズ低減モード
SLEEP_MODE_PW_SAVE パワーセーブモード
SLEEP_MODE_STANDBY スタンバイモード
SLEEP_MODE_PWR_DWN パワーダウンモード

5種類あって、パワーダウンモードが一番消費電力が少ないモードになっています。また、スリープモードから復帰するためにWatchdog(WDT)タイマーを使って割り込みを発生させます。

ウオッチドッグタイマーは、スリープモード中でも動いている内蔵128KHz発信器のクロックをカウントして指定のタイムアウト時に割り込み又はシステムリセットを行う機能を持ちます。

タイムアウト時間は16ms,32ms,64ms,128ms,250ms,500ms,1s,2s,4s,8sの中から選ぶことができまして、またそれをループさせることにより任意の間隔で一連の処理を行うことができます。

「pingpair_sleepy」スケッチでは setup_watchdog()のパラメータでタイムアウト時間を指定し、sleep_cycles_per_transmissionの値の倍数の期間だけスリープモードを繰り返すように組んであります。ただ、内蔵発信器のクロックなので時間の精度はあまり良くないようです。ATmega MCU内部動作の詳細はデータシートの訳 こちら を参考にさせていただきました。awawaさんありがとうございました。

スリープモードの時間はいろいろな値を設定することができますが、現在私は setup_watchdog(wdt_4s)そして sleep_cycles_per_transmission = 75として、5分に一回データを送るように設定しました。

以下にarduino1.0用に作成したスケッチを記述します。オリジナルから変更点は、温度センサーの値を読み込む処理、送受信役割分担(ロールピン)の部分を削除した所です。私のハードがNRF24L01+無線モジュールのCE,CSNがそれぞれデジタル8,9ピン、DS18B20+温度センサのDQがデジタル6ピンにつががっていますので、スケッチの該当する部分もそれに合わせてあります。温度センサの解像度は10bitに設定してあります。

送信側スケッチ Tx_data.zip
受信側スケッチ Rx_data.zip

このスケッチを動かすためには前述のOneWireライブラリRF24ライブラリをインストールする必要があります。

送信側と受信側双方をセットして動かすとシリアルモニターに温度が無事表示されました。シリアルモニタの通信速度はNRF24L01+無線モジュールの関係で57600bpsになっています。

実際に回路の電流を測ってみると、待機時に流れる電流が約0.2mAでした。どのくらい電池が持つか計算してみましょう。こちらの記事を参考にさせてもらいました。

スケッチが動いているときの消費電流は

 ATmega328P-PU         20mA
 NRF24L01+ モジュール   11mA
 DS18B20+  センサ        2mA
 DC-DCコンバータ         6mA (変換効率が85%と言うことで)
 
 計      おおむね 40mA
 

スケッチが動いている実働時間は2秒程度、待機している時間が約300秒(5分)なので平均の消費電流は

(2s/300s)*40mA+0.2mA ≒ 0.5mA

単三電池の容量が2000mAh程度なので

2000mAh÷0.5mA = 4000h(時間) ≒ 166日

計算では結構長く電池が持ちそうです。いずれこの期間についても検証してみたいと思っています。

※ 上記のハード・ソフトで 2012年3月3日 から 2012年8月17日まで、電池交換なしで5.5ヶ月間動き続けました。8月17日に落雷が原因で受け取り側のPC(サーバ)が不調にならなければ、もっと長い期間の記録になったはずでした。

11 thoughts on “NRF24L01+ と DS18B20+と Arduinoでリモート温度計2

  1. 管理人さん、すばらしいですね。NRF24L01+を、本当に使いこなしておられる。

    私も、NRF24L01+経由で、温度湿度センサーデータをネット上のWebサーバやPachubeにアップする仕組みをつい一昨日組み上げたところでした。でも、管理人さんほど、詳しい検証はせずにとりあえずデプロイした感じです。
     センサー側は管理人さんと同様にAndroidもどきを使っています。最初私も電池駆動をしていました。しかし、原因はまだ不明なのですが、おそらくEneloop単3x4では、上手く5V定電圧が作れないでしょうか、5Vレギュレータを入れても、入れなくても、ATMega328pが安定してくれませんでした・・・管理人さんの電池環境は何ですか?

    それにしても、ここまでNRF24L01+について、日本語で具体例を解説してある情報は、私の知る限りこのブログしかない気がします。英語でもありません。管理人さん、NRF24L01+マスターですね。

  2. 管理人さん、もういちど記事を詳しく読ませてもらいました。 ATMega328Pは、3.3V駆動で内部発信器 8MHzを使われているのですね。電源は単3×2に http://akizukidenshi.com/catalog/g/gM-03072/ だけで、十分なわけですね。

    RF24ライブラリは、8MHzでも正常に動きましたか? それほど難しくないなら、私も 管理人さんと同じ方式に( 3.3Vへのステップダウン、レギュレータを使うのは違いますが。)変えようかと考えています。

    ATMegaのスリープモードの存在は知りませんでしたので、これも余裕があれば実装してみようかと思います。

    • Kenji.Yさんこんにちは。システム完成おめでとうございます。マスタなんてとてもとても。(^v^)
      バッテリーは、2枚目の写真(光っていて見ずらいですね、すみません)のブレッドボード上にちょこんと載っている昇圧型DC-DCコンバーター 
      【3.3V HT7733A使用 0.2A出力: http://akizukidenshi.com/catalog/g/gM-03072/
      を経由して使っています。3.3V電源が安定して得られるみたいです。
      当初この回路をアルカリ単三乾電池1本で動かしてみたのですが、2本使用した方が良いみたいです(こちらはエネループでも可)。
      写真に写っているArduinoもどきは8MHz(セラロック発振子使用)です。これにArduino Pro or Pro Mini (3.3V,8MHz) w/ATmega328の
      ブートローダを焼いて使ってみましたが、この条件ではRF24ライブラリは8MHzでも正常に動くようです。
      残念ながら8MHz内部クロック動作および3V電池直接駆動はまだ試していないのです。
      実はもう一台16MHz(水晶発信子使用)を作っています。こちらはUNOのブートローダを焼いていますが、こちらも動作しました。
      消費電力が桁違いなのでATMegaのスリープモード使用は電池動作のためには必須だと思います。

  3. なるほど、8MHzも外部発信器を使われていたのですね。
    私の場合、AVRを持っていないので、OptiLoader(https://github.com/WestfW/OptiLoader) を使って、別のArduino経由でブートローダを書き込みました。
     このOptiLoaderは、本当に簡単で、実行するだけで、対象のマイコンを自動判別し、適切なブートローダを書き込んでくれます。ただ、OptiLoaderのソースを見る限り、ATMega328Pの8MHzに対応したものは、含まれていないようです。 もうすこし、どうやってAVRライタを使わずに、8Mhz版を書き込めるか調べてみます。

    • OptiLoaderはすごいですね。知りませんでした。対象のボードに電源を入れなくても良いのですね。AVRISP MKIIより簡単です。8MHz版もできると良いですね。

  4. あけましておめでとうございます。またまた寄り道です。実は私も、Martinさんのページを参考に、かなり部品点数を減らして、Martinさんの回路に、nRF24L01,SHT10,ICSPを追加したようなものを作りました。感光液がなくて、仕方なく秋月の片面ユニバーサル基板 Cタイプ緑(72x48mm)でチビチビハンダづけで作りました。今は3xAAで連続運転中です。
    で、何に使っているかと言いますと、実は2年くらい前クワガタを夏に拾って虫かごで飼っていました。調べてみると寿命はだいたい2年ということで、冬眠の準備までして冬に突入。ですが、2月頃、乾燥が原因で1匹死んでしまいました。今年の夏も飛んできたクワガタ2匹を虫かごにいれて今冬眠中です。また同じようなことにならないように、今は、SHT10で監視してTimeOut8s x 75 で約10分に1度監視しています。閾値は適当ですが、危ない湿度になればメールでお知らせするようにしてあります。
    ではまた何かあればレポートします。今年もよろしくお願いいたします。

    • 新年おめでとうございます。本年もよろしくお願いいたします。私もSHT10を以前購入しました。まだ使っていないので、Arduinoさんのように応用したいと思っています。
      スリープモードは消費電力が抑えられるので、回路にもよると思いますが電池がとても長持ちします。この記事の温度計で実験した時はアルカリ単三電池×2ヶで少なくとも半年は問題なく動作しました。

      • リプライありがとうございます。私の場合、ATMEGAはパワーダウンモードですが、nRF24L01をMirfで動かしているので、nRF24L01自体はパワーダウンモードにできません。SHT10も特に小細工なしに使用しています。ですので、私のセンサは半年は無理だと思います。DC-DCコンバータは、ロスがあるので、1.2v x 3の電池ダイレクトで全て使用しています。
        余談ですが、1.0.2でも1.0.3でもMirfは使えました。
        1.0.1あたりではうまく動かなかったと思います。(0023では当然使えました)。では、また何かアドバイス等御座いましたらお知らせください。

  5. First of all thank you for sharing.
    I refer to your article, use the Tx_data and Rx_data.
    However, the window has been opened Rx error message as follows

    Temperature = nan Time: 69 Sent response.
    Temperature = nan Time: 571 Sent response.
    Temperature = nan Time: 1072 Sent response.
    Temperature = nan Time: 1573 Sent response.
    Temperature = nan Time: 2074 Sent response.
    Temperature = nan Time: 2575 Sent response.
    Temperature = nan Time: 3076 Sent response.
    Temperature = nan Time: 3587 Sent response.
    Temperature = nan Time: 4089 Sent response.
    .
    .
    .
    .

    I have checked Tx window which displays the following message
      Time: 279Now sending 26.50 … Failed, response timed out.
      Time: 1740Now sending 26.50 … Failed, response timed out.
    .
    .
    .
    Maybe where I made a mistake, would you please guide us, thank you very much.

    • loeb cheng さん コメントありがとうございます。

      >Time: 279Now sending 26.50 … Failed, response timed out.

      26.50 °C を読み取っているのでDS18B20+ はokだと思います。

      NRF24L01+ 周りの問題だと思います。 結線を確認して NRF24L01+ 間の通信が出来るか否かテストした方が良いと思います。

      この記事を書いてから時間が経過してしまったので、私の記憶も不確かになってしまいました。

      確か Tx_data and Rx_data はmaniacbug さんのexamplesを元に作ったと思います。

      https://github.com/maniacbug/RF24/tree/master/examples に記載の GettingStarted 又は pingpair を試してみることをお勧めいたします。

      (※ 拡張子 .pde は Arduino 1.0 以降 .inoに変更になっていると思います)

  6. お返事をありがとうございました
    私は、翻訳者をグーグルあなたに感謝しようとしました。
    あなたは、私が興味を持っていたことを共有しているため。
    私が見えにくいしようとします。
    ありがとうございます。Googleの翻訳は非常に驚くべきことではなかった願い。
    ありがとう

Arduino にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください