ArduinoではじめるXBee M2Mネットワーキング
5.乾電池で動く無線リモート赤外線リモコン
〜開けゴマも夢じゃない。ようこそ未来の家へ〜

by ボクにもわかる地上デジタル

XBeeメインメニューへ戻る
地デジトップへ戻る

ZigBee 無線リモート赤外線リモコンの製作例
ZigBee 無線リモート赤外線リモコンの完成例

はじめに

 このページでは赤外線リモコンの送受信機能をもったXBee子機(Arduinoベース)を親機となるパソコン(Cygwin)から制御する「無線リモート赤外線リモコン」を製作します。また赤外線リモコン操作の履歴を収集するロガーにも対応します。
 赤外線リモコン信号をXBee無線によるワイヤレスで送信することで、子機を隣の部屋に設置して制御したり、あるいはスマートフォンを使って外出先から自宅の機器を制御することが出来るようになります。
 この機器は赤外線リモコン信号の送信だけではありません。赤外線リモコンの受信機能を持たせることで、普段、何げなく使用している各種の赤外線リモコンの操作履歴を収集することが出来ます。例えば、テレビの何チャンネルを良く見ていたかとか、エアコンを何時に何℃に設定したかなど、役立ちそうにない無駄な情報も年間を通して収集すればちょっとしたビッグデータです。(全部屋の赤外線データを1年間も収集すれば、エクセルで処理できないくらいの膨大なデータになります。)
 さらにArduino子機を乾電池で動かせるようにArduino、XBeeともに動作時以外はスリープする機能を付与しました。赤外線で家電を制御する類似の製品は多く登場してきましたが、「乾電池で動く」ところまでの製品はなかなか売られていません。XBeeを組み合わせた自作品でしか出来ない特長だと思います。

ZigBee 無線リモート赤外線リモコンの製作例
ZigBee 無線リモート赤外線リモコンの基板製作例(子機B)

親機パソコン(Cygwin)

 まず親機となるハードウェアですが、ここでは実験を容易にするためにパソコンを使います。それなりに複雑な制御・膨大なデータとなるので Arduinoで作る場合は必要な機能を絞り込んでからのほうが良いでしょう。WindowsパソコンにXBeeモジュールを接続するには「XBee USBエクスプローラ」を用います。
 親機のXBeeモジュールのファームウェアは「ZIGBEE COORDINATOR API」を用います。また、後述のArduinoで製作する子機には「ZIGBEE END DEVICE」のXBeeモジュールを用います。
 Windowsパソコン上にCygwinをインストールする方法は「Cygwinのインストール方法」を参照してください。また、当サイトで配布している「XBee 管理用ライブラリ ZB Coordinator APIソフトウェア」をダウンロードして、CygwinをインストールしたフォルダへZIPを展開します。Cygwinのコンソールで「xbee」ディレクトリ内で「make」と入力するとコンパイルが実行されます。例えばサンプルソフト(exe)は「examples」フォルダにツール類は「tools」フォルダに格納されます。
 なお、現時点のXBeeライブラリ(バージョン 1.92)にはサンプルのソースコード(sample60_ir.c)が含まれていませんので、本サンプルコード一式を下記からダウンロードし、「Cygwin親機用」フォルダ内の「sample60_ir.c」をexamplesに格納してください。(XBeeライブラリ Ver.1.93以降に収録予定。)

サンプルコード: sample60_ir.zip

子機Arduinoのハードウェアの概要

 ここでは実験用としてArduino UNOを使用しブレッドボードで製作する子機Aと、基板に半田付けして製作する子機Bの製作概要を説明します。子機Aもしくは子機Bの「どちらか片方」を製作します。以下に主要部品のパーツリストを示します。この他に配線類や半田、ケース、電池なども必要です。

ZigBee 無線リモート赤外線リモコンの製作例
ZigBee 無線リモート赤外線リモコン(子機は子機Aもしくは子機Bのどちらかを製作する)

 子機Aの主要な部品はArduino UNO本体、XBee ZBモジュール、XBee ピッチ変換コネクタ、赤外線リモコン受信モジュール、赤外線送信用LEDなどです。子機用のXBee ZBモジュールにはPROではないタイプを使用します。

リモート赤外線リモコン製作の主要部品
品名 参考単価数量 備考

Widnows PC -1 Windows 7を推奨
XBee USBエクスプローラ 1,280円1 参考資料
XBee ZB(S2)モジュール 2,900円1 PRO・RPSMAコネクタ型がお奨め(詳細)
XBee 専用アンテナ 550円1 RPSMAコネクタ型の場合に必要









5V
Arduino Uno SMD R3 2,390円1 改造する場合は秋月互換機を推奨
XBee ZB(S2/S2B) Module 1,700円1 子機End Deviceとして使用(PROはダメ)
XBee用2.54mmピッチ変換基板 300円1 ブレッドボードで作るセンサーで使用
上記用のLED、抵抗 50円1 必要に応じて
ブレッドボード 250円1 一例としてEIC-801
赤外線リモコン受信モジュール 50円1 SHARP GP1UXC41QS(3.3V/5V動作可)
高輝度赤外線LED 20円1 直径5mmタイプを推奨
電界/積層セラコンデンサ 0.1uF 10円2 マイコンとリモコンモジュール用
MOS FET Nch 2N7000 20円1 ID=200mA VGS=4.5V ※5V動作専用
小信号ダイオード BAT43 20円1 1S2076A,1N4148でも動作する
カーボン抵抗10Ω 1/4W 5円1 赤外線LED用。高電力タイプを推奨







3.3
V
Atmel ATmega 328P 250円1 Arduinoブートローダを書き込む(詳細)
ICソケット 28P 300mil 50円1 マイコンを外す必要があるため必須
水晶発振子 16MHz 30円1 リードの曲げ加工が必要
XBee ZB(S2/S2B) Module 1,700円1 子機End Deviceとして使用(PROはダメ)
DCDC搭載 XBee用ピンピッチ変換 1,200円1 Strawberry Linux製 MB-X
基板(ブレッドボード配線タイプ) 80円1 Picotec AZ0526(秋月で販売)
赤外線リモコン受信モジュール 50円1 SHARP GP1UXC41QS(3.3V/5V動作可)
高輝度赤外線LED 20円1 直径5mmタイプを推奨
電界/積層セラコンデンサ 0.1uF 10円2 マイコンとリモコンモジュール用
セラミックコンデンサ 22pF 10円2 水晶クロック用
NPN型トランジスタ 20円1 Icmax=500mA以上、HFE=100程度
カーボン抵抗1kΩ 1/4W 5円1 トランジスタのベース入力用
カーボン抵抗10Ω 1/4W 5円2 赤外線LED用。高電力タイプを推奨
電池ボックス 単3×2本用 60円1 実験用にはスイッチ付が便利
プラスチックネジ、ナット 20円2 XBee基板の下に予め入れておく

 Arduino UNOを用いる場合、USBシリアル変換や電源回路など消費電流を無駄使いしてしまっているデバイスがあります。乾電池による長期間の駆動を実現するには子機Bに示すような部品でArduinoも自作する必要があります。Arduinoを自作する場合はAVRマイコンを3.3V 8MHz動作にするなどによりXBeeモジュールと直結するとともに消費電力を削減することも可能です。(本ページの製作例では16MHz動作。)

子機Arduinoのハードウェアの配線方法

主要部品の実装(XBee以外)
子機B(3.3V動作)の主要部品の実装
※XBeeピンピッチ変換モジュール以外を先に実装する

(1) XBee ZBモジュール ⇔ Arduino

 各部品の配線方法について説明します。まずはXBee ZBモジュールです。子機のXBee ZBモジュールにはファームウェア「ZIGBEE END DEVICE API」を書き込んでおきます。また設定を初期化するためにX-CTUを用いて「Restore」を実行しておきます。
 子機Aの場合、5VのArduinoと3.3VのXBeeモジュールとを接続する必要があります。この場合は電圧の相互変換が必要です。最も容易な方法はArduino Wireless Shield(参考価格1870円)を用いることです。この場合、下表の6結線の内4結線を省略することが出来ます。XBee 9ピンのSleep_RQ信号はArduinoのDigital 4に、XBee13ピンのOn/Sleep信号はArduinoのDigital 3に接続します。
 もしくはXBee用2.54mmピッチ変換基板を用いて下表のXBeeモジュールとArduinoとの6本の結線を行います。

XBee ZBとArduinoとの接続
XBee ZB(3.3V) 接続 Arduino(5V) 備考
ピン 名称 ピン 名称
1 3.3V 直結 3.3V 電源 XBee Wireless Shieldは結線済
2 DOUT 直結 Digital 0 RX XBee Wireless Shieldは結線済
3 DIN ダイオード Digital 1 TX XBee Wireless Shieldは結線済
9 Sleep_RQ 直結 Digital 4 GPIO出力 ArduinoがXBeeを起動する信号
10 GND 直結 GND - XBee Wireless Shieldは結線済
13 On/Sleep 直結 Digital 3 割込みISR1 XBeeがArduinoを起動する信号

 この表ではXBeeの3番ピン(DIN)とArduinoのDigital 1(TX)との間に小信号ダイオードを挿入しています。ダイオードにはBAT43がお奨めです。より安価で入手しやすい1S2076Aや1N4148でも問題なく動作するでしょう。
 ダイオードのカソード側(K:マークのある方)をArduinoに、アノード(A)側をXBeeに接続します。XBee ZBモジュールが初期値のままであればプルアップされているので以上のダイオードの挿入だけで信号の電圧変換を行うことが出来ます。
 またXBeeの2番ピンのDOUTとArduinoのDigital 0(RX)とは直結します。さらにXBee 13番ピン(On/Sleep)をArduinoのDigital 3へ、XBee 9番ピン(Sleep_RQ)をArduino Digital 4へ直結します。
 以上のような3.3Vと5Vの信号の相互接続方法については「3.3V XBee 5V Arduino 信号電圧相互変換方法」に詳しく記しています。これらの接続方法は各デバイスのスペック上、動作しない場合がありますが、それはよほど運の悪い場合で、おそらく100台くらい製作したくらいでは問題ないと思います。一方、電圧や温度変化などを詳細に考慮しなければならないような「製品設計」を行う場合や何千台、何万台も製作する場合は、適切な電圧レベル変換回路の追加が必要です。
 子機BのArduinoとXBeeをともに3.3Vで動かす場合、上表の「DIN⇔Digital 1」間も含めて全て直結で結線します。子機Bの製作例の写真に従って接続すれば良いでしょう。

(2) 赤外線リモコン受信モジュール ⇔ Arduino

 SHARP製の赤外線リモコン受信モジュールGP1UXC41QSとArduinoとの接続方法に特に留意点はありません。赤外線モジュールの受光部側を見た時に左になる信号出力VOUTピンをArduinoのDigital 2番ピンに接続します。Arduinoのピンのうち割込みに対応しているのはDigital 2と3で、それぞれを赤外線モジュールとXBeeモジュールに使用します。(他のピンに変更する場合、割込みについても留意が必要です。)
 電源は5V、3.3Vのどちらでも動作しますが、モジュールのVOUT出力の電圧も変化するので、Arduino UNOに接続する場合は5Vを用います。

主要部品の実装(XBee以外)
子機A(5V動作)の主要部品の実装

赤外線モジュールとArduinoとの接続
GP1UXC41QS 接続 Arduino(5V)
ピン 名称 ピン 名称
VOUT 直結 Digital 2 割込みISR0
GND 直結 GND -
VCC 直結 5V 電源

(3) 赤外線リモコン送信LED ⇔ Arduino

 赤外線リモコン送信用のLED部は子機Aと子機Bとで異なります。子機Aは入手しやすく普及している汎用のMOS FET 2N7000を用います。一方、3.3Vで動かす子機BではこのFETが使用できないので、少し入手しにくいトランジスタを用います。
 子機Aの赤外線リモコン送信LEDはArduinoのDigital 12番ピンに接続します。LEDと負荷抵抗を直列に接続しても発光しますが、発光強度が弱いのでMOS FETを用いて強めます。そこで、ArduinoのDigital 12番ピンをFET 2N7000のG(ゲート:中ピン)に入力し、FET D(ドレイン:右ピン)を赤外線LEDのカソード(リードの短い方)に、FET S(ソース:左ピン)をGNDに接続します。ハードウェアが完成してもすぐにLEDの電源を入れてはいけません。Digital 12がオープンやHigh出力になると大きな電流が赤外線LEDに流れ続け、LEDやマイコン、FETが壊れる可能性があります。必ずスケッチを書き込み、マイコンの動作を確認し、さらにDigital 12がLow出力になっていることを確認してからLEDの電源を接続します。

赤外線LEDとArduinoとの接続(子機A 5V)
赤外線LED 接続 MOS FET Nch 接続 Arduino(5V)
ピン 名称 ピン 名称 ピン 名称
- - - S(ソース) 直結 GND -
- - - G(ゲート) 直結 Digital 12 GPIO出力
K(カソード) 直結 D(ドレイン) - - -
A(アノード) 抵抗 10Ω 1/4W 経由 +5V 電源

 子機BではNPNの2SCトランジスタを用います。私は手元にあったローム製2SC4115を使用しました。赤外線LEDのスイッチ動作だけなのでIcmax=500mA以上、HFE=100程度のトランジスタであれば、例えば2N4401、2N5550Gでも使えると思います。
 ArduinoのDigital 12番ピンを1kΩのベース抵抗を経由してトランジスタのB(ベース:トランジスタの型番表示面からみて右側ピン)に入力します。※写真ではトランジスタのB(ベース)が左側に向いています。
 トランジスタのC(コレクタ:中ピン)は10Ω2個の抵抗を経由して赤外線LEDのカソード(リードの短い方)に接続します。また赤外線LEDのアノード(リードの長い方)は電源に接続します。子機Aと同じようにDigital 12がLow出力になっていることを確認してからLEDの電源を接続します。

赤外線LEDとArduinoとの接続(子機B 3.3V)
赤外線LED 接続 トランジスタ 接続 Arduino(3.3V)
ピン 名称 ピン 名称 ピン 名称
- - - E(エミッタ) 直結 GND -
K(カソード) 直結 C(コレクタ) - - -
- - - B(ベース) 1kΩ Digital 12 GPIO出力
A(アノード) 抵抗 5Ω 1/2W 経由 +5V 電源

(4) インジケータ、スイッチ

 以上の他にArduino用リセットスイッチ(Arduino UNOに実装されている)やArduino Digital 13のインジケータ(これもArduino UNOに実装されている)が必要です。リセットはペアリング時に使用します。Digital 13のインジケータは点灯時にスリープが解除されて動作していることを示しています。また起動後にネットワーク不参加だった場合などに高速に点滅し、ペアリング中であることを示します。

(5) 電源

 Arduino UNOを用いた子機Aの実験段階ではUSBからの給電で良いでしょう。ACアダプタを使用する場合は7V〜12Vのものを使用します。9Vあたりが良いでしょう。乾電池で動かす場合は単3電池4本(6V)を直列に接続してDCジャックに入力します。ただし、前述のとおりArduino UNOそのものがリーク電流を有しています。

 子機BはXBeeピンピッチ変換モジュールにDCDCコンバータを内蔵しています。このモジュールの11番ピンと12番ピンに単3電池2本を直列の電源を接続します。また、下図のようにマイコンの8番ピンと22番ピンの2つのGNDを裏面で接続、同様に7番ピンの+Vと20番ピンのAVCCも裏面で接続します。

主要部品の実装
子機Bの実装例(裏面)

 これらの配線は交差するので互いにショートしないように絶縁が必要です。下図はGNDをリード線で配線し、その上にポリイミドテープを貼り、+VとAVCCを耐熱コードで接続、また耐熱コードの両端の半田付け部をハックルー(熱可塑性ポリアミド樹脂)で固定しました。

主要部品の実装
マイコンの裏側の電源が交差するので絶縁する。
半田ヤニのように見えるのがハックルー(熱可塑性ポリアミド樹脂)

 以上で完成です。下図はXBeeモジュールを搭載する前の完成例です。基板の上部と下部の赤(+側)と黒(-側)のコードは電池に接続します。また、これらのコードを半田付けだけで支えていると、すぐに外れます。コードを動かすと、硬化しているコードの半田付け部を起点に折り曲がるからです。したがって、コードをテープなどで固定しておくと、耐久性がぐんと上がります。よく見るとテープの隅を接着剤で固定していることも分かると思います。

主要部品の実装(XBeeなし)
子機Bの完成例(XBee実装前)

(補足1) 自作Arduinoの単一電源化

 ここで、少しだけArduinoを自作する方向けの情報を掲載します。Arduino UNOを使う場合は不要なので次の節に進んでください。
 Arduino UNO上にはUSBシリアル変換ICが実装されていますが、Arduino用のスケッチをArduino UNO等でAVRマイコンに書き込んでおけば、その後(普段)は無駄な電力を消費するだけの存在です。またArduino UNOには5Vと3.3Vと2つの電圧を出力する電源回路が実装されています。電源回路はArduinoが非動作時も僅かな電流を消費し続けるので、単一の電源電圧に統一することで節電することができます。
 そこで、子機Bの製作例ではXBeeで用いる3.3Vのみの電圧に単一電源化しました。但し、電流容量を考慮し、赤外線LEDは電池から直結しています。
 この子機Bの例以外で最も簡単な単一電源化は単3電池3本(4.5V)からLDOタイプのレギュレータで電圧を安定化することです。レギュレータの選定時は回路全体の動作時消費電流だけでなく無負荷時電流も考慮します。例えば0.1mA以下のものを使用します。あるいは、降圧型のDCDCコンバータ(RECOM製スーパー3端子レギュレータ R-78E3.3-0.5)を用いても良いかもしれません。DCDCコンバータは「Arduino動作時」の効率を高める働きをします。ただし、その一方でスリープ中のリーク電流が増大する欠点があります。例えば、RECOM製の場合0.5mA程度のリーク電流が流れます。さらにMINMAX製の製品だと3mAもの無負荷時電流が流れます。あまり電池寿命が変わらないのであればLDOの方が良いでしょう。

(補足2) 自作Arduinoの3.3V 16MHzは規格外

 AVRマイコン ATMEGA 328Pの仕様上、3.3V動作時のクロックは13MHzが上限であり、Arduino UNOと同じ16MHzで動かすと熱暴走しやすくなる懸念があります。
 本来であれば3.3Vで適切に動かすためにクロックを8MHzに変更する必要があります。また、8MHzにすることで動作時の消費電力も下がります。また、8MHz動作に変更した場合、Arduino IDEでのコンパイル時に「Arduino Pro or Pro Mini(3.3V 8MHz) w/ ATmega328」を用います。
 このような規格外にも関わらず16MHzで動かしているのは、このサンプルスケッチだと赤外線リモコンの送信機能が使えなかったからです。確認のため、マイコン内蔵のRC発振器(8MHz)を使用して、赤外線リモコン信号を送信してみたところ、制御対象の機器が反応しませんでした。RC発振器や処理時間が増大によって信号の搬送波の周波数がずれてしまったことが原因だと思います。この対策を行うにはスケッチ「ir_send.ino」のFLASH_AEHA_TIMESやdelayMicrosecondsの引数などのパラメータ調整を行います。
 一方、実際に3.3V 16MHzで実験してみたところ、日常の室内環境では3.3V 16MHzでも問題なく動作し、3.0Vくらいまで16MHzで動き続けることが確認できました。パソコンのCPUと比較すればクロック速度に十分な余裕がありそうにつき、オーバークロック状態で使うことにしました。さらに、今回のサンプルではスリープを多用しているのでマイコン内部の温度はほとんど上がりません。
 以上のような理由から子機Bの製作例では3.3V 16MHzで動かすことにしました。Arduino IDEでスケッチを書き込むときは「Arduino Duemilanove」を選択すれば良いでしょう。
 なお、生産ばらつきによって性能が変化しますので、心配な場合は本サンプル以外の(スリープなし)のサンプルスケッチを書き込み3.3Vで丸一日も動き続ければ、問題ないと考えることが出来ます。

(補足3) 自作Arduinoのこだわり

 自作Arduinoといっても「マイコンにファームウェアを書いただけ」と思われるでしょう。もちろん正しいですが、ブレッドボードを使っている都合上の、こだわりがいくつかあります。
 例えば、16MHzクロックの水晶発振子ですが、ここでは表面実装タイプを使用しました。ブレッドボートで製作する際、ピンピッチ間隔が2.54mm間隔になるのでマイコンのクロックが実装しにくい課題があります。そこで絶縁台座つきの表面実装部品を使用し、水晶のピンを2.54mmピッチ間隔に加工することで、リード線が金属ケースに接触するなどの不具合が起こらないように考慮しました。
 また、制約の多いブレッドボード配線やIC/モジュール部品のピン制約の中で電源やGNDの配線にも一定の留意を行いました。基板の中央付近を上下に横断した部分をGNDの起点と位置付けて、1点電源パターン、1点アースパターンに近づけました。赤外線リモコン受信モジュールのGNDを赤外線発光LED部から引き回しているのも、こだわりの一つです。これらは同時には動かないので、受信モジュールのGNDはLED部と直列のGNDにしてでもマイコンのGNDに戻す方が良いと考えました。また、水晶クロックのGNDを経由しないようにも考慮しました。他にも課題は書ききれないほど多くありますが、それらをトレードオフした結果がこのパターンに集約されています。
 さらに、回路図を書かなくても写真だけで配線図が分かるようにも留意しました。なので、回路図は作成していません。
 このパターンをコピーしたり真似していただくことは光栄ですが、このサイト「https://bokunimo.net/bokunimowakaru/」を参考にした程度の情報は残していただけるよう、お願いいたします。

主要部品の実装(XBee付)
子機Bの完成例(XBee実装後)

子機Arduinoのソフトウェア概略

 子機の役割は赤外線リモコン受信モジュールで受けたリモコン信号を解析することと、親機から送られてきたリモコン信号を赤外線LEDを使って送信することです。これらの処理にはマイコンが必要であり、その役割をArduinoが担います。
 サンプルスケッチは「sample60_IR_Remote」フォルダに入っており、ir_read.ino、ir_send.ino、sample60_IR_Remote.inoの3つのinoファイルから構成されます。フォルダ名と同じsample60_IR_Remote.inoがメインとなるスケッチで、ir_read.inoが赤外線リモコン信号の読み取りと解析を、ir_send.inoが赤外線リモコン信号の送信を行います。
 対応している赤外線リモコンフォーマットは家製協AEHA方式、NEC方式、SONY SIRC方式です。切り替えは親機から行います。(今のところ複数のフォーマットの同時受信は行えません。)
 setup関数ではXBeeや赤外線リモコン送受信に関する初期化と親機とのペアリング処理、XBeeモジュールの省電力動作設定を行います。ペアリングは本子機から親機へxbee_pingで応答を確認し、応答が無ければxbee_ataiでネットワーク参加状態を確認し、参加状態になるまでコミッショニングボタン信号を約2秒おきにソフトウェアで押下します。省電力設定はATコマンドを用いxbee_at関数で設定します。また、XBeeモジュールが「ZIGBEE END DEVICE API」以外の場合は動かないようにしています。
 loop関数はスリープ単位で動作するように構成しました。まず、割込みの設定を行い、system_sleepにてArduinoをスリープモードに移行します。そして、赤外線受信モジュールもしくはXBeeからの割込みが入るとスリープを解除して動作します。ardIsrSrcは割込みの種類を保存する変数です。赤外線受信の時は0、XBeeからの割込み時は1が入ります。
 赤外線リモコン信号を受信した時はスリープ解除後に速やかに赤外線の解析を行います。遅延が生じるとコードを消失してしまうからです。解析結果は親機にxbee_bytesで送信します。
 XBee ZBモジュールはxbee_off関数でスリープ状態になっています。ATSPで設定されたスリープ期間SP値=0x01F4(5秒)を過ぎるとXBee ZBモジュールはワイヤレス受信のための起動を行い、受信データが無ければ再びスリープに戻ります。受信データがあった時はArduinoに割込みをかけてスリープを解除し、起動したArduinoはXBeeの受信データを受け取ります。
 このようにSP値によるスリープ時間中の子機は親機からのデータを受信することが出来ません。この時間を長くすると親機から子機への伝達遅延も大きくなる一方、乾電池が長持ちします。例えば、同じ部屋の機器をリモコン操作する場合の伝達遅延と、例えば朝に2階の寝室で目覚めた時に1階のエアコンの電源を入れる場合や外出先からの制御などと比べると、実用上で許容される遅延範囲が大きく異なります。今回はSP値=5秒としましたが、最大28秒まで設定することが出来ます。
 さらにATSNで設定するSN値があります。SP×SNの間隔でXBeeにデータ受信が無くてもArduinoを起動します。今回のスケッチでは何も実行しませんが、センサー測定値などを親機に送信するために使用します。ここではSN値=0x24(36回)と設定し、5秒×36回=約180秒(3分)毎に起動します。

応答性の向上

 用途によっては赤外線リモコン送信を行う場合の遅延が問題となります。まずは前述のSP値を小さくして遅延を減らします。
 ACアダプタを使用した電源でも良い場合は、Arduino側の子機XBee ZBモジュールをRouter(ファームウェア=ZIGBEE ROUTER API)として動かせば容易に瞬時応答を実現することが可能です。Arduino側のスケッチ内の「End device以外の場合は動かさない」と書かれた部分の「while(1);」やスリープ関連の「system_sleep();」などを削除することでRouterに対応することが出来ます。

赤外線リモコン信号のXBee通信フォーマット

 本ソフトウェアで用いる赤外線リモコン信号のフォーマット(XBee通信区間)を下表に示します。この信号はxbee_bytes関数を用いて親機と子機とのXBee通信(双方向:子機が赤外線受信した信号は子機から親機の通信に、親機から子機を経由して赤外線を送信する場合は親機から子機の通信)に用います。当サイトの関連書籍のサンプル60と同一フォーマットとしました。
 始めの[ESC][I][R]の3バイトの値は固定です。TypeはAEHA=0、NEC=1、SIRC=2を表し、Sizeは以降の赤外線データのバイト数を表します。

赤外線リモコン信号のXBee通信フォーマット
data[0] data[1] data[2] data[3] data[4] data[5]〜
ESC 'I' 'R' Type Size 赤外線データ
0x1B 0x49 0x52 0x00 0x06 0xAA 0x5A 0x8F 0x12 0x14 0xF1

 なお赤外線リモコンコードを受信する赤外線フォーマット(AEHA/NEC/SIRC)を変更したい場合はSize=0として上記XBee通信フォーマットに準じた5バイトのデータを親機から子機へ送信すると子機Arduino側に赤外線フォーマットを設定することが出来ます。

実行の様子

 Cygwinコンソールからの実行の様子を下図に示します。まず「examples」フォルダ内の「sample60_ir.c」をコンパイルし、シリアルCOM番号を指定して実行します。

xbee@pc ~/xbee
$ gcc examples/sample60_ir.c -o examples/sample60_ir

xbee@pc ~/xbee
$ ./examples/sample60_ir 5
Serial port = COM5 (/dev/ttyS4)

--------------------
ZB Coord 1.91
by Wataru KUNINO
--------------------
00112233 COORD.

[DD:71]CAUTION:ATNJ=(FF)
Found a Dev. : 00 13 A2 00 40 69 2D 4C
Recieved[11] : 1B 49 52 00 06 AA 5A 8F 12 14 F1 .IR...Z....    ←@
Recieved[11] : 1B 49 52 00 06 AA 5A 8F 12 15 E1 .IR...Z....    ←A
+ -> Accepted                                                  ←B
AQOUS Vol. Up
Send IR [11] : 1B 49 52 00 06 AA 5A 8F 12 14 F1
Recieved[ 2] : 4F 4B OK
Done Send IR
q -> Accepted                                                  ←C
Read IR
Done

xbee@pc ~/xbee
$

 次にArduino子機を起動します。既に起動していた場合はペアリングを実行するためにArduinoをリセットします。しばらくすると「Found a Dev.」と子機のIEEEアドレスが表示されます。
 この状態で子機のある部屋でテレビなどの赤外線リモコンのボタンを押すと親機に@のようなコードが送信されます。Aは別のボタンを押した時です。
 またCygwin上でパソコンのキーボードから「+」キーを入力するとSHARP製のテレビの音量を上げることが出来ます。前述のとおり実際に赤外線を発光するまでに最大5秒の待ち時間が必要です。また数字キーでチャンネル変更、「0」で電源をON/OFFすることも出来ます。テレビの電源のリモコン信号のONとOFFは共通なので、リモート操作するには「
消費電力を測る」などの方法でテレビの電源状態を知る必要があります。「q」で終了です。
 リモコンコードを学習登録することも可能です。Cygwinからキーボードの「r」キーを入力すると、学習モードに入ります。ここで、赤外線リモコンを操作して受光すると信号を学習します。学習した信号は「Enter」キーで送信することが出来ます。(サンプルでは学習結果を保存する機能はありませんので、電源を切ると消えます。)
 子機の赤外線リモコン信号のフォーマットを変更するにはCygwinからキーボードで「a」「n」「s」のキーを入力します。それぞれ、「a」=AEHA、「n」=NEC、「s」=SONY SIRC方式を示します。AEHA方式の状態でNEC方式の赤外線リモコン信号を受信しても何らかのコードが得られますがデタラメです。その信号を送信しても機器を操作することは出来ません。
 なお現時点ではArduinoの起動後の初回スリープ時に赤外線リモコンを受光してもXBee側に送信できない問題があります。理由は不明ですが、5秒を過ぎて2回目のスリープに入ると正常に動作します。

 他のテレビやエアコンなどを操作したい場合は、親機側のソースコード「sample60_ir.c」の変更が必要です。「IR_DATA_SHARP_TV」の定義部分などを参考にしてください。

あとがき

HALコーポレーションのクロッサム
HALコーポレーションのクロッサム2+USB

 赤外線リモコン信号を使って遠隔制御するシステムは古くはHALコーポレーションのクロッサム(上図)やバッファローの「Remote Stationなどがあり、最近ではiRemoconなど様々な商品がありました。
 音声認識ボード(一例=EasyVR Shield)と組み合わせれば、「エアコンつけて」と話すだけでリモコン制御することが出来たり、他の部屋や屋外から制御したり、パソコンなどで自動制御するということも可能です。しかし、これらは送信機にパソコンやLAN、ACアダプタなどを接続しなければなりませんでした。
 このページで紹介した「無線リモート赤外線リモコン」の子機は家中に設置することが出来ます。その最大の特長は「電波によるワイヤレス通信」と「乾電池駆動」です。

 とはいえ制御だけでは、まだまだ高価なシステムとお考えかもしれません。しかし、赤外線リモコンのデータロガー機能は活用範囲が高まるかもしれません。このデータログを欲しがる人は多いはずだからです。例えば、ウェザーステーション 「Netatmo」のように購入者の自宅の室内環境と自宅周辺の環境データをクラウドにアップするシステムが登場しています。このような仕組みでビッグデータとして活用する用途が考えられるのです。


4.家中どこでも情報表示  5.開けゴマ!無線リモート赤外線リモコン  6.家中の機器が連携すれば


XBeeメインメニューへ戻る

地デジトップへ戻る