前回はRaspberry PiのOSインストールと初期設定まで行いました。
今回はWi-Fiの設定と時計動かす所まで行きます。
[2021-06-05 追記]
一部パスなどが最新版rpi-rgb-matrixで変更になっているところがあったので修正
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/bindings/python
make build-python PYTHON=$(which python3)
sudo make install-python PYTHON=$(which python3)
当然ですが、makeするときはrpi-rgb-led-matrix/pythonにいないとダメですよ。
で、以下のようにして実行します。
cd samples
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=/usr/bin/python3 実行する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 〜 外装を整えるとテンションあがる