PICでTVリモコンを模擬した話 [電子工作]
2017年4月17日の日記
TVの近くに置いておいてこれをタイマーにしてon/offします。
このところ,PICで遊んでいます。道具をそろえるのが非常に面倒だし,また,ソフトを組むのもデバッグするのも本当に大変なんですが,自分でマイコンを使った機器を作れるようになるとなかなか便利です。
先日,子供用にタイマーつきのあんどんを作りました。今日はTVのリモコンを模擬したものを作ります。
そもそも,ちゃんとTVにはリモコンがついているのに,なんでわざわざPICでリモコンを作らなきゃなんないのか? って実はiruchanもそう思います。
ところが,こうしないといけなくなっちゃったんです。
実は,半年ほど前,某関西に本社があるP社(もちろん,"開拓者" のP社じゃありません)の大型液晶TVを職場で買いました。
といって,職場でTVを見るわけじゃなく,単にパソコンのモニター用として購入し,特定の画面を表示させておくためのものでした。
ところが.....。
ここに落とし穴がありました。パソコン専用のモニターとして使うなら,ちゃんとモニターを買うべきだったんです。
今は液晶TVはかならずHDMI端子がついていますから,そこにパソコンをつなげば大型モニタになるし,DVDやブルーレイも再生できる,プレゼンもできるので便利です。アナログのビデオ信号と違って1本のケーブルで音も出せるのは便利です。普段はTVとして使っていて,たまにパソコンからDVDを再生する,と言うこともできますね。
ただ,今回のように,パソコン接続専用,ということならちゃんとしたモニターを買うべきです。
なにがまずかったか,というと.....。
実はそのP社製の液晶TVは信号がoffの時は一応,省エネで電源をoffにできるのですが,次回,信号がonになっても起動しないんです!!!!
そんなの,パソコンの液晶モニターだったらそれこそWindows95の頃から,無信号時にはoffになり,パソコンをつけると自動的にモニターもonになる機能がついていて,わざわざ液晶モニター自身のスイッチをいじる必要はなかったのに,と思います。
ところが,あろうことか,そのP社の液晶TVはそんな簡単なことすらできないんです。
だから,夕方になって,退社するときにパソコンの電源を切るとか,スリープにすると,自動的に液晶TVもoffになるかスリープモードになって消費電力を減らし,朝,みんなが出勤する頃にパソコンが起動するかスリープから復帰すると自動的に液晶TVがonになって画面を表示させたいのですが,これができません。
まあ,一応は無信号時になるとoffにする機能はありますので,それを使えば,朝,誰かが液晶TVの電源を入れればいいだけの話なんですけど.....。
また,オンタイマーの機能はありますので,それを使おうと思いましたが,今度は肝心の時間情報がないのでこれすらできません。
と言う次第で,結局,どうしても地デジ放送をつながない限り,オンタイマーすら使えません。
どうせHDMIが着いているんだからパソコンから時間情報を取り込めばいいじゃん,と思うんですけどね....。あるいは初期設定画面で時刻を設定できればいいんですけど......。
とはいえ,そもそも無信号状態になったら自動的にoffにする機能くらい,簡単じゃないのか,と思います。
一応,そのP社になんとか時刻設定ができないのか,webから問い合わせしました。
ところが....。
すぐに返事が返ってくるかと思ったら返事が来たのはなんと1週間も経ってからでした.....orz。おそらく,自社の製品に都合が悪いことだから,と放っておかれたのか,それとも上司の許可を待っていたのか,それにしてもお客様からの問い合わせに1週間もかかる,というのはいただけません。また,回答も,時刻の設定画面はないし,地デジに接続しないと時刻設定できない,と言うものでした。
もうおっ~~~~!!!!!!
とうとう頭にきたiruchanは本件,ネットにさらしておくことにしました。もとからこのP社のTVやレコーダは番組表に広告が出て見にくいったらありゃしないってんで頭にきてるんですけど,この対応もいただけません。もうP社の製品は買いません!!
という次第ですが,別件で同じ頃,親に掃除機を買ってあげようと,某H社に掃除機について同じくwebから問い合わせをしたことがありますが,返事は翌日かな,と思っていたらなんと,10分もかからずに届きました。実は,そのとき,P社のとどっちにしようか迷っていたんですけど,もちろん,買ったのはH社です。
さて,とうとう,ここまで来るとPICでリモコンを模擬してTVの近くに置いておき,一定の時間になると電源on/offの信号を出させるしかない,と思いました。ただ,さすがにPICは時間情報はもっていないので,○○:○○にon/offする,というプログラムを作るには時計モジュールからI2Cバス経由で時間情報を取り込む必要がありますが,まあ,そこまでしなくても,という気がするので,単純に12時間ごとにon/offする,と言うプログラムにします。
一応,iruchanはPICが使えるようになったし,TVなどのリモコンは赤外線LEDを決められたコードに基づいて点滅させているだけなので,なんとかPICでできるはず,と思いました。すでに,ネットを見るといろんな方が試しておられますね。
今回はリモコンと言っても,電源スイッチの入切だけなので,電源ボタンを押したときの信号でLEDを点滅させればよいわけです。
一応,今回,いろいろと調べてみました。
TVなど,赤外線LEDを使ったリモコンは国内の電機メーカだと下記の3通りがあるようです。
☆家電協方式‥‥(財)家電製品協会に属する会社が使っているもの。P社,最近台湾系になったS社など。
☆NEC方式‥‥‥N社,H社,もうじきTV部門も売却のT社など
☆ソニー方式‥‥品川に本社があるS社
いずれもコード体系が異なるだけですからPICで作成可能だと思います。ここではP社が採用している家電協方式について説明します。
家電協リモコンのコードは次のようになっています。 クリックすると拡大します。
ややこしいのは,LEDが点滅してコードをTVに伝えますが,単純に1のときだけ点灯し,0のときは点灯しない,と言うようなパターンではありませんし,かつ,点灯しているときは連続点灯しているわけではなく,38kHzで点滅しています。
ビットが0の時にはずっと点灯しない,というパターンじゃないのは理由があり,CDの信号でもそうですけど,こうしちゃうとどこがビットの切れ目かわからなくなっちゃうからです。だから,0の時も1の時も必ずhighになる部分があり,そのあとのlowの時間の長さで0か1かを区別します。
CDの信号も同じで,ずっと0が続くとピックアップの信号がずっと0となるため,サーボ回路が働かなくなってしまうためです。
家電協方式のリモコンの場合はかならず,0.4msのhighとなる部分があり,その後,lowの部分が0.4msだと0,1.2msだと1を表すようになっています。
また,信号の始まりを表すリード部分があり,その後,4バイトのカスタムコードおよび2バイトのデータコードがあり,最後にストップビットがあります。NEC方式だと信号の訂正のため,反転ビットを続けたりしていますが,家電協方式はありません。
カスタムコードは早い話,メーカの識別番号で,各メーカにより異なります。
データコードは電源やch.ボタン,ボリウムボタンなど,各種のボタンごとのコードです。
実際に,リモコンの出力波形をオシロで調べてみました。
信号全体を示しています。先頭の太い部分はリーダーコードです。
やはり38kHzでスイッチングしていることがわかります。
と,ここまで来たらあとはそのカスタムコードと,電源ボタンのデータコードがわかればいい,と言うことになります。
といって,こういうことを一般消費者がメーカに尋ねると今の時代,何の目的に使うのかと根掘り葉掘り聞かれたりして,結構,面倒なことになりそうです。 でも,技術者は必要な情報ですし,メーカごとにマニュアルがあり,サービス会社や販売店などには開示されているはずです。
幸いにも,秋月電子のPICマイコン赤外線リモコン学習キットの取説にP社のコードがでていました。
ということで,P社のTVリモコンの電源ボタンのコードは次の通りです。
40, 04, 01, 00, BC, BD (16進)
最初の4つがカスタムコードで,あとの2つが電源ボタン操作時のコードです。メーカが異なる場合,同じ家電協のリモコンならカスタムコードが違うだけです。
これが2進法だと
0100 0000 0000 0100 0000 0001 0000 0000 1011 1100 1011 1101
となるわけで,これの0と1を上記のパターンで38kHzで変調してLEDを点滅させればOKです。
PICのプログラムは例によってGreat Cow Basicで作りました。
使用したPICはいつもの12F1822です。なんでか,というと12F1822はハードウェアPWMの機能がついていて,便利なんです。今回,38kHzでLEDを点滅させることが必要ですが,ハードウェアPWMの機能がついているとそのPWMの制御コマンドが1行で済んじゃうので簡単です。Great Cow Basicだと,単にHPWMというコマンドを使うだけです。
HPWM ch. freq duty
です。ch. は12F1822のPWM出力チャンネル(1822は1チャンネルのみなので1しかありません),freq は周波数(今回は38kHzなので38),duty はデューティです。Great Cow Basicは8ビットで表すので,最大は255です。
ソースファイルは次のようなものです。
回路は簡単なもので,前回のあんどんみたいに単にタクトスイッチとLEDをつけただけ,という感じです。配線も万能基板です。タクトスイッチを軽く1回押すと信号がでます。3秒以上,長押しするとタイマーが起動し,12時間ごとに信号を出すようにしました。
LEDは赤色のものと赤外線の2つ使っています。
なんでか,というと単に赤外LEDだけにしちゃうと肉眼では見えないので,テストがやりにくいんです。そこで,普通の赤色LEDを使ってモニターします。
もっとも,赤外LEDは目に見えないと言っても,CCDには見えちゃうので,デジカメで見れば薄紫色に見えますので,点灯しているかどうか確認できます。
というのは前から知っていて,それを利用していましたが,スマホの一部では赤外線に反応しないものもあるようで,スマホのカメラだとこのように見えないものがあるのでご注意ください。
なお,さすがにメーカさんも単純な赤外LEDだと見えないので何かと不便,ということで可視領域にも若干,感度を残しておいて,赤く薄く光る赤外LEDというのもあります。こういうのを使うと便利だと思います。
デジカメでは赤外LEDはうすく青 or 紫色に写りますが,肉眼では見えません。
ただ,最初,赤外LEDも,テスト用の赤色LED同様,PICの出力ポートに単純に100Ωの抵抗を介して取り付けたところ,やはり光量が不足なのか,TVの反応はいまいちでした。かなり近づかないとTVが反応しませんし,少しでもLEDを首を振ると反応しません。
実際,LEDに流れる電流を測定してみたら2.5mAでした。最近のLEDは高輝度なので,これくらいの電流でもものすごく明るいんですが,iruchanが使った赤外LEDは中古品だし,古いものなのでどうも光量が足りなかったようです。
それで,その電流制限抵抗を100Ωから33Ωにしたらおかしな現象が.....。
今度は赤色LEDも点灯しなくなってしまいました......orz。
てっきり,抵抗を替えたときにはんだづけをミスったか,といろいろ回路を調べてみますがダメ。
改めて12F1822の規格表を見てみると,出力電流は25mAまで,と言う記載があります。
でも,そこから先は何も書いてないんですが,それ以上の電流を取ろうとするとどうもPICが動作しないようです。ちゃんと保護機能が働くんですね。
しかたないので,1個,Trを使って電流を増幅することとしました。2SC1815のベースをon,offしてそのコレクタ電流で赤外LEDを点灯させることにしました。
これで75mAも流しました。さすがにかなりの大電流ですが,φ5mmのLEDは100mAくらいまでは流せるので大丈夫です。φ3mmのものだと25mAくらいまでですので,ご注意ください。やはり,LEDの電流制限抵抗を10Ωにしたのは小さすぎるようです。100Ωくらいがよいかと思っています。
こうやって結構,うまくいくようになりました。 3mくらい離れていてもP社のTVは無事にon/offできました。これで,12時間ごとに液晶TVをon/offできて省エネになりますね!!
2017年7月4日 追記
やはりタイマー式だと時間が正確ではなく,内部クロックのせいもあるのでしょうか,1日1分くらい早くなっていきます。
それに,PICだとそれこそI2Cバス経由で電波時計モジュールなどと接続するとかしない限り,カレンダー機能なんて無理ですから, 土,日はTVをつけない,なんてことはできません。
と言う次第で,パソコンから制御することにしました。また,当然ながらパソコンから電源も供給したいと思います。
と言って,パソコンでソフトを作ってなにかのポートに赤外LEDをつないでパソコンから直接on,offするなんて考えてみると,実は非常に難しいことなんですよね。
一昔前ならセントロニクス仕様のインターフェースが普通に付属していたので,そのポートをon,offすることができましたが,セントロニクスを使っていたプリンタがUSBになったのはずいぶん昔のことですし,今どき,パソコンでLEDをon,offしようなんて考えると大変です。普通ならデジタルI/Oボードの購入が必要でしょう。
そこで,iruchanはRS-232Cを使うことにします。
えっ!? と思う方も多いと思います。今どき,RS-232Cなんてパソコンにはついていませんよね。
もちろん,USBで接続します。
今回,製作したPIC仕様の基板にUSB⇔RS-232C変換基板を取り付けて,USB経由でRS-232Cを制御します。RS-232Cだといくつかのポートがあり,個別にon,offできます。
実を言うと,世の中,USB接続の機器でも内部構成はRS-232Cになっていて,出入り口の部分にこのようなUSB⇔RS-232C変換器を持っているものが多いのです。こういう機器はソフト側でも普通にRS-232Cのソフトを組んで,それがそのまま動きます。デバイスマネジャで使用するCOMポートを調べて,ソフトでそのポートを使う,という風に設定すれば昔のRS-232Cのソフトがそのまま使えます。
と言う次第で,iruchanは今回,VB.netでごく簡単なソフトを組んで,このPIC基板に接続しました。
ソフトは簡単なもので,RS-232CのRTS(送信要求)ポートを使います。これをon,offしてPICを制御します。
普通はRS-232Cなのですから,TxDやRxDを使うのでしょうけど,これらはデータ(早い話が文字列)の送受信用で,これらは自由に気ままな間隔でon,offしたりすることができないので使えません。
さて,さすがに変換器は必要なので購入します。
一昔前だとMAX232などのICをよく使いましたけど,今回はFT232Rを使います。最近はよく使われるようです。
これらはRS-232Cの信号レベルが通常のパソコンやマイコンで使う,TTLレベルじゃないので,それを変換するためのものです。RS-232Cは "0" が9Vで, "1" が-9Vとなっています。±15Vくらいになっている場合も多いです。
TTLだと "0" が0Vで, "1" が5Vですよね。
ただ,これだとどこかで線が切れていてずっと "0" になっていても,故障で "0" になっているのか,本当に "0" が続いているのか,わかりませんよね。そこで,RS-232Cは0でも1でも絶対値が0Vじゃないようになっていて,極性も反転します。電圧も大きいのでノイズに強く,電話線で信号をやりとりするのに便利で,今もファクスなんかでも使われています。
VB.netではserialport.RTSenableというメソッドがあるので,それをtrueにするかfalseにするかでRTSを "0" か "1" にできます。これで,PIC基板のタクトスイッチをon,offするようにしました。
単に,タクトスイッチの接点にTrを挿入しただけです。
最初,Trを使ったスイッチということなので,NPNのTrを使ったのですが,RS-232CのRTSポートはパソコンの電源を入れた状態ではRTSポートの電位は-9Vくらいになっていました。当然,USB⇔RS-232C変換基板のRTS出力は常時,5Vとなっていて,これじゃ,PIC基板を接続したときにはTVのon/off信号が出っぱなしで,TVがonしたりoffしたりするので,論理を逆にするためPNP Trを使っています。
この赤い基板,Amazonで売られているものです。中国のHiLetgoというブランドの FTDI FT232RLというもので,たったの230円ほどのものです。秋葉原のお店などで,別の同じ機能のものが1,000円くらいで売られていますが,これで十分でした。おまけに5Vと3.3Vのピンもついていて,入力のUSBの論理によらず,PCにつないだだけでPICなどに電源を供給できるのも便利です。Arduinoとの通信用としてもよく使用されているようです。
これで指定した時刻にTVをon/offできるようになりました。もちろん,土,日はTVをonしない,なんて簡単にできます。
といって,ハッピーマンデーのおかげで祝日はどうにもなりません。Microsoftも日本の祝日を返す関数なんて用意してくれてませんしね。結局,手動で祝日を記録したファイルを作っておいて,それを読み込むくらいしか手はありません。まあ,いろいろと手は考えられるんでしょうけどね。それにしてもハッピーマンデーなんて早くやめて!! って思うのはiruchanだけでしょうか。
今回,iruchanもVB.netを使いはじめなんですけど,驚いたことがあります。
なんと,デバッグをしたいのに,ブレークポイントが機能せず,通過しちゃうんです!!!!!
それこそ,最初は "はぁ?" って感じで,これには驚いちゃいました。なんでこんなことになるの?
ようやく原因がわかりました。モードがDebugになっていないとブレークポイントを無視しちゃうし,そもそもデフォルトがReleaseになっているからなんですね。ちょっと頭にきちゃいました。
こんばんは!
PICを本格的に始められたそうですが、「ようこそ」!!
一度はまったら、なかなか抜け出せない禁断の世界です(笑)
私も以前に赤外線リモコンの信号を読み取ってLCDに表示する回路を製作したことがあります。
http://vividhobby.blog.fc2.com/blog-entry-431.html
模型の電飾の操作には、スイッチより赤外線の方が簡単で便利で、活用しています。
by Vivid (2017-04-17 00:15)
どうもコメントをありがとうございます。
そうでしたか,さっそく拝見させていただきました。申し訳ありませんが,今回いろいろと調べた折には見つかりませんでした。
AIWAのデコードをされたようで,大変素晴らしいです。
またよろしくお願いします。
by iruchan (2017-04-17 08:15)
Great project!!!
by Evan (Anobium) (2017-05-14 01:06)
Dear Evan, thank you for your comment.
This project is intended to turn on/off the Panasonic TV sets for reducing energy consumption purposes.
by iruchan (2017-05-14 05:52)
検索中よらせていただきました。
似たような装置を作った事があります。
ある機器の電源がONになった時にチャイムを鳴らしOFFになった時にブザーを鳴らす機器です。
電源コードに線を巻き付け電流が流れている時に発生する電流を検出する方法で可能でした。
参考までに。
by たけぴょん (2018-03-21 22:35)
どうも情報提供ありがとうございました。
電流を検知するならホール素子など,いろいろ手がありそうですね。
by iruchan (2018-03-22 08:00)