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 Library | GFX |
Adafruit ST7735 and ST7789 Library | ST7735 |
TJpg_Decoder by Bodmer | JPG |
使い方
配線(グラフィック表示)
説明
SSD1331を使用するサンプルとして簡単な表示を行います。
RP2040系(XIAO2040)のSPI0を使用します。
ライン、矩形、円などの描画サンプルは
File > Examples > Adafruit SSD1331 OLED Driver Library for Arduino > test
を参照してください。
配線
XIAO2040 | 配線 | SSD1331 |
---|---|---|
3.3V | 赤 | VCC |
GND | 黒 | GND |
GPIO29(SPI0 CS) | 黄 | TFT CS |
GPIO27 | 青 | TFT Reset |
GPIO28 | 橙 | TFT 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.3V | 赤 | VCC | 赤 | VCC |
GND | 黒 | GND | 黒 | GND |
GPIO29(SPI0 CS) | 黄 | TFT CS | ||
GPIO27 | 青 | TFT Reset | ||
GPIO28 | 橙 | TFT AO(D/C) | ||
GPIO3(SPI0 MOSI) | 緑 | TFT SDA | 緑 | MOSI |
GPIO2(SPI0 SCK) | 紫 | TFT SCK | 紫 | SCK |
GPIO29 | 黄 | 黄 | CS | |
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カードのファイルリストの作成 を紹介しています。
組み合わせて使用することでフォトフレームなどを作ることができます。
コメント