発車案内板を作ろう
電子工作, SMD2121, ドットマトリクス, LED, Raspberry Pi, Raspberry Pi Zero, NTP, ハードウェア, ソフトウェア, Python

Flying Object lab

飛行物体の実験室 > 記事 > 発車案内板を作ろう > ドットマトリクス"SMD2121"の日本語セットアップ -発車案内板を作ろう 前編-

ドットマトリクス"SMD2121"の日本語セットアップ -発車案内板を作ろう 前編-

ドットマトリクス"SMD2121"の日本語セットアップ -発車案内板を作ろう 前編-

2025年11月06日

2025年11月22日

余り物のRaspberry Pi Zeroと衝動買いの遺産SMD2121

 研究室は様々な物品が転がっており、今後日の目を見ることも無く廃棄されるようなものも多々あります。そんな物の1つになりかけていた"Raspberry Pi Zero"。SDカードすらセットされておらず、息を止めたままのそれを叩き起こします。

 自宅は様々な物品が転がっており、今後日の目を見ることもないようなものも多々あります。そんな物の1つになりかけていたフルカラーLEDドットマトリクス"SMD2121"。これらの2つを合体させて、便利な電光掲示板を作ってやろうではありませんか。

Xで見た「運行情報掲示板」

 Xを見ていたら、このような投稿$^{(1)}$が目に飛び込んできました。

引用元: @KO51TokyoHazama

 学校から移動するタイミングを見計らうために作られた発車案内板。弊学も駅まで10分くらいかかる距離に位置しているので個人的にも作りたいと考え、Raspberry Pi ZeroとSMD2121を組み合わせた掲示板を作ることとしました。

 この作品にはさらに先行事例が存在します。おそらく発祥は大阪電気通信大学の方々が作ったもの$^{(2)}$でしょう。

 両者ともに基本的な内容は同じです。この掲示板が表示している情報は多岐に渡ります。が、筆者が使おうとしている電光掲示板は解像度が非常に低いです。このことを考慮しながら制作を行っていきます。

Raspberry Pi Zeroの準備

 今やむしろ貴重となった、容量わずか8GBのmicroSDを見つけたので、こちらにOSを書き込みます。で、いざ動かしてみるとWi-Fiに接続できません。色々試してみて、凡ミスに気づきました。  筆者が動かしているのは無線通信の機能が一切ついていない初期型の"Raspberry Pi Zero"でした。なので、LANケーブルコネクタがついているUSBハブを急遽購入してきて接続を行います。

 これでRaspberry Pi Zeroが問題なく作動しました。

ssh接続の確立

 Raspberry Pi Zeroの貧弱なリソースでは、マウスの反応も悪く操作性がよくありません。なので、PCからリモートで操作できるようにします。  GUI左上のRaspberry Piアイコン→Preferences→Raspberry Pi Configuration→Interfaces からSSHが有効であることを確認します。

sudo raspi-config

をコマンドラインに入力し、Interface Options→SSH→Yes でSSHサーバーを有効化します。

 PC側のコマンドプロンプト(筆者はGit Bashを利用)から以下のコマンドを叩いたら無事、PCとRaspberry Pi Zeroの接続ができました$^{(3)}$。

ssh pi@raspberrypi.local

(ここで示しているのはユーザ名がデフォルトのpiの場合です。OSのイメージを書き込みするときにこれらの内容を変更していた場合は、適宜その内容に変更してください)

NTPで時計合わせ

 timedatectlコマンドを実行し、現在の時計の状態を見てみます。

 時計は合っているように見えますが、RTCを持っていないRaspberry Piでは時計がずれることは日常茶飯事です。

 なので、NTPで時計合わせを自動でできるようにしておきます。

 まず、nanoを使ってファイル/etc/systemd/timesyncd.confを編集します。

sudo nano /etc/systemd/timesyncd.conf

 [Time]以下のNTPとFallbackNTPの行を以下のように変更します$^{(4)}$。筆者の場合はコメントアウトの除外&加筆でした。

[Time]
NTP=ntp.jst.mfeed.ad.jp ntp.nict.jp
FallbackNTP=time.google.com

以下のコマンドでNTPを有効にし、デーモンとサービスを再起動します$^{(5)}$。

sudo timedatectl set-ntp true
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd.service

再度timedatectlを呼び出し、時刻をチェックしておきましょう。

SMD2121を駆動する

 ライブラリをダウンロードしてドットマトリクスを点灯させます。  そのためにはまずRaspberry Pi Zeroとドットマトリクスをジャンパワイヤなどで接続しなければなりません。

Raspberry Pi Zero⇔SMD2121の接続

 筆者が購入したSMD2121にはリボンケーブルが付属していました。これをドットマトリクスの端子に接続すると、端子の配置が反転します。

 反転した状態でのピンの接続先はこうなります。

 筆者の環境では、Raspberry Pi Zeroのピンも反転しています。(Raspberry Pi Zero WHなどのデフォルトのピンヘッダと表裏反対に接続している)

 これを考慮したうえで、接続を示すとこうなります。

 この通りに配線を行った後、最後にドットマトリクスの中央に接続できる電源の5VとGNDにもジャンパワイヤで接続を行います。

 ※筆者の環境では問題になりませんでしたが、このタイプのドットマトリクスが要求する電源電流はかなり大きいものになります。もし接続が切れたり、Raspberry Piが落ちるようなら電流値が大きい電源を利用してください。先行事例を見ていると、2A以上の電源を使ったほうが無難です。

ドットマトリクスを扱うためのライブラリをダウンロード

 次に、Raspberrry Piにgithubからライブラリを落としてきます。  gitが無い場合は以下のコマンドでgitをインストールしておきます$^{(6)}$。 (筆者の場合は既に最新バージョンが入っていると表示されましたが、念のため実行しました)

sudo apt-get install git

 gitの存在を確認したら以下のコマンドでライブラリをダウンロード(clone)します$^{(7)}$。

git clone https://github.com/hzeller/rpi-rgb-led-matrix/

 lsコマンドで確認したところ、しっかり配置されています。

デモを動かす

 ライブラリのディレクトリに移動し、ビルドを行います。

cd rpi-rgb-led-matrix/
make -C examples-api-use

 その後、"examples-api-use"の中にある"demo"ファイルに適切な指示を与えて実行すると、しっかりドットマトリクスLEDが光ります。

 例として、ライフゲームを動作するデモがあったので動かしてみます。コマンドは以下の通りです$^{(8)}$。

sudo ./examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-cols=64 -D7

 これで、Raspberry Pi Zeroとドットマトリクス、およびその接続に問題が無いことがわかりました。

日本語を扱う

 電光掲示板として用いるため、日本語のフォントが扱いたいです。しかし、ライブラリが対応しているのは.bdf形式のフォントのみです。  本章では、ドットマトリクスに日本語を表示させます。  電子工作では「東雲フォント」という有名なフォントがあり、これがbdf形式で配布を行っています$^{(9)}$。ただし、フォントがotfファイルやttfファイルの場合は変換を行わなければなりません。

使いたいフォントを探し、bdfファイルに変換する

 本記事では「ベストテン」という10x10ドットのフォントを利用します$^{(10)}$。  ここでは取り上げませんが、「KHドットフォント」シリーズも個人的にはいいと思います$^{(11)}$。

 ドットマトリクスに表示したいフォントを探してきて、PCに落とします。  PCから手早くファイルやディレクトリをRaspberry Piへ移動させる手段としては、scpコマンドを使うのが良いでしょう。新たにPC側でコマンドプロンプト(筆者はWindowsのpowershell)を開き、以下のコマンドでファイルを全て転送します。

scp -r ./MyFonts pi@raspberrypi.local:~

 -rオプションを付けることで、ディレクトリの中身を再帰的に転送できます。パスやファイル/ディレクトリの名前は適宜変更してください。

 raspberry piへ戻り、以下のコマンドで"otf2bdf"というツールをインストールします。

sudo apt install otf2bdf

フォントを以下のようなフォーマットで変換します。 今回は「ベストテン」のフォントを変換するのでこのようなフォーマットとなりました。

otf2bdf -p 10 -r 72 -o ~/Myfonts/BestTen-DOT.bdf ~/Myfonts/BestTen-DOT.otf

(上記のコマンドでは作業ディレクトリの位置を指定していません。状況に合わせて適宜変更してください)

 これで正しくフォントファイルが変換されたはずです。

 Windows側でfontforgeというソフトウェアを用いて変換する手もあるようですが、筆者は試していません$^{(12)}$$^{(13)}$。

ライブラリのデモで日本語フォントを表示

 ライブラリのディレクトリに戻り、フォントが正しく表示されるかチェックします。

 デモプログラムの"scrolling-text-example"を使用して、文字列をドットマトリクスへ流します。

 そのコマンドがこちらです$^{(6)}$。

cd ~/rpi-rbg-led-matrix
sudo ./examples-api-use/scrolling-text-example -f ~/Myfonts/BestTen-DOT.bdf --led-no-hardware-pulse --led-rows=32 --led-cols=64 The quick brown fox jumps over the lazy dog. 色は匂えど散りぬるを 我が世誰ぞ常ならむ 有為の奥山今日超えて 浅き夢見し酔ひもせず。

(上記の例では、変換後のフォントファイルのパスは~/clock/fonts/BestTen-DOT.bdfとなっている)

 これで正しく表示が行えたことを確認できました。

余談: 接続はしっかり見よう

 日本語に対応するコードを走らせたタイミングで、偶然表示が異常にちらつくようになってしまいました。ソフト側の問題かと思って設定を一回やり直しましたが、実際の問題はハード側で、LATに相当するジャンパワイヤが引っこ抜けているだけでした。

 ハードの状態は逐次頭に入れておきましょう。これで30分無駄にしました。

Pythonに対応させる

Pythonのデモ

 記述するコードはC++, Python, Node.js, Go, Rustで動かすことができるようです$^{(7)}$。基本的にこのライブラリはC++で動作させることを想定しているようですが、今回は記述と読解が容易なPythonを用います。このため、PythonからライブラリのAPIを叩く方法を確認します。

 まずライブラリのファイル直下に移動し、ビルドを行います。

cd ~/rpi-rgb-led-matrix
sudo apt-get update && sudo apt-get install python3-dev cython3 -y
make build-python 
sudo make install-python 

ここまで来たら、sampleディレクトリ内のデモを動かせます。 以下のコマンドを用いて、Hello Worldを表示します。

cd ~/rpi-rgb-led-matrix/bindings/python/samples
sudo ./runtext.py --led-rows=32 --led-cols=64 --led-no-hardware-pulse 1 -t "Hello World!"

Pythonで自分のコード(+日本語フォント)を動かす

 デモ用のファイルのコードを見てみると読み込んでいるフォントはfontsディレクトリ直下にある7x13.bdfであることが分かります。

font = graphics.Font()
font.LoadFont("../../../fonts/7x13.bdf")

 コードを作る前に、設定を変更します。

 /etc/modprobe.d/の直下にblacklist-rgb-matrix.confを作成し、以下のコードをファイルに書き込みます。

blacklist snd_bcm2835
sudo update-initramfs -u

を実行し、数分待機します。

sudo reboot

を実行し、Raspberry Piを再起動します。

以上の手順を踏まないと、実行時にうまく動いてくれませんでした。

 次に、パスの問題です。デフォルトの書き方だと、以下のように相対パスで"/rpi-rgb-matrix/fonts/7x13.bdf"にアクセスするようになっていました。

font.LoadFont("../../../fonts/7x13.bdf")

 matrix_debug.pyというファイルを作り、Raspberry Piのホームディレクトリ直下に配置します。そしてsudoで実行すると以下のようになります。

pi@raspberrypi:~ $ sudo python3 matrix_debug.py
Traceback (most recent call last):
  File "/home/pi/matrix_debug.py", line 24, in <module>
  File "graphics.pyx", line 32, in rgbmatrix.graphics.Font.LoadFont
Exception: Couldn't load font /home/pi/rpi-rgb-led-matrix/fonts/BestTen-DOT.bdf

 ライブラリの"graphics.pyx"が"~/Myfonts/BestTen-DOT.bdf"を読み取ろうとして失敗しています。

 これは実行ユーザがdaemonに格下げされており、アクセス権限が無いことに由来しています。(これらはライブラリのissueにて議論されています$^{(15)}$。解決に1日かかりました)

 問題解決のため、ディスプレイとファイルにアクセス許可を与えます。

sudo chmod a+rx /home
sudo chmod a+rx /home/pi
sudo chmod a+rx /home/pi/Myfonts
sudo chmod a+r /home/pi/Myfonts/BestTen-DOT.bdf

このような状態で、以下のようなコードを書きました。

#!/usr/bin/env python3
import time
import sys

from rgbmatrix import RGBMatrix, RGBMatrixOptions, graphics

options = RGBMatrixOptions()
options.rows = 32
options.cols = 64
options.chain_length = 1
options.parallel = 1

matrix = RGBMatrix(options = options)

font = graphics.Font()

font_path = "/home/pi/Myfonts/BestTen-DOT.bdf"

font.LoadFont(font_path)

offscreen_canvas = matrix.CreateFrameCanvas()
pos = offscreen_canvas.width

def draw():
    global pos
    global offscreen_canvas

    textColor = graphics.Color(0, 255, 0)
    text = "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。"

    offscreen_canvas.Clear()

    text_width = graphics.DrawText(offscreen_canvas, font, pos, 10, textColor, text)

    pos -= 1

    if (pos + text_width < 0):
        pos = offscreen_canvas.width

    offscreen_canvas = matrix.SwapOnVSync(offscreen_canvas)

try:
    print("Press CTRL-C to stop.")
    while True:
        draw()
        time.sleep(0.05)
except KeyboardInterrupt:
    sys.exit(0)

 以上のコードをホームディレクトリ直下に置き、以下の指示で実行してみます。

pi@raspberrypi:~ $ sudo python3 matrix_debug.py
Press CTRL-C to stop.

 Press CTRL-C to stop.が出ている間はドットマトリクスに文字列が表示されています。これで基本的な準備が整いました。次回は、ソフトウェアを組み上げていきます。

※本記事で紹介した手法は、セキュリティ上での懸念が残っています。もしこのコードを扱うのであれば、その点を留意した上でご利用ください。

参考文献