カラーOLED SSD1331のLCDを表示制御します。
小型の表示モジュールをArduino環境でRaspberryPi Pico、ESP32系を使って表示した内容を記載します。
カラーOLED SSD1331
主な製品情報
16bitフルカラー(65535色)、OLEDによる広い視野角。

◆その他のLCD
◆関連記事
ピン配置
スクリーン上の〇数字はLCD制御ライブラリ「Adafruit SSD1331 OLED Driver Library for Arduino by Adafruit」を使って画面の回転をさせる時、上面方向になる位置とパラメータ値を示しています。
シルク表記に対しSDA = MOSI, SCL = CLKに置き換えて使用します。

外観

使ってみた
◆開発環境
Arduino環境で開発しました。
表示制御にRaspberry Pi Pico と ESP32-WROOM32(Node-MCU)を使いました。
LCDの制御ライブラリはAdafruitの「Adafruit SSD1331 OLED Driver Library for Arduino by Adafruit」を使いました。
◆使ってみた
モニタとしては小さい部類だと思います。
小さな組み込みに適しています。
バックライト無しで鮮やかな発色をします。
各ドットが発色するため広い視野角で視認性が良いです。

反面、バックライトが無いことで画像の切り替えをフェードイン・フェードアウトする処理を自作するのは大変です。
また画面の撮影ではダイナミック点灯によるちらつきが気になります。
準備
ライブラリ
Arduino環境ででSSD1331を制御するために必要なライブラリをインストールします。
依存関係に「Adafruit GFX Library by Adafruit」が必要です。
ライブラリ名 | 検索 | 動作確認Ver |
---|---|---|
Adafruit GFX Library by Adafruit | Adafruit GFX | 1.12.1 |
Adafruit SSD1331 OLED Driver Library for Arduino by Adafruit | ssd1331 | 1.3.0 |
今回SDカードリーダに保存したJPG画像を表示するため以下のライブラリのインストールをします。
SDカードリーダだけを使用する場合ライブラリのインストールは不要です。
ライブラリ名 | 検索 | 動作確認Ver |
---|---|---|
TJpg_Decoder by Bodmer | jpg | 1.1.0 |
使い方
RP2040系 RaspberryPi Picoを使った表示
説明
RaspberryPi Picoを使ってSSD1336 Adafruitモジュールライブラリのサンプルスケッチを動かします。
サンプルスケッチをArduinoIDEのメニューから参照します。
Examples > Adafruit SSD1331 OLED Driver Library for Arduino > test
配線

スケッチ
サンプルスケッチのSPIに使用するCS, RST, DCピン番号を変更します。
変更前
// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs 10
#define rst 9
#define dc 8
変更後
// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs (SS)
#define rst (22)
#define dc (28)
結果
サンプルの文字表示、グラフィック表示のサンプルが次々と表示されました。
画像は最後に表示されたグラフィックです。
小さい画面ですが鮮やかな発色です。

ESP32系 ESP32-WROOM32を使った表示
説明
SSD1331 OLEDをESP32-WROOM32(NODE-MCU)を使って表示制御します。
ESP32-WROOMのSPIではデフォルトVSPIピンを使用します。
変更する場合はピン定義マクロのピン番号を変更し、スケッチ27行目のコメントを解除します。
// SPI.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);
配線
VSPIを使った配線

スケッチ
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>
#define OLED_CS (SS)
#define OLED_RST (27)
#define OLED_DC (26)
#define OLED_MOSI (MOSI)
#define OLED_SCK (SCK)
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, OLED_CS, OLED_DC, OLED_RST);
void setup(void)
{
//SPI ピン変更をする場合コメントを解除
// SPI.begin(OLED_SCK, -1, OLED_MOSI, OLED_CS);
display.begin();
display.fillScreen(BLACK);
display.setRotation(0);
display.setTextSize(2);
display.setCursor(0, 10);
display.fillScreen(BLACK);
display.printf("TAMANEGI\n");
display.setTextSize(1);
display.setTextColor(RED);
display.printf("\n0.96 inch LCD\n");
display.setTextColor(YELLOW);
display.printf("Res=96 x 64\n");
display.setTextColor(BLUE);
display.printf("SSD1331\n");
}
void loop()
{
}
結果
ESP32-WROOM32(NODE-MCU)でSSD1331の表示制御できました。

表示(SDカードからjpgファイルの表示)
説明
SDカードリーダより読み取ったJPG画像(“tamanegi.jpg”)を表示をします。
SDカード(FAT32)のルートフォルダには”tamanegi.jpg”ファイルを保存します。
JPGファイルのサイズは96 x 64で作成します。
今回使用したjpgファイルです。

配線
SPIのMOSI, SCKはOLED, SDカードリーダともに共通のGPIOピンを使用します。

スケッチ
#include <SPI.h>
#include <SD.h>
#include <TJpg_Decoder.h>
#include <Adafruit_SSD1331.h>
#include <Adafruit_GFX.h>
#define COMMON_MOSI (MOSI)
#define COMMON_SCK (SCK)
#define COMMON_MISO (MISO)
#define DISPLAY_CS (SS)
#define DISPLAY_RST (22)
#define DISPLAY_DC (28)
#define SD_CS (0)
#define FILENAME "/tamanegi.jpg"
#define JPG_SIZE_MAX (20 * 1024) //DataSize <20KByte
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, DISPLAY_CS, DISPLAY_DC, DISPLAY_RST);
struct jpg_file
{
size_t size;
uint8_t buf[JPG_SIZE_MAX];
};
jpg_file jpg;
bool display_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap)
{
if (y >= display.height())
return 0;
display.drawRGBBitmap(x, y, bitmap, w, h);
return 1;
}
void setup()
{
//SPIピン設定
// SPI.setTX(COMMON_MOSI);
// SPI.setRX(COMMON_MISO);
// SPI.setSCK(COMMON_SCK);
display.begin();
display.fillScreen(BLACK);
display.setRotation(0);
Serial.begin(115200);
delay(1000);
if (!SD.begin(SD_CS, SD_SCK_MHZ(16)))
{
Serial.println("SD initialization failed!");
while(1);
}
TJpgDec.setCallback(display_output);
File jpgFile = SD.open(FILENAME, FILE_READ);
if (!jpgFile)
{
Serial.printf("Open file failed [%s]\r\n", FILENAME);
while(1);
}
jpg.size = jpgFile.size();
if(sizeof(jpg.buf) < jpg.size)
{
Serial.println("File size over");
return;
}
uint16_t w = 0, h = 0;
Serial.printf("file size = %d bytes\r\n", jpgFile.readBytes((char *)jpg.buf, jpg.size));
TJpgDec.getJpgSize(&w, &h, jpg.buf, jpg.size);
Serial.printf("Width = %d, height = %d\r\n", w, h);
TJpgDec.setJpgScale(1);
TJpgDec.drawJpg(0, 0, jpg.buf, jpg.size);
jpgFile.close();
}
void loop()
{
}
結果

コメント