ラズパイ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疎通確認

以下の方のサイトがとても参考になった。
(ありがとうございます!助かりました!)

i2cdetecコマンド結果

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」を実行してみる。

stats 実行結果

すごい、ちょっと見切れてるけど、ちゃんと文字が表示された。
思った以上に、簡単に出来るようだ。

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個は故障した時の予備として保管しておくことにする。

いいなと思ったら応援しよう!