このページでは、ハンダ付けなしで製作できるブレッドボードを使ったワイヤレスセンサーの製作方法を説明しています。ただし、XBeeのピッチ変換基板など一部にハンダ付け作業をともないます。
これから温度と照度センサーの例をあげて説明します。また、新たなセンサー部品を手にしたときに、自分でセンサー子機をつくれるのに必要な情報も織り込んでゆきますので、様々なセンサーへの応用ができるようになります。さらに、乾電池で長期間にわたって動作させることが可能な End Device の設定方法についても解説します。
下図はZigBee 温度・照度センサーの基板パターン例です。左側にXBee、中央付近に温度センサー、右側に照度センサを実装します。XBeeモジュールはピン間隔が2mmでブレッドボードの2.54mmと異なるので、XBee用のピンピッチ変換基板を使用します。ただし、ピンピッチ変換基板にコンデンサやLEDを実装することが出来る場合は、ピンピッチ変換基板側にそれらの部品を実装します。
温度センサーと照度センサーは、それぞれが検出した電圧をXBeeの18番ピン(ADIN2)と19番ピン(ADIN1)に入力しています。多くXBeeセンサー子機の場合は、XBeeのAD1(19)〜AD3(17)の3つをセンサー用のアナログ入力として使用します。
ここではブレッドボードを使用して製作します。部品のハンダ付けを行いたい場合は秋月電子などで売られている「片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ)」を使用して製作します。
XBeeをブレッドボードと同じピンピッチに変換するための変換基板が必要です。ここでは、スイッチサイエンスの「XBeeピッチ変換基板とソケットのセット」と秋月の「XBee用2.54mmピッチ変換基板」のどちらかを使用します。スイッチサイエンスのピンピッチ変換基板はXBee用コンデンサ、LED、LED用抵抗が別途必要ですが、秋月のには含まれています。しかし、秋月のピッチ変換基板の場合はLEDの配線の変更が必要で、また電源電圧が0.3Vほど下がってしまい、さらに基板も少し大きめです。スイッチサイエンスの「XBeeピッチ変換基板とソケットのセット」の方が製作が容易で電圧も下がりません。
品名
参考価格
| 備考
| XBee ZB(S2/S2B) Module
| 1,700円
| 単3電池2本で動作する子機用のモジュールです。
| ブレッドボード
| 250円
| XBee センサ子機を簡単に製作するのに便利です。
| XBee用2.54mmピッチ変換基板
| 300円
| XBee をブレッドボードに取り付けるのに必要です。(要ハンダ)
| 温度センサ LM61BIZ
| 50円
| 電源にコンデンサ0.1uFが必要です。
| 照度センサ NJL7502L
| 50円
| 負荷抵抗に1kΩ〜10kΩが必要です。
| プッシュスイッチ
| 50円
| ペアリングのコミッショニングスイッチ用です。
| 電池ボックス
| 100円
| 単3乾電池2本用。電線の先端はハンダでめっきしておきます。
| ブレッドボードジャンパー線
| 180円
| ここでは9本ですが多めに買っておいた方が良いでしょう。
| |
XBeeモジュールには、ZigBeeに対応しているもの(ZBまたはZigBeeまたはSeries2またはS2、S2Bと表記されている)を使用します。親機にはXBee PROを薦めますが、子機用としてはXBee PROは乾電池では動作しませんので、XBee PROでは無い 通常のXBeeを薦めます。アンテナのタイプは、サイズが大きいほど変換基板やブレッドボードの悪影響を受けにくくなるので、ワイヤータイプか専用アンテナタイプがお奨めです。
下図は小物部品の拡大図です。「XBee周辺」と書かれた部分の3点の部品(XBee用コンデンサ、LED、LED用抵抗)は前述のとおり今回は不要です。
なお、今回は実験用なので温度センサと照度センサをXBeeに直結しています。このため、様々な要因で測定値に変動が発生しますが、Digi純正のセンサーと比べて、著しく悪ということはありません。しかし、販売用の製品を作る場合などにはこれだけの部品では不十分で、例えば、センサーの電源電圧の安定化や出力電圧を保持するためのボルテージフロア回路、XBee側の入力電圧(最大1.2V)を超過しないための保護回路などが必要になり、さらに測定値を校正する必要があります。
スイッチサイエンスの「XBeeピッチ変換基板とソケットのセット」の製作方法について説明します。秋月の「XBee用2.54mmピッチ変換基板」は後述します。なお、下図は青い基板ですが、古い基板は赤色でしたので、当サイトでは両方が混在しています。
スイッチサイエンスのピンピッチ変換基板には、上図のようにXBee用のソケットとピンヘッダが付属していますが、XBee用コンデンサ(0.1μF)、LED、LED用抵抗(1kΩ)を別途、用意する必要があります。
先にXBee用ソケット以外の部品をハンダ付けします。ソケットを先にハンダ付けすると、ピンヘッダのハンダ付け時にソケットを溶かしてしまう場合があるからです。ただし、LEDは後からの方がソケットのハンダ付けがやりやすくなるかもしれません。抵抗のすぐ下にあるパッドはハンダでショートしておきます。
ピンヘッダをハンダ付けする際は垂直になるように注意します。1か所だけハンダ付けして、溶かしながら角度を調整すると良いでしょう。10番ピンのGNDはハンダが溶けにくいので、出力の高めのハンダこてを使うか、パッドを良く温めてからハンダを流し込みます。
あとはXBee用のピンソケットをハンダ付けして完成です。
秋月のピッチ変換基板は、変換基板、2.54mmピンヘッダ2個、2.00mmピンソケット2個がセットになっています。変換基板にはIC1の部分に電源IC(LDO)が実装されています。その右側にジャンパーパターンJP1があります。
そのジャンパーパターンJP1をよく見ると、パターンが接続されているので、カッターナイフ等で切断します。遠視の方は拡大鏡が必要かもしれません。
変換基板に付属していた2.54mmピンヘッダを裏面に取り付けて表面でハンダ付けします。次に、ジャンパーパターンJP1のLEDが接続されている側のランドとXBeeの15番ピン(ASSOCIATEピン)にリード線をハンダ付けします。また下図の製作例では基板に「AE-XBee-REG-DIP」と書かれたスペースを切断しています。ここが飛び出ているとブレッドボードのスペースを無駄に占有してしまうからです。今回の製作では切断しなくても差し支えありません。(切断はカッターナイフで両面に深めのキズをつけてペンチで折り曲げると比較的容易に切断できます。くれぐれもケガをしないようにご注意ください。)
最後に表面に2.00mmピンソケットを取り付けて、裏面でハンダ付けして完成です。今回は乾電池2本を使って給電するので電源ICは不要です。取り外して入出力にジャンパー線をハンダ付けしても良いのですが、他の用途で使うかもしれないので残しておきます。ただし、およそ0.3Vの電圧降下が発生してしまいますので、乾電池を使い切る前に電池切れになっていまいます。
XBee用ピンピッチ変換の製作が完了したら、ブレッドボードでの製作図面(拡大図)を見ながらブレッドボードに部品を差し込んでゆきます。以上で製作は完了です。
ここで動作確認をしてみます。まずは製作したセンサー子機の電源を入れて、ASSOSIATEランプ(LED)が点灯しつづけていることを確認します。点滅していた場合は、コミッションボタンを4回、連続で押して初期化します。それでもすぐに点滅してしまうようであれば周囲に他のXBeeネットワークが常に参加許可の状態で動作している可能性があります。
次に親機がArduinoであればSample4_sensのスケッチを親機Arduinoに書き込みます。しばらくすると検索が始まるので、製作したセンサーのコミッションボタンを1回だけ押します。一息ついて(1〜2秒)から、再度、コミッションボタンを1回押すと、親機が子機を発見します。
その後、照度と温度が表示され、照度センサーを覆うと、照度が0になるようであれば動作確認は完了です。なお、照度も温度も正しい測定結果ではありません。Digi純正センサーとは得られる電圧が異なるからです。
それではスケッチ(ソースコード)を開いて、「照度測定結果」や「温度測定結果」のコメントのある部分を見てください。ここに「xbee_sensor_result()」という関数があると思います。この関数は照度センサ値が入力されるADCIN[1]の電圧からDigi純正センサーの結果を計算する関数です。
今回の照度センサーについては「value = (float)xbee_result.ADCIN[1] * 1.17302 / 3.3;」に書き換えます。ただし、この換算式は負荷抵抗が10kΩの時です。1kΩの時は3.3の部分を0.33に書き換えます。
温度センサーについては「value = (float)xbee_result.ADCIN[2] * 1.17302 / 10. - 60.;」に書き換えます。これで、再度、Arduinoに書き込めば、それらしい値が得られるようになるでしょう。
センサ
変更前
| 変更後
| 照度 | (10kΩ) // 照度測定結果 | value = xbee_sensor_result( ADCIN, LIGHT); // 照度測定結果 | value = (float)xbee_result.ADCIN[1] * 1.17302 / 3.3; 照度 | (1kΩ) // 照度測定結果 | value = xbee_sensor_result( ADCIN, LIGHT); // 照度測定結果 | value = (float)xbee_result.ADCIN[1] * 1.17302 / 0.33; 温度
| // 温度測定結果 | value = xbee_sensor_result( ADCIN, TEMP); // 温度測定結果 | value = (float)xbee_result.ADCIN[2] * 1.17302 / 10. - 60.; |
ここからは、これまでよりも高度な内容です。実用的なセンサーネットワークを組むのに必要な情報ではありますが、Arduinoでさっさとスケッチを作成したい人は、一旦、「3.絵っ!スケッチを描こう」に進んでいただいて、必要になった段階で戻ってきてもらえればかまいません。
← 1.さぁ準備を始めよう 2.ブレッドボードで作るセンサー 3.絵っ!スケッチを描こう →
製作したままの状態で実験をし続けると、アルカリ乾電池で丸一日も持つか持たないかといったところで、毎日、電池交換が必要で実用的ではありません。これは購入した状態の子機XBeeモジュールが「ZigBee Router」と呼ばれる設定になっているためで、子機XBeeを「ZigBee End Device」に設定変更することで消費電力が大幅に下がります。また、サンプルアプリでは親機から頻繁に測定指示を出している点も、消費電力の増大となっています。
子機XBeeをEnd Deviceへの変更するにはX-CTUを使用してファームウェアを書き換えます。親機となるArduinoの Wireless SD Shieldから親機用XBee PROモジュールを、一度、外して子機用XBeeモジュールを取り付けてX-CTUで書き換えます。詳しくは前ページ「ArduinoではじめるXBee 1.さぁ準備を始めよう」に記載のとおり、X-CTUの「Function Set」のファームウェアの種類の部分で「ZIGBEE END DEVICE AT」を選択し、「WRITE」を実行します。Arduino以外で書き換える場合は「XBee ZigBee 基本編 ワイヤレス通信を始めよう」を参照してください。
また、ファームウェアの書き換え後に、機能と消費電力のバランスをみながら、以下のような設定項目を調整します。ただし、End Deviceに設定するとパソコンのX-CTUとXBeeとの通信を行う直前に、XBeeのリセットを押す、もしくは電源を入れてから、すばやくX-CTUを操作する必要があります。あるいは、パソコン側の処理時間を考慮すると同時操作もしくはX-CTUの操作を先にしないと成功しない場合もあります。子機の作業が終わったら、Arduino Wireless SD Shield に親機用XBee PROを戻します。
これまでの例ではArduino親機から測定指示を出していましたが、End Device から一定間隔で測定を行って送信することも可能です。その設定がIR値です。IR値を60秒(EA60)に設定すると、60秒間隔で宛先のDHとDLに指定したアドレスに測定結果を送信します。ただし、親機から測定要求を出すxbee_force()関数は削除しておかないと、測定回数がかえって増えてしまいます。
AT
name
| 初期
| 例
| 説明
| SM
| Sleep Mode
| 0x04 | Cyclic 0x04 | Cyclic No Sleep(00)/Pin Hibernate(01)/Cyclic Sleep(04)/Cyclic Sleep Pin-Wake(05)の切り換え。Cyclic Sleep wakes on timer expiration.
| ST
| Time before Sleep
| 5000[ms] 0x03E8 | 1000[ms] シリアルやRFの通信終了後、省電力モードに移行するまでの待ち時間[ms]。 | SP
| Sleep Period
| 32x10[ms] 0x07D0 | 20秒 ZigBeeデータ通信のための省電力モードの持続時間x10[ms]。RouterとCoordinatorは情報の最大保持期間。設定範囲は0020(320ms)〜0AF0(28sec)。 | SN
| Sleep Number
| 毎回起動 0x0003 | (20×3)秒毎 外部CPUを起動するまでの起動カウンタ。SP後に通信データが無い場合は省電力モードになり、それがSN回続くと外部On/Sleep pinへON信号(H)を出力する。(SP×SNの間隔で起動) | SO
| Sleep Options
| 0x00 | オフ 0x00 | オフ 0x02 - Wake for ST time on each cyclic wake (after sleeping for SP*SN) | 0x04 - Enable extended cyclic sleep (SP毎にポーリングしない) DH
| Destination Address High
| 0x00000000
| 0x0013A200
| 測定結果を送信する宛先(親機)の上位アドレスを指定する
| DL
| Destination Address Low
| 0x0000FFFF
| 0xXXXXXXXX
| 測定結果を送信する宛先(親機)の下位アドレスを指定する
| D1
| AD1/DIO1 Config.
| 0x02
| ポート1(AD1/DIO1)をアナログ入力に設定
| D2
| AD2/DIO2 Config.
| 0x02
| ポート2(AD2/DIO2)をアナログ入力に設定 | (未使用に戻す場合は0x00に。) D3
| AD3/DIO3 Config.
| 0x00
| 0x00
| ポート3(AD3/DIO3)は使用しないので0x00のまま。 | (アナログ入力に変更する場合は0x02に。) PR
| Pull-up Resistor
| 0x1FFF
| 0x1FF9
| アナログ入力に設定したポート1〜2のプルアップを禁止します。ポート1だけがアナログ入力の場合は0x1FFD、ポート1〜2の場合0x1FF9、ポート1〜3の場合0x1FF1です。
| IR
| IO Sampling Rate
| 0x0000
| 0xEA60 | 60秒 デジタルIO入力およびアナログADC入力値を指定した宛先に繰り返し送信する間隔。0x0000に設定していると送信しない。設定範囲は0x0032(50ms)〜0xFFFF(約65秒)。 | |
子機をEnd Deviceに設定すると、なぜ、わざわざ変換基板上のLEDをASSOCIATIONインジケータに変更したのかが良くわかると思います。単に親機とのペアリング状態が分かるだけではなく、XBeeが動作するとASSOCIATEも点滅するのです。LEDが点滅し続けている間は大きな電流(約40mA)が流れ続けます。この場合、1日ほどしか電池が持ちません。
一方、XBeeの動作が停止するとLEDも消灯します。ほとんどLEDが消灯していて、ごくまれにLEDが点滅しているような場合、正しくスリープモードに入っているので、何カ月も動作し続けることが可能になります。
また、親機とのペアリング後の動作には注意が必要です。ペアリングが完了してもLEDが点滅し続けて、省電力にならない場合があるからです。そんな時は子機のリセットや電池の抜き差しを行うと省電力に移行します。親機からATSIを送信する「xbee_rat( adrress , "ATSI");」を実行しても省電力に移行します。
なお、前述のとおりEND DEVICEをX-CTUで読み込み/書き込みしようとすると、通信エラーが発生する場合があります。その場合は、XBeeの電源を入れてから(もしくはリセットボタンを押してから)ST時間内にX0CTUのRead/Writeを実行すると成功します。
ハードウェアでは温度センサや照度センサを、XBeeが動作しているときだけHレベルが出力されるXBeeの13番ピン(ONピン)から動作させればよいでしょう。今回の場合は温度センサと照度センサに電源を供給しているジャンパー線の電池側のピンを外し、XBeeの13番ピンに接続するだけで消費電力が数mAですが下がると思います。わずかな電流に思うかもしれませんが、乾電池で動作する機器での常時の消費電流はμAのレベルですので、mAは非常に大きな数字です。
もっと省電力にしてバッテリーの持続時間を延ばしたいという方は、前述のX-CTUでの設定項目を調整してみると良いでしょう。ただし、ST時間を短くするとX-CTUでの設定が不可能になってしまいますので、十分にご注意ください。
← 1.さぁ準備を始めよう 2.ブレッドボードで作るセンサー 3.絵っ!スケッチを描こう →