SPI接続でフルカラーOLEDモジュールを使う(SSD1331)

コンピュータ、組み込み

Seeed のXIAO2040を使ってカラーOLEDモジュールの表示制御をします。
Arduino環境のRP2040系 XIAO2040でのSPI接続での表示、JPG画像の表示をしてみます。

今回紹介するもの

カラーOLEDモジュール (SSD1331) 0.95inch

特徴

カラーOLEDなのでバックライト無しで発光します。
とても小さいモジュールなので狭小の組み込みに使用できます。

[2023/5/3] 追記
同サイズクラスのLCD ST7735 0.96inchを記事にしました。
OLEDとの比較について記事にしています。

製品情報
サイズ0.95inch
解像度(X, Y)96, 64
通信方式SPI
ドライバSSD1331
動作電圧3.2~5V
外観

前面

背面

使用感

とても小さな表示モジュールです。
バックライトではなくドット素子が発光するのでLCDに比べて視野角が広く、色味の変化がほとんどありません。

Adafruit製ライブラリを使用しているので基本的な命令は他のLCDと同様に使用できます。

こちらは単色OLEDを使用したサンプルです。I2Cなので少しの配線で表示ができます。


こちらはタッチパネルが使用できます。記事を追記しました。[2023/2/10]

準備

ライブラリ

LCDを制御するためのライブラリにはAdafruit製ライブラリを使用します。
サンプルではAdafruit製のサンプルスケッチをマイコンで接続するための修正をしています。

ライブラリ名検索
Adafruit GFX LibraryGFX
Adafruit ST7735 and ST7789 LibraryST7735
TJpg_Decoder by BodmerJPG

使い方

配線(グラフィック表示)

説明

SSD1331を使用するサンプルとして簡単な表示を行います。
RP2040系(XIAO2040)のSPI0を使用します。

ライン、矩形、円などの描画サンプルは
File > Examples > Adafruit SSD1331 OLED Driver Library for Arduino > test
を参照してください。

配線
XIAO2040配線SSD1331
3.3VVCC
GNDGND
GPIO29(SPI0 CS)TFT CS
GPIO27TFT Reset
GPIO28TFT AO(D/C)
GPIO3(SPI0 MOSI)TFT SDA
GPIO2(SPI0 SCK)TFT SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
XIAO2040

【スケッチの説明】
XIAO2040を使ってSSD1331に文字列を表示します。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Seeed XIAO RP2040

Adafruit SSD1331 OLED Driver Library for Arduino
Adafruit GFX Library
TJpg_Decoder

【準備】
SDカードのルートフォルダに "test.jpg"を保存します。
jpgファイルのサイズは 96 x 64 サイズで保存します。

SPI0のMOSIとSCKは共通で使用します。
XIAO2040              <-> SSD1331
<<display側>>
3.3V                  <-> VCC
GND                   <-> GND
GPIO29                <-> display CS
GPIO27                <-> display Reset
GPIO28                <-> display AO(D/C)
GPIO3(SPI0 MOSI)      <-> display SDA
GPIO2(SPI0 SCK)       <-> display SCK

【バージョン情報】
2023/2/17 : 新規
**********************************************************************/

#include <SPI.h>
#include <Adafruit_SSD1331.h>
#include <Adafruit_GFX.h>

//displayピン設定
#define DISPLAY_CS    26
#define DISPLAY_RST   27
#define DISPLAY_DC    28
#define DISPLAY_MOSI   3
#define DISPLAY_SCK    2

// JPGの最大サイズ(バッファを静的に確保するようにしているため、決め打ち。取り扱う最大ファイルサイズで変えるようにする)
#define JPG_SIZE_MAX (20 * 1024) //MAX 20KByteを想定

// Color definitions
#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);

void setup()
{
  //SPIピン設定
  SPI.setTX(DISPLAY_MOSI);
  SPI.setSCK(DISPLAY_SCK);

  //displayの初期化と初期設定
  display.begin();       
  display.fillScreen(BLACK);                      //背景の塗りつぶし
  display.setRotation(3);
  //テキスト表示
  display.setRotation(3);                         //画面回転

  display.setTextSize(2);                         //サイズ
  display.setCursor(0, 10);                       //カーソル位置                      
  display.setTextColor(GREEN);             //緑
  display.printf("TAMANEGI\n");

  display.setTextSize(1);                         //サイズ
  display.setTextColor(RED);               //赤
  display.printf("\n0.95inch OLED\n");
  display.setTextColor(YELLOW);            //黄
  display.printf("Res=96 x 64\n");
  display.setTextColor(BLUE);              //青
  display.printf("SSD1331\n");
}

void loop()
{
}
結果

カラフルに表示ができました。

表示(SDカードからjpgファイルの表示)

説明

SDカードリーダよりjpgファイル”test.jpg”を読み取り、TFTに表示をします。

SDカードのルートフォルダには”test.jpg”ファイルを保存してください。
jpgファイルのサイズは160 x 128で作成します。

配線

RP20402040系(XIAO2040)を使用した配線を掲載します。
SPI0をTFTとSDカードリーダ共通で使用します。

XIAO2040配線SSD1331配線TFカードリーダ
3.3VVCCVCC
GNDGNDGND
GPIO29(SPI0 CS)TFT CS
GPIO27TFT Reset
GPIO28TFT AO(D/C)
GPIO3(SPI0 MOSI)TFT SDAMOSI
GPIO2(SPI0 SCK)TFT SCKSCK
GPIO29CS
GPIO4(SPI0 MISO)MISO

スケッチ

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
XIAO2040

【スケッチの説明】
SDカードモジュールからtest.jpgを読み出しSSD1331に表示します。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Seeed XIAO RP2040

Adafruit SSD1331 OLED Driver Library for Arduino
Adafruit GFX Library
TJpg_Decoder

【準備】
SDカードのルートフォルダに "test.jpg"を保存します。
jpgファイルのサイズは 96 x 64 サイズで保存します。

SPI0のMOSIとSCKは共通で使用します。
XIAO2040              <-> SSD1331
<<display側>>
3.3V                  <-> VCC
GND                   <-> GND
GPIO29                <-> display CS
GPIO27                <-> display Reset
GPIO28                <-> display AO(D/C)
GPIO3(SPI0 MOSI)      <-> display SDA
GPIO2(SPI0 SCK)       <-> display SCK

<<TFカードリーダ側>>
GPIO29                <-> SD CS
GPIO3(SPI0 MOSI)      <-> SD MOSI
GPIO4(SPI0 MISO)      <-> SD MISO
GPIO2(SPI0 SCK)       <-> SD SCK

【バージョン情報】
2023/2/13 : 新規
**********************************************************************/

#include <SPI.h>
#include <SD.h>

#include <TJpg_Decoder.h>
#include <Adafruit_SSD1331.h>
#include <Adafruit_GFX.h>

//display SD共通ピン設定
#define COMMON_MOSI   3
#define COMMON_SCK    2

//displayピン設定
#define DISPLAY_CS    26
#define DISPLAY_RST   27
#define DISPLAY_DC    28

//SDピン設定
#define SD_CS         29  
#define SD_MISO       4
#define FILENAME      "/test.jpg"

// JPGの最大サイズ(バッファを静的に確保するようにしているため、決め打ち。取り扱う最大ファイルサイズで変えるようにする)
#define JPG_SIZE_MAX (20 * 1024) //MAX 20KByteを想定

// Color definitions
#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(SD_MISO);
  SPI.setSCK(COMMON_SCK);

  //displayの初期化と初期設定
  display.begin();       
  display.fillScreen(BLACK);                      //背景の塗りつぶし
  display.setRotation(3);

  Serial.begin(115200);
  //while(!Serial);
  delay(1000);
  
  //SDカードリーダの初期化とファイルの読み取り
  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()
{
}

結果

SDカード内のjpgファイルの表示をしました。
こちらではSDカードのファイルリストの作成 を紹介しています。
組み合わせて使用することでフォトフレームなどを作ることができます。

コメント

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