ラズパイ3でRGBマトリクスLED(16×32)を輝かせて遊ぶ話

#プロローグ～クリスマスといえば？～
この記事は[リンク情報システム](https://www.lis.co.jp/)の2018年アドベントカレンダーのリレー記事です。
engineer.hanzomon の~~選ばれし~~グループメンバによってリレーされます。
（リンク情報システムのFacebookは[コチラ](https://www.facebook.com/lis.co.jp/)から）

……現在実施中のアドベントカレンダーですが、本日はその16日目でございます。
\ｺﾝﾆﾁﾜ/

突然ですが、クリスマスといえば皆さんは何を思い浮かべますか？
筆者は、「夜の街に彩りを与えてくれるカラフルなイルミネーション」と、
「みんなでテーブルを囲って食べるクリスマスケーキ」を思い浮かべます。

本日の記事は「16×32のRGBマトリクスLED」と
「Raspberry Pi 3(通称ラズパイ3)」を使って、
街中のイルミネーションとクリスマスケーキのような
キラキラと輝きつつ、ふんわり柔らかい記事に仕上げました。

それでは筆者の@t_slash_kが送るアドベント16日目の記事、いよいよはじまります。

#RGBマトリクスLEDとは
本記事のタイトルを見て、「“RGBマトリクスLED”って何？？」と思った方も多いと思います。
簡単に言えば「あらゆる色を出せる電光掲示板」なのですが、~~これではあまりにも雑すぎるし~~箇条書きでもう少し詳しく解説します。
・マトリクスLEDは一般的に電光掲示板と呼ばれており、各ドットを1つのLEDで表現する仕組みとなっている
・RGBは色の表現法の1種。赤(Red)、緑(Green)、青(Blue)の3原色の光を混ぜて様々な色の光を再現する
　→「光の3原色」

……要するに、「あらゆる色を出せる電光掲示板」なのです。~~回りくどくてごめんなさい。~~



近年では鉄道駅の発車標や自動改札、列車の方向幕、屋外の巨大デジタルサイネージなど街中の様々な場面で使われています。

![IMG_8395.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/034c661b-bf3f-9bf7-22ce-fd62a980a57e.jpeg)
↑
駅の発車標での使用例
(12月5日に筆者@t_slash_kがJR新宿駅にて撮影)

![IMG_8394.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/65718552-6038-96c7-37ea-af791aa67db1.jpeg)
↑
列車の方向幕での使用例(山手線の新型車両E235系0番台)
(12月5日に筆者@t_slash_kがJR新宿駅にて撮影)

#用意／使用したもの
・Raspberry Pi 3 Model B(本体、及び設定に必要な機器)
　→OSをインストールするmicroSCカード(8GB以上)は必須。その他の機器類は後述
・RGBマトリクスLED(16×32)
・↑上記2つを動かすためのDC5Vの電源(共に2A以上が望ましい)
・たくさんのジャンプワイヤ(50本あれば普通に足りると思う)

……こんだけあれば十分です。筆者の場合はこれらに加えて
・端子台(RGBマトリクスLEDの電源を繋ぐ)
・ブレッドボード
・DCジャック
を用意しました。上記3パーツは必要に応じて用意するといいかも。
#Raspberry Pi 3の設定
ラズパイを動かすにはまずRaspbianをインストールする必要があるのですが、この方法についてはお近くの書店やネットの海にごろごろ転がっているためここでは割愛します。代わりに、筆者が実感したこの工程でのポイントをざっくりと以下に箇条書きで列挙します。
・ラズパイの設定にあたり、USB接続のキーボードとマウスが必要。これをラズパイのUSB端子に繋ぐことで、コマンド等の入力をおこなう。
・ラズパイとモニターをHDMIケーブルで繋ぐ必要があるが、ノートパソコンはモニターにできない。筆者は液晶テレビをモニターとして使った。
・本記事では日本語入力を扱うため、日本語入力及び日本語設定を忘れずにおこなうこと。これらの方法もお近くの書店やネットの海にごろごろ転がっているためここでは割愛。
#準備
###電源～マトリクスLED間の配線
マトリクスLEDを買ったとき、同梱で接続用のケーブルが2種類(電源用とI/O延長用)一緒についてきたと思います。
下図のようにマトリクスLEDの電源用の赤黒ペアのケーブルの両端をマトリクスLED及び電源に繋いでいきます。
この際、電源の(+)(-)に注意！電源にACアダプタを使っている場合は、
ACアダプタの規格も関係し、この規格によって(+)(-)の向きも変化してくるため尚更です。
![IMG_8407.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/e4d79e44-e894-b48e-d942-779a4817641d.jpeg)



###マトリクスLED～ラズパイ間の配線
ジャンプワイヤを使ってマトリクスLEDとラズパイを接続するのですが、**実はこの作業が本記事最大の難所だったりします。**
後工程でダウンロードする制御ライブラリに配線図の記載があったため、
↓↓こちらのサイト↓↓
(https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md)
をベースとして記述します。
マトリクスLEDのピン配置図及びラズパイ～マトリクスLEDのピン対応図を上記サイトから抜き出すと下図のようになります(マトリクスLEDが1枚の場合)。
![pin配置図.png](https://qiita-image-store.s3.amazonaws.com/0/317905/6f180183-da2c-ec05-b4a8-c1e0b8ea36cb.png)

#####配線のポイント
上記工程が終わったら、あとは配線図の通りに配線をしていくだけです。しかし、**その工程が大変**なため、ここでも筆者が実感した本工程でのポイントを下記に箇条書きで列挙します。
・マトリクスLEDのピンは両端に2つついている(IN/OUT)が、**ラズパイと接続する端子はIN側。**間違えないように注意！
・ラズパイピンもマトリクスLEDのピンもオス端子であるため、メス―メスのジャンプワイヤを使えば1番楽。~~そんなことも知らない~~筆者はメス―メスのジャンプワイヤを買っていなかったため、オス―メスピンとブレッドボードでなんとかした(↓)。
![IMG_8358.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/9ddba0f2-3bfc-53a2-e8b1-3716a63066bd.jpeg)



###制御ライブラリの導入
ソフトウェアの準備として、マトリクスLEDをラズパイで制御するためのライブラリを導入します。
今回は↓こちら↓の制御ライブラリを使用しました。
https://github.com/hzeller/rpi-rgb-led-matrix　
####インストール方法
ラズパイのターミナルを開き、
コマンドでラズパイ上にビルドします。
早速、下記のコマンドをターミナル上に入力して、
まずは制御ライブラリを入手しましょう。

```
(pi@raspberrypi:~ $)
git clone https://github.com/hzeller/rpi-rgb-led-matrix/
```

下記コマンドで、入手した制御ライブラリをビルドします。

```
(pi@raspberrypi:~ $)
cd rpi-rgb-led-matrix
make -C examples-api-use
```

pythonを使用できるようにするコマンドを下記に示します。
本記事では下記のコマンドは実行しなくても構いませんが、機能の拡張をしたい場合は実行します。

```
(pi@raspberrypi:~ $)
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)
```

#そして実行(点灯)へ・・・！
ここまでの準備がすべて完了したら、いよいよ、
待ちに待ったイルミネーション(マトリクスLED)の点灯です……！
楽しみでワクワクが止まりません……！
###デモシナリオの実行
まずはrpi-rgb-led-matrixのディレクトリで下記コマンドを実行します。

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $)
sudo examples-api-use/demo
```
すると、下記のようなオプション画面が出てきます。

```
pi@raspberrypi:~/rpi-rgb-led-matrix $ sudo  examples-api-use/demo
Expected required option -D <demo>
usage: examples-api-use/demo <options> -D <demo-nr> [optional parameter]
Options:
	-D <demo-nr>              : Always needs to be set
	-t <seconds>              : Run for these number of seconds, then exit.
	--led-gpio-mapping=<name> : Name of GPIO mapping used. Default "regular"
	--led-rows=<rows>         : Panel rows. Typically 8, 16, 32 or 64. (Default: 32).
	--led-cols=<cols>         : Panel columns. Typically 32 or 64. (Default: 32).
	--led-chain=<chained>     : Number of daisy-chained panels. (Default: 1).
	--led-parallel=<parallel> : Parallel chains. range=1..3 (Default: 1).
	--led-multiplexing=<0..9> : Mux type: 0=direct; 1=Stripe; 2=Checkered; 3=Spiral; 4=ZStripe; 5=ZnMirrorZStripe; 6=coreman; 7=Kaler2Scan; 8=ZStripeUneven; 9=P10-128x4-Z (Default: 0)
	--led-pixel-mapper        : Semicolon-separated list of pixel-mappers to arrange pixels.
	                            Optional params after a colon e.g. "U-mapper;Rotate:90"
	                            Available: "Rotate", "U-mapper". Default: ""
	--led-pwm-bits=<1..11>    : PWM bits (Default: 11).
	--led-brightness=<percent>: Brightness in percent (Default: 100).
	--led-scan-mode=<0..1>    : 0 = progressive; 1 = interlaced (Default: 0).
	--led-row-addr-type=<0..2>: 0 = default; 1 = AB-addressed panels; 2 = direct row select(Default: 0).
	--led-show-refresh        : Show refresh rate.
	--led-inverse             : Switch if your matrix has inverse colors on.
	--led-rgb-sequence        : Switch if your matrix has led colors swapped (Default: "RGB")
	--led-pwm-lsb-nanoseconds : PWM Nanoseconds for LSB (Default: 130)
	--led-pwm-dither-bits=<0..2> : Time dithering of lower bits (Default: 0)
	--led-no-hardware-pulse   : Don't use hardware pin-pulse generation.
	--led-slowdown-gpio=<0..2>: Slowdown GPIO. Needed for faster Pis/slower panels (Default: 1).
	--led-daemon              : Make the process run in the background as daemon.
	--led-no-drop-privs       : Don't drop privileges from 'root' after initializing the hardware.
Demos, choosen with -D
	0  - some rotating square
	1  - forward scrolling an image (-m <scroll-ms>)
	2  - backward scrolling an image (-m <scroll-ms>)
	3  - test image: a square
	4  - Pulsing color
	5  - Grayscale Block
	6  - Abelian sandpile model (-m <time-step-ms>)
	7  - Conway's game of life (-m <time-step-ms>)
	8  - Langton's ant (-m <time-step-ms>)
	9  - Volume bars (-m <time-step-ms>)
	10 - Evolution of color (-m <time-step-ms>)
	11 - Brightness pulse generator
Example:
	examples-api-use/demo -t 10 -D 1 runtext.ppm
Scrolls the runtext for 10 seconds

```
####・デモシナリオ0番(回転する四角形)
下記コマンドを実行します。

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $)
sudo  examples-api-use/demo --led-no-hardware-pulse --led-rows=16 --led-cols=32 -D 0
```


実行すると、真ん中でカラフルな正方形がくるくると回転します。実に綺麗だ……
![IPAD3058.GIF](https://qiita-image-store.s3.amazonaws.com/0/317905/0f8bb8fe-bf80-fea7-1a24-eb1b6fd2af3a.gif)

####・デモシナリオ1番(イメージスクロール)
下記コマンドを実行します。

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $)
sudo  examples-api-use/demo --led-no-hardware-pulse --led-rows=16 --led-cols=32 -D 1 -m 20  /home/pi/rpi-rgb-led-matrix/examples-api-use/runtext16.ppm
```

実行すると↓↓こんな感じ↓↓　「Hello World！」
![PNCY7213.GIF](https://qiita-image-store.s3.amazonaws.com/0/317905/768a9ffb-1f52-0304-b873-300cc4830e27.gif)

####・時計表示
ラズパイの時刻を表示します。
例として、下記に2種類のコマンドを挙げます。
#####コマンド例1

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $)
 sudo  examples-api-use/clock --led-no-hardware-pulse --led-rows=16 --led-cols=32 -f ./fonts/helvR12.bdf -C 47,217,122
```

#####コマンド例1の場合の時刻表示
![IMG_8363.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/b21496ab-2857-b0c4-2593-264ea6ba00b6.jpeg)


#####コマンド例2

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $) 
sudo  examples-api-use/clock --led-no-hardware-pulse --led-rows=16 --led-cols=32 -f ./fonts/6x13B.bdf -C 24,107,250 -d "%H:%M"
```

#####コマンド例2の場合の時刻表示
![IMG_8370.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/aa189760-88f5-b20e-c236-b7be581c19a6.jpeg)


……時刻の色とフォントが違いますが、この2つは下記の箇条書きした部分をいじることで変更ができます。これは後述の「テキスト表示」や「テキストスクロール」などでも共通となっています。
・フォント:コマンド内の「-f」のパラメータで指定
・色:コマンド内の「-C」のパラメータで指定。「R,G,B」の値をそれぞれ0～255で指定

この2種類のコマンドの違いはもう1つ、「表示範囲を明示的に指定しているか」です。
コマンド例1では何も指定していないが、コマンド例2では色を指定した後に「-d "%H:%M"」とコマンドを打つことで「時：分」まで表示することを明示的に指定しています。
この「-d」のパラメータの指定を変更し、「-d "%H:%M:%S"」と入力すると、秒単位での時刻表示が可能になります。
しかし、今回使用した16×32マトリクスLEDでは表示が収まりきらなかったため画像は割愛します。

####・テキスト表示
指定したテキストを表示します。
早速、下記コマンドを実行します。

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $) 
sudo  examples-api-use/text-example --led-no-hardware-pulse --led-rows=16 --led-cols=32 -f ./fonts/helvR12.bdf -C 247,107,25
Enter lines. Full screen or empty line clears screen.
Supports UTF-8. CTRL-D for exit.
LIS
```

実行結果は↓↓こんな感じ↓↓
![IMG_8362.JPG](https://qiita-image-store.s3.amazonaws.com/0/317905/db3e7c24-8e14-13d8-d18c-be71057b05d0.jpeg)



####・テキストのスクロール
指定したテキストをスクロール表示します。
早速、下記コマンドを実行します。

```
(pi@raspberrypi:~/rpi-rgb-led-matrix $)
sudo  examples-api-use/scrolling-text-exple --led-no-hardware-pulse --led-rows=16 --led-cols=32 -s 4 -f ./fonts/helvR12.bdf -C 102,179,22 LIS Advent Calendar 2018 Day 16
```

実行結果は↓↓こんな感じ↓↓
![EVBV1691.GIF](https://qiita-image-store.s3.amazonaws.com/0/317905/8f740a2d-0b00-8b4b-fa58-361c6625c7d3.gif)

なお、先程の「テキスト表示」「テキストスクロール」は日本語文字に対応していません。日本語を出力したい場合はimagemagickというソフトで日本語のテキストを画像変換して、画像のスクロールを実行します。


#エピローグ～感想～
ここまでいろいろ紹介してきたが、どれもキラキラと輝いててきれい！~~筆者もあんな風に輝きたい！~~
今回紹介した動作は制御ライブラリ全体ではほんの一部で、他にも音量バーみたいな表示や色が脈を打つイルミネーションなども簡単にできます。
また、これを応用して「天気予報やニュースをマトリクスLEDに流す」といった事をしている方や、「列車の方向幕を再現する」といった事をしている方もいました。マトリクスLEDの応用は多岐に渡るんだなぁ…………凄い。筆者も何か作りたい…………！

……………そういえば、クリスマスまであと1週間余りです。クリスマスといえば、プレゼントも楽しみですね。
イルミネーションからメッセージボードまで使い道は様々！RGBマトリクスLED！フルカラーの電光掲示板！
一家に一台、クリスマスプレゼントに是非…………オススメです。

(P.S.)
今回のアドベントカレンダーですが、[8日目](https://qiita.com/k-tsukamoto/items/9c7466688d84fcd7da2e)と[10日目](https://qiita.com/jaguti/items/be36b6a4f0260be2d044)の記事は筆者の同期が執筆しています。
また、明日の記事も筆者の同期である@120600mah さんが執筆します。
そちらも併せてご覧ください。