何か作った系

【自作】PICマイコンで赤外線学習リモコンを自作する②:赤外線通信の解析とソフト設計

前回赤外線受信・送信に必要なハードウェアを設計しました。

今回はプログラムの内容を考えてまとめる予定。

”世界最強級”と書いてますが、ネタではないです。

ソフトのつくり的にどんな通信フォーマットの信号が来てもコピー・送信ができるようなソフト作ります。

前回の記事
【自作】PICマイコンで赤外線学習リモコンを自作する①:試作基板作成

オイオイオイオイーーーー!! Youtube動画3本投稿してから1年たってんじゃねぇかよぉッ!! 三日坊主、極まれり。 Youtube 再始動 1年目に3本動画を投稿して力尽き、あれから1年が経過した ...

続きを見る

ソフトウェアを作る

今回作成するのは赤外線学習リモコンなわけですが、マイコンがそこまで高性能ではないのでできることが限られてます。

前回ざっくりと決めた仕様は以下の通り。

上記の機能を持たせるために、今回は大きく以下の二つに分けてプログラムを作っていきたいと思います。

・学習リモコンの操作・表示・動作切り替え等の主要な動作遷移
・赤外線リモコン信号の受信・送信に必要なロジック

学習リモコンの動作遷移をざっくり決める

今回は入力として、

・赤外線信号コピーSW
・赤外線信号送信SW
・赤外線信号送信周波数SW

の3つがあります。それぞれの機能や役割についてはまた後で説明したいと思います。

ざっくりですが、ボタンが押されたらそれぞれの処理に分岐するようにしたいと思います。

以下の図で三角形は信号がL➡Hに変化した時を、赤色の三角形はそのう有効なエッジを表しました。

プログラムがめんどくさくなりそうなので、1つのスイッチを押しているときはほかのスイッチの入力を受け付けないようにしました。

赤外線信号の解析

続いて赤外線受信処理を考えます、と言いたいことろですが、赤外線通信について何も知らないのでまずは勉強してみました。

今回作るのは学習リモコンなので、流れとしては、

赤外線信号を受信➡赤外線信号をコピー&保持➡赤外線信号を送信

の流れになります。

赤外線信号がどんな感じの信号なのかもよくわかっていないので、今回はその辺も調べてみました。

前回作った以下の回路で、フォトトランジスタに赤外線リモコンの発行部を当てると次のような波形が出ます。

基本的にギザギザ下波形が繰り返されています。

この信号のうち、ひとまとまりの部分が一回分の送信です。今回は観察用に何度も押しましたが、メーカーによっては一回ボタンを押しただけで2回送信したりするものもあるようです。

赤外線通信で送信されている”データ”を観察する

この波形をもっと拡大してみると、以下のような波形になっています。

HになったりLになったりしている部分があるかともいますが、実はこれが赤外線リモコンから送信されているデータになります。

このパルスの幅に意味があります。

例えば上記の画像で一番最初に来ているパルスは、そのあとのパルスに比べて幅が狭く、だいたい同じような感じの間隔になっています。

最初のパルスは通常”スタートパルス”と呼ばれるらしく、「これから赤外線信号の送信を始めますよ」という合図を送っています。

それ以降のデータはメーカーの識別であったり、赤外線信号を受信する機器がどのような応答をするかを決めるためのデータ(数値)を表しています。

赤外線通信のデータのフォーマットについては、以下のサイト様で詳しく解説されていました。

日本向けだとだいたい同じような規格になっているらしいですが、海外製の機器だと全く異なる通信方式になっていることもあるそうです。

赤外線通信の”信号の送り方”を観察する

次に、赤外線通信を知るために必要な”送り方”についてみてみます。

実は先ほどの画像のうち、Hになっている一つの波形を見てみるとずっとONになっているわけではなく、より高い周波数で揺れていることがわかります。

だいたい周波数は37~38kHzでした。

これは赤外線通信において、サブキャリア波と呼ばれます。

やっている内容としては、先ほど全体で見たHやLの集まりであるデータを、より細かい周波数で刻んで(PWMして)送信しています。

この理由ですが、これは単に家電といっても、エアコンやオーディオ、スマート家電等、いろいろな機器が混在しているので、これらの信号が混ざらないようにする役割を担っているそうです。

赤外線信号においては、受信側の機器が、リモコンから送られてきたデータが正しいだけでなく、刻んでいる周波数がだいたい正しいかどうかも見て、受信信号が正常かどうか判断しています。

実は今回、信号コピーSW、信号送信SWだけでなく、周波数(Hz)変更スイッチもつけています。

今回はせっかく自作するので、市販品のように「SONY限定」みたいな縛りなく、どんなメーカーのリモコンの信号でも受信できるようにしたいです。

なので送信時に周波数を変えられるように、スイッチを追加しています。

受信時にサブキャリア波による揺れを消し、データだけを取り出してみる

次に信号をどう受信するかについて考えてみます。

今回はコピーした信号、送信時に周波数を選択して送信したいので、受信時には周波数の情報はいらないです。

なのでこれを消すことを考えます。

実はフォトトランジスタに赤外線信号を当てて出力を見ると、以下のように波形が刻まれてしまいます。

これはサブキャリアの揺れ(電圧が一瞬下がる)によって、フォトトランジスタが赤外線信号を受信していない判定を時折してしまうためです。

これだと正しいデータを得られないので、今回は単電源オペアンプLM358をコンパレータ回路として使用して、電圧が少し低下してもL判定にならないようにしました。

完成した回路の出力は以下のような感じです。(いいかんじ。)

赤外線受信の流れを考えてみる

ここまでで赤外線信号にはいろいろ送信の規格があることや、データ(数値)が赤外線を介し、電圧のHレベルとLレベルを使って送られていること、データはサブキャリア波によって高い周波数で刻まれて送信されていること、の3つを確認できました。

次はどんな風に信号をコピーするかを考えてみます。

赤外線信号をコピーするとなると、まずメーカーごとの規格を理解して、コピーしたデータから同じ送信方式で送信・・・

ということが考えられます。。。。。。

が、これだと知らないメーカーが来たとき対応できないうえに、メーカーの数だけ準備をしていないといけないです。

この方法は正直すごい面倒です。。。(通信について勉強しなくちゃいけない☆(꒪ཫ꒪; ))

そこで今回は丸暗記でやってみたいと思います。(できるかは不明)

方法はいたって簡単。赤外線データをデータとしてみるのではなく、単に何秒間ONで何秒間OFFを繰り返しているのか?

単に時間軸で追って行ってコピーしてやります。

図で説明すると以下のようになります。まず受信した赤外線信号をコンパレータ回路でフィルタリングし、中身のデータだけを取り出します。

これを時間軸で見て、何秒経過したらON、何秒経過したらOFFになっているか、この時間を測って保存します。

変数に保存した時間の長さを使って出力を行った場合、それぞれ設定した時間ごとに出力が切り替わる波形ができます。

この波形は見かけ上、元の受信データと同じになるはずです。

幸いなことに、赤外線信号はデータを送ったら受信信号を受け取って・・みたいな互いのやり取り、相互通信がありません。

なので信号を送信するリモコン側にデータを送っているという自覚があろうが、単に赤外線LEDを時間でON/OFFを切り替えているだけであろうが、受信側の機器には判別不能なわけです。

今回はそんな、身代わり受験みたいなパワープレイで「学習」を実現したいと思います。

赤外線受信処理を設計してみる

ここまでで赤外線信号を受信する作戦が立てられました。

次は実際に処理を考えていきます。

まず受信したデータについて、ON ➡ OFF、OFF ➡ ONを遷移する間の時間の測り方ですが、これにはマイコンのタイマ機能を使います。

マイコンのタイマ機能に関しては、下記のArduinoのタイマ機能を説明した記事で割ときれいに説明できたと思うので、どうぞ。

【Arduiono】Arduinoでタイマ割込みを使用したPWM制御を行う方法を紹介する

今回はArduiono、いや、Arduinoに搭載されたマイコン「ATmega328P」のタイマ機能を使用してPWM制御を行ってみました。 備忘録。 ※本記事ではATmega328PBのデータシートを ...

続きを見る

ざっくりというと、マイコンは無限に(折り返しはありますが)カウントアップしているので、そのカウントアップする速さを調節すれば適切な分解能でONとOFFの間の幅を測れるだろう、という感じです。

今回は受信した赤外線信号を見ながら、以下のような感じでカウントアップする速度を決めてみました。

いろいろ出てきて少々ごちゃついてし待ったので少しまとめます。

①まず時間を測るために、マイコンに搭載されたタイマ機能を使い、パルスの幅をカウント数として取得します。

②その測った時間(カウント数)を保存するために、プログラムで定義した変数に数値として保存します。

③ですがその変数が、一つのON⇔ON間、OFF⇔OFFについて、マイコンの性能的に0~255の数字の範囲に抑えておかないと、受信したデータを最後までコピーすることができません。

④なので、1カウントの幅を適切に調節して、パルスの幅がそこそこ正確な時間に、だけど255は超えない程度に、いい感じの情報量になるように調節します。(カウントアップ速度を調節しましたが、あまり遅くできないのでビットシフト等で対応してみました)

ちょっとごちゃごちゃしてしまいましたが、今回作成する受信処理を図でざっくりとまとめてみると以下のようになりました。

上記の図でtimer1信号時間計測、と書かれた部分のカウント数を、マイコン内で保存(コピー)し、学習するようにしたいと思います。

いろんなメーカーが考えている通信のフォーマットもクソもない、ただの丸暗記です。

赤外線信号送信処理を設計してみる

次に取得した赤外線信号のデータを送信するための処理を考えてみます。

今回、赤外線信号はサブキャリアによる成分をコンパレータ回路で除いて、データの部分をON/OFFの時間として保存しました。

データの復元は以下のような流れで行います。

送信する際はこのONとOFFの時間を守りながら、マイコンのポートの出力をON/OFFするだけです。

最終的に行う処理を処理全体でもうちょい具体的にまとめてみると以下の図のようになります。

上記の図についてやっていることを簡単にまとめてみます。

①まず、受信処理で取得したカウント数(ON/OFFの継続時間)が0になるまでPICマイコンのTimer1機能を使用して波形を出します。

②カウント数が0になったら次の時間の変数に移動して、再度新しくカウントダウンを始めます。
 この際、波形がHレベルならH➡Lへ、LレベルならL➡Hに切り替えて出力します。

こうすれば受信したデータと同じものが復元できるはずです。(H or L 決定(データ))

ただしこのままだと、受信したデータの生データ(コンパレータ回路によるフィルタリング前)のようにサブキャリアによる刻まれた波形にはなっていません。

④なのでこのデータを、PICマイコンのPWM機能を使用して、サブキャリアによって刻んで出力します。(PORT送信信号)

こうすれば、元の受信信号と全く同じものが出力できるようになるはずです。

開始・終了するタイミングによってはマイコンのポートの出力が途中で途切れることもあるので厳密には同じになりません。

が、リモコン波形の信号を観察した感じではそこまで精度がなさそうだったので、なんとなくこれで行けそうな気がします。

赤外線通信の送信周波数変更処理(サブキャリア周波数変更処理)

次にサブキャリアの周波数を変える処理を考えてみます。

最初の調査のところで説明しましたが、サブキャリアはエアコンやオーディオ、家電など、異なるメーカーや種類の家電が誤動作しないように信号の種類を変えるために使用されています。

これの周波数が違うと、いくら受信データが同じでも受信側は正常なデータとして受信することができないです。

なのでこれを今回自作するリモコン側で自由に変えられるようにします。

受信処理の設計をしてみた図(一個上)ではサブキャリアの波形を”重畳する”とかっこつけて描きましたが、実際はPWMのdutyを0%にするのか、30%程度に設定にするのかを決めて、ポートの出力を出すかどうか決めます。

30%程度というのは一応メーカーの規格全体で統一されているものらしいですが、実際は実験してみないと何とも言えないです。

全体を図にしてみると以下のような感じ。

PWM自体はPICマイコンのtimer2にて行います。

timer1でデータがHの間はdutyを30%に設定して出力を行い、Lの間はdutyを0%にして出力を行います。

多分うまくいくんじゃないかと思います。

実装&テスト

今回はPICマイコンなのでMPLAB Xでデバッグ、PICKIT3で書き込みです。

環境整備等は以下の記事で紹介しました。

【PIC】MPLABで作成したプログラムをPICKIT3で書き込む方法を紹介する

あまり新しい情報がなかったのでまとめてみました。 開発環境(ソフト)->開発環境(ハード)->プロジェクトの作成->実際に書き込みの順で書いてあります。 多少参考になるかもしれん。 環境整備とかからち ...

続きを見る

余談ですが、書き込みの時4.75V程度にすると書き込み失敗がないみたいです。

純正品が販売されてないのでAlliexpressで購入したパチモンを使ってますが、5V付近になると出力が安定しないみたいでしょっちゅうエラー出るんですよね・・・

話を戻しますがいざ検証。

果たしで受信できるか・・・・

受信できてそう。

黄色い波形が生の赤外線信号をフィルタリングした後のデータです。

受信が完了したら青色の波形がL➡Hになるようにプログラムを組んでみました。

ただ正直受信はデータを取り込んでるだけなのでいまいちわからない。

果たして送信できるか・・・・

キタァッ!!!!

☆丸暗記送信成功☆

できている!!!、送信できているぞぉッ!!!!

通信のプロトコルとか何にも勉強してないけど、見た目だけならそれっぽくできているぞぉ!!!!!

黄色い波形が保存したデータを吐き出したもの、ピンク色の波形がサブキャリアによって刻んだ後の波形になります。

適当に試作した基板なのでノイズの影響がマイコンに影響しているのか、へんな髭がいっぱい立ってますが・・・

動作に問題ないので、ヨシ!!

まとめ

今回は叡智な丸暗記という方法で、通信の勉強も何もせずに学習リモコンのプログラムを作り上げてみました。

結果としては、OK。

ただバグもあります。

今回使用したPIC16F1827は、なんと定義できる変数が356byteしかありません。

しかもバンクが4つに分かれているせいで、配列の要素数を50個にすると「変数が定義できません!!」みたいな謎のエラーが出ます・・・・

小手先でごまかしたせいなのかは分かりませんが、なぜか信号の受信時に余計なデータまで保存してしまいます。
(いろいろやったんだけど直らんかった・・・)

なんとか動画にするまでに解決してみようと思います。

それでは、また。

次は基板を設計して発注します。

次の記事
【自作】PICマイコンで赤外線学習リモコンを自作する③:基板設計・組み立て

前回までで試作したマイコンボードを用いたソフトの作成・デバッグが完了しました。 完全にバグは消えていませんが・・・・・ 今回は試作した基板を参考に、から完成形の基板を作っていきたいと思います。 基板を ...

続きを見る

ソースコード

まだつくり途中なのでピン配置等違いますが、最終的に整理します。

基板データ、筐体データ等もドライブに上げる予定なので、最終的には電子工作キットみたいな具合にまとめます。

-何か作った系
-, ,