はじめに
ディスプレイに日本語を表示する方法を紹介します。ディスプレイに関する過去の記事は以下を参照ください

なぜ日本語がそのまま表示できないのか?
SSD1306などの単色OLEDやST7789などのディスプレイをMicroPythonから扱う際、デフォルトで用意されているのは英数字だけの単純なビットマップフォントです。そのため、次の問題が発生します。
| 項目 | 説明 |
| デフォルトのフォント | ASCIIコード(A〜Z、0〜9、記号)だけ対応 |
| 日本語の扱い | 標準で含まれていない(コードポイントがない) |
| 日本語の表示 | ビットマップデータがないため、単なる空白となる |
日本語がそのまま出せない理由は、デフォルトのライブラリが日本語のビットマップデータを持っていないからなのです。別途紹介しますが、e-paper用のライブラリは日本語対応になっている場合が多い為、シンプルに日本語が表示できます。
ビットマップデータとは?
ディスプレイは単なる「点」の集まり
SSD1306などの小型ディスプレイ(128×64ピクセルなど)は、白/黒の点(ピクセル)だけでできています。
日本語も、次のような単なる点の並びです。
例えば、7×7ピクセルで表現した「日」という文字を例示します。1は黒、0は白を表します
| ピクセル | 表示 |
| 行0 | 1111111 |
| 行1 | 100001 |
| 行2 | 1111111 |
| 行3 | 100001 |
| 行4 | 100001 |
| 行5 | 1111111 |
| 行6 | 0000000 |
遠くから見ると、「日」という字に見えませんか??
MisakiFontとは
MisakiFont は、日本語のドット単位のビットマップデータをまとめたライブラリです。
| 項目 | 説明 |
| MisakiFont | 日本語のそれぞれの文字コード(例えば「日」「本」「語」)を、7×7ピクセルなどの小さなビットマップデータに変換 |
| 表示側(SSD1306など) | MisakiFontから取得したビットマップデータを、単純な処理で表示できる |
つまり、MisakiFontを使うと日本語が読めるデータになり、SSD1306などのディスプレイで日本語が表示できるというわけです。
配線
以前の記事を参照ください

OLEDディスプレイに日本語を表示する
Misakifontを入手する
以下から入手できます。作成してくださった方に感謝です。
https://github.com/Tamakichi/pico_MicroPython_misakifont
「misakifont」のフォルダを丸ごとRaspberryPi Picoにアップロードください
日本語を表示する
from machine import Pin, I2C
import ssd1306
from misakifont import MisakiFont
import time
fcolor = 1
fsize = 1
WIDTH = 128
HEIGHT = 64
def show_string(oled, mf, text, x, y, color=fcolor, size=fsize):
"""単純にテキストを指定位置から描画"""
for c in text:
fd = mf.font(ord(c))
for row in range(7):
for col in range(7):
if (0x80 >> col) & fd[row]:
oled.fill_rect(x + col * size, y + row * size, size, size, color)
x += 8 * size
# I2CおよびOLEDの初期化
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c)
mf = MisakiFont()
# 画面初期化
oled.fill(0)
# 表示
show_string(oled, mf, "日本語つかえるよ", 0, 0) # 1行目
show_string(oled, mf, "Aa1あ火", 0, 16) # 2行目
oled.show()
# 5秒後、画面消去
time.sleep(10)
oled.fill(0)
oled.show()まとめ
ディスプレイに日本語を出したくなることはきっとあると思います。ただ、実際にやってみればわかりますが、表示できない日本語もあります。それも踏まえて活用できるとより楽しめると思います。是非チャレンジください。
コメント