RP2040 Raspberry Pi PicoでのSSD1306 OLED表示の基礎知識

目次

RP2040 Raspberry Pi PicoとCircuitPythonに関する詳細な使い方については、Raspberry Pi Pico関連の記事をご覧ください。

概要

この記事では、I2Cインターフェースを通じて四線式SSD1306ディスプレイを制御する方法について説明します。ディスプレイの解像度は128x64ピクセルで、モノクロ表示のみをサポートしています。色指定は0(黒)と1(白)の二値のみを使用します。

高度な応用:日本語文字表示と簡易ライブラリ実装

追加の機能として、日本語文字の表示方法と、それに対応した簡単なライブラリ実装を紹介します。

必要なライブラリ:

  • adafruit_framebuf
  • adafruit_ssd1306
  • font5x8

これらは公式パッケージに含まれています。

公式モジュールの使用方法

サンプルコード

以下のファイルをボードにアップロードしてください:

  • framebuf
  • ssd1306
  • font5x8
  • font16x16ch(高度な日本語表示に必要)
import board
import busio
import adafruit_ssd1306

# I2Cバスインターフェースを作成
i2c = busio.I2C(board.GP1, board.GP0)  # Raspberry Pi Pico RP2040

# SSD1306 OLEDクラスを作成
display_width = 128
display_height = 64
display = adafruit_ssd1306.SSD1306_I2C(display_width, display_height, i2c)

# 表示を初期化(黒で塗りつぶし)
display.fill(0)
display.show()

# 左上隅のピクセルを設定
display.pixel(0, 0, 1)
# 中央付近のピクセルを設定
display.pixel(64, 16, 1)
# 右下隅のピクセルを設定
display.pixel(127, 31, 1)

# 文字列を表示
display.text('hello,wrld', 50, 0, 1)
display.show()

メソッドの説明

  • i2c = busio.I2C(board.GP1, board.GP0):SCLとSDAピンを指定してI2Cバスを初期化します。
  • display.fill(0):画面全体を黒でクリアします。
  • display.show():描画内容を実際に表示します。

描画操作メソッド

  • display.rotation = 0:画面の回転角度を設定(0〜3)。
  • circle(center_x, center_y, radius, color):円を描画します。
  • fill(color):指定色で画面全体を塗りつぶします。
  • hline(x, y, width, color):水平線を描画します。
  • vline(x, y, height, color):垂直線を描画します。
  • line(x0, y0, x1, y1, color):直線を描画します。
  • pixel(x, y, color):特定のピクセルを設定します。
  • rect(x, y, width, height, color, fill=False):矩形を描画します。
  • scroll(delta_x, delta_y):表示をスクロールします。
  • text(string, x, y, color, font_name='font5x8.bin', size=1):テキストを表示します。

日本語表示の応用

方法:漢字のビットマップを取得し、ピクセル単位で表示

ビットマップ生成方法

オンラインツールを使用して、16x16ドットの漢字ビットマップを生成します。設定例:

  • サイズ:16x16
  • ビット深度:8ビット
  • 文字高さ:16
  • 各文字:2バイト
  • フォント:宋体(宋體)

自作ライブラリの使用方法

以下の関数が提供されます:

  • Ssd1306_128x64_Init(SDA: Pin, SCL: Pin):SSD1306デバイスを初期化し、オブジェクトを返します。
  • Decode16x16_Bytes_To_Pixel(data: tuple, x: int, y: int):漢字のビットマップデータを表示します。最大8文字まで一行に表示可能。
  • Draw_Sent(word: str, x: int, y: int):指定された文字列を表示します。自動改行機能付きで、最大32文字まで対応。

サンプルコード

import board
import busio
import adafruit_ssd1306
from font16x16ch import Ssd1306_128x64_Init, Decode16x16_Bytes_To_Pixel, Draw_Sent

display = Ssd1306_128x64_Init(board.GP0, board.GP1)
Draw_Sent('鍛え抜かれた者は金石も穿つ', 0, 0)
display.show()

また、Decode16x16_Bytes_To_Pixel関数を使って個別に表示することもできますが、最大7文字までと限界があります。

data = (
    0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1f, 0xf0, 0x10, 0x84, 0x7f, 0xfc,
    # ... 他のデータ ...
)

display = Ssd1306_128x64_Init(board.GP0, board.GP1)
Decode16x16_Bytes_To_Pixel(data, x=0, y=0)
display.show()

タグ: Raspberry Pi Pico ssd1306 CircuitPython I2C OLED

8月7日 04:26 投稿