ネット通販で購入したSSD1309搭載の2.42インチOLED(有機ELディスプレイ)の接続インターフェースを基板裏面のランドパターンを使ってSPIからI2Cに変更した際のメモです。
ネット通販で購入したOLEDの仕様
下記表No.1の2.42インチOLEDをSPI接続からI2C接続に変更しました。No.2は当サイトで利用実績のあるI2C接続の0.96インチOLEDです。
# | 発光色 | サイズ解像度 | 接続方式 | ドライバーIC | 電源電圧 (V) |
1 | 2.42インチ 黄色 | 128×64 | I2Cに設定変更 ※デフォルトはSPI | SSD1309 | 3.3 |
2 | 0.96インチ 青色 | 128×64 | I2C | SSD1306 | 3.3〜5.0 |
2.42インチOLEDをI2C接続に変更(R8、R9、R10、R11、R12)
2.42インチのOLEDはSPI接続がデフォルトでした。転送速度はSPIが高速ですが、時計や温度、気圧、CO2濃度などの表示用途なので、配線数が少ないI2C接続に変更しました。
購入したネット通販サイトではR3、R4、R5でSPIとI2Cを切り替えると説明書きがあったのですが、届いた基板裏面には切替用ランドパターンとしてSPI(R8)とI2C(R9)のシルク印刷が設けられていたので、旧製品?の説明と思われます。
基板裏面のシルク印刷通りにSPI側にはんだ付けされていた0Ωのチップ抵抗R8を取り外してI2C側にR9としてはんだ付けし直しました。しかし、これだけではI2Cアドレスは検出されず、スケッチを実行しても画面には何も表示できませんでした。
なお、0.96インチOLEDと一緒にI2Cバスにつないでスケッチを実行すると2.42インチOLED側にも表示できるのですが、時折ノイズを拾った時のように画面表示がちらつく(ジャンパーワイヤを指で強く掴むと治まる)など動作が不安定でした。
2.42インチOLED基板の裏面には白文字のシルク印刷で「IIC:R9、R10、R11、R12」と書かれていますが、フラットフレキシブルケーブル(FFC)の下に隠れているR10、R11、R12用のランドパターンには抵抗が実装されていません。
FFCをロックしている基板コネクタ両サイドの爪をスライドして(ロックを外して)FCCを引き出します。R10、R11、R12のランドパターンをはんだメッキ線をはんだ付けしてつなぎます。最後に、FFCを基板コネクタに差込んで両サイドの爪をスライドして元通りにFFCをロックして作業完了です。
I2Cアドレスを検知できるようになり、2.42インチOLED単独でも安定して画面表示できるようになりました。
2つのOLEDのI2Cアドレスを確認
ArduinoサイトにあるI2CアドレスをスキャンするスケッチArduino Playground – I2cScannerを実行したところ、0.96インチOLED、I2C接続に改造後の2.42インチOLEDともに「0x3C」でした。
u8gやu8g2のスケッチでは、ディスプレイのI2Cアドレスを明示しなくても動作します。リファレンスを読むと「デフォルトではU8g2はディスプレイの可能な限り低いI2Cアドレスを想定しています」との記載があります。指定する場合は、u8g2であれば「u8g2.setI2CAddress(0x3C *2);」のアドレス部分を変更します。
https://github.com/olikraus/u8g2/wiki/u8g2reference#seti2caddress
各モジュールのI2CのアドレスとSCLとSDAのピン番号のメモです。
# | モジュール | I2C アドレス | I2C ピンアサイン SCL | I2C ピンアサイン SDA |
1 | 2.42インチ OLED (I2Cに変更) | 0x3C | 印字(SCK) | 印字(SDA) |
2 | 0.96インチ OLED | 0x3C※ (0x3Dに変更可能) | 印字 | 印字 |
※0.96インチOLEDのIPアドレスは、基板裏面のシルク印刷は 0x78 ですが、I2cScannerの実行結果は 0x3C でした。I2cScannerのスケッチには「見つかったデバイスの7-bitアドレスを16進数で表示」のコメントがあります。0111100(7-bit、0X3C)に(ReadかWriteを指定する)最下位ビットとして”0″を加えると 01111000(8-bit、0x78)。
本ブログ内のOLED対応スケッチ
本ブログ内のOLED対応スケッチにはu8gや後継のu8g2を使っています。今回使ったOLEDは解像度は低いものの、黒色がくっきりで表示が鮮明、広視野なので斜め方向からの視認性が良好です。