何かを変えたいと思った時は環境を変えると良い。そんなわけでボヤッと過ごすフリータイムを終わらせるため、今更ながらM5Stackを買いました。買ったからには何かしなければ、という気になるので散財は正義ですね。
M5Stackには元からLCDがついているということで、手始めに動画再生をトライしてみました。動画再生と言いつつ動画ファイルを再生するわけではなく、イメージファイルの連続表示です。いわゆるパラパラ漫画ですね。
いつもどおり備忘録がてら手順とコードを残しておきます。
動画をJpgに変換
まずは再生する動画をJpgに変換します。今回は偽マフティの連邦に反省を促すダンスを使わせていただきました。
閃光のハサウェイ見に行きたいなー。
Jpgへの変換は"Free Video to JPG Converter"を使いました。
Free Video to JPG Converter 5.0.92.607 用 Windows - ダウンロード
シンプルなGUIで、一定フレームごとに画像を抜き出す事が可能です。
M5 stackのディスプレイサイズは320×240なので、最大限表示させる場合は"縮小専用"などでサイズ変更してください。
これで大量に偽マフティ画像が得られました。これらを連続再生するとM5Stackで連邦に反省を促すダンスが流れるわけです。
SDカードにデータを入れてM5Stackに突っ込み、前準備完了です。
コード
ファイル名の取得の仕方がわからなかったので力技で実装です。
ファイル数もファイル名も把握できているので、事前にそれを知っている事ありきで書いています。中のファイル数だけfor文を分まわし、インクリメントされているファイル名を文字列足し合わせてM5.Lcd.drawJpgFile
のパスに入れています。応用性ゼロです。
#include <M5Stack.h> void setup(){ M5.begin(); M5.Power.begin(); } void loop() { String filename; for (int i = 1; i < 507; i++){ if(i < 10){ filename = "/Mufti/Mufti 00"; }else if(i < 100){ filename = "/Mufti/Mufti 0"; }else { filename = "/Mufti/Mufti "; } filename += i; filename += ".jpg"; Serial.println(filename); int str_len = filename.length() + 1; char filename_array[str_len]; filename.toCharArray(filename_array, str_len); M5.Lcd.drawJpgFile(SD, filename_array); } }
Arduino sketchでの文字列とdrawJpgFileの仕様にハマる
Arduino sketchはあまり触れた経験が無く、文字列の取り扱いでハマりました。
まずは文字列の結合、特にint型を文字列に入れ込む方法。これはそのまま filename += i;
でいけました。
次にdrawJpgFile
の引数、String型のfilenameをそのまま渡すと駄目で、char型の配列に入れ直しています。
結果
やっとまともに動かすとこまでできたが、カクカク過ぎるな。これじゃ反省を促せない。 pic.twitter.com/IbWqDe86TK
— t_emcee@忙しさ★★★★★ (@t_emcee) August 7, 2021
まとめ
M5Stackはじめました。
動画流すくらいなら簡単にできるかなと思っていましたが、意外と手こずりました。手を動かすと頭で考えているようにはいかないですね。
drawJpgFile
を使った連続再生だと思ったより速度が出なくてカクカク感があります。調べてみると高速化されている方もいて、そちらも試してみたのですが何故かうまく動かず原因解析も時間かかりそうだったので保留中。
ごちゃごちゃ試している間に入門書も届いたので、一通り本に習ってみてから今後なにかやっていければなと思っています。
参考にしたリンク
【M5Stack】パラパラ漫画をLCD表示させる方法 & JpgLoopAnime_Simple.verのご紹介 | Haratta Tech Lab
string — ArduinoでintまたはStringをchar配列に変換する
M5Stackを使ってみる - Attic or Garret