OLED SSD01306 (SPI接続)
SSD1306のSPI接続品です。※ジャンパー設定でSPIとI2Cを切り替えられるモノもあるようです。
OLED SSD1306のコマンドと送信手順
SSD01306のコマンドは以下の手順で送信するコマンド送信 | |
---|---|
SS(Slave Select) | LOWにする |
DC(Data/Command) | LOWにする |
コマンド送信 | |
SS(Slave Select) | HIGHにする |
データ送信 | |
---|---|
SS(Slave Select) | LOWにする |
DC(Data/Command) | HIGHにする |
データ送信 | |
SS(Slave Select) | HIGHにする |
初期化に必要なコマンドを抜粋:スクロールとか色々あるので詳細はデータシート参照
命令コード | 命令長さ | 命令内容 |
---|---|---|
81 00~FF | 2 | 表示コントラスト リセット時 0x7F |
A4 | 1 | 描画 ON : 画面の書き換えを行う |
A5 | 1 | 描画 OFF : 画面の書き換えを停止 ※ダブルバッファ的な使い方が出来る |
A6 | 1 | 通常表示 : データビット1を黒、0を白で表示する |
A7 | 1 | 反転表示 : 画面の白黒を反転 |
AE | 1 | 画面を非表示にする : 描画は行われる |
AF | 1 | 画面を表示する |
B0~BF | 1 | 描画ページを指定する |
10~1F | 1 | 描画開始位置 横方向の上位4ビット: 66ピクセル目から描画を始める場合は1F |
00~0F | 1 | 描画開始位置 横方向の下位4ビット: 66ピクセル目から描画を始める場合は02 |
-- SSD1306 初期化例 : 動作が分かりやすいようにしてます。流石に こんなのを毎回書くのは大変なので関数にしますよ --
※ <>を全角<>に置き換えています。コピペの際は注意してください。
#include <SPI.h>
// この▼のピン割り当ては変更できます
#define OLED_CS 7 // Slave Select(Chip select)
#define OLED_DC 6 // SSD1306 Data/Command
#define OLED_RESET 5 // SSD1306 Reset
// --- SSD1306 COMMADN : I2Cで使ったのと同じ ---
static uint8_t oledInitCommands[] = { // SSD1306の初期化コマンド群
0xC8, // 上下の描画方向
0xA1, // 左右の描画方向
0xA8,0x3F, // 画面の解像度
0xD3,0x00, // 縦方向のオフセット
0x40, // 縦方向の描画開始位置
0xA6, // 表示方法 - A7にすると画面反転
0x8D, 0x14 // OLEDパネルの供給電圧と思われる 14hに設定しないとダメらしい
};
void setup() {
// --- SOFTWARE SPI ピン設定
pinMode(OLED_CS, OUTPUT); // Sleva Select
pinMode(OLED_DC, OUTPUT); // SSD1306 Set data/command pin as output
//SPI初期化
digitalWrite(OLED_CS, LOW);
SPI.begin();//SPIを初期化、SCK、MOSI、SSの各ピンの動作は出力、SCK、MOSIはLOW、SSはHIGH
SPI.setDataMode(SPI_MODE0);//SPIモードを「0」に設定・CPOL(クロック位相)=0,CPHA(クロック極性)=0
SPI.setBitOrder(MSBFIRST);//SPI送受信用のビットオーダーを「MSBFIRST」に設定
// --- Reset SSD1306
pinMode(OLED_RESET, OUTPUT);// SSD1306 RESET
digitalWrite(OLED_RESET, HIGH);
delay(1); // VDD goes high at start, pause for 1 ms
digitalWrite(OLED_RESET, LOW); // Bring reset low
delay(10); // Wait 10 ms
digitalWrite(OLED_RESET, HIGH); // Bring out of reset
// --- SSD1306 初期化
// OLED設定コマンド送信
digitalWrite(OLED_DC, LOW); // Command mode
SPI.transfer(oledInitCommands,sizeof(oledInitCommands));
SPI.transfer(0xA4) ; // 描画ON
SPI.transfer(0xAF) ; // 画面表示
digitalWrite(OLED_CS, HIGH); // SSD1306解放
}
ビットマップ画像を表示するサンプルスケッチ:参考動画で使用しているプログラムとデータです。
▼ 解説動画で使用しているビットマップ表示スケッチ
-- SPI-HARD.zip : Arduino ハードウエアSPI --
-- SPI-SOFT.zip : ソフトウエアSPI--
SSD1306のデータマップ
スペックシートの 8.7 Graphic Display Data RAM (GDDRAM) を見た方が分かりやすいかも1バイト(8ビット)が縦に並び、横方向に128バイト繋がります。
この128バイト(縦8ピクセル、横128ピクセル)を1ページとして
縦方向に8ページ繋がっています。
SSD1306のデータ送信では、ページ番号と開始バイト位置を設定して
1バイト単位でビットデータを送信します。
描画位置をPage0の0ピクセル目からに設定し
0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08 の 8バイトをデータをして送信した場合
←図のPAGE0の左側のようにドットが設定されます。
BITMAPデータの作成
BITMAPの向きがWindowsなどと違うために、BITMAPデータを作るのが結構大変だったります。image2cpp を利用すればArduinoIDEで使えるSSD1306用のビットマップデータが簡単に作れます。
※Chrome推奨