picoでOLED(SSD1306)ことはじめ

Page content

■ 目的

I2C接続のOLEDディスプレイ(SSD1306)に表示をさせたい。
公式ドキュメントやネットの情報から使用用方法を調査していく。

使用OLED : 0.96インチ 128×64ドット有機ELディスプレイ
参考 : RaspberryPiで有機ELディスプレイ(1) SSD1306を動かしてみる
参考 : OLED 0.96インチで遊ぶ (1) - SSD1306

■ 配線

I2CはGND/VCC/SCL/SDAの4本の配線を行えばよい。
今回はpicoの赤で囲った部分をOLEDと配線する。

配線
pin番号 役割
6 SDA
7 SCL
36 VCC(3.3V)
38 GNC

図引用(Fig2)

■ SSD1306の通信フォーマット

通信フォーマットはSSD1306ドキュメントのFig8-7に記載されている。 先頭に書き込みを行うI2Cアドレスがあり、以降にコントロールバイトとデータバイトの繰り返し構造のようだ

cap
[コントロールバイト]

コントロールバイトの構造は先頭1bitが「Co」次のbitが「D/C#」で残りは「0」 それぞれの値の意味としては

名称 概要
Co Co=0 コントロールバイトとデータバイトを繰り返し送付する。Co=1 データバイトを連続で送付、描画データとか
D/C# D/C#=0 次のデータバイトはコマンドを意味する、コマンドの次にもう1バイトデータも送付。D/C#=1 次のデータバイトはデータを意味する
[データバイト]

コマンド、もしくはデータを送付する。
コマンドはドキュメントのP29、Table9-1に記載されている

■ 初期化コマンド

設定例がドキュメント末尾(P64)に記載されている。最初はこのまま利用する。
上記の通信フォーマットに従うと、下記データ列を送付する。

名称 データ列 メモ
Set MUX Ratio 0x00 0xA8 0x3F
Set Display Offset 0x00 0xD3 0x00
Set Display Start Line 0x80 0x40
Set Segment re-map 0x80 0xA1 左上原点
Set COM Output Scan Direction 0x80 0xC8
Set COM Pins hardware configuration 0x00 0xDA 0x12
Set Contrast Control 0x00 0x81 0x7F
Disable Entire Display On 0x80 0xA5
Set Normal Display 0x80 0xA6
Set Osc Frequency 0x00 0xD5 0x80
Enable charge pump regulator 0x00 0x8D 0x14
Display On 0x80 0xAF

これをpico用のコードで記載すると下記になる
アドレスはバススキャンして得たアドレスを指定する。

int ret = 0;
uint8_t	initCommand[33] = {
	0x00, 0xA8, 0x3F,	    // SetMultiplexRatio
	0x00, 0xD3, 0x00,	    // SetDisplayOffset
	0x80, 0x40,			      // SetDisplayStartline
	0x80, 0xA1,			      // SetSegmentRemap
	0x80, 0xC8,			      // SetCOMOutputScanDirection
	0x00, 0xDA, 0x12,	    // SetCOMPingsHardwareConfiguration
	0x00, 0x81, 0x7F,	    // SetCntrastControl
	0x80, 0xA4,			      // EntireDisplayON
	0x80, 0xA6,			      // SetNormalDisplay
	0x00, 0xD5, 0x80,     // SetOscFrequency
	0x00, 0x8D, 0x14,	    // EnableChargePumpRegulator
	0x80, 0xAF            // Display ON
};
ret = i2c_write_blocking(i2c_default, 0x3c, initCommand, sizeof(initCommand), false);

上記コードを1回実行すると数のような描画となる。
表示用のメモリクリアを行っていないため、ノイズが入っているようだ。

cap

■ SSD1306の画面構成

調査中

cap
cap