128×32ピクセルのOLEDをNucleoボードにI2Cで接続する


少し前に買って放置していた、横長のOLEDをMicroPythonで動かしてみました。
よく使っているOLEDは128×64ピクセルですが、今回のものは縦32ピクセルです。
縦が半分になっているだけですが、それ以上に小さく感じます。
小型ボードと相性がいいかも、と思って買ってみました。

コントローラはSSD1306で、128×64ピクセルのOLEDと同じです。画面サイズ以外は完全互換のようです。
なので接続方法も128×64ピクセルのOLEDと全く同じです。

今回は、STM32ベースのボード「Nucleo-L432KC」に接続しました。
インタフェースはI2Cです。
「SSD1306+I2C+STM32+MicroPython」の組み合わせはちょっとした落とし穴があり、以前もちらっと書いたのですが、今回改めてちゃんと書いてみます。

STM32には、ハードウェアのI2Cコントローラが搭載されています。
MicroPythonでは、ソフト実装のI2Cコントローラもあり、HW I2Cを搭載していないESP8266等のチップでもI2Cを使用することができます。
HW I2Cは使用できるピンが決まっていますが、SW I2Cは任意のGPIOピンを使用することができます。
I2Cインスタンスを生成する際に、明示的に1以上のbus IDを与えた場合はHW I2Cになり、明示的に0以下のbus IDを与えるか、bus IDを与えなかった場合はSW I2Cになります。

一方、SSD1306ドライバはSW I2Cしか使用できません。これは、このドライバがSW I2Cにしか用意されていない低レイヤAPIを使用しているためです。

従って、SSD1306をI2Cで使用する場合は、必ずSW I2Cを使わなければなりません。これが落とし穴です。
STM32はHW I2Cが使えるのですが、あえてSW I2CにしないとSSD1306は使えません。

というわけでSW I2Cを使ってNucleo-L432KCでOLEDを制御してみます。

まず結線は以下のようにしました。SDA、SCLはどのGPIOでもいいのですが、今回はHW I2Cと同じピンを使いました。

MicroPythonのコマンドは以下のようになります。
なおSSD1306のドライバはペーストモードを使って予め読み込ませておく必要があります。

>>> from machine import I2C,Pin
>>> pa10 = Pin('PA10')
>>> pa9 = Pin('PA9')
>>> i2c = I2C(sda=pa10,scl=pa9)
>>> i2c.scan()
[60]
>>> oled = SSD1306_I2C(128,32,i2c)
>>> oled.text('Hello',0,0)
>>> oled.show()

コメント