頭の中がオールクリア

昨日は一日中、録り溜めたドラマを見て過ごした。NHKの夫婦善哉が面白かった。ボクも相当いい加減だが、蝶子のような奥さんがいないのは、いい加減さの質が違うのだと思う。で、今日またRaspberry Piの続きをやろうとしたら頭の中がすっきりからっぽ。ぶっちらかした机の上を誰かがきれいさっぱり片付けてしまった感じ。あらためて、必要なものを机の上に並べていく。

目標は赤外線リモコンの信号の解析と、あわよくば再現。Arduinoでやればわけもないこと(製作例はこちら)。Raspberry Piだと信号の変化を捉える間、時間をつぶすのがたいへん。そのかわりメモリを贅沢に使える。信号の変化をすべて記録し、丁寧な統計処理を目指す。

赤外線リモコン受光モジュールPL-IRM2161-XD1をポートに接続。ポートは/sys/class/gpio/~で初期化。ポートのエッジのイベントとpoll関数の組み合わせで信号の変化を捉える。この方法がうまくいくことはふたつ前の投稿で確認ずみ。

時刻はclock_gettime関数で取得(一般によく使われるgettimeofday関数はPOSIXだと廃止予定)。間隔を計算するテストも成功。テレビの赤外線リモコンは32ビットくらいだがエアコンはおしなべて320ビットくらいある。全部のエッジのrisingとfallingを確実に記録するためlongの配列を512×2個確保。力任せすぎて美しくないところの修正を検討中。ぶっちらかしたまま関心が再現の方法へ向く。

再現では所定の時刻になるまでまた時間をつぶす方法で悩む。sleep関数は秒単位だからダメ。μ秒単位のusleep関数は試したところ正確さに欠ける。n秒単位のclock_nanosleep関数は、Raspberry Piのタイマの精度だと実質μ秒単位となってしまうのだが、なぜか正確に動作して成功。もうひとつnanosleep関数もあってどちらが良いか検討中。どちらで再現するかは、解析結果を記録する方法に影響する。できるだけ早く決めるべきだが、ぶっちらかしたまま関心が赤外線を発射する方法に向く。

再現する信号の38kHzのキャリアはPWMで生成するのが理想。正確な周波数とフォーマットごとに異なるデューティ比を簡単に生成できる。そのオン/オフをどう制御するかが問題。ANDゲートを通し、ポートでON/OFFするのがソフトウェア的には簡単。でもハードウェアが美しくない。ANDゲートひとつのためにANDゲートが4つ入った7400などを使い、3つの入力ピンをGNDに落とす、なんてどうかと思う。LMC555を使うと38kHzを生成し、かつポートでON/OFFできる。これも、多少の問題がある。38kHzに調整が必要だし、デューティ比が固定されてしまうし、せっかくあるPWMを使わないのはもったいない。

PWMの38kHzを正確なタイミングで停止/再開できれば再現に関するすべての問題が解決する。あまりやりたくないが、/dev/memからメモリマップを取得し、レジスタを直接操作する方法を検討中。ああそうだ。そのソースを書いている途中だったのだ。

広告
カテゴリー: 世間話 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中