ゆるく楽しむプログラミング

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にする
コマンドの詳細は SSD1306のスペックシートを参照

初期化に必要なコマンドを抜粋:スクロールとか色々あるので詳細はデータシート参照
命令コード  命令長さ 命令内容
81 00~FF 表示コントラスト リセット時 0x7F 
A4 1 描画 ON : 画面の書き換えを行う 
A5 1 描画 OFF : 画面の書き換えを停止 ※ダブルバッファ的な使い方が出来る
A6  通常表示 : データビット1を黒、0を白で表示する
A7  反転表示 : 画面の白黒を反転
AE  画面を非表示にする : 描画は行われる 
AF  画面を表示する
B0~BF 描画ページを指定する 
10~1F 1  描画開始位置 横方向の上位4ビット: 66ピクセル目から描画を始める場合は1F 
00~0F 描画開始位置 横方向の下位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推奨



解説動画