【ESP32】SPIシリアル 128×64 OLED LCDの動作確認【SSD1306】

  • 投稿 : 2018-12-15
  • 更新 : 2018-12-17

本記事は広告およびアフィリエイトプログラムによる収益を得ています

今回は、商品が動作するかだけの確認なので、結構適当です。

配線

OLED   ESP32
GND <=> GND
VCC <=> VIN (5V)
D0 <=> D18 (CLK)
D1 <=> D23 (MOSI)
RES <=> D2
DC <=> D4
CS <=> D5

Internet Clock using ESP32 and OLED Display

上記を参考にして接続しました。おそらく、RES、DCは任意のポートにして大丈夫だと思う。D2は今回使った開発ボードでは、基板上の青色LEDにも接続されてるので変えたほうがよさそうには思う。

今回は、VSPI?あたりを使用しましたが、HSPIを使う事例もあるので、ほかにも接続の仕方はいろいろあるかと思います。まだ、ポート(端子)の意味がよくわかってないので過去事例(実績)のマネをしています。

参考

CS(Chip select) pin of OLED -> PIN D5 of ESP32
DC pin of OLED -> PIN D4 of ESP32
RES pin of OLED -> PIN D2 of ESP32
SDA pin of OLED -> PIN D23 i.e. MOSI of ESP32
SCK pin of OLED -> PIN D18 i.e. SCK of ESP32
Vdd of OLED -> Vcc of ESP32
GND of OLED -> GND of ESP32
Internet Clock using ESP32 and OLED Display

今回参考にした接続

Arduino Pins u8glib comment HiLetgo OLED Pins Other OLED Pins
13 SCK D0 CLK
11 MOSI D1 MOSI
HiLetgoのOLEDを使う -SPI- – jumbleat

OLED側のD0、D1の端子の意味を上記から推測しました。

SPI通信を行う場合、ハードウェアSPIだけでなく、ソフトウェアSPI(BitBangging SPI)を使うこともできます。
ハードウェアSPIではSCLK(Pin#23)とMOSI(Pin#19)は変更できませんが、ソフトウェアSPIでは全てのピンに好きなピン を使うことができます。
OLED液晶モジュールを使う

上記のやり方は UNO 用のソフトウェア SPI 接続なので、汎用的なハードウェア SPI 接続で使う方法もご紹介します。
OLED_DC と OLED_RESET は任意のピンを使えます。
[SPI] 0.96 inch OLED ディスプレイ (ER-OLED0.96-3W / SSD1306)

https://ht-deko.com/arduino/esp-wroom-32.html#13

各SPIモジュールのピンアサインは以下の通りです。ただし、GPIOマトリックスの項目で説明した通り、比較的自由にリマッピング可能です。
HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
VSPI - SCK,MISO,MOSI,SS = 18,19,23,5
esp32_tips – スイッチサイエンス

Getting Started with the ESP32 Development Board | Random Nerd Tutorials

ライブラリーを導入(Arduino)

ESP32 と 小型128x32OLED液晶ディスプレイ (試運転) - Qiita

上記を参考に、いかの2つのライブラリーを導入します。

・Adafruit SSD1306 by Adafruit
・Adafruit GFX Library

ArduinoIDEの「スケッチ」=> 「ライブラリをインクルード」 => 「ライブラリを管理…」から簡単に導入できます。

Adafruit SSD1306 by Adafruitをインストール。

検索ワードは「Adafruit_SSD1306」のほうが良いかも。

※画像は、間違えて「Adafruit_SSD1306_Wemos_Mini_OLED」を導入してます。それでも動作しますが・・。正しくは「Adafruit_SSD1306」のほうを・・

Adafruit GFX Libraryをインストール

ヘッダーファイルの編集

ESP-WROOM-02でOLED(有機EL) SSD1306が動作しない | Open Beta Lab

128×64 で使うためには、ライブラリの「Adafruit_SSD1306.h」を編集する必要があります。

C:\Users\kuro\Documents\Arduino\libraries\Adafruit_SSD1306 または、
C:\Users\kuro\Documents\Arduino\libraries\Adafruit_SSD1306_Wemos_Mini_OLED 
kuroはログインユーザー名です。Windowsのドキュメントフォルダあたりにあるかと思います。

上記あたりにある「Adafruit_SSD1306.h」ファイルを以下のように修正します。

#define SSD1306_64_48
//   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16

修正前↑
修正後↓

//#define SSD1306_64_48
   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16

#define SSD1306_128_64が有効になるように書き換えて、その他は//でコメント化してください。

サンプルプログラムで確認(Arduino)

「ファイル」> 「スケッチ例」>「Adafruit SSD1306」>「ssd1306_128x32_spi」を選択します。

ソースファイルの編集

// If using software SPI (the default case):
#define OLED_MOSI  23 
#define OLED_CLK   18
#define OLED_DC    4
#define OLED_CS    5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

ポート番号(接続)の部分を、今回接続したものに書き換えます。

※記事を書いてるときに気づきましたが「software SPI 」とかかれてますね。

実行結果

あっさり動作しました。初期不良とかはなさそうなので、動作確認は終わりです。

補足

error

#error("Height incorrect, please fix Adafruit_SSD1306.h!");

上記エラーが出るときは、「Adafruit_SSD1306.h」の編集を忘れているかと思います。

その後の接続例

OLED   ESP32
GND <=> GND
VCC <=> 3V3 (3.3V)
D0 <=> D18 (CLK)
D1 <=> D23 (MOSI)
RES <=> D16 (RX2)
DC <=> D4
CS <=> D5

・3.3Vでも動作した
・RESをD16に変更してみた

スポンサーリンク