esp-open-rtosを使ってみる
ssd1306(OLED)
exampleディレクトリーには、センサーやTFT/LCDを扱うための沢山のサンプルコードが含まれています。
今回は、その中からexamples/ssd1306_exampleを紹介します。
hd44780_lcdでは随分と苦労しましたが、こちらはあっさりと動きました。

ssd1306に関するライブラリは、extras/ssd1306の関数群として提供されています。
この関数群はSPI/i2c兼用になっていて、以下の定義で通信方法を切り替えます。
「SSD1306_I2C_SUPPORT」が定義されているときはi2c
「SSD1306_SPI4_SUPPORT」が定義されているときは4線式のSPI
「SSD1306_SPI3_SUPPORT」が定義されているときは3線式のSPI
サンプルのデフォルトは「SSD1306_I2C_SUPPORT」になっています。
i2c仕様のSSD1306モジュールとの接続は、サンプルソース上にハードコードされています。
#define SCL_PIN 5
#define SDA_PIN 4
SPI仕様のOLEDを入手しました。
入手したモジュールのピンのシルクは
GND VCC D0 D1 RES DC CS
となっていますが、意味は
GND VCC SCLK MOSI RES DC CS
です。
何か別のモジュールの基盤を流用したんでしょうかね....
ESP8266との接続は以下となります。
OLED(SPI) |
ESP8266 |
GND |
GND |
VCC |
3.3V |
D0(SCLK) |
GPIO14(HSCLK) |
D1(MOSI) |
GPIO13(HMOSI) |
RST |
3.3V(注) |
DC |
GPIO4 |
CS |
GPIO5 |
(注)
本当は、余っているGPIOを使って、HIGH→LOW→HIGHのリセット動作を行う必要が有りますが、
サンプルコードにはこの機能が無いので、手動で3.3V→GND→3.3Vにする必要が有ります。
#define I2C_CONNECTION
の行をコメントアウトしてビルドしたら、i2cと同じように動きました。
examples/ssd1306_fpsも一発で動きました。
このサンプルは全速力でグラフィックを描画し、1秒間に描画した回数を数えて表示します。
下の写真では1秒間に68回の描画を行っていることが分かります。
「Hello, esp-open-rtos!」の文字を色々なサイズのフォントで表示します。
使えるフォントは以下のフォントです。
フォント名に含まれているaXbは幅と高さのドット数で、
フォント名の右の番号はフォントのインデックス番号です。
これらのフォントファイルはextras/fonts/dataにヘッダーファイル(テキストファイル)として有るので、
Makefileでヘッダーファイルとして組み込みます。
フォントファイルは、ファームの一部としてビルドされるので、沢山組み込むとそれだけFlashを圧迫します。
0 FONT_FACE_GLCD5x7,
3 FONT_FACE_BITOCRA_4X7,
4 FONT_FACE_BITOCRA_6X11,
5 FONT_FACE_BITOCRA_7X13,
6 FONT_FACE_TERMINUS_6X12_ISO8859_1,
7 FONT_FACE_TERMINUS_8X14_ISO8859_1,
8 FONT_FACE_TERMINUS_BOLD_8X14_ISO8859_1,
9 FONT_FACE_TERMINUS_10X18_ISO8859_1,
10 FONT_FACE_TERMINUS_BOLD_10X18_ISO8859_1,
11 FONT_FACE_TERMINUS_11X22_ISO8859_1,
12 FONT_FACE_TERMINUS_BOLD_11X22_ISO8859_1,
13 FONT_FACE_TERMINUS_12X24_ISO8859_1,
14 FONT_FACE_TERMINUS_BOLD_12X24_ISO8859_1,
15 FONT_FACE_TERMINUS_14X28_ISO8859_1,
16 FONT_FACE_TERMINUS_BOLD_14X28_ISO8859_1,
17 FONT_FACE_TERMINUS_16X32_ISO8859_1,
18 FONT_FACE_TERMINUS_BOLD_16X32_ISO8859_1,
左がi2cモジュール、右がSPIモジュールです。

WeMos D1 Mini用の0.66インチのSSD1306モジュールを入手しました。
i2cインタフェースでSCLとSDAは、それぞれD1(GPIO5)とD2(GPIO4)を使っています。

このモジュールはWeMos D1 Miniにスタックするか、以下の様に2連のBaseボード経由で使うことができます。

このモジュールは64x48ドットの解像度を持っていますが、内部的には96x64ドットのGRAMを持っていて、
以下の網掛けの部分だけを使っています。
従って、X座標は+32する必要が有ります。

esp-open-rtos標準のライブラリー(extras/ssd1306)で表示することができます。
esp-open-rtos標準のフォントライブラリーは沢山の種類のフォントを扱うことができますが、ビルド時にフォントファイルを
SPIFFSに格納するため、
ビルドにすごく時間がかかります。
フォントの種類を求めないのであれば、こちらの
8x8の固定フォントを使うことで、ビルドの時間を短縮することができます。
SSD1306の1ページは8x128ドットなので、8ドットフォントとSSD1306は大変相性がいいです。
ソースはこち
らで公開しています。
フォントファイルはヘッダーとしてリンクしてしまうので、SPIFFSは使いません。
フォントファイルにはポンドや円のフォントも含まれていましたので表示できるようにしてみました。
また、上下を逆に表示しています。

続く....