できたもの

動画の出来が色々とアレだが、動作時の様子を以下の動画の後半で確認できる。

動画だと映りが悪いが、写真だとLEDをつけた時の様子は以下のような感じになる。

作成目的

M5系列からYouTube Data APIを使った作例を作ってみたくて、作成した。

使用部品

筐体設計

STLデータは以下に公開してある。

M5StickCとPCA9685モジュールが3個入るような箱を設計した。最初はだいぶコンパクトに設計していたのだが、配線が箱に収まらないことが分かり、途中で拡張した。もともとはM5StickCも箱の中に収める想定だったのだが、入らなかったので、横につけることにした。

フルカラーLEDは配置する場所に自由度を持たせられるように、個別に格納する箱を作成して、それぞれ4本の配線でM5StickC側の箱と接続するようにした。

配線

今回の配線の概要図を以下に示す。

PCA9685モジュールとフルカラーLEDの接続部分はテキトーになっているが、LEDについてはRGB順で1個目のLEDは1個目のPCA9685モジュールの0,1,2chに接続、2個目のLEDは1個目のPCA9685モジュールの3,4,5chに接続…という形で接続している。

ここが一番しんどかった。PCA9685モジュールを3個使っているのでやろうと思えば最大16個のフルカラーLEDを接続できるが、12個配線したところで力尽きた。

ソフト実装

ソフト全体は以下のリポジトリに置いてある。

src/main.cppについて以下の部分は各ユーザー毎に書き換える必要がある。

  • APIキー
  • アクセスポイントのSSID
  • アクセスポイントのパスワード

あと、src/main.cpp中のchannelsをいじれば対象とするYouTubeチャンネルとLEDの色を変更できる。

M5StickCからYouTube Data APIを利用する部分は、以下のAPIラッパーを利用させていただいた。

ただし、このままではチャンネル情報しか取得できないため、以下の関数等を追加している。

  • std::vector<String> YoutubeApi::getUpcomingBroadcasts(char *channelId)
    • 指定されたChannelIDのチャンネルの配信予定(VideoID)を取得する。
  • BroadcastDetails YoutubeApi::getBroadcastDetails(char *videoId)
    • 指定されたVideoIDの動画の配信詳細情報を取得する。
    • 配信開始予定時刻は詳細情報からしか取れない。

課題

きちんと検証はしていないが、現状のソースだと、YouTube Data APIのクォータを異常に消費する。本当は1分ごとに情報取得とかをしたかったが、無料枠ではクォータが足りなくなる。

各LEDに紐づくチャンネルIDと、LEDの色がハードコーディングされているので、外部から設定できるようにしたい。