別シリーズ記事で、Arduino Uno R4にOLEDを接続し表示ができました。小さくても自発光のディスプレイは見やすいです。そこでTinyGoの練習に使っているラズパイPicoでもOLED接続を試みてみることにいたしました。TinyGoで、ビルドした、書き込んだ、動いた、という感じっす。ホントか?
※「GoにいればGoに従え」Go関連記事の総Index
※実機動作確認は Arm Cortex-M0+コアのRP2040チップ搭載、Raspberry Pi Pico機にTinyGoのオブジェクトを書き込んで行っています。ビルドはWindows11上です。
※RP2040のデータシート(PDF)はこちら
別件シリーズ
Arduino UNO R4/R3へのOLED接続を試みた別件シリーズは以下です。
部品屋根性(107) SSD1315制御のOLEDのArduino Uno R4/R3接続
上記での「ミソ」は
-
- 伝統のSSD1306ではなく、SSD1315搭載のパネル
- ソフトはSSD1306用のまま(Arduino環境のドライバと.ino形式ソース)
- I2C接続
このSSD1315のパネルは、Arduino UNO R4(Armコア)ではハードI2CでもソフトI2Cでも動作するけれども、Arduino UNO R3(ATMega328)ではソフトI2Cでないと動作しない、という結論でした。意外ね。
今回は同じパネルをRaspberry Pi PicoにハードI2Cで接続してみます。プログラムは勿論TinyGoで書いたものです。
Raspberry Pi PicoのハードI2C、デフォルト値の確認
ラズパイPicoでは2本のハードI2C、I2C0とI2C1が使用可能です。どちらも複数の端子に接続可能です。TinyGoのmachineパッケージのデフォルトは以下の通りでした。
-
- I2C0、SDA=GP4, SCL=GP5
- I2C1、SDA=GP2, SCL=GP3
上記のピンに接続する場合は I2Cのコンフィグ時にわざわざ端子を設定する必要はありません(というかExampleプログラムでは省略していたので、Exampleを無修正で使用する場合は上記端子に接続する必要があります。)
また、I2Cのデフォルト速度は100kHzです。Exampleプログラムでは高速な400kHzとして設定しており、それで動作OKです(それどころが、Frequencyを省略してデフォルトの100kHzにしたら挙動が変。なして?)
TinyGo Driversと実験用ソース
SSD1306のドライバは、過去回でも使用したTinyGo Driversに含まれてます。
GoにいればGoに従え(25) TinyGo Drivers便利。なんでも簡単接続。
今回その使用のため設定したら、上記回よりもアップデートされたバージョンが入ってきました。結構頻繁にアップデートしているのかな?
また、TinyGo DriversのGitHubを見に行けばexamplesあり。今回は以下のExampleをそのまま使わせていただきました。
drivers/examples/ssd1306/i2c_128x64/main.go
パネルをI2C0のデフォルト端子(SDA=GP4とSCL=GP5)に接続したところ上記ファイルの無修正にて動作しました。
なお、TinyGoのSSD1306用ドライバをArduinoで定番のu8g2ライブラリと比較するとTinyGoのドライバにはフォントとかフォント用のAPIなどは含まれてません。文字表示はまた別途入れてね、という感じ。ドットマトリックス表示用のAPIのみです。
実験結果
以下のとおり、問題なくドットマトリックス表示できました。実際は1個のドットが壁にぶつかる度に跳ね返って軌跡を残すような感じで動的に描画が進みます。
描画できると、やはり文字も書き出したくなるな。。。