Arduinoで有機ELディスプレイSSD1331を使ってみる
サンプルコードを動かす
Arduino IDEを開いて、File/Examples/Adafruit SSD1331 OLED Driver Library for Arduino/LCDGFXDemoを開く。
https://gyazo.com/d9f1db3b65159cd15e470b6eaa1351a5
サンプルコードの以下を修正。
code:LCDGFXDemo_copy_20230911200253.ino
// 以下を修正
// 以下を修正
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst);
いい感じに動いてる。
https://gyazo.com/684369c0e21f4d6320aada6361f98d30
ライブラリを使わずに画面をON/OFFしてみる
サンプルコードを削っていって、digitalWrite だけでディスプレイの電源をON→OFFできるようになったよ。
code:onoff.ino
void initSPI() {
// Init basic control pins common to all connection types
pinMode(cs, OUTPUT);
digitalWrite(cs, HIGH); // deselect(データ送信の時だけ select = LOW にする)
pinMode(dc, OUTPUT);
digitalWrite(dc, HIGH); // Data mode
// sclkとmosiを初期化
pinMode(mosi, OUTPUT);
digitalWrite(mosi, LOW);
pinMode(sclk, OUTPUT);
digitalWrite(dc, LOW);
// rstを初期化
pinMode(rst, OUTPUT);
digitalWrite(rst, HIGH);
delay(100);
digitalWrite(rst, LOW);
delay(100);
digitalWrite(rst, HIGH);
delay(200);
}
// Display on (0xAF)
void displayOn() {
// display on (0xAF)
digitalWrite(cs, LOW); // cs start
digitalWrite(dc, LOW); // command start
spiWrite16(0xAF);
digitalWrite(dc, HIGH); // command end
digitalWrite(cs, HIGH); // cs end
}
// Display off (0xAE)
void displayOff() {
digitalWrite(cs, LOW); // cs start
digitalWrite(dc, LOW); // command start
spiWrite16(0xAE);
digitalWrite(dc, HIGH); // command end
digitalWrite(cs, HIGH); // cs end
}
void spiWrite16(uint16_t w) {
for (uint8_t bit = 0; bit < 16; bit++) {
if (w & 0x8000)
digitalWrite(mosi, HIGH);
else
digitalWrite(mosi, LOW);
digitalWrite(sclk, HIGH);
digitalWrite(sclk, LOW);
w <<= 1;
}
}
void setup() {
delay(1000);
initSPI();
displayOn();
delay(1000);
displayOff();
delay(1000);
displayOn();
delay(1000);
displayOff();
}
void loop() {
// put your main code here, to run repeatedly:
}
画面に何か出力してみる
sendData(color) で現在のカーソル位置に指定した色を表示後、カーソルと次の位置へ移動することができる。これを 64 * 96繰り返すことで画面全体を描画することができる。
https://gyazo.com/cf1528b65c499f03a56a679d9e857de0
code:sample.ino
void initSPI() {
// Init basic control pins common to all connection types
pinMode(cs, OUTPUT);
digitalWrite(cs, HIGH); // deselect(データ送信の時だけ select = LOW にする)
pinMode(dc, OUTPUT);
digitalWrite(dc, HIGH); // Data mode
// sclkとmosiを初期化
pinMode(mosi, OUTPUT);
digitalWrite(mosi, LOW);
pinMode(sclk, OUTPUT);
digitalWrite(dc, LOW);
// rstを初期化
pinMode(rst, OUTPUT);
digitalWrite(rst, HIGH);
delay(100);
digitalWrite(rst, LOW);
delay(100);
digitalWrite(rst, HIGH);
delay(200);
}
void initOLED() {
sendCommand(0xAE); //Set Display Off
sendCommand(0xA0); // 色やその他いろいろの設定
sendCommand(0b00110010); // 256色(00)、デフォルトの描画方向など
sendCommand(0xA1); // Set Display Start Line
sendCommand(0x0);
sendCommand(0xA4); //Set Display Mode (Normal)
sendCommand(0x15); //Set Column Address
sendCommand(0);
sendCommand(95);
sendCommand(0x75); //Set Row Address
sendCommand(0);
sendCommand(63);
// 画面を白に塗りつぶす
for(int j=0; j<64; j++){
for(int i=0; i<96; i++){
// R(3bit) + G(3bit) + B(2bit) で256色を表す
int r = 7 << 5;
int g = 7 << 2;
int b = 3;
int white = r | g | b;
sendData(white);
}
}
sendCommand(0xAF); //Set Display On
delay(110);
}
void sendCommand(uint8_t c) {
digitalWrite(dc, LOW);
digitalWrite(cs, LOW);
spiWrite8(c);
digitalWrite(cs, HIGH);
}
void sendData(uint8_t c) {
digitalWrite(dc, HIGH);
digitalWrite(cs, LOW);
spiWrite8(c);
digitalWrite(cs, HIGH);
}
void spiWrite8(uint8_t w) {
for (uint8_t bit = 0; bit < 8; bit++) {
if (w & 0x80)
digitalWrite(mosi, HIGH);
else
digitalWrite(mosi, LOW);
digitalWrite(sclk, HIGH);
digitalWrite(sclk, LOW);
w <<= 1;
}
}
void setup() {
delay(1000);
initSPI();
// 画面を初期化
initOLED();
// RGBを表示
for(int j=0; j<64; j++){
for(int i=0; i<96; i++){
int color;
if (j < 32 && i < 48) {
color = 7 << 5; // 左上は赤
} else if (j < 32 && i >= 48) {
color = 7 << 2; // 右上は緑
} else if (j >= 32 && i < 48) {
color = 3; // 左下は青
} else {
color = (4 << 5) | (4 << 2); // 右下は黄色
}
sendData(color);
}
}
}
void loop() {
// put your main code here, to run repeatedly:
}
色の表し方
https://gyazo.com/c2c6c079c7021a26b6c9a1d0986cb391
線と矩形を描いてみる
https://gyazo.com/7586f5ab967ec482a33f2cf150cda082
code:DrawLineAndRectanble.ino
void initSPI() {
// Init basic control pins common to all connection types
pinMode(cs, OUTPUT);
digitalWrite(cs, HIGH); // deselect(データ送信の時だけ select = LOW にする)
pinMode(dc, OUTPUT);
digitalWrite(dc, HIGH); // Data mode
// sclkとmosiを初期化
pinMode(mosi, OUTPUT);
digitalWrite(mosi, LOW);
pinMode(sclk, OUTPUT);
digitalWrite(dc, LOW);
// rstを初期化
pinMode(rst, OUTPUT);
digitalWrite(rst, HIGH);
delay(100);
digitalWrite(rst, LOW);
delay(100);
digitalWrite(rst, HIGH);
delay(200);
}
void initOLED() {
sendCommand(0xAE); //Set Display Off
sendCommand(0xA0); // 色やその他いろいろの設定
sendCommand(0b00110010); // 256色(00)、デフォルトの描画方向など
sendCommand(0xA1); // Set Display Start Line
sendCommand(0x0);
sendCommand(0xA4); //Set Display Mode (Normal)
sendCommand(0x15); //Set Column Address
sendCommand(0);
sendCommand(95);
sendCommand(0x75); //Set Row Address
sendCommand(0);
sendCommand(63);
// 画面を白に塗りつぶす
for(int j=0; j<64; j++){
for(int i=0; i<96; i++){
// R(3bit) + G(3bit) + B(2bit) で256色を表す
int r = 7 << 5;
int g = 7 << 2;
int b = 3;
int white = r | g | b;
sendData(white);
}
}
sendCommand(0xAF); //Set Display On
delay(110);
}
void sendCommand(uint8_t c) {
digitalWrite(dc, LOW);
digitalWrite(cs, LOW);
spiWrite8(c);
digitalWrite(cs, HIGH);
}
void sendData(uint8_t c) {
digitalWrite(dc, HIGH);
digitalWrite(cs, LOW);
spiWrite8(c);
digitalWrite(cs, HIGH);
}
void spiWrite8(uint8_t w) {
for (uint8_t bit = 0; bit < 8; bit++) {
if (w & 0x80)
digitalWrite(mosi, HIGH);
else
digitalWrite(mosi, LOW);
digitalWrite(sclk, HIGH);
digitalWrite(sclk, LOW);
w <<= 1;
}
}
void setup() {
delay(1000);
initSPI();
// 画面を初期化
initOLED();
// 線を引く
sendCommand(0x21); // Draw Line
sendCommand(0x1); // column start = 1h
sendCommand(0x10); // row start = 10h
sendCommand(0x28); // column end = 28h
sendCommand(0x4); // row end = 4h
sendCommand(0x07 << 5); // RED = 7
sendCommand(0x0); // GREEN = 0
sendCommand(0x0); // BLUE = 0
// 塗りつぶしあり
sendCommand(0x26); // 塗りつぶしの有無
sendCommand(0x01); // あり = 0x01 なし = 0x0
// 矩形を描く
sendCommand(0x22); // Draw Rectanble
sendCommand(0x03); // column start = 03h
sendCommand(0x02); // row start = 02h
sendCommand(0x12); // column end = 12h
sendCommand(0x15); // row end = 15h
sendCommand(0); // outline red = 0
sendCommand(0); // outline green = 0
sendCommand(0b11111 << 1); // outline blue = 0b11111
sendCommand(0); // fill red = 0
sendCommand(0b111111); // fill green = 0b111111
sendCommand(0); // fill blue = 0
}
void loop() {
// put your main code here, to run repeatedly:
}
参考
DCとCSの使い方の参考になった
SeedStudio / RGB_OLED_SSD1331