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 |
■ SSD1306の通信フォーマット
通信フォーマットはSSD1306ドキュメントのFig8-7に記載されている。 先頭に書き込みを行うI2Cアドレスがあり、以降にコントロールバイトとデータバイトの繰り返し構造のようだ
[コントロールバイト]
コントロールバイトの構造は先頭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回実行すると数のような描画となる。
表示用のメモリクリアを行っていないため、ノイズが入っているようだ。
■ SSD1306の画面構成
調査中