できたもの
動画の出来が色々とアレだが、動作時の様子を以下の動画の後半で確認できる。
動画だと映りが悪いが、写真だとLEDをつけた時の様子は以下のような感じになる。
作成目的
M5系列からYouTube Data APIを使った作例を作ってみたくて、作成した。
使用部品
- M5StickC 1個
- PCA9685 16チャンネル PWMモジュール 3個
- フルカラーLED 12個
筐体設計
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の色がハードコーディングされているので、外部から設定できるようにしたい。