目次
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()