概要
ESP32-DevKitC-32EボードとOLEDディスプレイSSD1331を組み合せた IoTデバイスを製作しています。
ArduinoのデバイスとしてESP32-DevKitC-32Eボードを使用した場合、Adafruit-SSD1331ライブラリを使えば比較的簡単に動かすことができました。
そういう意味ではArduinoは本当によくできていますが、複数のタスクを活用した設計を行いたく、まず、RTOSとC/C++で開発できる環境を構築することを目指します。
いろいろと試した結果、lcdgfxライブラリのdemoをビルドしてSSD1331に表示することができました。
参考にしたページ
lcdgfxについて
今回利用しているライブラリがlcdgfxです。
プロジェクトの説明として、下記が記述されています。
Driver for LCD displays running on Arduino/Avr/ESP32/Linux (including Rasperry) platforms
元となっているプロジェクトが下記、ssd1306 である模様です。
ちなみにこちらのプロジェクトの説明は下記の通りです。
Driver for SSD1306, SSD1331, SSD1351, IL9163, ILI9341, ST7735, PCD8544, Nokia 5110 displays running on Arduino/ESP32/Linux (Rasperry) platforms
元はSSD1306シリーズを中心としたLCDをターゲットにしていたところに対し、幅広いLCDに対応するようにプロジェクトを変更したように見えます。 最後のリリースは2021年となっており、README.md にも下記の記載があることから、lcdgfx を使用することにしました。
Check also new C++ library lcdgfx. It consumpts less memory, has simple C++ api
作成したプロジェクト
esp-idf_hello_world
これが今回作成したプロジェクトです。
内容としては、ビルド用のDockerコンテナ(Builder)を作成し、それを利用して私の環境に合わせたビルドを行うDockerfileとシェルスクリプトのセットとなります。
- build
- 01_build-builder.sh
- 02_enter-builder.sh
- 03_build.sh
- Dockerfile
(README等は省略)
ビルド方法
スクリプトの実行方法
READMEの通り、プロジェクトをクローンしたら最上位のディレクトリから、スクリプトがあるディレクトリのパスを含んだ形でスクリプトを実行します。
step1
ビルド用のDockerコンテナのイメージを docker build します。最初の1回のみ実行が必要です。
なおデフォルトのイメージ名は”esp-idf-v4_builder”としており、第一引数で任意の名前を指定可能です。
$ build/01_build-builder.sh
step2
ビルド用のDockerコンテナに入ります。第一引数でイメージ名を指定可能です。
$ build/02_enter-builder.sh
step3
ソースコードをビルドします。
$ build/03_build.sh
解説
Dockerfile
lcdgfxのexamples/demos/ssd1331_demoはesp-idf v4ではビルド可能ですが、v5ではビルドエラーになりました。よって、こちらはv4に相当するbuilderを作成します。
01_build-builder.sh
特記事項なし
02_enter-builder.sh
特記事項なし
03_build.sh
ビルド手順については、lcdgfx/README.md に基いています。
“Using with plain avr-gcc:”のところに下記記載があります。
- Build demo code (variant 2)
- cd lcdgfx/tools && ./build_and_run.sh -p avr -m <your_mcu> ssd1306_demo
ESP32についても有効なようで、最後に下記のコマンドを実行しています。
cd tools ./build_and_run.sh -p esp32 demos/ssd1331_demo
ビルドした結果を見てみると、
bld/esp32/ に Makefileやソースコードがコピーされています。
Makefile build components main sdkconfig sdkconfig.defaults
このうち、main/ 以下には esp32_main.cpp に freertos のタスク生成処理が記述されています。 build/ 以下には esp-idf の各コンポーネントがずらっとコピーされており、この中にビルド生成物(ssd1331_demo.bin,ssd1331_demo.elf,ssd1331_demo.map)もあります。
components/ 以下には lcdgfx/src と sketch ディレクトリが examples/demos/ssd1331_demo/ 以下のファイルがコピーされており、そのうち、ssd1331_demo.ino が main.cpp としてコピーされています。
ssd1331_demo.ino(main.cpp) が今回のプログラムの本質的な部分であり、SSD1331で使用するGPIOについてもここで定義されています。
元々は下記の定義であるところを、
DisplaySSD1331_96x64x8_SPI display(3,{-1, 4, 5, 0,-1,-1}); // Use this line for Atmega328p
私の環境に合わせて下記のように書き換えます。
DisplaySSD1331_96x64x8_SPI display(4,{-1, 17, 16, 0,18,23});
ビルドスクリプトの記述のほとんどを占めてしまっているのが、この書き換え処理(パッチ適用)になります。
FlashROMへの書き込み
ビルドするとFlashROMへの書き込みコマンドが表示されます。
Generating sections.ld LD /home/wurly/work/lcdgfx/bld/esp32/build/ssd1331_demo.elf esptool.py v3.3.2 Creating esp32 image... Merged 2 ELF sections Successfully created esp32 image. To flash all build output, run 'make flash' or: python /home/wurly/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/wurly/work/lcdgfx/bld/esp32/build/bootloader/bootloader.bin 0x10000 /home/wurly/work/lcdgfx/bld/esp32/build/ssd1331_demo.bin 0x8000 /home/wurly/work/lcdgfx/bld/esp32/build/partitions_singleapp.bin
usbipd-win などを使えば、WSL環境からもUSBデバイスが使用できるのですが、ここでは下記のようにバイナリファイルをWindowsファイルシステム上にコピーし、 ESP32 FlashROM 書き込み の方法で書き込みを行いました。
copy \\wsl.localhost\Ubuntu-22.04\home\wurly\project\ssd1331_demo_esp32\lcdgfx\bld\esp32\build\bootloader\bootloader.bin .\ copy \\wsl.localhost\Ubuntu-22.04\home\wurly\project\ssd1331_demo_esp32\lcdgfx\bld\esp32\build\partitions_singleapp.bin .\ copy \\wsl.localhost\Ubuntu-22.04\home\wurly\project\ssd1331_demo_esp32\lcdgfx\bld\esp32\build\ssd1331_demo.bin .\ esptool.py --chip esp32 --port COM3 --baud 921600 write_flash 0x1000 bootloader.bin 0x8000 partitions_singleapp.bin 0x10000 ssd1331_demo.bin
実行結果
概要にある動画の通りです。