Raspberry PiでP3 RGB LED Matrix Display 64×32 を動かすまで

こちらを動かしてみたのでメモしておきます。

P3 RGBピクセルパネルHDビデオディスプレイ64×32ドットマトリックスSMD LEDディスプレイモジュール192×96mm

届いた製品内容

ディスプレイ本体。サイズは商品名にもある通り192×96mmです。

ディスプレイの電源用の赤と黒のコード、I/O延長用のケーブル、ディスプレイの裏にねじ込めるマグネットが付属しています。

電源

色々見ていると安定して動かすには 5V 2A程度は必要そうでした。ちょうど手元にあったAnker Astro E5という充電器が5V 3Aだったので、これを利用することにしました。こちらは古いのでもう売ってないですが、Amazonで探せばもっと最新の良いのが出てるはずです。これでコンセント無いところでもディスプレイ映せます。

f:id:yomon8:20180904141446j:plain

そのあたりに転がっているだろうUSBケーブルを切ると、赤黒緑白の線が出てくると思うので、その中の赤と黒の線を付属の電源コードにはんだ付けして使ってます。

配線図

こちらのライブラリにある手順を利用させていただきます。

github.com

詳しくはこちらに記載されています。

https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md

ポイントだけ抜き出すと、パネル側のこちらの写真と、

https://raw.githubusercontent.com/hzeller/rpi-rgb-led-matrix/6e44e8c6c2571cd81609047cdd90c871ed9d4adc/img/idc-hub75-connector.jpg

Raspberry Pi側はこちらより引用した以下の図、から😄マークを見ながら配線することになります。

特に上の写真は方向間違いやすいので気をつけてください。

f:id:yomon8:20180904142341p:plain

わかりやすく、😄の部分を抜き出すとこうなります。

Connection Pin Pin Connection
- 1 2 -
- 3 4 -
- 5 6 GND
strobe 7 8 -
GND 9 10 E
clock 11 12 OE-
G1 13 14 GND
A 15 16 B
- 17 18 C
B2 19 20 GND
G2 21 22 D
R1 23 24 R2
GND 25 26 B1
- 27 28 -
- 29 30 GND
- 31 32 -
- 33 34 GND
- 35 36 -
- 37 38 -
GND 39 40 -

ライブラリのデモプログラムビルド

引き続きこちらのライブラリ利用します。

github.com

Raspberry Pi上でビルドします。  

$ git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
$ cd rpi-rgb-led-matrix/
$ make -C examples-api-use

デモプログラム実行

DEMOプログラムのオプションは以下の通り。デモシナリオが複数用意されているのがわかります。

$ 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番動かしてみたところです。

$ sudo examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-cols=64 -D0

f:id:yomon8:20180904152635g:plain

以下のコマンドで複数シナリオ順番に動かしてみた動画です。

$ for i in $(seq 5 11);do sudo examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-cols=64 -t4 -D${i};done

youtu.be

他にも時計表示できるデモプログラムの clock や、テキスト表示できる text-example なんかが用意されているので、この辺りを応用するだけで色々なことができそうです。

$ sudo ./examples-api-use/text-example --led-no-hardware-pulse  --led-rows=32 --led-cols=64 -f ./fonts/6x13.bdf -y 8 -x 2 -B 17,35,61 -C 247,249,252
Enter lines. Full screen or empty line clears screen.
Supports UTF-8. CTRL-D for exit.
YOMON8.NET

C++苦手な人でも、C、Python、Node.js、Golang、Rustなど、他の言語のバインディングが存在しているので利用させてもらう手もありかと思います。

https://github.com/hzeller/rpi-rgb-led-matrix#api

大変ありがたい。