Raspberry Pi PicoでOLEDディスプレイを活用!I2C通信の基礎と文字表示の実装方法

目次

はじめに

RaspberryPiで電子部品を扱う際、最初にディスプレイの使い方をマスターすることを強く推奨します。結果を「すぐに」,「誰からでも見える」状態にしておくことはプロジェクトの成功の近道です

OLED Displayのしくみ

  • OLEDとは
    Organic Light Emitting Diode(有機発光ダイオード)の略。有機ELの呼称がよく用いられる。
    原理の異なるDisplayに液晶ディスプレイがある。
  • 発光原理
    特殊な有機物質(炭素を含む物資)に電流を流すと物質そのものが発光するという性質を利用している。
  • 特徴
    液晶ディスプレイと異なりバックライトが不要なため、薄い。
    必要な部分だけを光らせることができるのでエネルギー効率が良い(電気代が安い)。
    有機物の劣化により、長時間使用すると焼き付きや輝度の低下が発生する場合がある。
  • その他
    青色発光ダイオードの発見をきっかけに、光の三原色であるR(赤)G(緑)B(青)がすべて揃い、省エネルギーの白色光などさまざまな技術開発が進んだ。

配線

代表的なOLED(幅128ピクセル*高さ64ピクセル)の配線を示します。図は直接接続していますが、ブレッドボードとジャンパー線を使用して接続しても構いません。

RaspberryPi PicoOLED Display
VSYS(39番)VCC
GND(38番)GND
GP17(22番)SCL
GP16(21番)SDA
()内はピン番号

I2C通信とは

I2Cは、アイスクエアードシーと読みます。
I2Cとは、複数のデバイスが一つのバス(通信の道)を共有して通信するためのプロトコル(ルール)のことです。

上記の様にRaspberryPi PicoとDisplayでI2Cで通信する場合、Picoをマスターデバイス、Displayをスレーブデバイスと呼びます。Displayは複数あっても構いません。

I2Cで通信するには2本の線が必要です。

  • SDA(データライン) : データの送受信を行う線
  • SCL(クロックライン) : データ送受信のタイミングを制御する線。マスターがクロックを生成し、スレーブはクロックに同期してデータを送受信する

I2C通信の動作原理

スタート条件:PicoがSDAラインの電圧を3.3V→0Vへ変化させる。SCLラインは3.3Vのまま。これでI2C通信を開始。

データの送受信:PicoはSCLのクロック信号を生成しながら、SDAラインを通じてデータを送信。各データはSCLが3.3Vの時にSDAラインの状態として読み取られます。

アドレスの送信:Picoは最初にDisplayのアドレスを送信し、通信対象のデバイスを指定。各スレーブデバイスには固有のアドレスがあり、そのアドレスに基づいて通信を行います。

データの受信:Displayは指定されたアドレスを受け取ると、Picoに対してデータの送信または受信を行います。

ストップ条件:PicoがSDAラインを0V→3.3Vへ変化させる。SCLラインが3.3Vであれば通信が終了。

OLED Displayに文字を表示する準備とプログラム

OLED Displayにテキストを表示するためには、実は非常に複雑なプログラムが必要です。その為、ディスプレイを容易に使うための「ライブラリ※」が準備されています。
 ※ ExcelのVLOOKUP関数のような、便利な関数が入った道具箱
多くのデバイスでライブラリが準備されています。初めて使うデバイスはまずライブラリの有無を確認しましょう。

  • ライブラリのインストール
    Tonny IDEを使用して、ssd1306.pyライブラリをインストール。
    ツール → パッケージの管理 → ssd1306で検索 → micropython-ssd1306
  • コーディング
    ディスプレイのアドレス番号とHello,Worldという文字列を表示する。
    文字位置は座標指定。(コード参照のこと)
from machine import Pin, I2C
import ssd1306
import time

# I2Cの設定
# I2Cには「0」と「1」があるため配線図を確認のこと
# 指定するのはGP番号であることに注意
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

# I2Cデバイスのアドレス確認
devices = i2c.scan()
if devices:
    print("I2Cデバイスが見つかりました:")
    for device in devices:
        print("デバイスアドレス: ", hex(device))
else:
    print("I2Cデバイスが見つかりませんでした")

# OLEDの設定(幅128ピクセル、高さ64ピクセル)
# 手持ちのOLEDのサイズを入力すること
try:
    print("OLED初期化開始")
    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
    print("OLED初期化成功")
except Exception as e:
    print("OLED初期化エラー:", e)
    raise e

# OLEDにアドレスを表示
oled.fill(0)  # 画面をクリア

# 1行目に「I2C Addresses:」を表示
oled.text("I2C Addresses:", 0, 0)

# 2行目以降にデバイスアドレスを表示
y_position = 10  # 初期Y位置を設定

if devices:
    for device in devices:
        oled.text(hex(device), 0, y_position)  # 各デバイスアドレスを表示
        y_position += 10  # Y位置を更新
else:
    oled.text("No devices found", 0, y_position)

# 次の行に"Hello, World!"を表示
oled.text("Hello, World!", 0, y_position + 10)
oled.show()  # 画面を更新
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次