スキップしてメイン コンテンツに移動

SSD1306 OLED:I²C接続で表示

 Raspberry Pi Pico W に 0.96 インチ I²C 接続 OLED(128 × 64 ドット)をつないで、表示テストをしてみましょう。

この OLED は SSD1306 というコントローラ IC で動いており、I²C アドレスは 0x3C です。
自分でレジスタを叩くこともできますが、今回は初心者でも扱いやすい SSD1306 用ライブラリ を使って手早く動かしてみます。

  1. Thonny IDE を起動
    Pico を USB でつないだら、Thonny のメニューから
    [ツール] → [パッケージを管理...] を選びます。


  2. ライブラリをインストール
    検索ボックスに ssd1306 と入力し、結果一覧から micropython-ssd1306 を選択して Install
    自動的に Pico 内の lib フォルダssd1306.py がコピーされます。





これで準備完了。あとはスクリプトでライブラリをインポートし、表示テストを実行するだけです。

配線図


ソースコード

# Raspberry Pi Pico W + 0.96" SSD1306 OLED (128×64, I²C)
# - SDA = GP16, SCL = GP17  … I2C(0) を使用
#
# 依存ライブラリ:
#   ・このファイルと同じ階層、または /lib フォルダに
#     MicroPython 公式の ssd1306.py(掲載コード)を配置

from machine import I2C, Pin
from utime import sleep
import ssd1306            # ssd1306.py をインポート

# ────────────────────────────────
# 設定値(変更したい場合だけ書き換えてください)
SDA_PIN   = 16            # SDA line (GP16)
SCL_PIN   = 17            # SCL line (GP17)
OLED_ADDR = 0x3C          # 0x3C または 0x3D
I2C_FREQ  = 400_000       # 100_000400_000
# ────────────────────────────────

# === I²C 初期化 ===
i2c = I2C(
    0,                    # bus 0 (GP16/GP17)
    sda=Pin(SDA_PIN),
    scl=Pin(SCL_PIN),
    freq=I2C_FREQ,
)

# === I²C スキャンでアドレス確認 ===
if OLED_ADDR not in i2c.scan():
    raise RuntimeError(
        "OLED (addr 0x{:02X}) が見つかりません。配線とアドレスを確認してください。"
        .format(OLED_ADDR)
    )

# === OLED インスタンス生成 ===
oled = ssd1306.SSD1306_I2C(128, 64, i2c, addr=OLED_ADDR)

# === 初期画面描画 ===
oled.fill(0)                              # 画面クリア
oled.rect(10, 0, 100, 18, 1)              # 枠線
oled.text("Hello World!", 13, 5, 1)       # タイトル
oled.show()                               # 反映

# === カウンタを 1 秒ごとに更新 ===
n = 0
while True:
    oled.fill_rect(20, 40, 30, 10, 0)     # 前回の数字を消去
    oled.text(str(n), 20, 40, 1)          # 新しい数字を描画
    oled.show()                           # 反映
    n += 1
    sleep(1)


処理の流れ

🛠️ I²C バス初期化

I2C(0, sda=GP16, scl=GP17, freq=400 kHz) でバス 0 を 400 kHz に設定。


🔍 デバイススキャン

i2c.scan() で接続済み I²C アドレスを列挙し、0x3C が存在するか確認。

→ 見つからなければ RuntimeError を発生させて処理を中断。


🖥️ OLED ドライバ生成

ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C) で 128×64 モノクロ画面を確保。


🧹 画面初期化

oled.fill(0) で全面を黒、oled.rect() でタイトル枠を描き、

oled.text("Hello World!", …) で文字列を配置 → oled.show() で表示。


🔄 メインループ開始

1 秒ごとに以下を繰り返す。

    🔲 前回の数値を消去 — oled.fill_rect()

    🆕 カウンタ描画 — oled.text(str(n), …)

    📤 表示更新 — oled.show()

    ➕ カウンタ加算 — n += 1

    ⏱️ ウェイト — sleep(1)

コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...