11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【TinyTV / ESP32】ESP32で動画再生!ミニレトロテレビ(Mini RetroTV)の製作②!

ブレッドボードでのテストを経て3Dプリントパーツを作成しMini RetroTV(ミニレトロテレビ)として完成しました!

【TinyTV / ESP32】ESP32で動画を再生する!片手サイズで可愛いミニレトロテレビ(Mini RetroTV)の製作!①ブレッドボードで組んでみる

TinyTV(タイニーTV)』ってご存知でしょうか?
TinyTVはレトロテレビを模した形状で内蔵された動画の再生が出来るというガジェットです。

面白そうなガジェットなので普段電子工作で使っているマイコンボードでもこのようなものが作れないものか・・・?
調べてみるとESP32を使い動画再生を行うというコア部分を作られている方がいました。

動画ファイル(mp4)からあらかじめ映像(mjpeg)と音声(mpe)に分離したファイルを用意しておき、ESP32の2つのコアを使いこれらを同時に処理して動画として再生させるというものです。

これならSDカードに保存した映像と音声ファイルをESP32を使って再生させることができ、上記TinyTVのようなものが作れそうですよね!

前回ブレッドボードで回路を組みテストを行ってみました。
うまく動画の再生が出来ていますよね!
スイッチやIR(赤外線)リモコンを使った動画の切り替え機能も付けてみました。
これなら何かしらケースを作成して収めることが出来るとTinyTVのようなものが作れそうです!

上記動画のようにブレッドボードで組んで動かしてみるだけでも面白いので、こちらの記事も合わせて見て頂ければと思います。

【TinyTV / ESP32】ESP32で動画を再生する!片手サイズで可愛いミニレトロテレビ(Mini RetroTV)の製作!①ブレッドボードで組んでみる

そして今回はブレッドボードで組んだものをベースに3Dプリントパーツを設計しミニレトロテレビ(Mini RetroTV)として完成させました!
片手に収まるサイズ感でなかなか可愛いく仕上がったと思います。

本体に付いているボタン操作で動画の[進み][戻り]や赤外線リモコン(IR)での操作も出来るようにしています。
レトロな動画を入れるとピッタリマッチします!

Instagramでは非常に多くのコメント&DMを頂いたので、3DプリントパーツをThingiverseにアップしました。
このサイズに全てのパーツを収めるのは結構大変でCADでの設計は苦労しました。
製作は少し大変かもしれませんが、興味がある方はぜひ製作してみて下さい!

ESP32で動かすミニレトロテレビ(mini RetroTV)の製作!

本題に入る前に・・・ESP32で動画再生を行う今回の製作ではコア部分となる素晴らしいプロジェクトを公開されている先人の方々に感謝です!(詳しくは前回の記事をご覧下さい)

ブレッドボードで組んだものではESP32開発ボードにESP32-DevKitCを使いました。
Mini RetroTVとして完成させるには単体で駆動出来るようにLolin D32という開発ボードを使っています。

Lolin D32はESP32-DevKitCと同じESP-WROOM-32が使われた開発ボードで、リポバッテリーからの駆動やその充電回路が内蔵されているのでこのようなプロジェクトに最適です!
他のパーツ構成は前回ブレッドボードで組んだものから変えていません。

Instagramでは非常に多くのコメント&DMを頂いたので3DプリントパーツデータをThingiverseに公開しました。

手の平サイズの小さなボディーに全パーツを収めるのは結構大変だと思います。
製作をご検討の方は前回の記事を参考に、まずブレッドボードで組んで動かしてみて回路構成等を理解した上で製作に望まれるのがいいかと思います。
ブレッドボード上で動かすだけでも結構楽しいのでオススメです!

全体構成 & 接続

まず全体の接続、回路構成です。
ブレッドボードで組んだものからリポバッテリーでの駆動や電源のON/OFFスイッチを追加しています。

ESP32(Lolin D32)・1.69インチ(240×280)TFTディスプレイ・SDカードモジュール・I2Sオーディオモジュール&スピーカー・タクトスイッチといったシンプルな構成で動かすことが出来ます。

使用パーツは3Dプリントパーツにマウントする際に穴位置やサイズの問題があるので、製作される際は指定パーツを使って下さい。(後述します)

全体の接続はこのようになります。

接続および使用I/O端子

ディスプレイLolin D32
GNDGND
VCC3.3V
SCLGPIO18
SDAGPIO23
RESGPIO33
DCGPIO27
CSGPIO5
BLK3.3V
SDカードモジュールLolin D32
VCC3.3V
CSGPIO13
MOSIGPIO15
CLKGPIO14
MISOGPIO4
GNDGND
I2Sオーディオ(PAM8302)Lolin D32
A+GPIO26
A-GND
Vin3.3V
GNDGND
ボタンLolin D32
進むGPIO16
戻るGPIO17
IR(赤外線受光モジュール)Lolin D32
SignalGPIO22
GNDGND
VCC3.3V
電源スイッチLolin D32
ENピン
GND
リポバッテリーLolin D32
BATピン
GND

3Dプリントパーツの設計

TinyTVのように片手に収まるサイズ感で製作したい・・・というのが大前提としてあったので、3Dプリントパーツの設計には非常に苦労しました。

もう少し曲線部分を増やしレトロテレビ感を出したかったのですが、パーツを配置するスペースが内部に多く取れないのでシンプルな形状にしています。

CAD上では想定するサイズで最大限内部に空間が出来るように設計しましたが・・・

どうしてもパーツ固定の際にドライバーが入らないことから、ボディー底面にビスを打つための穴をいくつか入れました!

これを隠すために当初予定していなかった足(スタンド)を取り付けたところ・・・結果的にレトロテレビっぽく可愛いくいい感じで仕上がりました。

STLデータをThingiverseにアップしたので興味ある方はお使い下さい!
全4パーツ構成となっています。

参考 Mini RetroTV with ESP32Thingiverse

フィラメントはPLAを使いました。
PLAフィラメントを使った試作ではSunlu製のものを使うことが多いのですが、今回つや消しタイプのマットグリーンとマットブラックを使いました。

積層面が目立ちにくく非常に綺麗に仕上がりました。

使用パーツ一覧

使用パーツの一覧です。
以下指定のものに穴位置など合わせているので、サイズ等はリンク先ページで確認して下さい。

Lolin D32

ESP32開発ボードはLolin D32を使います。(上写真右)
技適取得済みのESP-WROOM-32が使われリポバッテリーからの駆動が出来る便利なボードです。
現在国内ショップでは入手しにくいのが残念です!

【電子工作】技適取得済みESP32開発ボード『Lolin D32』を使ってみる!

ディスプレイ(1.69インチ TFT 240×280 ST7789)

ディスプレイは1.69インチ(解像度240×280)、SPI制御のST7789ドライバタイプのものを使います。

ブレッドボードでのテストでは他のサイズや別のドライバチップを使ったディスプレイでも動作出来ましたが、3Dプリントパーツは上記のものに合うように設計しています。

テレビのモニター形状に合うように角が丸まったタイプのディスプレイです。(写真中央)

SDカードモジュール

SDカードモジュールはサイズや駆動電圧等さまざまなものが販売されていますが、こちらも3Dプリントパーツに合うようにミニサイズの3.3V駆動タイプのものを使います。(写真中央)

I2Sオーディオモジュール & スピーカー

I2SオーディオモジュールはPAM8302モジュールを使います。
シングルチャンネルのD級パワーアンプモジュールで最大2.5Wまでの出力が可能となっています。

これに合わせスピーカーは2Wタイプのものを使いました。
1W前後の小さなスピーカーでも問題ありませんが、スピーカースペースは少し余裕があるので大きなものを使いました。
かなり音質が良くなります。

IR受光モジュール(赤外線センサー)

IR(赤外線)受光モジュールはこちらを使いました。
テレビやエアコンなどリモコンのIR信号に反応して動画をランダム再生する事が出来るようにしています。

タクトスイッチ

タクトスイッチは6mm角(6mm×6mm)のものを使います。
CAD設計上、9mm以上の高さが必要となります。

9mm以上で押しやすいものを選択して下さい。
私は12mmのもの(6mm×6mm×12mm)を使いました。
3Dプリントパーツから少し出っ張る感じになります。

電源スイッチ

電源スイッチはタミヤの6Pスライドスイッチを使います。

ユニバーサル基板

Lolin D32を乗せるメインボード用とスイッチボード用の2枚必要となり、指定サイズにカットして使います。

M2×6mm タッピングビス

基板および3Dプリントパーツの固定にM2×6mmのタッピングビスを使います。(計24本)

リポバッテリー

リポバッテリーのサイズは空いたスペースに入れるので特にサイズは限定しませんが、300~500mA前後のものがちょうどいいかと思います。

その他パーツ

その他パーツとしてピンヘッダーやジャンパーワイヤが必要となります。

スイッチボード & メインボードの作成

Lolin D32・タクトスイッチ・IR受光モジュールはユニバーサル基板に実装し3Dプリントパーツにビス固定します。
指定サイズに切り取ったユニバーサル基板が2枚必要となってきます。

スイッチボード

まずタクトスイッチとIR受光センサーを取り付けるボードの作成です。

ユニバーサル基板を以下サイズに切り取ります。
カッター等で何度か切れ目を入れ折り曲げると簡単に切り取ることが出来ます。

四隅に固定用のビス穴(M2)が必要となるので、ビスが通る2mmくらいまで広げます。
棒ヤスリがあれば便利です!

タクトスイッチを2つ、IR受光センサーをそれぞれ指定位置にはんだ付けし配線します。

この基板から5本のケーブルが出ますが、あまり長すぎるとケースに収めるのが困難になります。
3Dプリントパーツを使い仮組みして次のメインボードとの距離から最適な長さにして下さい!

メインボード

次にメインボードです。
同様にユニバーサル基板を以下サイズにカットし指定位置に固定用のビス穴(M2)を2箇所開けます。

ESP32(Lolin D32)の固定はこの位置になります。
3DプリントパーツのUSB端子穴位置に合わせています。

スイッチやディスプレイ、SDカードモジュール、I2Sオーディオモジュールとの接続は直接ワイヤーをユニバーサル基板にはんだ付けしてもいいのですが、今回ピンヘッダーを取り付けました。

上記全体回路図を参考に配線して下さい!

参考までに、各モジュールへの接続用ピンヘッダーはこのように取り付けました。

各モジュールの配線

ディスプレイ

購入先によってはディスプレイにピンヘッダーが取り付けられているものがありますが、3Dプリントパーツと干渉するので直接ケーブルを配線します。

他のモジュールも同様に直接ケーブルをはんだ付けします。

SDカードモジュール

電源スイッチ

PAM8302 オーディオモジュール

スピーカーの音量はボードの半固定抵抗をドライバーで回して調整します。

この時点で一度仮組みしてESP32にスケッチを書き込み動作確認をした方がいいかもしれません!(書き込むスケッチは後述します)

配線ミスがあると組んだあとにまたバラすのが大変です!
また音量調整も組み込んだ後では出来ないので、この時点でやっておくといいです。

組み立て

配線が出来たら組み立てです。

STEP.1
ディスプレイの取り付け
フロントパネル(Front.stl)にディスプレイを固定します。
固定で使うビスは全てM2×6mmを使います。

STEP.2
スイッチボードの取付

STEP.3
メインボードの取り付け

ピンヘッダーを差し込みフロントパネルは完了です!

STEP.4
microSDカード & オーディオモジュールの取り付け
ボディーパネル(body.stl)の上部にmicroSDカードモジュールとオーディオモジュールを取り付けます。

STEP.5
電源スイッチ & スピーカーの取付
バックパネル(Back_Panel.stl)に電源スイッチとスピーカーを取り付けます。
電源スイッチを固定するビスのみ5mm程度のものを使用します。
ニッパ等を使い1mmほどカットしたものを使って下さい!
スピーカーは付属の両面テープで固定します。
STEP.6
ボディーの組み立て
ボディーにフロントパネルをスライドして残りのピンヘッダーを差し込みます。
配線が長すぎるとケースを閉じにくくなり、また短かすぎると上手くピンヘッダーに差し込めなくなり・・・
一番難しい部分となりますが、一度ここまで仮組みして配線の長さを決めていると綺麗に収まると思います。

リポバッテリーは空いたスペース、または400mA前後のバッテリーならスピーカーの後ろに貼り付けて収めることが出来ます。(下記写真のものはパーツ一覧でリンクを貼った360mAのバッテリーです)
STEP.7
ボディーの固定
底面2ヶ所、背面2ヶ所にビスを打ちボディーを固定します。


STEP.8
スタンドの取り付け
最後にスタンドを取り付けて完成です!

スケッチの書き込み

Mini RetroTVとして動作するスケッチはこちらからダウンロードして下さい。

スケッチの書き込みはArduino IDEを使って行います。
ESP32への書き込みが初めてという方は、ESP32に゙対応したボードパッケージのインストールが必要となります。

普段ESP32を使われている方は問題ないと思いますが、初めての方はこちらの記事を参考にまずボードパッケージのインストールを行って下さい。

Arduino IDEでESP32やESP8266を使う時の環境設定を行う手順!

ライブラリのインストール

スケッチ書き込みの前に必要なライブラリがいくつかあります。
以下ライブラリのインストールを行っておきます。

必要なライブラリ
  • Adafruit GFX Library
  • JPEGDEC
  • arduino-libhelix
[Adafruit GFX Library by Adafruit]と[JPEGDEC by Larry Bank]ライブラリはArduino IDEのライブラリマネージャーからインストール出来ます。

最後に[arduino-libhelix]ライブラリです。
以下GitHubページからダウンロードしてインストールします。

参考 pschatzmann/arduino-libhelixGitHub

GitHubからダウンロードしたライブライのZIPファイルを、[スケッチ]→[ライブラリをインクルード]→[ZIP形式のライブラリをインストール]から行って下さい。

スケッチの書き込み

ライブラリのインストールが完了したらPCと接続しスケッチを書き込みます。
ボード設定は[Lolin D32]です。

動画ファイルの用意

再生させたい動画ファイル(mp4)からあらかじめ映像(mjpeg)と音声(mp3)を分離した2つのファイルを用意しておく必要があります!

FFmpegというフリーソフトを使い解像度やビットレートなどを設定して動画ファイルからmjpeg/mp3ファイルの抽出を行いますが・・・少し面倒な作業となります。

上記ダウンロードしたファイルにある[SDCards]フォルダ内に私がテストで使っていた既に変換済みのファイルをいくつか入れています。

FAT32形式でフォーマットしたSDカード内にコピーすれば再生出来るので、動作確認の際にお使い下さい!

動作確認

スケッチを書き込み、mjpeg/mp3ファイルが入ったSDカードをセットして起動すると動画が順次再生され、[進む][戻る]スイッチで再生する動画を切り替えることが出来ます。

またテレビやエアコンなど赤外線リモコンからの何かしらIR信号を受信するとランダムで選曲し動画を再生します。

ここまで動作が問題なければ完成です!
お疲れ様でした!

内蔵したリポバッテリーはUSBケーブルを差し込むと自動的に充電が開始されます。
ボードにある充電インジケーターLEDは見えませんが300mA前後のリポバッテリーで1時間といったところで完了します。

SDカードの穴の隙間から覗き込むと薄っすらインジケーターLEDの点灯を確認することが出来ます。
赤色LEDが点灯している時は充電中、点滅に切り替わると充電完了となります。

MEMO
[進む][戻る][IR信号からのランダム再生]はI/Oピンの割り込みを使っています。
スイッチのチャタリング等の影響を受け何度かスイッチ動作をカウントしてしまうことがあります。
そこも味があっていいかな?とは思いますが、気になる方はスイッチ周りにRCフィルター等を入れ対策して頂ければと思います。

上記サンプルスケッチではIR信号を受信するとランダム再生するようにしていますが、私が実際に使っているものはテレビのリモコンの各チャンネル(1~10)に特定の動画を割り当てて再生するようにしています。
よりレトロテレビっぽくなって面白いと思います。

使用するリモコンによりIRコードが異なるのでサンプルスケッチではランダム再生にさせていますが、そのようなカスタムをしてみたいという方はこちらの記事を参考にIRコードを取得すれば比較的簡単にスケッチ修正は出来ると思います。

【Arduino入門編㉗】赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法!

FFmpegを使ったファイル変換

動画ファイル(MP4)から映像(mjpeg)と音声(mp3)ファイルを分離したものをスケッチと共に添付したので動作確認は出来たかと思います。

自身で用意した動画を再生させたい場合はFFmpegというフリーソフトを使いmp4ファイルからmjpeg/mp3ファイルを抽出(ファイル変換)する必要があります!
FFmpegの使い方は長くなるのでこちらでは割愛しますが、必要な部分のみ簡単に見ておきます。

ダウンロードしたスケッチの先頭部分を見て頂くとコメントアウトした2行のコードがあります。
FFmpegを使い映像及び音声ファイル変換の際に必要となります。
FFmpegを使い今回使用した構成で再生する際の映像&音声ファイル変換に使用するターミナルに打ち込むコマンドです。

これをターミナルで打ち込み、FFmpegを使ってmjpegファイル/mp3ファイルの抽出を行います。

【映像抽出 mp4 → mjpeg】

ffmpeg -i XXXX.mp4 -vf “fps=24,scale=-1:240:flags=lanczos,crop=288:in_h:(in_w-288)/2:0” -q:v 11 AAAA.mjpeg

【音声抽出 mp4 → mp3】

ffmpeg -i XXXX.mp4 -ar 44100 -ac 1 -ab 32k -filter:a loudnorm -filter:a “volume=-5dB” AAAA.mp3
[XXXX.mp4]は動画の元ファイルで、[AAAA.mjpeg][AAAA.mp3]は抽出後の映像と音声ファイルとなります。
AAAAは任意の文字で問題ないのですが、映像と音声をセットで使うので一致させておく必要があります。

自作基板でMiniTVを製作された方のこちらの動画が参考になると思います。

最後に!

ESP32で動画を再生する・・・今回のプロジェクトのコアとなる部分を公開されている先人の方々に感謝です!

市販されているTinyTVのような可愛いミニレトロテレビを製作することが出来ました。

あらかじめ内蔵されている動画を再生するだけのTinyTVとは違い、好きな動画をSDカードに入れておけば何でも再生する事が出来ます。
電子工作の作業デスクに置いておけばテンションも上がりますよね!

TINYシリーズのアーケードゲーム版?にTINY ARCADEというものがありますが、収録されているレトロアーケードゲームもESP32を使いエミュレーターで動かすことが出来ます。

こちらも面白いので興味ある方は合わせて見て頂ければと思います。

【電子工作 / ESP32】ESP32で動かすアーケードゲームエミュレーター『Galagino』。TINY ARCAD風ケースを3Dプリンタで製作しました!

コメントを残す