ラズパイ4からOLED(SSD1306)を制御する
ラズパイから文字を表示させてみたくて、OLEDを買った。
OLEDについて
OLEDは、Organic Light Emitting Diodeの略称で、細かい分類はあるようだが、日本ではざっくりと有機ELと呼んでいるらしい。
OLED「SSD1306」について
Amazonで以下のOLEDを購入した。商品名はArduino用となっているが、I2Cバスなのでラズパイからでも制御できる。
SSD1306というのは、ドライバIC(チップ)のことらしい。
SSD1306というチップがI2Cのスレーブデバイスであり、有機ELディスプレイドライバの役割を担っている。
届いたときはシンプルな梱包で、説明書等は一切ない。
ブレッドボードで使うには、ピンヘッダをはんだで付ける必要がある。
回路図
以下はAmazonの画像にあった回路図。
かなりシンプルで、SSD1306にディスプレイとI2C用コネクタがついている。
入力電圧(VCC_IN)は5Vだが、中にレギュレータがあって、3.3Vに変換してるっぽい。
https://m.media-amazon.com/images/I/61j50hADrQL._SL1200_.jpg
I2C疎通確認
以下の方のサイトがとても参考になった。
(ありがとうございます!助かりました!)
i2cdetectコマンドから、接続されているI2Cスレーブデバイスのアドレス一覧を表示することが出来る。SSD1306のアドレスは、0x3Cらしい。
I2Cスレーブのアドレスは、デバイスによってどれを使うか決まりがあるのだろうか?EEPROMなんかは、0x5Xを使う気がする。
CircuitPython
adafruitのCirtuitPythonというPythonライブラリを使えば、簡単にSSD1306を制御できるらしい。
CirtuitPythonはOLED専用というよりは、初心者がセンサーやモーターを簡単に動かせることを目的としたライブラリみたい。
だから、Circuitという名称がついているのだろう。
adafruitについて
adafruit(エイダフルーツ・インダストリーズ)は、ニューヨークに拠点を持つオープンソースハードウェア企業らしい。
オープンソースハードウェアという言葉は初めて聞いた。
オープンソースソフトウェア(OSS)という言葉はよく聞くが、ハードウェアって何だろう?
イメージ的に、回路図や仕様を公開するから、ロイヤリティ不要で自由に製造していいよってことなのだと思う。
Makerfire社
Amazonで購入したOLEDのメーカーはMakerfireらしい。なので、Makerfire社がadafruitのSSD1306を製造したのだろう。
Makerfire社は中国の深圳にある企業で、主にドローンの製造、販売を行っているが、小型の電子部品も扱っているようだ。
これを1個500円以上で買う人がいるのだから、結構いいビジネスになっているのかもしれない。
CircuitPythonサンプル
前置きが長くなったが、CircuitPythonをインストールして、Usage Exampleに書かれているコードを動作させてみた。
左上、中間、右下にドットを点灯させるプログラムのようだ。
内容はかなりシンプルで、fill関数で0(全消灯)をshow関数で描画する。
その後に、pixel関数で座標を指定し、show関数で再度描画している。
Display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
display.fill(0)
display.show()
# Set a pixel in the origin 0,0 position.
display.pixel(0, 0, 1)
# Set a pixel in the middle 64, 16 position.
display.pixel(64, 16, 1)
# Set a pixel in the opposite 127, 31 position.
display.pixel(127, 31, 1)
display.show()
その他のAPI関数
これだけだと、どうやって文字や数字を描画するのかがわからない。
他のサンプルのリンクがあった。
SSD1306ライブラリのドキュメントは、以下らしい。
上記サイトでは見当たらなかったが、サイト内検索したら出てきた。
読んでみると、どうやらGitHubのexampleフォルダの下にサンプルが格納されているようだ。APIを理解しようと思ったが、サンプルを動かして真似たほうがよさそう。
GitHubのサンプルをダウンロード
git clone コマンドでリポジトリをそのままcloneする。
pi@yukari:~/oled_ssd1306 $ git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306.git
Cloning into 'Adafruit_CircuitPython_SSD1306'...
remote: Enumerating objects: 595, done.
remote: Counting objects: 100% (120/120), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 595 (delta 58), reused 79 (delta 30), pack-reused 475
Receiving objects: 100% (595/595), 171.09 KiB | 2.90 MiB/s, done.
Resolving deltas: 100% (321/321), done.
なにやらたくさんサンプルがありそうだ。
pi@yukari:~/oled_ssd1306/Adafruit_CircuitPython_SSD1306/examples $ ls
happycat_oled_32.ppm ssd1306_pillow_clock.py
happycat_oled_32.ppm.license ssd1306_pillow_demo.py
happycat_oled_64.ppm ssd1306_pillow_image_display.py
happycat_oled_64.ppm.license ssd1306_pillow_images.py
ssd1306_bonnet_buttons.py ssd1306_pillow_ip.py
ssd1306_bouncing_ball.py ssd1306_pillow_shapes.py
ssd1306_clear.py ssd1306_pillow_text.py
ssd1306_framebuftest.py ssd1306_simpletest.py
ssd1306_pillow_animate.py ssd1306_stats.py
ssd1306_stats.pyを実行
exampleフォルダの「ssd1306_stats.py」を実行してみる。
すごい、ちょっと見切れてるけど、ちゃんと文字が表示された。
思った以上に、簡単に出来るようだ。
IPアドレスが表示されるのは有難い。DHCPによる動的IPアドレス割当てなので、もしIPが変わってもVNCやSSH接続に困らない。
今後のやりたいこと
ここまでサンプルがあるとそれだけで十分そう。
CPU温度表示は表示できるといいかもしれない。
あと、購入したものは同じものが2つだったけど、同時に使えるのだろうか。I2Cスレーブアドレスが競合すると思うのだが…
ラズパイのI2Cは1ポートしかピンが出てないっぽい。
SSD1306にはアドレス選択できるようなものがなく、アドレス固定。
I2Cの競合問題はよくあると思うけど、I2Cアドレス変換ブリッジのようなICが存在するのだろうか?それとも、競合しないように部品を選定するのだろうか?
I2C Bitbang
以下、ブログの方がI2C bitbangという方法を紹介してくれていた。
I2C程度の低速度クロックならソフトだけで実装できるんじゃないの?という方法。たしかに…
I2Cアドレストランスレーター
I2Cアドレスの変換ICは、アドレストランスレーターという名前で売られていた。
任意のバイトをICに設定すると、そのXORのアドレスをマスタ側に見せるらしい。I2CアドレスをI2Cで変更するのはややこしくないだろうか。
OLEDを2個つけるのは諦めて、もう1個は故障した時の予備として保管しておくことにする。