LEDドットマトリックス時計

必要なもの

LEDパネルとACアダプターの接続

LEDパネルのケーブルをACアダプターと接続するためにスマホで使っていたUSBケーブルを使いました。 まず、USBケーブルのMicroUSBコネクタを切って被覆を取り去ってください。そうすると、緑、白、赤、黒のコードが出てくきます。このうち白と緑はデータ転送用のケーブルなので今回は使用しません。次に、USBケーブルの赤をLEDパネル付属の電源ケーブルの赤(2本)に直接つなぎます。これを黒のケーブルについても行ってください。

LEDパネルとRaspberryPiの接続

LEDパネルのケーブルをACアダプターと接続したら、次はLEDパネルとRaspberry Piを接続します。この時、LEDパネル側の接続には、LEDパネルのINPUT端子を使います。RaspberryPi Zero WHはRaspberryPi2や3とGPIOピンの配列が同じになるので、以下のように接続します。GPIOピンの番号は、SDカードスロットが上になるように置いたとき、一番上の左側が1番になることに注意して作業してください。

本体での作業

RaspberryPiとLEDパネルとACアダプター、LEDパネルの接続が終わったら、LEDパネルのACアダプターをコンセントに差し込み、次にRaspberryPiを起動します。 起動したら、LEDパネルの制御ライブラリrpi-rgb-led-matrixのプロジェクトをGitHubからクローンしてプロジェクトをビルドします。今回はPython3を使うので以下のようにします。バージョンによって異なってくる事もあるので、詳しくはrpi-rgb-led-matrix/bindings/python/README.md(英語)を参照してください。

git clone https://github.com/hzeller/rpi-rgb-led-matrix/
cd rpi-rgb-led-matrix
sudo apt-get update && sudo apt-get install python3-dev python3-pillow -y
make build-python PYTHON=$(which python3)
sudo make install-python PYTHON=$(which python3)

上のコマンドが終了したら、rpi-rgb-led-matrix/bindings/python/samples/に移動してruntext.pyを実行してみます。僕が使用したLEDパネルは32×64ものだったので、コマンドの後ろに–led-rows=32 –led-cols=64を追加しました。

cd rpi-rgb-led-matrix/bindings/python/samples/
sudo python3 runtext.py --led-rows=32 --led-cols=64

うまく表示されたら準備は完了です。次に時計のプログラムを書いていきます。

#!/usr/bin/env python3
# coding: UTF-8
# Display a runtext with double-buffering.
from samplebase import SampleBase
from rgbmatrix import graphics
from datetime import datetime
import time
from logging import getLogger, StreamHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)

class RunText(SampleBase):
    def __init__(self, *args, **kwargs):
        super(RunText, self).__init__(*args, **kwargs)
        self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default="00:00")

    def run(self):
        offscreen_canvas = self.matrix.CreateFrameCanvas()
        font = graphics.Font()
        font.LoadFont("/home/pi/rpi-rgb-led-matrix/fonts/DS-DIGI.bdf")
        textColor = graphics.Color(0, 255, 0)
        pos = offscreen_canvas.width
        my_text = self.args.text

        while True:
            d = datetime.now()
            h = d.hour
            if int(h) > 12:
                h = int(h)-12
            h = (" " + str(h))[-2:]
            my_text = h + ":" + d.strftime("%M")
            offscreen_canvas.Clear()
            len = graphics.DrawText(offscreen_canvas, font, -3, 27, textColor, my_text)

            time.sleep(0.01)
            offscreen_canvas = self.matrix.SwapOnVSync(offscreen_canvas)


# Main function
if __name__ == "__main__":
    run_text = RunText()
    if (not run_text.process()):
        run_text.print_help()

表示する位置を指定する場合はlen = graphics.DrawText(offscreen_canvas, font, -3, 27, textColor, my_text)の数字のところを変えてください。 数字のフォントを変更する時はfont.LoadFont(“/home/pi/rpi-rgb-led-matrix/fonts/DS-DIGI.bdf”)で指定します。 僕は、フォントのサイズが合わなかったので、自分の好きなフォントをサイトなどで探して、ttfファイルをダウンロードしました。そして、linuxでotf2bdfを使い、bdfファイルに変換し、 /rpi-rgb-led-matrix/fonts/以下に配置してコード内で指定しました。otfファイルをbdfファイルに変換するソフトのotf2bdfは-p オプションでフォントサイズを指定できます。

sudo apt-get install otf2bdf
otf2bdf -p [値] [変換後のファイル] [変換前のファイル]

書き終わったら以下のclock.service作って/etc/systemd/systemに置き、systemctlに登録して起動時に実行されるように設定します。Unit定義ファイル(以下のclock.service)のそれぞれの項目について知りたい方はここからどうぞ。

[Unit]
Description=RGB MATRIX Panel Clock Display Service
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/home/hoge/
ExecStart=/usr/bin/python3 /home/hoge/rpi-rgb-led-matrix/bindings/python/samples/clock.py --led-rows=32 --led-cols=64
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target

コマンドにオプションで–led-brightness=50を後ろにつけると50%の明るさになります。