赤外線制御編1


久しぶりの更新。どうもさわる暇が無くて・・・。

今回のネタは赤外線LEDを使ってリモコンの信号を送ろうというもの。 「とりあえず」反応するので、現状のプログラムについて書くことにする。

前回のPWMによるモータ制御は今回の伏線・・・というのは嘘。何も考えてない。

・リモコンの仕組み

赤外線を使ったリモコンの波形はだいたいこんな感じ。


最初に「これから送るぞーっ」っという長めに光った後、短いパルスを何回も出す。どこにデータが含まれているのかというと、パルスとパルスの間隔にある。間隔が短ければ「0」・間隔が長ければ「1」としている。この波形の例だとデータ量は32ビット。

これだけなら簡単なんだけど搬送波の問題がある。光っている部分を拡大すると、ただ光っているだけでなく、約38kHzで点滅している。このON/OFFをソフトウェアですると凄い負荷になってしまう。けれど別にやってできないことはない。X68000ではタイマを利用して力技でやっていた。さすがに10MHz機ではそれで精一杯だったけど。H8ではスマートな方法がある。PWMを使えばよい。PWMの出力をON/OFFして上の図の波形を出せばいいだけ。楽ちん。欠点はタイマを2つ使うことかな?


・ハード

ハードウェアは既に出来上がっている。X68000用に作ったのをそのまま利用する。元は「OutsideX68000」という本に載っていた回路で、少々手を加えている。


間のごちゃごちゃした部分は連続点灯防止回路。プログラムが暴走して光りっぱなしにならないようにしている。電流を多めに流している(右の3というのは3Ω)ので、光りっぱなしになるとヤバい(LEDがプッツン)。
左の8pinというのはX68000のジョイスティック端子なのでAKI−H8では・・・TIOCA-1に決めた。


・ソフト

仕組みのところで書いたとおり、動作は簡単。38kHzのPWMをON/OFFしているだけ。PWMはタイマ1、その制御にはタイマ0を使うことにする。

通常の状態ではタイマ0・タイマ1共に眠ったまま。信号を送れという指令が来たら、タイマ0が動きだす。タイマ0は割り込みを発生し、その間隔はリモコンの信号のパルス幅とする。よって、タイマ0の割り込み処理ルーチンの仕事は2つだけ。PWMのON/OFFと、リモコンデータ(ランレングス圧縮)を読み込んで次の割り込みまでの時間を設定。

あとは・・・そんなもんかな。ソースが全て物語っている。


・データ

送ることばかり考えていたけど、その送るデータはどうすればいいのか?それは、X68000用に作ったデータを利用することで解決する。今までいろんな信号をサンプリングしたし。ただ、それだとデータを作るにはX68000が必要になるわけで、将来的にはH8で作れるようにしたい。

データフォーマットは単純。最初に全体のデータサイズ(それ自身も含む)を2バイト。もちろん(?)ビッグエンディアン。インテルな人はビッグエンディアンに移行する癖を付けよう(と勝手なことを言うモトローラな人)。次にONの時間のランレングスデータ。その次はOFF。これがずっと繰り返されているだけ。ランレングスの単位は1/76k秒。基本的には1バイトだが、255までに収まらなかった場合は、H'00の後に2バイト使うことにする。

ちと後悔。データはONのランレングスで始まってONのランレングスで終わるので、個数は奇数。データは全て奇数サイズになってしまう。美しくないよなぁ(と感じるのは僕だけ?)。


・ハードその2

LEDには約1Aの電流が流れる。その電源はAKI-H8上のレギュレータ78N05。78N05は最大0.3A。よって全然足りない。一応、リモコンの電源部に100μFの電解コンデンサをつけたけど、連続で流すと電圧が降下してしまう。少し試したところ、8秒ほど赤外線LEDを光らせる(38kHzで)とマイコンにリセットがかかってしまった。普通に使う分には大丈夫って事でそのままにしておく。あとで、レギュレータを変えないとね。


今回のプログラム

REMO001.LZH 5,196 bytes

実験で作ったプログラム。
1秒おきにソニー製MDプレーヤに対して電源のON/OFFの信号を送るふざけたプログラム。
ドキュメントはまだ無し。


続くのか?
ご意見・ご感想は kumon@sam.hi-ho.ne.jp までどうぞ。

戻る