HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/02/18

ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する! ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

(ESP32で東方の Bad Apple!!の動画を再生する!実際にはパラパラ漫画です)

Tags: [電子工作]




● ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

 ESP32で東方の Bad Apple!!の動画を再生する!実際にはパラパラ漫画です。

● FREE WINGが改造した MP3 再生版 I2S DAC
 注意: ESP32で MP3を再生して音楽が鳴ります!
Touhou Bad Apple!! Demo ESP32 with MP3 Audio I2S DAC and SSD1306 OLED (128x64 dot)


● FREE WINGが改造した MP3 再生版 NO DAC
 注意: ESP32で MP3を再生して音楽が鳴ります!
Touhou Bad Apple!! Demo ESP32 with MP3 Audio and SSD1306 OLED (128x64 dot)


●オリジナルの音無し版
Touhou Bad Apple!! Demo ESP32 with SSD1306 OLED (128x64 dot)


● ESP32の I2S DACの比較
 下記の DACを比較しています。
* MAX98357A
* CS4344
* ES7148
* PCM5102A
* UDA1334A

ESP32 I2S DAC Audio playback quality comparison Part 1


ESP32 I2S DAC Audio playback quality comparison Part 2



ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!


ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!


ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!




● Original Movie

【東方】Bad Apple!! PV【影絵】

【東方】Bad Apple!! PV【影絵】



● ESP32_BadApple_MP3 FREE WINGによる MP3改造版のソース

FREEWING-JP / ESP32_BadApple_MP3

 とりま、改善系をプルリクしました。
Feature/optimize draw oled buffer #3

 大きく3項目の改造・改善を行なっています。
 ・OLEDの描画処理の高速化
optimize_draw_oled_buffer

 ・MP3ファイルの再生機能の追加
add_mp3_function

 ・OLEDの描画処理の更なる高速化とデータファイルサイズを半減(90度回転)
optimize_draw_oled_rotate_90


● ESP32_BadApple Source Code for Arduino

 オリジナルの ESP32の Bad Apple!!のソースコード。

 今回、このプログラムの改造を通じて Arduinoや ESP32について色々な知見を得る事ができました!

hackffm / ESP32_BadApple
 Bad Apple video by Touhou on ESP32 with SSD1306 OLED, uses the Heatshrink compression library to decompress the RLE encoded video data.

 /data/video.hsが動画(パラパラ漫画)のデータで 908 KBです。

・SPIFFSに video.hsファイルを転送する必要が有ります
SPIFFSに video.hsファイルを転送する必要が有ります




● heatshrink圧縮

 元は 128x64dot モノクロ 6573 frameで、
128 * 64 / 8 * 6573 = 6730752 byte
 です。

 動画の長さ的には 6573 / 30fps = 219.1 secです。

 6730752 byteのデータを RLE圧縮で 2296671 byteに圧縮し、それを更に heatshrinkで 930065 byteに圧縮しています。

byte圧縮率(元の何%か)
元データ 6573フレーム6730752100.0%
RLE圧縮229667134.1%
heatshrink圧縮93006513.8% (40.5%)

heatshrink
 A data compression/decompression library for embedded/real-time systems.

Arduino-HScompression
 Arduino library that uses the open source Heatshrink compression library

heatshrink-java
 Java library used to encode/decode heatshrink compressed data.


● Wemos Lolin32 ESP32

 ※工事設計認証(技適)番号:211-161007


● Wemos Lolin32 ESP32 I2C

// I2C Communication SDA = 5 and SCL = 4 on Wemos Lolin32 ESP32 with built-in SSD1306 OLED
SSD1306 display (0x3c, 5, 4);


● SPIFFSのアップロードをコマンドラインから行なう方法

2023/02/18
ESP32の SPIFFSのアップロードをコマンドラインから行なう方法
ESP32の SPIFFSのアップロードをコマンドラインから行なう方法

  How to Upload SPIFFS to ESP32 via command line


● Arduino ESP32で MP3ファイルを再生する方法

2023/02/18
Arduino ESP32で MP3ファイルを再生する方法
Arduino ESP32で MP3ファイルを再生する方法

  ESP8266Audioライブラリで MP3ファイルをお手軽に再生する方法


● FFmpegを使って OLED 128x64用に動画をリサイズして、全フレームを PNGファイルに書き出し

rem OLED 128x64のサイズに動画をリサイズ
ffmpeg.exe -i "[Touhou] Bad Apple!! PV [Shadow]" -vf "scale=128:64" ba_oled.mp4

rem 動画の全フレームを PNGファイルに書き出し
mkdir scene
ffmpeg.exe  -i ba_oled.mp4 ./scene/%05d.png

● WSL上で heatshrinkをビルドして動画データを圧縮する

# heatshrinkをビルドする
git clone https://github.com/atomicobject/heatshrink
cd heatshrink
make

# sceneディレクトリに全フレームの PNGファイル(6573個)をコピーしておく
ls -l ./scene

# Compress.pyで PNGファイルを RLE圧縮する
rm video.*
python Compress.py
# 1150898
# Done

# heatshrinkで更に圧縮する
# RLE to heatshrink
./heatshrink -e video.bin video.hs

ls -l video.*
# -rw-r--r-- 1 user user 1150898 Feb 26 00:31 video.bin
# -rw-r--r-- 1 user user  585822 Feb 26 00:32 video.hs
# -rw-r--r-- 1 user user 6730752 Feb 26 00:31 video.uc

 90度回転版は元データの 10%以下!
byte圧縮率(元の何%か)
元データ 6573フレーム6730752100.0%
RLE圧縮115089817.1%
heatshrink圧縮5858228.7% (50.9%)

$ ./heatshrink -h
heatshrink version 0.4.1 by Scott Vokes <vokes.s@gmail.com>
Home page: https://github.com/atomicobject/heatshrink

Usage:
  heatshrink [-h] [-e|-d] [-v] [-w SIZE] [-l BITS] [IN_FILE] [OUT_FILE]

heatshrink compresses or decompresses byte streams using LZSS, and is
designed especially for embedded, low-memory, and/or hard real-time
systems.

 -h        print help
 -e        encode (compress, default)
 -d        decode (decompress)
 -v        verbose (print input & output sizes, compression ratio, etc.)

 -w SIZE   Base-2 log of LZSS sliding window size

    A larger value allows searches a larger history of the data for repeated
    patterns, potentially compressing more effectively, but will use
    more memory and processing time.
    Recommended default: -w 8 (embedded systems), -w 10 (elsewhere)

 -l BITS   Number of bits used for back-reference lengths

    A larger value allows longer substitutions, but since all
    back-references must use -w + -l bits, larger -w or -l can be
    counterproductive if most patterns are small and/or local.
    Recommended default: -l 4

 If IN_FILE or OUT_FILE are unspecified, they will default to
 "-" for standard input and standard output, respectively.


● SSD1306 OLEDの描画の高速化

2023/02/18
SSD1306 OLEDの描画を高速化する方法
SSD1306 OLEDの描画を高速化する方法

  How to Speed Up OLED Drawing Speed


● ESP32のプログラムのサイズを小さくするテクニック

 int16_tや int8_tの代わりに int32_tを使う事でプログラムのサイズが減ります。
 多分、ESP32は 32bit長の演算がデフォルトで、8bit長や 16bit長の場合は変換をしているのと思います。
 Arduinoの中間ファイル(アセンブリ出力)の確認方法が判らないので憶測ですが。。。

 同じ理由でプログラムの実行速度も速いハズです。

 結論: ESP32の場合 int32_t, uint32_t等の DWORDを使用し、WORD(int16_t, uint16_t)や BYTE(int8_t, uint8_t, byte, char)は使用しない。

 参考として、
Sketch uses 322849 bytes
 が
Sketch uses 322825 bytes
 で 24byte減りました。


● ESP32のプログラムを高速化する方法

 2バイトや 1バイトの変数を 4バイトの DWORD系に変更する。
 無駄な初期化の代入を削除する。
 プログラムの変数の変化を見極めて、不要な代入を削除する。
 ロジックを見直して処理の方法を変える。


● Bad Apple!!の改造の成果!

改造内容コミット ハッシュ再生時間ノーウェイトの実行時間速度改善(秒)
オリジナルa6f330c3:36.9771:37.886--
オリジナルを I2C SCLK 4MHz設定a6f330c3:36.9411:21.11016 sec
mod Add Frame counter and More Accurate frame rate1974d053:39.0941:39.652-2 sec
mod Optimize int16_t to int32_tc33224c3:39.0841:38.390-1 sec
mod I2C SCLK to 4MHz2ee30c03:39.1161:21.60616 sec
mod Optimize Direct Draw OLED buffer395e4d93:39.0901:04.37433 sec
上記の (I2C SCLK 700kHz)同上--1:21.17316 sec
mod More Optimize Direct Draw OLED buffer994f92b--1:03.27434 sec
OLED buffer Write 4 dotd39c117--1:02.31935 sec
mod Del unnecessary Initialize158a3a2--1:02.28335 sec
上記の (I2C SCLK 700kHz)同上--1:19.05718 sec
mod Add MP3 Audio function749d7e73:40.2343:28.140--
mod Rotate 90 for Direct Write821ca733:39.4762:56.62832 sec(MP3比)
上記の (I2C SCLK 1.31MHz)
(Enable MP3)
同上--2:38.73818 sec(mod Rotate 90比)
上記の (I2C SCLK 700kHz)
(Disable MP3)
同上--1:16.93521 sec
上記の (I2C SCLK 1MHz)
(Disable MP3)
同上--1:00.05037 sec
上記の (I2C SCLK 1.31MHz)
(Disable MP3)
同上--45.88852 sec

● I2Cの SCLKクロック周波数を変化させた時

 1MHz以上で実行時間に変化が無いのでロジアナで実際に動作周波数を確認したら上限が 1MHz(実測で 892kHz)っぽい。
 これは ESP32-D0WDQ6 (revision 1)の上限?
※ 下記の「I2Cの SCLの周波数をクロックアップ」の記事で書きましたが、ESP32のライブラリ内で 1MHzに制限していました。

 mod Del unnecessary Initialize,158a3a2
I2C SCLK Freqノーウェイトの実行時間
(I2C SCLK 700kHz)1:19.057
(I2C SCLK 1MHz)1:02.288
(I2C SCLK 2MHz)1:02.281(1MHzと同じ)
(I2C SCLK 3MHz)1:02.295(1MHzと同じ)
(I2C SCLK 4MHz)1:02.283(1MHzと同じ)
(I2C SCLK 10kHz Low Speed mode)(未計測)
(I2C SCLK 100kHz Standard mode)6:58.725
(I2C SCLK 400kHz Fast mode)2:00.338
(I2C SCLK 3.4MHz High Speed mode)1:02.273

● EPS32の I2Cの SCLの周波数を黒魔術でクロックアップして SSD1306 OLEDの描画を高速化する方法

2023/02/18
EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法
EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法

  OLED SSD1306で I2Cの SCLK周波数をドーピングで高速化して描画速度を爆速にする方法



Tags: [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する
2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する

  2.42inch 128x64 OLED LCD Display module SSD1309で Bad Apple!!を再生します

SSD1306 OLEDの描画を高速化する方法
SSD1306 OLEDの描画を高速化する方法

  How to Speed Up OLED Drawing Speed

EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法
EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法

  OLED SSD1306で I2Cの SCLK周波数をドーピングで高速化して描画速度を爆速にする方法

【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット
【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット

  Freenove Basic Starter Kit for ESP32-S3-WROOM Onboard Camera Wireless Python C FNK0084

【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット
【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット

  Freenove Ultimate Starter Kit for ESP32-WROVER Onboard Camera Wireless Python C FNK0047

LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方
LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方

  LoRaを使用した IoT郵便受け LoRa IoT Mailbox Sensor with LINE Messaging API

ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法
ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法

  Slackの勤怠チャンネルに毎日毎日毎日毎日 手動で投稿するのが馬鹿らしいので ESP32で作った

ESP32-S3で SPIを使う時に Arduinoでエラーが出た話
ESP32-S3で SPIを使う時に Arduinoでエラーが出た話

  ESP32 S3 SPI error VSPI was not declared in this scope

ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法
ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法

  ESP32で MCLKが必須の CS4344が問題無く使えます

ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法
ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法

  ESP32 SPI IPS Color LCD ST7735S tutorial

【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法
【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法

  ESP32 I2C OLED SSD1306 tutorial

ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話
ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話

  Fake ESP32-WROOM Ignore FCC ID and Strange TELEC mark




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/espressif_esp32_bad_apple_demo/