lircを使ってみる
Raspberry piで赤外線リモコンといえば、lirc。
お手軽にリモコンコードを送信することができました。しかし、受信側の機器によって(というか一般的に)は誤動作防止のために複数回同じコードを送信する必要があるあります。繰り返し送信するときには何も送信しない[GAP]期間を入れるのですが、これが上手く行きません。リモコンコードの最初のフレーム送信開始から次のフレームを送信する前までの期間を一定にする必要があるのに、どうしても長めに[GAP]が挿入されてしまいます。オプションの設定もしているのですが、上手く動作するときもあれば、いつの間にか動作しないようになっているとか…
また、lircは予め送信するコードを/etc/lirc/lircd.conf.d の中に設定ファイルとして書いておかなければなりません。ダイナミックにコードを生成して送信するのには向いていないようです。
pigpioを使ってみる
lircがうまくいかず、次に手を出したのがpigpioです。なかなか優れたライブラリで、pigpioのPWMを使えば意外と簡単にリモコン送信ができました。ただ、PWMだとある程度決まった周波数でしかPWMを生成してできないのですね。代わりに、wave_chain でgpio制御とディレイを組み合わせて思い通りにのコードパターンを作ることができました。pigpioは中々よく考えられています。便利に使えそうです。
しかしながら、作ったwave_chainを送信するとオーディオアウトから「ブー」という音がします。電源かGNDから乗っているのかなと思い、電源GNDを分離してみましたが改善しません。
また、Raspberry pi起動直後は正常に出力したリモコンコードで制御ができているのですが、しばらくすると動作しなくなってしまいます。
どうやら、一度でもオーディオ再生をすると、リモコンコードのパターン(周波数やパルス幅)が変化(周波数は低くなり、幅は延びる)してしまい、機器側でリモコンコードとして認識しなくなってしまうようです。
どうやらDMAに関係しているようです。
Raspberry piでGPIOを制御するならpigpioが使いやすいようです。オーディオを使わなければタイミングもしっかりしていそうですので、別の機会があればpigpioを使ってみようと思います。
lircではリモコンコードのパターンはオーディオの影響を受けていないようでしたが、ギャップはやはり延びていました。こちらも使えません。
色々試してみましたが、上手く行きません。Raspberry piで音声を出さなければ良いのですが、スマートスピーカーとして使おうとしたら音声出力は必要です。このためだけにもう一つRaspberry piを使うのもなんだかなぁということで、リモコン送信の部分はワンチップマイコンにすることにします。Raspberry piからUARTで制御することにします。