Quantcast
Channel: okahiro | Okahiro's Gadget Lab
Viewing all articles
Browse latest Browse all 40

IRセンサでテレビ化ラズパイをリモコン操作してみた。

$
0
0

今日は赤外線センサ(以下IRセンサ)を入手したので、これを使ってテレビ化したラズパイをリモコンで操作してみようと思います。

関連記事:ラズパイで地デジのリアルタイム視聴をしてみた。
関連記事:感圧センサをタッチしてラズパイで地デジをザッピングしてみた。

IRセンサとRaspberry Pi 2(以下ラズパイ2)との接続からリモコンの学習および設定ファイルの編集までは主に以下のページを参考にさせてもらいました。ありがとうございます。

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_lirc_ir_remote_control/

img_1497

上の写真でブレッドボードに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もチェックしてみてください。

 

今日のところはこの辺で。☕️

 


Viewing all articles
Browse latest Browse all 40

Trending Articles