【Arduino】カラーOLED SSD1331を使う

it

カラーOLED SSD1331のLCDを表示制御します。
小型の表示モジュールをArduino環境でRaspberryPi Pico、ESP32系を使って表示した内容を記載します。

カラーOLED SSD1331

主な製品情報

16bitフルカラー(65535色)、OLEDによる広い視野角。

◆その他のLCD

ST7735の記事です。
小型で安価、SPIで通信するLCDをRaspberry Pi Picoで表示、タッチパネル、SDカードリーダを使いました。
Nextion のHMI NX3224T024を使った記事です。
NextionEditorのセットアップと簡単な使い方、Raspberry Pi Picoと連動した画面制御について記事にしました。
ILI9341の記事です。
Arduino環境で使える中型サイズのLCDを使いました。
表示制御、タッチパネルとトラブル、SDカードからのJPG表示を記事にしました。
ILI9488の記事です。
表示制御以外にGT911静電容量式タッチパネルの多点タッチを使いました。
ESP32以外にRaspberry Pi Picoでも使用できるスケッチの修正を紹介しています。
ST7789の記事です。
IPS方式で発色のきれいなLCDです。
表示やタッチ制御以外にTNとIPS方式の視野角についても比べてみました。

◆関連記事

ピン配置

スクリーン上の〇数字は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 AdafruitAdafruit GFX1.12.1
Adafruit SSD1331 OLED Driver Library for Arduino by Adafruitssd13311.3.0

今回SDカードリーダに保存したJPG画像を表示するため以下のライブラリのインストールをします。
SDカードリーダだけを使用する場合ライブラリのインストールは不要です。

ライブラリ名検索動作確認Ver
TJpg_Decoder by Bodmerjpg1.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()
{
}

結果

コメント

タイトルとURLをコピーしました