今日は前回成功したラズパイ2での地デジのリアルタイム視聴と、その前の回でやってみた感圧センサを組み合わせてみます。
関連記事1):ラスパイで地デジのリアルタイム視聴をしてみた。
関連記事2):ラズパイで感圧センサを使って貯金額を計ってみた。
感圧センサがタッチされたらチャンネルを切り替えるようにしてみました。いわゆるザッピングですね。
以下のようにPythonでスクリプトを作成してみました。
#!/usr/bin/env python import spidev import time import subprocess # Open spi device. spi = spidev.SpiDev() spi.open(0, 0) # Make channels list ch = ["27", "26", "25", "22", "21", "24", "23", "16", "28"] try: n = 0 while True: if n >= 9: #Number of channels n = 0 res = spi.xfer2([0x68, 0x00]) value = (res[0] * 256 + res[1]) & 0x3ff print value if value > 100: # Threshold of pressure 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) n += 1 time.sleep(0.5) #sleep 0.5sec except KeyboardInterrupt: spi.close()
上記のスクリプトでは、Pythonスクリプトからシェルコマンドをsubprocess.callで命令しています。.callではコマンドが完了するまで待ちの状態になります。前のコマンドが完了する前に次のコマンドが走ると困るのでこうしています。ただし、最後のコマンドはomxplayerを起動するものですが、ここでは.callではなく.Popenを使用しています。もしここで.callを使うとタッチしても次のチャンネルに切り替わりません。なぜならomxplayerが再生中なので、スクリプト内の次のラインが実行されないからです。.Popenの場合はコマンドの完了を待たないのでタッチが有効になります。
では試してみましょう。スクリプトを走らせた状態で、感圧センサをタッチしてみます。
すると感圧センサのDN値が3から869に跳ね上がり、地デジのリアルタイム視聴のためのプログラムが起動しました。
まずは某公共チャンネルが再生されます。
再び感圧センサにタッチすると、一度デスクトップの画面が現れ、別のチャンネルに切り替わります。
この間、約6秒くらいかかります。ザッピングというには遅すぎますねー。(;^ω^)
なお、しばらく視聴し続けて、その後タッチするとなぜかデスクトップは表示されず、ブラックアウトして次のチャンネルに切り替わるようになります。原因は不明ですね…。
普通のテレビなら当たり前にできることですが、実際作ってみると結構大変です。電気メーカーの社員さんたちはやっぱり優秀です。
今日のところはこの辺で。☕️