キノコの自省録

日々適当クリエイト

RaspberryPiでOLED液晶モジュールに出力する文字のフォントを変えたり日本語を出したり

この続き。

RaspberryPiを使ってHiLetgo 0.91" I2C シリアルLCDモジュールを表示させてみる - キノコの自省録

対象製品はこれ。今売り切れてますね……。

HiLetgo 0.91" IIC I2C シリアルOLED液晶ディスプレイモジュール 128x32 3.3V/5V AVR PIC Arduino UNO MEGA [並行輸入品]

これ使って、時計とか作ろうかなと思ってたりしてます。

フォントとフォントサイズの変更

GitHub - adafruit/Adafruit_Python_SSD1306: Python library to use SSD1306-based 128x64 or 128x32 pixel OLED displays with a Raspberry Pi or Beaglebone Black.

このexplamples/stats.pyをベースに改変してみます。フォントの指定は、98行目のここで行っています。

# Load default font.
font = ImageFont.load_default()

このImageFontというのはPillowのモジュールです。ドキュメントはこちら。

ImageFont Module — Pillow (PIL Fork) 4.2.1 documentation

stats.pyにもコメントとして書かれてあるように、ImageFont.truetype()メソッドを使用すれば、フォントやフォントサイズの変更ができます。

# Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('Minecraftia.ttf', 8)

.ttfフォントがpythonスクリプトと同じディレクトリに入ってるか確認してね、って書いてありますが、そこに配置せず、今回はapt-getでIPAフォントをinstallする方法を試みます。

$ sudo apt-get install fonts-ipafont

インストールされたフォントは、/usr/share/fontsにあります。

$ ls /usr/share/fonts/truetype/
fonts-japanese-gothic.ttf  fonts-japanese-mincho.ttf

このフォントを使って表示させてみます。フォントサイズは倍の16に変更します。

#font = ImageFont.load_default()
font = ImageFont.truetype("fonts-japanese-gothic.ttf", 16)
 :
draw.text((x, top), "hello,", font=font, fill=255)
draw.text((x, top+16), "world!", font=font, fill=255)

システムがフォントのパスを解決しますので、ttfのファイル名だけでOKです。結果はこちら。

f:id:kinokorori:20171001225045p:plain

日本語の表示

IPAフォントは日本語フォントなので、そのまま日本語が表示できます。pythonスクリプト文字コードutf-8にして、ファイル先頭にcoding:utf-8を入れます。

# -*- coding:utf-8 -*-
 :
draw.text((x, top), "こんにちは、", font=font, fill=255)
draw.text((x, top+16), "世界!", font=font, fill=255)

これを実行すると、見事に化けます。draw.textはunicodeを要求しますので、正しくデコードできずに文字化けが発生します。そのため、下記のように修正します。

# -*- coding:utf-8 -*-
 :
draw.text((x, top), u"こんにちは、", font=font, fill=255)
draw.text((x, top+16), u"世界!", font=font, fill=255)

結果はこちら。

f:id:kinokorori:20171001225129p:plain