ESP32-DevKitC-32E で OLEDディスプレイ SSD1331 を使う (lcdgfxライブラリのdemoを動かす)

概要

ESP32-DevKitC-32EボードとOLEDディスプレイSSD1331を組み合せた IoTデバイスを製作しています。

ArduinoのデバイスとしてESP32-DevKitC-32Eボードを使用した場合、Adafruit-SSD1331ライブラリを使えば比較的簡単に動かすことができました。

そういう意味ではArduinoは本当によくできていますが、複数のタスクを活用した設計を行いたく、まず、RTOSとC/C++で開発できる環境を構築することを目指します。

いろいろと試した結果、lcdgfxライブラリのdemoをビルドしてSSD1331に表示することができました。

lcdgfxについて

今回利用しているライブラリがlcdgfxです。

GitHub - lexus2k/lcdgfx: Driver for LCD displays running on Arduino/Avr/ESP32/Linux (including Rasperry) platforms
Driver for LCD displays running on Arduino/Avr/ESP32/Linux (including Rasperry) platforms - GitHub - lexus2k/lcdgfx: Driver for LCD displays running on Arduino/...

プロジェクトの説明として、下記が記述されています。

Driver for LCD displays running on Arduino/Avr/ESP32/Linux (including Rasperry) platforms

元となっているプロジェクトが下記、ssd1306 である模様です。

GitHub - lexus2k/ssd1306: Driver for SSD1306, SSD1331, SSD1351, IL9163, ILI9341, ST7735, PCD8544, Nokia 5110 displays running on Arduino/ESP32/Linux (Rasperry) platforms
Driver for SSD1306, SSD1331, SSD1351, IL9163, ILI9341, ST7735, PCD8544, Nokia 5110 displays running on Arduino/ESP32/Linux (Rasperry) platforms - GitHub - lexus...

ちなみにこちらのプロジェクトの説明は下記の通りです。

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とシェルスクリプトのセットとなります。

GitHub - wurly200a/ssd1331_demo_esp32
Contribute to wurly200a/ssd1331_demo_esp32 development by creating an account on GitHub.
  • 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

実行結果

概要にある動画の通りです。

Copied title and URL