2023/2/27
子供がいる世帯であれば必ず発生するのが、子供のテレビ見すぎ問題かと思います。
放っておくと何時間でもYouTubeを見てしまうし、毎度注意するのも疲れてしまいます。
そこで、テレビのON時間をカウントし、時間になったら注意してくれるものをM5StickCを使って作成しました。
HDMI端子の中にCECという通信線があり、これを使うことでテレビのON/OFFを判別しました。
ずんだもんで喋らせてみました、m5unifiedのmp3再生サンプル+m5stack-avatar使いました。感謝ですm(_ _)m
— やまっく (@YY87750722) February 14, 2023
あとは、これで子供がテレビの時間を守れるかどうか・・。#m5stickc pic.twitter.com/ewoHBOwX7x
親の言うことは全然聞かないのに、M5StickCに言われると何故かいうことを聞きます。
テレビとの通信は自己責任の上でお願いいたします。
何かしら問題が発生した場合、当方で補償はできません。
材料 | 購入先 | リンク |
---|---|---|
M5StickC | Amazonなど | |
スピーカー | ダイソーなど | |
HDMIケーブル | ダイソーなど | |
GROVEケーブル | Amazonなど | |
D級アンプ PAM8012 | 秋月電子など | |
Nch MOSFET 2SK4017 | 秋月電子など |
M5StickCです。顔を表示させると、ちょっとしたロボットみたいになります。
ダイソーのスピーカーです、片方だけ使います。改造してM5StickCにつなぎます。
HDMIケーブルとGroveコネクタを合体したものです。HDMIの中のCECラインでテレビと通信してON/OFFを判別します。
無音時にもスピーカーにノイズが乗るので、5V電源にローサイドスイッチを入れて、音声出力時だけONしています。
スピーカーは片方だけ使います。
ドライバーで分解すると、ケース+スピーカーのシンプル構造になっています。
意外と立派なスピーカーが入っています。
2pついてきてで300円は安いかも?
スピーカーにつながっている線を切断して、上記の回路図通りにD級アンプをはんだ付けします。
D級アンプのGNDと、M5StickCのGNDの間にNch MOSFETを入れて、ゲートにGPIO25を接続します。
これで、GPIO25がHIGHでアンプの電源がON、LOWでOFFになります。
HAT側のコネクタをピンヘッダとユニバーサル基板で自作して、ローサイドスイッチ用のスペースを作ります。
はんだ付けしました。
もう少し広く作ってもよかったかも。
M5StickCのGroveコネクタ用ケーブルと、HDMIケーブルのCECをはんだ付けします。
HDMIケーブルを剥くとこんな感じ、ここからテスタを使ってCEC/VCC/GNDの線を探していきます。
HDMIのピン配置は こちらが詳しいです。
CECはオープンドレインの1線双方向バスです。
M5StickC側はGPIO32を入力端子(PullUp)、GPIO33を出力端子(OpenDrain)として使います。
CECにGPIO32/33を両方はんだ付けします。
これでハードは完成です。
以下のオープンソースを使用しています。
GitHub - floe/CEC: Arduino library for HDMI CEC communication
Arduino library for HDMI CEC communication.
GitHub - m5stack/M5Unified: Unified library for M5Stack series
Unified library for M5Stack series.
GitHub - earlephilhower/ESP8266Audio: Arduino library to play MOD, WAV, FLAC, MIDI, RTTTL, MP3, and AAC files on I2S DACs or with a software emulated delta-sigma DAC on the ESP8266 and ESP32
Arduino library to play MOD, WAV, FLAC, MIDI, RTTTL, MP3, and AAC files on I2S DACs or with a software emulated delta-sigma DAC on the ESP8266 and ESP32
GitHub - meganetaaan/m5stack-avatar: An M5Stack library for rendering avatar faces
An M5Stack library for rendering avatar faces.
テレビのON/OFFを判定するのに、HDMIの中にあるCECという通信ラインを使用します。
CECは一線双方向の通信バスになっていて、コマンドをテレビに送ることで情報を読み出したり、ON/OFFやボリューム調整などの操作をすることができます。
CEC/CEC_Specs.pdf at master · floe/CEC
Arduino library for HDMI CEC communication. Contribute to floe/CEC development by creating an account on GitHub.
今回は、テレビのON/OFFを判別するコマンドを定期的に送って、ONのときの時間をカウントしています。
以下は仕様書抜粋です。
Give Device Power Status コマンドを送ると、Power Status が返ってきます。
Power Statusが"0"でTV ON、"1"でTV OFFです。
上記で紹介した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のキーボード関連の処理
Mp3再生はM5Unifiedのサンプルを使用します。
M5Unified/MP3_with_ESP8266Audio.ino at master · m5stack/M5Unified
Unified library for M5Stack series.
このうち、画面表示系の処理は今回使わないので削除します。
また、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);
・
・
・
issueにM5StickCでの使用例があがっていますので、これを使用します。
Work with M5StickC · Issue #59 · meganetaaan/m5stack-avatar
セリフを出すのは「avatar.setSpeechText」、表情を変えるのは「avatar.setExpression」を使用します。
また、口の大きさを変える(LipSync)には「avatar.setMouthOpenRatio」を使用します。
以下のGithubにソースコード上げていますので、よかったら参照ください。
GitHub - yamaccu/M5StickC-TVOnCounter: テレビのON時間をM5StickCを使ってカウントします。
テレビのON時間をM5StickCを使ってカウントします。
HDMIの中のCECラインを使ってテレビのON時間をカウントしてみました。
CECはあまり馴染みがないかもしれませんが、ブラビアリンクとか、ファミリンクとか、テレビの遠隔操作系に使われているものです。
その気になれば、1時間でテレビ強制OFFとかもできるのですが、子供の自主性を尊重して声掛けだけにしておきました。
実際、導入してみると効果がありまして、親に言われるより素直に聞いてくれています。
近い未来、家庭用ロボットがこんな風に子供の生活を管理してくれるようになるかもしれませんね。
以上です。
Tech Blog Index
2023/02/27
・ TVON時間カウンタ作成
2022/09/09
・ スタックチャンを作ってみた
2022/04/30
・ 日輪刀をプログラミング
2022/02/16
・ Statiqでブログ作成
Sponsor