TECH BLOG




2023/2/27

M5StickCを使って子供のテレビの見過ぎを注意する


はじめに

子供がいる世帯であれば必ず発生するのが、子供のテレビ見すぎ問題かと思います。
放っておくと何時間でもYouTubeを見てしまうし、毎度注意するのも疲れてしまいます。

そこで、テレビのON時間をカウントし、時間になったら注意してくれるものをM5StickCを使って作成しました。
HDMI端子の中にCECという通信線があり、これを使うことでテレビのON/OFFを判別しました。

親の言うことは全然聞かないのに、M5StickCに言われると何故かいうことを聞きます。

注意事項

テレビとの通信は自己責任の上でお願いいたします。
何かしら問題が発生した場合、当方で補償はできません。

材料

材料 購入先 リンク
M5StickC Amazonなど  
スピーカー ダイソーなど  
HDMIケーブル ダイソーなど  
GROVEケーブル Amazonなど  
D級アンプ PAM8012 秋月電子など  
Nch MOSFET 2SK4017 秋月電子など  

M5StickCです。顔を表示させると、ちょっとしたロボットみたいになります。

M5StickCの写真

ダイソーのスピーカーです、片方だけ使います。改造してM5StickCにつなぎます。

ダイソーのスピーカーの写真

HDMIケーブルとGroveコネクタを合体したものです。HDMIの中のCECラインでテレビと通信してON/OFFを判別します。

HDMIケーブルとGroveコネクタをはんだ付けした写真

ハード構成と作成手順

テレビのON時間カウンターの回路図

無音時にもスピーカーにノイズが乗るので、5V電源にローサイドスイッチを入れて、音声出力時だけONしています。

1. スピーカーを分解

スピーカーは片方だけ使います。
ドライバーで分解すると、ケース+スピーカーのシンプル構造になっています。

ダイソーのスピーカーを分解した時の写真

意外と立派なスピーカーが入っています。
2pついてきてで300円は安いかも?

ダイソーのスピーカーの写真

2. D級アンプをはんだ付け

スピーカーにつながっている線を切断して、上記の回路図通りにD級アンプをはんだ付けします。

ダイソーのスピーカーにD級アンプをはんだ付けした写真

3. ローサイドスイッチをはんだ付け

D級アンプのGNDと、M5StickCのGNDの間にNch MOSFETを入れて、ゲートにGPIO25を接続します。
これで、GPIO25がHIGHでアンプの電源がON、LOWでOFFになります。

HAT側のコネクタをピンヘッダとユニバーサル基板で自作して、ローサイドスイッチ用のスペースを作ります。

M5StickCの自作HATの写真

はんだ付けしました。
もう少し広く作ってもよかったかも。

M5StickCにローサイドスイッチ用NchMOSFETをはんだ付けした写真

4. GroveケーブルとHDMIケーブルのCECをはんだ付け

M5StickCのGroveコネクタ用ケーブルと、HDMIケーブルのCECをはんだ付けします。

HDMIケーブルを剥くとこんな感じ、ここからテスタを使ってCEC/VCC/GNDの線を探していきます。
HDMIのピン配置は こちらが詳しいです。

HDMIケーブルを剥いた写真

CECはオープンドレインの1線双方向バスです。
M5StickC側はGPIO32を入力端子(PullUp)、GPIO33を出力端子(OpenDrain)として使います。
CECにGPIO32/33を両方はんだ付けします。

自作のGrove-HDMIケーブルの写真

これでハードは完成です。

ソフトウェアの作成

以下のオープンソースを使用しています。

  1. CEC通信
  1. MP3再生
  1. 顔の表示

1-1. CEC通信について

テレビのON/OFFを判定するのに、HDMIの中にあるCECという通信ラインを使用します。
CECは一線双方向の通信バスになっていて、コマンドをテレビに送ることで情報を読み出したり、ON/OFFやボリューム調整などの操作をすることができます。

CECの仕様書はこちら

今回は、テレビのON/OFFを判別するコマンドを定期的に送って、ONのときの時間をカウントしています。

以下は仕様書抜粋です。
Give Device Power Status コマンドを送ると、Power Status が返ってきます。

CEC仕様書抜粋 power statusコマンド

Power Statusが"0"でTV ON、"1"でTV OFFです。

CEC仕様書抜粋 power statusの値説明

1-2. CECライブラリの修正

上記で紹介したCECライブラリはそのままでは使えず、以下の修正が必要です。

■ 論理反転

このCECライブラリのGithubページに飛ぶと、一番下に動作回路図があります。
これはArduino向けの回路で、双方向通信のためのOpenDrainを作っているものと思います。
今回、M5StickC(ESP32)側で端子をOpenDrainに設定できるため、この回路は不要になります。
回路をとっぱらうと通信の論理が逆になるので、ライブラリ側も合わせて修正する必要があります。

CEC_Device.cppの以下3点を修正します。

変更点①
void CEC_Device::Initialize(CEC_DEVICE_TYPE type)
{
  //pinMode(_out_line, OUTPUT);
  //pinMode( _in_line,  INPUT);
  pinMode(_out_line, OUTPUT_OPEN_DRAIN);  //out端子をOpenDrainにする
  pinMode( _in_line, INPUT_PULLUP);       //in端子はPullUpする

  //digitalWrite(_out_line, LOW);
  digitalWrite(_out_line, HIGH);          //論理反転


変更点②
bool CEC_Device::LineState()
{
  int state = digitalRead(_in_line);
  //return state == LOW;
  return state == HIGH;                  //論理反転
}

変更点③
void CEC_Device::SetLineState(bool state)
{
  //digitalWrite(_out_line, state?LOW:HIGH);
  digitalWrite(_out_line, state ? HIGH : LOW);   //論理反転

■ コンパイル通らない箇所の削除

コンパイルするとエラー箇所がわかると思いますので、削除していきます。
下記は一例です。

・Common.cppのavr関連のinclude
・CEC.inoのキーボード関連の処理

2. MP3再生について

Mp3再生はM5Unifiedのサンプルを使用します。

このうち、画面表示系の処理は今回使わないので削除します。
また、M5Stack-AvatarのLipsync用に、"_m5sound->playRaw"の処理の手前に、以下の変数(outLevel)を追加しておきます。

int16_t outLevel;
 ・
 ・
 ・
if (_tri_buffer_index)
{
  outLevel = abs(_tri_buffer[_tri_index][_tri_buffer_index]);  //★lipsync用に追加
  _m5sound->playRaw(_tri_buffer[_tri_index], _tri_buffer_index, hertz, true, 1, _virtual_ch);
 ・
 ・
 ・

3. 顔の表示について

issueにM5StickCでの使用例があがっていますので、これを使用します。

セリフを出すのは「avatar.setSpeechText」、表情を変えるのは「avatar.setExpression」を使用します。
また、口の大きさを変える(LipSync)には「avatar.setMouthOpenRatio」を使用します。

ソフトウェア全体

以下のGithubにソースコード上げていますので、よかったら参照ください。

まとめ

HDMIの中のCECラインを使ってテレビのON時間をカウントしてみました。
CECはあまり馴染みがないかもしれませんが、ブラビアリンクとか、ファミリンクとか、テレビの遠隔操作系に使われているものです。
その気になれば、1時間でテレビ強制OFFとかもできるのですが、子供の自主性を尊重して声掛けだけにしておきました。

実際、導入してみると効果がありまして、親に言われるより素直に聞いてくれています。
近い未来、家庭用ロボットがこんな風に子供の生活を管理してくれるようになるかもしれませんね。


以上です。




コメント(githubのアカウントが必要です)


Tech Blog Index

2023/02/27
  ・ TVON時間カウンタ作成

2022/09/09
  ・ スタックチャンを作ってみた

2022/04/30
  ・ 日輪刀をプログラミング

2022/02/16
  ・ Statiqでブログ作成


Sponsor