Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

以前に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側

テレビ側

  • 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とnpmの最新版をRaspberry PiにNode.jsとnpmの最新版をインストールするを参照してインストールします

リポジトリのクローンと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)が来るようです。
この辺は機種依存の可能性がありますので、適宜調べて変更してください。もしよろしければ、調査結果をコメントで投稿してください!

cec-client で表示された 0e:90:00 のような信号は、CEC-O-MATICというサービスでどのような内容なのか調べられそうです。
CEC-O-MATIC.png

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を用いた構成例が考えられると思います。

mimamori2.png

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

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

参考サイト

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした