OLEDディスプレイの中でも人気のあるSSD1306。
小型で扱いやすく、MicroPythonと組み合わせることで、簡単に文字や図形を表示できます。
しかし、標準のssd1306ライブラリはASCII文字しか表示できないため、ひらがなやカタカナを表示するにはフォントデータを用意する必要があります。
本記事では、美咲フォントを使い、MicroPythonでSSD1306に日本語文字を表示する方法を詳しく解説します。
SSD1306とMicroPythonの準備
- 使用するハードウェア:ESP32 / RP2040 / MicroPython対応ボード
- 必要なライブラリ:
ssd1306.py - I2C接続方法と初期化コード例

初期化コード
from machine import Pin, I2C
import ssd1306
# --- I2C 初期化 ---
i2c = I2C(0, scl=Pin(5), sda=Pin(4)) # GPIO番号は環境に合わせて変更
oled = ssd1306.SSD1306_I2C(128, 64, i2c)美咲フォントの準備
美咲フォントとは
美咲フォントは、日本語のひらがな・カタカナ・一部の漢字や記号を含む、フリーで使えるビットマップフォントです。
元々はBDF(Bitmap Distribution Format)形式で配布されており、1文字ごとにピクセル情報が保存されているため、小型ディスプレイや組み込み機器での表示に適しています。
特徴としては以下の通りです
- 小型ディスプレイ向け
8×8や16×16などのピクセル単位で文字が作られており、OLEDやLCDなど小さな画面でも読みやすい - フリーで利用可能
個人利用・商用利用も可能なライセンスで配布されているため、電子工作やIoTプロジェクトに安心して利用できる - BDF形式で配布
文字ごとのビットマップ情報をテキスト形式で扱えるため、PythonやMicroPythonで簡単に変換して使用可能 - カスタマイズしやすい
必要な文字だけを抜き出してMicroPython用の配列に変換できるので、SSD1306やST7789などの小型ディスプレイに最適化して利用できる
ひらがな・カタカナの必要な文字だけを抜き出す方法
美咲フォントを入手
- 美咲フォントは BDF 形式で公開されています。
- 例: 美咲フォント公式サイト
misaki_bdf.zip をダウンロード、解凍してmisaki_gothic.bdf取り出す。
BDF を Python で扱える形式に変換
- BDF はそのままでは使えないので、Python スクリプトを使ってビットマップ配列に変換します。
- 変換用のツール例:
- bdfconv(u8g2 の付属ツール)
- Python スクリプトでパース(例:
fonttoolsライブラリ)
必要な文字リストを作る
まず、自分が使いたい文字を Python でリスト化します。
chars = "あいうえおアイウエオ"この文字列をもとに「必要なグリフだけ」抽出します。
Pytnon3で MicroPython用に変換してmisaki.pyとして保存
bdflib ライブラリーを使いますのでインポートしていない方はインポートしておいてください。
わたくしはVscodeを使って実行しましたが、必ずVSコードの作業用フォルダーの中にmisaki_gothic.bdfをコピーしておいてください。
サンプルプログラム
from bdflib import reader
import pprint
font_dict = {}
with open("misaki_gothic.bdf", "rb") as f:
bdf = reader.read_bdf(f)
# 必要な文字だけを抽出
chars = "あいうえおアイウエオ"
for glyph in bdf.glyphs:
if glyph.codepoint is None:
continue
ch = chr(glyph.codepoint)
if ch not in chars:
continue
bitmap = []
# glyph.data はすでに int のリスト
for row in glyph.data[:8]: # 上位8行を使用
# 16bit幅なら右8bitを利用
bitmap.append(row >> 8 if row > 0xFF else row)
font_dict[ch] = bitmap
# MicroPython用フォーマットで保存
with open("misaki.py", "w", encoding="utf-8") as f:
f.write("font = ")
pprint.pprint(font_dict, stream=f)これで作業用フォルダーの中にmisaki.pyというフォントPythonファイルが出来上がります。
サンプル
font = {'あ': [50, 89, 53, 30, 16, 62, 16],
'い': [16, 40, 65, 65, 66, 68],
'う': [28, 2, 1, 33, 30, 0, 30],
'え': [35, 20, 12, 4, 62, 0, 30],
'お': [54, 81, 49, 30, 17, 122, 16],
'ア': [16, 8, 8, 12, 10, 1, 63],
'イ': [4, 4, 52, 12, 4, 2, 1],
'ウ': [24, 4, 2, 1, 33, 63, 8],
'エ': [127, 8, 8, 8, 62],
'オ': [12, 100, 20, 12, 4, 127, 4]}文字を追加するには下記のよう追加すると、簡単でわかりやすくなります。
# 必要な文字だけを抽出、追加する
aa="かきくけこさしすせそ"
bb="だじづでど"
chars = "あいうえおアイウエオ" + aa + bb実際に表示してみる
IDE Thonnrを使用してOLEDに文字列を描画して確認してみました。
上記で作成した美咲フォントをRP 2040のライブラリーフォルダーの中に格納します。
from machine import Pin, I2C
import ssd1306
from misaki import font # フォントデータを別ファイル misaki.py に保存しておく
import framebuf
# --- I2C 初期化 ---
i2c = I2C(0, scl=Pin(5), sda=Pin(4)) # GPIO番号は環境に合わせて変更
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def draw_char(oled, ch, x, y, color=1):
"""1文字描画"""
if ch not in font:
return
data = font[ch]
width = len(data)
height = 8
for col, byte in enumerate(data):
for row in range(height):
if byte & (1 << (7 - row)):
oled.pixel(x + col, y + row, color)
def draw_text(oled, text, x, y, color=1, spacing=1):
"""
90度反時計回りで文字列を描画
spacing: 回転後文字間隔(縦方向)
"""
xx=x
yy=y
cursor_x = x
cursor_y = y
for ch in text:
if ch not in font:
continue
# 文字を描画
data = font[ch]
char_width = len(data)
char_height = 8
for col, byte in enumerate(data):
for row in range(char_height):
if byte & (1 << (7 - row)):
oled.pixel(cursor_x + row, cursor_y + (char_width - 1 - col), color)
# 次文字の開始位置を調整
# 回転後は横幅が char_height、縦幅が char_width になる
cursor_y += char_width + spacing
def draw_text_horizontal(oled, text, x, y, color=1, spacing=1):
"""
90度反時計回りで文字を横書きで描画
text: 描画する文字列
x, y: 左上スタート座標
spacing: 文字間隔(横方向)
"""
cursor_x = x
cursor_y = y
for ch in text:
if ch == '\n': # 改行対応
cursor_x = x
cursor_y += 10
continue
if ch not in font:
continue
data = font[ch]
char_width = len(data)
char_height = 8
# 文字を描画
for col, byte in enumerate(data):
for row in range(char_height):
if byte & (1 << (7 - row)):
# 回転後座標
new_x = cursor_x + row
new_y = cursor_y + (char_width - 1 - col)
if 0 <= new_x < oled.width and 0 <= new_y < oled.height:
oled.pixel(new_x, new_y, color)
# 横書きにする場合は cursor_x を右にずらす
cursor_x += char_height + spacing
oled.fill(0)
# 表示する文字列
text = "あいうえお\nアイウエオ\nあい"
text1="あいうえお"
text2="アイウエオあい"
#draw_text(oled, text2, 60, 0)
#draw_text(oled, text1, 50, 0)
draw_text_horizontal(oled,text,0,0,3)
oled.show()改行対応や文字間隔の調整方法はspacing: 文字間隔(横方向)で指定します。
今回のプログラムでは横書きでの描画では、改行がきちんと表示されますが縦書きの場合はできません。

応用:文字サイズの拡張
16×16フォントの表示方法
from machine import Pin, I2C
import ssd1306
from misaki import font # フォントデータを別ファイル misaki.py に保存しておく
import framebuf
# --- I2C 初期化 ---
i2c = I2C(0, scl=Pin(5), sda=Pin(4)) # GPIO番号は環境に合わせて変更
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def draw_char16(oled, ch, x, y, color=1):
"""
8x8フォントを16x16に拡大し、
文字を90度反時計回りに回転して描画
"""
if ch not in font:
return
data = font[ch] # 8列のビットマップ
width = len(data) # 列数
height = 8
scale = 2 # 拡大率
for col, byte in enumerate(data):
for row in range(height):
if byte & (1 << (7 - row)):
# 90度反時計回り回転
oled.pixel(x + row*scale, y + (width - 1 - col)*scale, color)
oled.pixel(x + row*scale + 1, y + (width - 1 - col)*scale, color)
oled.pixel(x + row*scale, y + (width - 1 - col)*scale + 1, color)
oled.pixel(x + row*scale + 1, y + (width - 1 - col)*scale + 1, color)
def draw_text16_horizontal(oled, text, x, y, color=1, spacing=2):
"""
横書きに見えるように、90度反時計回り文字をX方向に並べる
"""
cursor_x = x
cursor_y = y
for ch in text:
if ch == '\n':
cursor_x = x
cursor_y += 16 + spacing
continue
draw_char16(oled, ch, cursor_x, cursor_y, color)
cursor_x += 16 + spacing # 横書きにするにはX方向にオフセット
text = "あいうえお\nアイウエオ"
draw_text16_horizontal(oled, text, 0, 0,color=1, spacing=1)
oled.show()これで大きい16×16 fontのカタカナひらがなが表示されます。

まとめ
MicroPythonとSSD1306を使うことで、手軽に小型OLEDに日本語文字を表示できます。
美咲フォントを用いることで、ひらがな・カタカナも簡単に描画可能です。
今回紹介した方法を応用すれば、縦書き表示や16×16サイズの文字表示も実現できます。
小型表示器で日本語を扱いたい電子工作やIoTプロジェクトに、ぜひ活用してみてください。



