Raspberry Pi で LED時計を作ってみた その4 〜 ついに時計の表示まで

20170205raspberry pi 20

前回はRaspberry PiのOSインストールと初期設定まで行いました。

今回はWi-Fiの設定と時計動かす所まで行きます。

Wi-Fiの設定からいきますか

前回の記事↓

Raspberry Pi で LED時計を作ってみた その3 〜 OSセットアップ

以下のコマンドでWi-Fiの設定ファイルを作ります。

sudo sh -c 'wpa_passphrase "SSID" "パスワード" >> /etc/wpa_supplicant/wpa_supplicant.conf'

これで設定ファイルができあがります。

無線を一旦オフにしてオンにし直します。

#無線オフ
sudo ifdown wlan0

#無線オン
sudo ifup wlan0

WLANにipv6のIPが表示されていれば成功です。

ip addr

最後にWi-Fi設定ファイルの中に平文のパスワードも残っているので消しておきましょう。

sudo -E vim /etc/wpa_supplicant/wpa_supplicant.conf

#平文パスワードは消しておく
network={
     ssid="time-capsule"
     #psk="txxxxxx" ←この行を消す
     psk=f69xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

無線LANは当然ながら有線LANとは違うIPがルーターから払い出されるので、IPアドレスが変わります。。

とりあえずデモを動かしてみる

Raspberry Pi で LED時計を作ってみた その2 〜 LEDパネル接続

前々回で既にRaspberry PiとRGB LED マトリクス パネルは接続しているので、試しにデモを表示してみます。

次回あたりに本来このパネルはどうやってコントロールするものなのかという説明はしたいと思いますが、正直これを「1から」コントロールしようとなると、かなり大変です。

GitHubにこのパネルを動かすライブラリ(ほぼデバイスドライバみたいな感じだが)があるので、それを使わせてもらう事にします。

Controlling RGB LED display with Raspberry Pi GPIO

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

これでRaspberry Piにソースがダウンロードできます。

あとは、以下のコマンドでコンパイル & 実行です。

make -C examples-api-use
sudo examples-api-use/demo -D0 --led-rows=16

接続が正しければこれでデモが表示されるかもしれませんが、環境によってはエラーがでるかもしれません。

自分の場合は「–led-no-hardware-pulse」をつけて起動しろと怒られ、次に「snd_bcm2835」をどうにかしろと言われて動かない。結局、ライブラリの公式に書いてある通り以下のコマンド実行した。

cat <<EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf
blacklist snd_bcm2835
EOF

sudo update-initramfs -u
sudo reboot

ちなみに、demoのオプションの「-D」はデモの番号。「-D11」まであります。「–led-rows=16」はパネルの縦のLEDの数です。いくつかの大きさのパネルが発売されているので買ったパネルに合わせて指定しないと画面が崩れます。

Pythonで動かす準備をする

次にPythonからコントロールする準備をします。今回、Python3で試してみました。

Python3のライブラリインストールと、Python用のRGB Matrix Panelのライブラリのコンパイルをします。

ここに書いてある通りなんですけどね。

sudo apt-get update && sudo apt-get install python3-dev python3-pillow -y
cd rpi-rgb-led-matrix/python
make build-python PYTHON=$(which python3)
sudo make install-python PYTHON=$(which python3)

当然ですが、makeするときはrpi-rgb-led-matrix/pythonにいないとダメですよ。

で、以下のようにして実行します。

sudo python3 ./runtext.py --led-rows=16 --led-brightness=50

–led-brightnessと言うオプションを指定してます。これLEDの明るさを指定する物です。100が最高なのですが、それで動かすと目がやられるんじゃないかというぐらいまぶしいです😀

サンプルのままだと、文字のサイズが微妙におかしかったりするのでソースの中を見て調整してみるといいでしょう。

時計アプリを作る

開発経験のある人だったら、ここまでくれば時計を作るのは難しくないとは思います。

そんなわけで一気に時計アプリのソースをどんと書いてみます。


#!/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="21:52")

    def run(self):
        offscreen_canvas = self.matrix.CreateFrameCanvas()
        font = graphics.Font()
        font.LoadFont("../../fonts/6x13.bdf")
        textColor = graphics.Color(100, 100, 255)
        pos = offscreen_canvas.width
        my_text = self.args.text

        while True:
            d = datetime.now()
            h = (" " + str(d.hour))[-2:]
            #スペースを頭に着けて最後から2文字背取得。1-9時の間も真ん中に時計が表示されるようにする考慮
            my_text = h + ":" + d.strftime("%M")
            #logger.debug(my_text)
            offscreen_canvas.Clear()
            len = graphics.DrawText(offscreen_canvas, font, 2, 12, 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()

はい。これをrpi-rgb-led-matrix/python/samples配下に「clock.py」という名前で置きました。

実行はこんな感じです

sudo ./clock.py --led-rows=16 --led-brightness=40

元々サンプルでついていたruntext.pyをペースに時間を表示するように改造しました。

置く場所がsamples配下というのが適当感ありますが、samplebase.pyを使いたかったのでとりあえずこういう構成にしました。

samplebase.pyは起動パラメーターを拾って処理してくれたり、ライブラリの初期化をいろいろやってくれる親クラスです。それを継承して処理を追加しています。

「graphics.DrawText」というのが実際に表示をしているところで、引数の2,12というのが表示開始位置っぽいです。あ、あと「font.LoadFont」でフォントを、「graphics.Color(100, 100, 255)」で文字の色を指定しています。

あとは超高速にひたすら描画を続けているという感じですね。

時計を自動起動させる

このままだとRaspberry Piを再起動すると時計表示が消えて再度コマンドを打たなければいけません。

こんなファイルを作りました。

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

[Service]
Type=simple
WorkingDirectory=ワークディレクトリの場所
ExecStart=実行するPyファイル(例:/home/pi/rpi-rgb-led-matrix/python/samples/clock.py --led-rows=16 --led-brightness=40)
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target

起動。

sudo systemctl start clockdisp.service

停止。

sudo systemctl start clockdisp.service

問題なければ自動起動の設定。

sudo systemctl enable clockdisp.service

ちなみにRaspberry Piは最初からNTPが動いていて時刻は正確であることも確認した。

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+hachi.paina.jp  56.100.90.56     3 u    7   64   17   13.072  -11.774   6.645
*chobi.paina.jp  133.243.238.243  2 u    2   64   25    7.323  -12.568   1.189
+2409:11:53c0:20 56.100.90.56     3 u    5   64   37   17.757  -13.550   1.055

次は見栄えだ!

次回はアクリルパネルをつけて見栄えをよくしていきます。なんせ、このままだとこれですからね。

とりあえず繋げた

Raspberry Pi で LED時計を作ってみた その5 〜 外装を整えるとテンションあがる

関連記事はCMの下をご覧ください

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA