今日は赤外線センサ(以下IRセンサ)を入手したので、これを使ってテレビ化したラズパイをリモコンで操作してみようと思います。
関連記事:ラズパイで地デジのリアルタイム視聴をしてみた。
関連記事:感圧センサをタッチしてラズパイで地デジをザッピングしてみた。
IRセンサとRaspberry Pi 2(以下ラズパイ2)との接続からリモコンの学習および設定ファイルの編集までは主に以下のページを参考にさせてもらいました。ありがとうございます。
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_lirc_ir_remote_control/
上の写真でブレッドボードに3本足で刺さっているのがIRセンサです。(感圧センサもつながったままなので、余計な線も写っています。)
そして今回は、PythonからLIRCを制御するためのpython-lircというソフトウェアと、MPEG2再生ソフトのomxplayerを制御するなどのためにpython-dogtailというソフトウェアをインストールします。
sudo apt-get install python-lirc sudo apt-get install python-dogtail
リモコンの各キーとそれに対応するプログラムを関連付けるために、”/home/pi/.lircrc”のようにして以下のファイルを保存します。
# ~/.lircrc # name = RPTV # power = stop script # 1 = 27 NHK-G # 2 = 26 NHK-E # 3 = null # 4 = 25 NTV # 5 = 24 ANB # 6 = 22 TBS # 7 = 23 TX # 8 = 21 CX # 9 = 16 MX # 10 = null # 11 = null # 12 = null # channel_forward = channel_forward # channel_backward = channel_backward begin prog = irexec button = power config = python /home/pi/Desktop/TV/TV_IR.py end begin button = power prog = RPTV config = power end begin button = 1 prog = RPTV config = 1 end begin button = 2 prog = RPTV config = 2 end begin button = 4 prog = RPTV config = 4 end begin button = 5 prog = RPTV config = 5 end begin button = 6 prog = RPTV config = 6 end begin button = 7 prog = RPTV config = 7 end begin button = 8 prog = RPTV config = 8 end begin button = 9 prog = RPTV config = 9 end begin button = channel_forward prog = RPTV config = channel_forward end begin button = channel_backward prog = RPTV config = channel_backward end
以上で環境は整いました。以下に今回のPythonコードを記載します。
#!/usr/bin/env python import os import time import subprocess import lirc import sys from dogtail.procedural import * #Initialize lirc sockid = lirc.init("RPTV", blocking = False) #Kill irexec cmd = 'pkill -9 "irexec"' subprocess.call(cmd, shell=True) ch = ["27", "26", "25", "24", "22", "23", "21", "16"] #Channel memory file (ch.txt) operation os.chdir("/home/pi/Desktop/TV/") flug = os.path.exists("ch.txt") if flug == False: f = open("ch.txt", 'w') n = 0 f.write(str(n)) f.close f = open("ch.txt", 'r') s = f.read() if s == "": n = 0 else: n = int(s) f.close def change_channel(): f = open("ch.txt", 'w') f.write(str(n)) f.close cmd0 = 'pkill -9 "omxplayer"' subprocess.call(cmd0, shell=True) cmd1 = 'pkill -9 "recdvb"' subprocess.call(cmd1, shell=True) cmd2 = 'rm /tmp/mpegpipe' subprocess.call(cmd2, shell=True) cmd3 = '[ -p /tmp/mpegpipe ] || mkfifo /tmp/mpegpipe' subprocess.call(cmd3, shell=True) cmd4 = 'recdvb --b25 --strip ' + ch[n] + ' - /tmp/mpegpipe &' subprocess.call(cmd4, shell=True) cmd5 = 'omxplayer --live /tmp/mpegpipe' subprocess.Popen(cmd5, shell=True) def exit_script(): keyCombo("q") cmd1 = 'pkill -9 "recdvb"' subprocess.call(cmd1, shell=True) cmd2 = 'rm /tmp/mpegpipe' subprocess.call(cmd2, shell=True) cmd6 = 'irexec /home/pi/.lircrc' #Reboot irexec subprocess.call(cmd6, shell=True) sys.exit() #Auto start the first channel change_channel() while True: codeIR = lirc.nextcode() if codeIR != []: if codeIR[0] == "channel_forward": if n == 7: n = 0 change_channel() else: n += 1 change_channel() elif codeIR[0] == "channel_backward": if n == 0: n = 7 change_channel() else: n -= 1 change_channel() elif codeIR[0] == "1": if n != 0: #If same channel was selected, it does nothing. n = 0 change_channel() elif codeIR[0] == "2": if n != 1: n = 1 change_channel() elif codeIR[0] == "4": if n != 2: n = 2 change_channel() elif codeIR[0] == "5": if n != 3: n = 3 change_channel() elif codeIR[0] == "6": if n != 4: n = 4 change_channel() elif codeIR[0] == "7": if n != 5: n = 5 change_channel() elif codeIR[0] == "8": if n != 6: n = 6 change_channel() elif codeIR[0] == "9": if n != 7: n = 7 change_channel() elif codeIR[0] == "power": exit_script() time.sleep(0.05)
LIRCのconfigファイル内のnameはここではRPTVとしています。(10行目に反映。)チャンネルの種類と並びは東京地区での設定(放送大学は除く)ですので、必要に応じて書き換えてください。また、スクリプトを終了して再開した際に前のチャンネルを覚えておくために、”/home/pi/Desktop/TV/”内に”ch.txt”というテキストファイルを作成します。ディレクトリは適宜書き換えてください。それから、電源ボタンを押すとテレビが映り、再度押すと切れるようにするために、irexecというソフトウェア(python-lircの一部)を停止/起動するようにしています。さらに、omxplayerを終了させるためにdogtailのkeyCombo機能を使ってキーボードの”q”をPythonから押すように制御しています。チャンネルの切り替えは直接チャンネルボタンを押すことと、チャンネルの前後ボタンに対応するようにもしています。なお、音量の操作には対応していません。(+/−キーを制御すれば可能かもしれません。)以上がメインのスクリプトです。
また、ラズパイ2の起動時にirexecがターミナル内で動くように、以下の短いスクリプトも書きました。(保存場所は、”/home/pi/Desktop/TV/”)
#!/usr/bin/python from dogtail.procedural import * import time run('lxterminal') time.sleep(0.5) type("irexec") keyCombo("Return")
このスクリプトをdesktopファイルで起動時に呼ぶよう設定します。
nano /home/pi/.config/autostart/TV_IR.desktop
[Desktop Entry] Exec=python /home/pi/Desktop/TV/irexec_start.py
以上で全てです。ラズパイ2でのテレビ視聴環境がなかなか快適になってきました。
実際にリモコンを操作しているところを動画におさめましたので、以下のYouTubeもチェックしてみてください。
今日のところはこの辺で。☕️