最終更新日:2018/08/02
いろいろな方々から質問があったので、ここでは、ESP32 ( ESP-WROOM-32 )の SPI 通信で、OLED ( 有機EL ) SSD1331 モジュールに文字を表示させる、最も簡単な方法を紹介します。
SPIFFS を使った方法です。
簡単と言っても、初めて使う方は手順が沢山あります。
ここでは 8×16 または 16×16 の文字を表示させます。
フリーの日本語フォント、東雲フォントを使いますが、半角の英語アルファベットも表示できます。
使用する主なボード
ESP32開発ボード
例えば、私のお勧めボード、ESPr Developer 32 などがあります。
OLED SSD1331 モジュール( SPI )
接続方法
SPI通信接続で以下のように接続してください。
最新版 Arduino – ESP32 のインストール
Arduino core for the ESP32 は最新版をインストールしておいてください。
2018/07/10より前のものはバグが多いので、古いバージョンの Arduino – ESP32 は必ずフォルダごと削除してから再インストールしてください。
インストール方法は以下の記事を参照してください。
Arduino core for the ESP32 のインストール方法
SPIFFS メモリサイズを大きくしておく
デフォルトのSPIFFSサイズでは、東雲フォントファイル群を保存できません。
予め、SPIFFS のパーティションテーブルを変更する必要があります。
変更方法は以下の記事を参照してください。
ESP-WROOM-32 ( ESP32 ) SPIFFS メモリサイズを大きくする方法
東雲フォント、UTF8→Shift_JIS変換テーブルをダウンロード
現在、こちらの記事にあるように、東雲フォントを保守開発していた /efont/ さんのページがリンク切れを起こしているので、一時的に GitHub の以下のページにフォントを置いておきました。
https://github.com/mgo-tec/SDcard_sample_filses
ZIPファイルをダウンロードして、解凍してください。
その中の以下のファイルを使います。
Utf8Sjis.tbl
私の自作ファイルです。
UTF-8 コードを Shift_JISコードに変換する為のテーブルファイルです。
shnmk16.bdf
全角日本語、東雲フォントファイルです。
16×16 pixel です。
shnm8x16.bdf
半角東雲フォントファイルです。
英語アルファベットはこれを使います。
8×16 pixel です。
SPIFFS ファイルアップローダープラグインで、フォントファイルをアップロードする
Arduino core for the ESP32 のプラグイン、SPIFFSファイルアップローダーを予めインストールしておきます。
アップロード方法は以下の記事を参照してください。
ESP-WROOM-32 ( ESP32 ) SPIFFS アップローダープラグインの使い方
これを使って、前項の3つのフォント関連ファイルを SPIFFS にアップロードしておいてください。
自作ライブラリのインストール
以下の3つの私の自作ライブラリを Arduino – IDE にインストールしておいてください。
GitHubページからZIPファイルをダウンロードしていただき、そのZIPファイルごとArduino – ESP32 にインストールできます。
そのインストール方法は以下の記事を参照してください。
GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )
ESP32_SSD1331
SSD1331 をドライブする自作ライブラリです。
https://github.com/mgo-tec/ESP32_SSD1331
ESP32_SPIFFS_UTF8toSJIS
Utf8Sjis.tbl ファイルを使って、UTF-8コードからShift_JIS に変換する自作ライブラリです。
https://github.com/mgo-tec/ESP32_SPIFFS_UTF8toSJIS
ESP32_SPIFFS_ShinonomeFNT
Shift_JISコードから東雲フォントを抽出する自作ライブラリです。
https://github.com/mgo-tec/ESP32_SPIFFS_ShinonomeFNT
文字表示だけの単純なスケッチ
半角英字アルファベットのみの単純なスケッチです。
“Hello World” の所を日本語に替えれば、日本語表示できます。
ただし、縦横サイズが1の場合、1行に半角英字は12文字まで。
全角は6文字までです。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include "ESP32_SSD1331.h" #include "ESP32_SPIFFS_ShinonomeFNT.h" #include "ESP32_SPIFFS_UTF8toSJIS.h" const char* UTF8SJIS_file = "/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく const char* Shino_Zen_Font_file = "/shnmk16.bdf"; //全角フォントファイル名を定義 const char* Shino_Half_Font_file = "/shnm8x16.bdf"; //半角フォントファイル名を定義 const uint8_t SCLK_OLED = 14; //SCLK const uint8_t MOSI_OLED = 13; //MOSI (Master Output Slave Input) const uint8_t MISO_OLED = 12; //これは実際は使っていない。MISO (Master Input Slave Output) const uint8_t DC_OLED = 21; //OLED DC(Data/Command) const uint8_t RST_OLED = 4; //OLED Reset const uint8_t CS1_OLED = 15; //CS (Chip Select ピン) ESP32_SSD1331 ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS1_OLED, DC_OLED, RST_OLED); ESP32_SPIFFS_ShinonomeFNT SFR; void setup() { Serial.begin(115200); ssd1331.SSD1331_Init(); ssd1331.Display_Clear(0, 0, 95, 63); SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); Serial.println(); String test_str; uint8_t test_buf[12][16] = {}; uint16_t test_sj_length; uint8_t H_Size, V_Size; //水平サイズ:H_Size(1,2,4) 垂直サイズ:V_Size(1,2,4) uint8_t X0, X1, Y0, Y1; //ディスプレイ表示座標位置 uint8_t red, green, blue; //256color, Max red=7, green=7, blue=3 test_str = "Hello World"; H_Size = 1; V_Size = 1; X0 = 0; Y0 = 0; red = 7; green = 7; blue = 3; test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf); ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf); test_str = "0123456789ab"; H_Size = 1; V_Size = 1; X0 = 0; Y0 = 16; red = 7; green = 0; blue = 0; test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf); ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf); test_str = "Hello!"; H_Size = 2; V_Size = 2; X0 = 0; Y0 = 32; red = 0; green = 7; blue = 0; test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf); ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf); } void loop() { }
コンパイル書き込み実行
では、Arduino IDE でコンパイル書き込み実行させてみてください。
下図の様に表示されればOKです。
Amazon.co.jp 当ブログのおすすめ
コメント