Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する

  • 58
    いいね
  • 4
    コメント

以前にRaspberry PiとMac or Windows PCを有線で直接繋いでさくっとSSH接続するという記事を書いていて、HDMI対応ディスプレイとキーボードをセットしなくてもさくっとSSH接続してRaspberry Piで遊べることをアピールしていたのですが、今回は逆にあまり使うことのなかったRaspberry PiのHDMI端子を活用し、テレビのON/OFF(STANDBY)状況をRaspberry Piから確認してみたいと思います。

今回はHDMIのCEC(Consumer Electronics Control)という、機器間を制御するリンク機能を活用します。
SONYだとブラビアリンク、東芝だとレグザリンク、パナソニックだとビエラリンク、SHARPだとAQUOSファミリンク、などと呼ばれています。

動作環境

Raspberry Pi側

  • Raspberry Pi 2 Model B
    • Raspbian Jessie Lite 2016-09-23
      • イメージをMicroSDに書き込んだ直後の状態

テレビ側

  • SONY BRAVIA KDL-46HX850

インストール

GitやVimのインストールとcec-clientのインストール

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install git vim cec-utils -y

Node.jsのインストール

Node.jsを第三回 Raspberry Pi 3に最新のNode.jsをインストールするをみてインストールします

リポジトリのクローンとnpm install

こちらのリポジトリにサンプルを公開していますので、cloneしてお使いください:
https://github.com/mascii/raspberrypi-hdmi-cec

npm installnode-ceconoff(LEDを制御して動作確認に使用) が入ります。

git clone https://github.com/mascii/raspberrypi-hdmi-cec.git
cd raspberrypi-hdmi-cec
npm install

Raspberry Pi起動時にTVの入力切替しない・電源を入れないための設定

/boot/config.txthdmi_ignore_cec_init=1を追記することで、Raspberry Pi起動時にTVの入力が切り替わったり、TVの電源が入ったりしなくなります。
突然、Raspbianの黒い画面出るとびっくりしちゃいますので、設定しておきます。

echo hdmi_ignore_cec_init=1 | sudo tee -a /boot/config.txt

テレビのON/OFF状況を取得してみる

cec-client で信号を調べる

cec-client -m -d 8 -b -r でテレビからどんな信号が来ているか確認できます。

Raspbian
pi@raspberrypi:~/raspberrypi-hdmi-cec $ cec-client -m -d 8 -b -r
starting a monitor-only client. use 'mon 0' to switch to normal mode
log level set to 8
using base device '0'
No device type given. Using 'recording device'
CEC Parser created - libCEC version 3.0.1
no serial port given. trying autodetect: 
 path:     Raspberry Pi
 com port: RPI

opening a connection to the CEC adapter...
waiting for input
TRAFFIC: [             218] >> 0e:90:00
TRAFFIC: [            2947] >> 0e:83
TRAFFIC: [           17947] >> 0e:83
TRAFFIC: [           32947] >> 0e:83
TRAFFIC: [           47948] >> 0e:83
TRAFFIC: [           62948] >> 0e:83
TRAFFIC: [           77951] >> 0e:83
TRAFFIC: [           92949] >> 0e:83
TRAFFIC: [           94908] >> 0f:36

どうやらテレビがONの時は 0x83(cectypes.coffeeを調べると GIVE_PHYSICAL_ADDRESS)が定期的に来て、テレビがOFFにする時に 0x36(STANDBY)が来るようです。
この辺は機種依存の可能性がありますので、適宜調べて変更してください。もしよろしければ、調査結果をコメントで投稿してください!

Node.jsでテレビのON/OFF状況を取得

先ほどクローンしたリポジトリ内にある hdmi.js は、0x83(GIVE_PHYSICAL_ADDRESS)が来るとテレビがONになった可能性があるので、ON/OFF状況を確認するコマンドを送ってテレビのON/OFF状況を確認します(OFF時であってもスタンバイ状態なので確認できる)。

0x36(STANDBY)が来るとテレビがOFFになったと判定します。

また、起動時の1回だけON/OFF状況を確認するコマンドを送ります。

0x830x36が稀に前後して到着することがあるようなので、このような処理にしています。

hdmi-led.gif
hdmi-led.jsでは、hdmi.jsの動作をベースに、TVがオンになるとGPIO 22ピンのLED(青)が、TVがオフになると GPIO 24ピンのLED(赤)が点灯します。

IoTとして活用

象印がみまもりほっとラインという、電気ポットの使用状況による安否確認サービスを提供していますが、今回紹介したHDMIのCEC機能を用いることで電気ポットではなくテレビを用いた安否確認システムを構築できそうです。
通信にSORACOM Air、サーバーにMilkcocoaを用いた構成例が考えられると思います。

mimamori.png

上図の構成であれば、テレビとのHDMI接続とモデムのUSB接続のみで済んでしまうので、電子工作不要で高齢者見守りデバイスを製作できるかと思います。

通信に必要なモデムですが、L-05Aといった3G対応の中古のものであればヤフオクやメルカリで1000円〜2000円程度で手に入る感じです。SORACOM Airの通信料は、テレビのON/OFF時の通知のみであれば他の案件での経験から月額350円程度だと推測します。

参考サイト

Raspberry Pi のcec 制御とHDMIのオンオフ - それマグで!