少し前に買って放置していた、横長の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()
コメント