親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

LEDマトリクス・パネル(LEDパネル)を使う

ここでは、LEDマトリクス・パネル(LEDパネル)を使う方法を説明します。LEDパネルがラズパイに接続(配線)されていると想定しています。接続方法については別途連絡ください。

LEDパネルの電源ケーブルをコンセントに刺し、ラズパイの電源を入れてください。今後、LEDパネルとラズパイの間の配線をやり直したり、うっかりワイヤーが抜けてしまって差し直したり、ということが起きると思います。このようにワイヤーの再配線をする時には、LEDパネルの電源ケーブルをコンセントから抜いてからやるようにしてください。このとき、ラズパイの電源は入ったままで大丈夫です。

準備

まずはラズパイOSを最新の状態にアップデートします。ラズパイのTerminalで、以下のコマンドをひとつづつ実行してください。

sudo apt update -y

sudo apt full-upgrade -y

これで、ラズパイOSが最新の状態にアップデートされました。続いて、以下のコマンドをひとつづつ実行してください。コマンドを手でタイプするのではなく、コピー・アンド・ペーストしてください(タイプミスしなくて済むので)。

sudo apt install libgraphicsmagick++-dev -y

sudo apt install libwebp-dev -y

sudo apt install python3-dev -y

sudo apt install python3-pillow -y

次に、以下のコマンドを実行:

cd iot-python

これでTerminalのプロンプト(コマンドをタイプするところ)が、以下の写真のようになります。

赤線を引いてある場所が「~/iot-python」となっていることを確認してください。白い縦長の長方形の部分が、新規のコマンドをタイプする場所です。

この状態で以下のコマンドを実行してください。

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

しばらく時間がかかりますが、コマンドの実行が終了したら、以下のコマンドを実行:

cd rpi-rgb-led-matrix

これでTerminalのプロンプト(コマンドをタイプするところ)が以下の写真のようになります。

赤線を引いてある場所が「~/iot-python/rpi-rgb-led-matrix」となっていることを確認してください。白い縦長の長方形の部分が、新規のコマンドをタイプする場所です。

この状態で以下のコマンドを実行:

make

しばらく時間がかかります。終了したら、以下のコマンドを実行:

sudo mousepad /etc/modprobe.d/snd-blacklist.conf

「Mousepad」というラズパイのテキストエディタ(Windowsのメモパッドのようなもの)が「snd-blacklist.conf」という設定ファイルを開きます。おそらくこのファイルには何も書かれていないと思います。最初の行に、以下の設定項目を追加します(コピー・アンド・ペーストする)。

blacklist snd_bcm2835

そして、ファイルを保存して、Mousepadを閉じます。もし、「snd-blacklist.conf」という設定ファイルが空でなく何か書かれていたら、最後の行まで移動して上記設定項目をコピー・アンド・ペーストしてください。

Terminalに戻り、以下のコマンドを実行してください。

sudo mousepad /boot/config.txt

今度は、Mousepadが「config.txt」という設定ファイルを開きます。このファイルには数多くの設定項目が書かれています。ファイルの1行目から順に見ていって、

dtparam=audio=on

という行を探してください(だいたい50行目あたりにあります)。そしてその行の先頭に「#」を書き込みます。以下のようにします。

#dtparam=audio=on

そして、ファイルを保存して、Mousepadを閉じます。これで準備作業は終わりです。ラズパイをリブートして、次のセクションへ進んでください。

LEDパネルのテスト(第1のテスト)

ラズパイのリブートが終わったら、いよいよLEDパネルを光らせるテストをします。Terminalを開いて、以下のコマンドを実行してください。

cd iot-python/rpi-rgb-led-matrix

Terminalのプロンプト(コマンドをタイプするところ)が、以下の写真(赤線を引いてある部分)のようになっていることを確認してください。

続いて以下のコマンドを実行してください(コピー・アンド・ペーストしてください)。64x32のLEDパネルを使っている場合は、「–led-rows 64」の数字の部分を「32」に変えてコマンドを実行してください。128x64のパネルの場合は、「–led-cols 64」の数字の部分を「128」に変えてコマンドを実行してください。

sudo ./examples-api-use/demo -D 0 --led-cols 64 --led-rows 64

以下のような正方形がLEDマトリクスに表示されグルグル回れば成功です。この表示を止めるには、Terminalで「Ctrl-C」してください。

以下のような場合は、ほぼ100%配線を間違えているので、配線をやり直してください。冒頭に書いたように、LEDパネルの電源ケーブルをコンセントから外して作業してください。

LEDパネルのテスト(第2のテスト)

さらにLEDマトリクスのテストを続けます。これまで使ってきたTerminalをそのまま使ってください。

これまで使ってきたTerminalではなく新規のTerminalを使っている場合には、まず以下のコマンドを実行してください。

cd iot-python/rpi-rgb-led-matrix

Terminalのプロンプトが以下の写真(赤線を引いてある部分)のようになっていることを確認してください。

この状態で以下のコマンドを実行してください。先に書いたように、64x32のLEDパネルを使っている場合は「–led-rows 64」の数字を32に変えてください。128x64のパネルの場合は、「–led-cols 64」の数字の部分を「128」に変えてコマンドを実行してください。

sudo ./examples-api-use/demo -D 1 --led-cols 64 --led-rows 64 ./examples-api-use/runtext16.ppm

「Hello World…」というメッセージが右から左へ流れながら表示されます。このメッセージは、LEDパネルの上部16行のLEDを使います。つまり、64x64や128x64のLEDパネルを使っている場合は上部1/4、64x32のLEDパネルを使っている場合は上部1/2の部分を使います。LEDパネルの表示を止めるにはTerminalでCtrl-Cしてください。

次に以下のコマンドを実行してください。

sudo ./examples-api-use/demo -D 1 --led-cols 64 --led-rows 64 ./examples-api-use/runtext.ppm

先と同じメッセージが表示されます。このメッセージは、LEDパネルの上部32行のLEDを使います。つまり、64x64や128x64のLEDパネルを使っている場合は上部1/2、64x32のLEDパネルを使っている場合はパネル全体を使います。LEDパネルの表示を止めるにはTerminalでCtrl-Cしてください。

次に以下のコマンドを実行:

sudo ./examples-api-use/demo -D 2 --led-cols 64 --led-rows 64 ./examples-api-use/runtext16.ppm

今度はメッセージが左から右へ流れながら表示されます。表示を終了するにはTerminalでCtrl-Cしてください。

これでテストは十分です。もし、もっとLEDパネルを使ってみたかったら(遊んでみたかったら)、以下のコマンドも実行してみてください。

sudo ./examples-api-use/demo -D 4 --led-cols 64 --led-rows 64

sudo ./examples-api-use/demo -D 5 --led-cols 64 --led-rows 64

sudo ./examples-api-use/demo -D 6 --led-cols 64 --led-rows 64 -m 100

sudo ./examples-api-use/demo -D 7 --led-cols 64 --led-rows 64 -m 100

sudo ./examples-api-use/demo -D 8 --led-cols 64 --led-rows 64 64 -m 100

sudo ./examples-api-use/demo -D 9 --led-cols 64 --led-rows 64 -m 100

sudo ./examples-api-use/demo -D 10 --led-cols 64 --led-rows 64 -m 100

sudo ./examples-api-use/demo -D 11 --led-cols 64 --led-rows 64

LEDパネルのテスト(第3のテスト)

LEDパネルのテストをもうひとつやる必要があります。そのための準備作業を少しやります。これまで使ってきたTerminalをそのまま使ってください。

これまで使ってきたTerminalではなく新規のTerminalを使っている場合には、まず以下のコマンドを実行してください。

cd iot-python/rpi-rgb-led-matrix

Terminalのプロンプトが以下の写真(赤線を引いてある部分)のようになっていることを確認してください。

この状態で以下のコマンドを、ひとつづつ順番に実行してください。

sudo pip3 install setuptools==58.2.0

make build-python PYTHON=$(command -v python3)

sudo make install-python PYTHON=$(command -v python3)

これが終わったら、以下コマンドを実行:

cd bindings/python/samples/

写真は省略しますが、Terminalのプロンプトに「~/iot-python/rpi-rgb-led-matrix/bindings/python/samples」と表示されていることを確認してください。そして以下コマンドを実行:

sudo python3 runtext.py --led-cols 64 --led-rows 64

右から左へ文字が流れるように表示されたら成功です。表示を終了するにはCtrl-Cしてください。

これでテストは十分です。もし、もっとLEDパネルを使ってみたかったら(遊んでみたかったら)、以下のコマンドも実行してみてください。

sudo python3 grayscale-block.py --led-cols 64 --led-rows 64

sudo python3 image-draw.py --led-cols 64 --led-rows 64

sudo python3 image-scroller.py --led-cols 64 --led-rows 64

sudo python3 pulsing-brightness.py --led-cols 64 --led-rows 64

sudo python3 pulsing-colors.py --led-cols 64 --led-rows 64

sudo python3 rotating-block-generator.py --led-cols 64 --led-rows 64

sudo python3 simple-square.py --led-cols 64 --led-rows 64

プログラミング

ここからは、LEDパネルに情報表示するプログラミング方法を説明します。LEDパネルに情報を表示するには、

という手順になります。64x64のLEDパネルを使っている場合には、64ピクセル x 64ピクセルの画像を作ります。64x32のLEDパネルを使っている場合には、64ピクセル x 32ピクセルの画像を作ります。128x64のLEDパネルを使っている場合には、128ピクセル x 64ピクセルの画像を作ります。

最初のサンプル・プログラムがimage-viewer.pyです。LEDパネルを使うプログラムを実行するにはTerminalから実行してください。他のプログラムのようにThonnyの緑の再生ボタンのようなものをクリックしても、エラーが出てプログラムを実行できません。プログラムを「iot-python」というフォルダに保存している場合には、Terminalで以下のコマンドを実行してください。

cd iot-python

そして、以下のコマンドでプログラムを実行します。

sudo python3 image-viewer.py

先頭に「sudo」を付けるのを忘れないようにしてください。「image-viewer.py」の部分を他のファイル名に変えると、他のプログラムを実行できます。

さて、image-viewer.pyの5行目から10行目までは、LEDパネルに関する設定項目です。詳細を理解する必要はないので、そういうものだと思って無視して結構です。ただし、64x32のLEDパネルを使っている場合には、7行目の

options.rows = 64

で、数字の64を32に変えてください。128x64のパネルの場合は、64を128に変えて下さい。

12行目以降では、LEDパネルに映す画像を作ります。12行目の「panel.jpg」は、その画像を(後で)保存するときのファイル名です。13、14行目で画像の横幅(ピクセル数)と縦幅(ピクセル数)を設定しています。64x32のLEDパネルを使っている場合には、14行目の

imageHeight = 64

で、数字の64を32に変えてください。128x64のパネルの場合は、64を128に変えて下さい。

16行目で、サイズが64x64(あるいは64x32)で、色(背景色)が黒の画像を作っています:

image = Image.new("RGB", (imageWidth, imageHeight), (0, 0, 0))

画像を作るには、Image.new()という関数を使い、それに3つのデータを渡します。1つめの”RGB”は、カラーの画像を作るための指定です。2つめは横幅と縦幅の指定、3つめは色(背景色)の指定です。この色指定には、RGB値を使います。Rの値、Gの値、Bの値の順です。上の例では、R、G、Bの値すべてが0となっています。つまり黒を指定しています。

色の指定に使うRGB値について少し補足します。色には(厳密にいうと「光」には)3つの根本的な色があります。赤(Red)、緑(Green)、青(Blue)です。光の三原色とよばれます。この3つを混ぜあわせると(人間が認識できるほぼ)すべての色を表現できます。このページを使って、三原色を混ぜあわせた結果がどんな色になるかを調べてみてください。

赤(Red)、緑(Green)、青(Blue)のそれぞれには、0から255までの256レベルを指定できます。この値は所定の色の「含有量」を表します。例えば、R値は「赤っぽさ」がどの程度かを表しており、最大値の255は「真っ赤」を意味します。R値が小さくなると、「赤っぽさ」が減ってだんだん暗い色になります。R値が0になると黒色になります。R、G、Bすべてが0だと黒色、R、G、Bすべてが255だと白色になります。

さてプログラムの説明に戻ります。17行目は、今作った黒い背景画像の上に文字や絵を重ねる(貼る)ための準備です。18行目は、黒い背景画像の上に文字を重ねる(貼る)時に使うフォントの指定です(デフォルトのフォントを使うように指定している)。画像を作成する時はいつも16-17行目のプログラムを使います。そういうもの(そういう決まりになっている)と思っておいてください。

プログラム的に重要なのは20行目以降です。背景画像に文字を貼るには、text()という関数を以下のように使います。

draw.text((0, 0), "29-07-22", fill=(255, 0, 0), font=font)

text()には4つのデータを渡します。

背景画像内の場所を指定するには座標を使います。画像の左上の角が原点(0, 0)になっています。そして以下の図のように、X軸は右側へ、Y軸は下へ伸びます(数学ではY軸は上へ伸びるのが普通ですが)。つまり、右側へ行けば行くほどX座標の値は大きくなり、下へ行けば行くほどY座標の値は大きくなります。

まとめると、上の例では、”29-07-22”という文字を赤くして、デフォルトのフォントを使って左上の角に貼っています。

21-23行目では、さらに追加の文字を背景画像に貼っており、最後に25行目でこの画像をファイルに保存しています。ファイル名は「panel.jpg」となります。

画像ができたら、今度はそれをLEDパネルに映します。以下のようにして

matrix = RGBMatrix(options = options)

LEDパネルを使い始める準備をします。そして、

matrix.SetImage(image)

として画像をLEDパネルに映します。以下のように表示されるはずです。

プログラムの最後の部分に、以下のような無限ループがあります。100秒スリープするのを繰り返しているだけなので、このループは何もしません。

while True:
    try:
        time.sleep(100)
    except KeyboardInterrupt:
        break

この無限ループがここにある理由は、上記の関数SetImage()を使って画像をLEDパネルに映したら、それをずっと映しっぱなしにしたいからです。SetImage()を使って画像をLEDパネルに映した後にプログラムが終了すると、LEDパネルの表示が消えてしまします。つまり、画像が映ったと思った瞬間に消えてしまいます。それを避けるために、何もしない無限ループを動かしてプログラムが終了するのを防いでいます。

次のサンプル・プログラムがimage-viewer-ttf.pyです。これは、先のプログラムimage-viewer.pyとほとんど同じですが、19、20行目でフォントの指定をしているのが新しい点です。

font1 = ImageFont.truetype("pixelmix_bold.ttf", 8)
font2 = ImageFont.truetype("pixelmix.ttf", 8)

pixelmix.ttfpixelmix_bold.ttfというファイルを(ラップトップやデスクトップのコンピュータに)ダウンロードし、そこからラズパイへコピーしてください。image-viewer-ttf.pyが置いてあるフォルダにコピーしてください。ラップトップやデスクトップからラズパイへファイルをコピーする方法はここを参照してください。

pixelmix.ttfとpixelmix_bold.ttfは、LEDパネル用の画像やピクセルアートを作る時に便利な(きれいに文字が映る)フォントです。デフォルトのフォントを使うより、少しきれいに文字が表示されると思います。他にも同類のフォントはたくさんあります(例えばここを参照)。ポイントは、字の太さが細くて、単純な描き方になっているものを使うことです。

次のサンプル・プログラムがimage-viewer-ttf-cycles.pyです。これはLEDに映す画像を2枚作り、1枚目を一定時間表示し、2枚目を一定時間表示し、また1枚目を一定時間表示し・・・という繰り返し表示をします。

このプログラムには2つの関数が定義されています。makeFirstPanelImage()とmakeSecondPanelImage()です。関数名の通り、ひとつめの関数は1枚目の画像を作り、ふたつめの関数は2枚目の画像を作ります。そして以下のような無限ループを使って、1枚目を一定時間表示し、2枚目を一定時間表示し・・・を繰り返しています。

while True:
    try:
        matrix.SetImage( makeFirstPanelImage() )
        time.sleep(panelInterval)
        matrix.SetImage( makeSecondPanelImage() )
        time.sleep(panelInterval)
    except KeyboardInterrupt:
        break

このプログラムは以下の2つの画像を繰り返し表示します。

自習プロジェクトの目次に戻る