Raspberry Pi3 B+でLED電光掲示板に動画を流してみる

Raspberry Pi 3 Model B+ で rpi-rgb-led-matrix というライブラリを使用して LED 電光掲示板(LED マトリクス)にアニメの動画(映像)を流してミニデジタルサイネージ風にしてみようという備忘録諸々…

今回は64×64のLEDパネルを2つ購入し、128×64の解像度のLEDマトリクス再生環境を構築します
こちらの記事とこちらのサイトをとても参考にさせて頂いています、ありがとうございます)
再生には rpi-rgb-led-matrix というライブラリを使い、ソフトは自作(改造)して再生させています

注意

  • 割と前にやった事も含まれているので、正確性は保証できません
    • 間違ってるーみたいなのがあればコメントまでお願いします
  • この記事通りにやって動かなくても責任は取れません、自己責任で行ってください
  • 全部買いこむと10000円は超えるのでお気をつけて…

必要なもの

※抜けてるものがあるかもしれません

  • Raspberry Pi 3 Model B+
    • 新しい機種出てたらそちらの方がいいと思います
    • 別途起動に USB 電源が必要です(私は iPad 用の充電器で代用していますが、普通に「ラズパイ用」とかで売られてる電源で良いと思います・詳細はほかをあたってください)
    • あと、基本的に(セットを除き)前述の USB 電源や USB ケーブルは入っていないので、(あると思いますが)ない場合はいつものUSB-MicroUSB変換ケーブルを買っておきましょう

  • LEDパネル(64×64のパネル(32S)を2個)
    • 他の解像度の場合、配線が違ってくる上に動画再生するにはピクセル数が少なすぎるため、これくらいをお勧めします(64×64 のパネルを 2個つなげれば 128×64 の解像度になる)
    • 基本的に何故か日本国内では売ってない(売ってても非常に高い)ので、Chinaから注文します…
    • 私はAliExpress(中国の電子部品メーカーが個人向けに卸してる製品を売ってるアリババグループのサイト)のこちらの製品を購入しました
      • この商品が一番お安いし評価も高くて良いと思います
      • 必ず32Sを注文してください、16Sのタイプだと64×32のパネルを縦にくっつけているのと変わりません
      • 他にもAliExpressで p3 64*64 とかで検索してみるといいかもです
    • どうやらLEDパネルはHUB75という業界規格に基づいて作られてるらしく、よっぽどの物でなければ別の製品でも同じような配線・ケーブルで使えるみたいです(参考・LEDドットマトリクスパネル HUB75規格について調べてみた
    • フラットケーブル(パネル間・パネル-ラズパイ間の接続ケーブル)と後述の電源ケーブルは殆どの製品が付属します(私が買った製品も付属していました・2個一緒に買うと充電ケーブルをLEDパネル2個用の充電ケーブルを添付してくれます(思ったより良心的))
    • 中国郵便で注文した所2週間以上かかったので(そもそも発送までが遅い)、出来るだけ余裕のある注文をお勧めします

ぐちゃぐちゃしていて見づらいですが、下の変換アダプタ噛ませてるケーブルがLEDパネル給電用ケーブル、奥のラズパイに接続しているケーブルがラズパイ給電用ケーブル、ラズパイからLEDパネルの方に伸びている沢山のジャンパーワイヤがLEDパネルデータ送信用ケーブルになります

  • LED 給電用
    •  給電用電源( 5V3A 以上)
      • 電流が足りないと LED 全体の画面を真っ白にした際に LED を全て光らせるだけの電力を確保できず、電力を食う緑・青の LED の輝きが弱まりオレンジっぽくなる現象が起こるので、つよつよな方はスイッチング電源かなんかを使うのが良いのでは…(わからん)
      • 以前は iPad 用の 5V2.1A の電源(と Amazon で売ってた USB-DC変換ケーブル )を使っていましたが、明らかに電流が足りなかったので、秋月電子通商にて販売している 5V4A の電源を購入しました(こちら)
        これで大分症状が改善したので、こちらを購入する事をお勧めします(もっと電流が大きいのもあるようなのでそっちでもいいかも…(あいにく当時は売り切れだった))
    • DC ジャック-スクリュー端子台変換コネクタ
      • 私は秋月電子のこちらの製品を使っています
    • 流れとしては給電用電源 → DC ジャック-スクリュー端子台変換コネクタ → 電源ケーブル( LED パネルに付属してるはず)という感じになるはずです
  • ラズパイ- LED 接続用ジャンパーワイヤ(オス-メス):最低16本以上
    • 私は秋月電子のこちらの製品を使っています(16本以上なのでこの10本セットの奴の場合は2個買えば OK のはず)
    • ただし、ケーブルが少し安っぽいせいか、接触不良で何度か抜き差ししたら何本か壊れてしまったりしたので、1個余分に買っておくことをお勧めします…
    • 後、ほかにもなんだかんだ使えるのでオス-オスの方(この製品とか)も買っておいた方が良いです
  • スピーカー
    • 同時に音も鳴らせるので、適当なスピーカー(イヤホンジャックから出力できるもの)も買っておきましょう
  • USBオーディオサウンドカード
    • rpi-rgb-led-matrix は、デフォルトでラズパイの bcm2835 サウンドモジュール(サウンドカード?)に使われている回路を使ってハードウェアパルスを生成します
    • そのため、サウンドモジュールが有効になっていると、ハードウェアパルスが生成できません
    • 一応ハードウェアパルスを使わずに再生できない事もないのですが、動画が若干ちらついたりするので、非推奨らしいです
    • そもそもラズパイ内蔵のサウンドカードは音質が悪いので、買っておいたほうが良いと思います(私はこちらの製品を購入しました)
  • (お好みで)2つのLEDパネルを固定する資材
    • 私は頻繁に持ち運ぶため結局ちょうつがいで折りたためるようにしましたが、見栄え重視ならパネルを固定して前面にアクリル板でも付けると綺麗かもしれません
  • (お好みで)ラズパイ用のディスプレイ
    • 金欠だったので買いませんでしたが、あった方が何かと便利です
    • ディスプレイを買う場合、マウスとキーボードも購入必須です
    • 私の場合、まず SSH( Windows なら Tera Term とかその辺)でラズパイに接続できる環境を用意してから、xrdp という Linux 上でリモートデスクトップを可能にするソフトを使って Windows 標準のリモートデスクトップからリモート出来るようにしています( VNC とかでもいいですがお好みで)
    • ただし、ラズパイのローカルネットワーク上の IP アドレスを調べないといけない(がこれがまた面倒)ので、リモートデスクトップのホスト側の PC に Bonjour というソフトを入れ( iTunes 入れると入ってきます)、raspberrypi.local というドメイン(ローカルネットワーク内のみで有効)でアクセスできるようにしています(リモートデスクトップの画面でraspberrypi.localと入力すると行けます・後はggって下さい(丸投げ))
  • (お好みで)LANケーブル
    • 上述の通り私はラズパイをリモートデスクトップ + SSH で運用しています
    • 家の中とか Wi-Fi が通じる環境なら全く問題がないのですが、例えばどっかに出し物に持っていく時など Wi-Fi に繋がらない(ラズパイとホストPCが同じネットワークに存在しない)場合、ラズパイと通信できないため問題です
    • スマホでテザリングする方法とかもありますが、手っ取り早くラズパイとホスト PC を LAN ケーブルで直接繋げると、ラズパイと通信できるようになります(この場合でもraspberrypi.localのドメインでリモートデスクトップ出来ます)
    • お使いの PC に LAN ケーブル端子が付いていない場合は変換端子を買っておくといいかもしれません

他にも色々あるかもしれませんが、大体これくらいだと思います…

配線

私は LED パネルとの間をフラットケーブルで接続し、余ったフラットケーブルを LED の裏側(基盤が見える方)から見て一番左側の端子に接続、もう片方の端子にジャンパーワイヤを接続するような構成としています

LED の規格について

配線の前に LED の規格について(ほぼこちらの投げ売り)ですが、
LEDパネル( 64×64 なら 4096 個)全ての LED を同時に光らせるのは現実的ではないため、
高速で LED の点灯・消灯を繰り返して、あたかも全部ついているように見せているんだそうです( LED 行先表示器をシャッタースピード 1/1000 とかで撮ると切れるのはそのため)

64×64 の LED パネルの場合、縦に64列、横が64列あるので、全部で32セクションに列を分けます(ここでの縦・横はそれぞれ縦長の列・横長の列の事です(縦・横に積まれている列ではありません(ややこしい)))

1セクションは一番上の横1列目と真ん中の横33列目、2セクションは横2列目と横34列目…と言った感じらしいです
1セクションあたりのLEDの数は横に64個 LED 並んでいるのが2列で128個あり、セクションを切り替えながら表示していくんだとか(だから実際は LED は一度に128個しか点灯していない)
R1・G1・B1 がセクション上段の1番左のピン、R2・G2・B2 がセクション下段の1番左のピンを点灯させる(同時に2つの LED 点灯を指示させることができる…?)ので、信号をあと63回送って上段64個、下段64個の LED を点灯させたら、消灯させて次のセクションを選択、点灯、消灯…を繰り返してセクションの最後まで行ったら最初のセクションに戻ってまたセクション選択、点灯、消灯…を繰り返す、
といった流れみたいです(めちゃくちゃ分かりづらい)

各ピンの役割は、

  • R1… LED の R (赤)部分を点灯させるかの信号を出す(セクション上段)
  • R2… LED の R (赤)部分を点灯させるかの信号を出す(セクション下段)
  • G1… LED の G (緑)部分を点灯させるかの信号を出す(セクション上段)
  • G2… LED の G (緑)部分を点灯させるかの信号を出す(セクション下段)
  • B1… LED の B (青)部分を点灯させるかの信号を出す(セクション上段)
  • B2… LED の B (青)部分を点灯させるかの信号を出す(セクション下段)
  • A・B・C・D・E… データを送り込むセクションの場所を決める(5Bit/32通り)
  • clock(CLK)… 信号を送信するごとのクロック(らしい)
  • strobe(LAT or STB)… これでLEDが光る・表記がLAT・STBとあるらしい
  • OE-… 画面表示有効のフラグらしい
  • GND… グランド

って感じらしい…?

ラズパイ側接続図

太字(水色背景)がジャンパ線を接続するピンです(かなりややこしいので注意・配線を間違えると変な映像しか出なくなります)
※ピンの(括弧)内はラズパイのピンの種類です
※ピン10のEですが、64×64のLEDパネルでのみ使われているピンらしく、64×32のパネルの場合は省略して問題ないとかなんとか…(わからん)

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

接続ケーブル側接続図

必ずケーブルの赤いラインが引いてある方を上にして接続して下さい!(上下逆にして接続して3日くらい詰んだことがあります)

接続ケーブルと LED パネル側の端子はピンが左右反転しています!注意してください
下の表は接続ケーブル用なので、LED パネル側の端子に直接接続させる場合は左右反転させて読み替えて下さい(別途ジャンパーワイヤ(メス―メス)が必要です)

太字がジャンパ線を接続するピンです(ほぼ全て接続します)
ピンの(括弧)内は LED パネル側のピンの種類です(何故か表記が合ってなかったりしますがこれで行けているのでおそらく大丈夫…)
また、ピンの表記は私の購入したパネルでの表記なので、例えば STB が LAT だったり、D が何故か GND になってたりしますが、そこは各自合わせて下さい…

接続先 ピン ピン 接続先
G1 1(G1) 2(R1) R1
GND 3(GND) 4(B1) B1
G2 5(G2) 6(R2) R2
E 7(E) 8(B2) B2
B 9(B) 10(A) A
D 11(GND) 12(C) C
strobe 13(LAT) 14(CLK) clock
 – 15(GND) 16(OE) OE-

写真はこちら

LEDパネル側端子

ソフトの導入

※ラズパイのセットアップは書いてたらきりがないので飛ばします

  • rpi-rgb-led-matrix(最重要ソフト・これのお陰でラズパイ上でLEDマトリクスを制御する事ができる)
    • 後述のLEDで動画を流すためのソフトはこのソフト(ライブラリ)を組み込んでビルドする
    • 他にも Python からライブラリを利用するための Python ライブラリもあるので、Python分かる方は楽しめると思います
  • Python(取りあえず入れといた方がよさげ・多分プリイン済み)
  • gcc/g++(ビルド用ソフト・多分プリイン済み)
  • make(ビルド用ソフト・多分プリイン済み)
  • git(バージョン管理ソフト・後で使う・多分プリイン済み)
  • OpenCV(動画再生ライブラリ・後述のビルドで必須)
  • SDL(音声再生ライブラリ・後述のビルドで必須)
  • ffmpeg(動画変換ソフト・LED-Movie-Convert で使用)

あたりが必要みたいです

OpenCV・SDL の導入

上記のうち、OpenCVとSDLのインストール(ビルド)にかなり難儀した(エラーでビルドが止まる)のですが、結局 apt のパッケージで入れましょうという結論に…

いつもお馴染みターミナル(または SSH )から、利用する OpenCV・SDL ライブラリを apt でインストールしておきます
(もしかすると、OpenCV 関連は OpenCV2.4 でないと動かないかもしれません・2019年4月現在では apt でインストールできる OpenCV は 2.4 のままですが、もし上手く行かない場合は適当にビルドしてください(投げやり))

おまじないとしてちゃんと

sudo apt update && sudo apt upgrade

してから、

sudo apt install libopencv-dev libsdl1.2-dev libsdl2-dev libsdl-mixer1.2-dev libsdl2-mixer-dev ffmpeg 

と実行します

rpi-rgb-led-matrix の導入

以下の通りに実行して rpi-rgb-led-matrix をダウンロード、ビルドします

cd ~/
git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
cd rpi-rgb-led-matrix
make
make install-python

ビルドには少し時間がかかります
実行すると、rpi-rgb-led-matrix は /home/pi/rpi-rgb-led-matrix/ 以下にインストールされます

ビルドが完了すると、examples-api-use ディレクトリにサンプルプログラムが色々置いてあるので、動くかテストしてみましょう

sudo ~/rpi-rgb-led-matrix/examples-api-use/demo -D 0 --led-rows=64 --led-cols=64 --led-chain=2 --led-no-hardware-pulse

これで正しく虹色の正方形がぐるぐる回転していれば正常です

他にも、公式ドキュメント(Google翻訳してます)より、

-Dで選択されたデモ
         0  - 回転する正方形
         1  - 画像を前方にスクロールする(-m <スクロール-ミリ秒>)
         2  - 画像を後方にスクロールする(-m <スクロール-ミリ秒>)
         3  - テスト画像:正方形
         4  - パルスカラー
         5  - グレースケールブロック
         6  - アーベリアン砂山モデル(-m <タイムステップ-ミリ秒>)
         7  - コンウェイの人生のゲーム(-m <タイムステップ-ミリ秒>)
         8  - ラングトンのアリ(-m <タイムステップ-ミリ秒>)
         9  - ボリュームバー(-m <タイムステップ-ミリ秒>)
         10 - 色の進化(-m <タイムステップ-ミリ秒>)
         11 - 輝度パルス発生器

のようなデモがあるので、色々遊んでみましょう
翻訳しても意味がちょっとよくわかりませんが、やってみれば大体分かるはず…
(1・2番はコマンドの末尾に ~/rpi-rgb-led-matrix/examples-api-use/runtext.ppm (流す用のデータが入っているファイル)を設定する必要があります)

  • 全く LED が点かない
  • 一部が欠ける
  • よくわかんない乱れた映像が流れる

場合はほぼ100%配線を間違えているので、配線をやり直しましょう
ちゃんと表示された事を確認して、本番のLEDパネルでの動画再生ソフトのビルドへ移ります

LED-Movie-Player の導入

LED-Movie-Player は、こちらの記事に書かれていたコードを元に、ループ再生や詳細なオプションを指定出来るようにして実用に堪えるように改造した RaspberryPi 上で LED マトリクスパネルに動画を流す事が出来る CUI アプリケーションです
色々面倒なので GitHub に置いておきます(元が C++ だったので C++ で書きましたが他の言語より数倍難しかったです…)
適当に GitHub から clone してください

git clone https://github.com/tsukumijima/LED-Movie-Player

その後、submodule を init してからビルドします(追記: submodule init しないといけないの忘れてました…すみません…)
ビルド途中でエラーが出た場合、ライブラリのインストールに失敗している可能性が高いです…

cd LED-Movie-Player
git submodule init
make && sudo make install

sudo make install を実行すると LED-Movie-Player と LED-Movie-Convert がパスの通った場所にインストールされますが、実行権限が付与されていないことがあるので、

sudo chmod 755 /usr/local/bin/led-movie-player
sudo chmod 755 /usr/local/bin/led-movie-convert

と実行し、LED-Movie-Player と LED-Movie-Convert に実行権限を付与しておきましょう

ラズパイのデフォルトサウンドカードを無効にする

前述の通り、rpi-rgb-led-matrix(と LED-Movie-Player )では、ラズパイの bcm2835 内蔵サウンドカードを無効化し、USBサウンドカードを使う事が推奨されます
ただUSBサウンドカードをラズパイに刺しただけでは無効化されないので、一部設定を行う必要があります

sudo nano /boot/config.txt

/boot/config.txt を開き、dtparam=audio=on の箇所を dtparam=audio=off に書き換えます
さらに

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

sudo update-initramfs -u

と実行し、bcm2835 サウンドカードを無効化します
次に、

cd ~
sudo nano /usr/share/alsa/alsa.conf

と実行し、Alsa の設定ファイルを編集します

defaults.ctl.card 0
defaults.pcm.card 0

の箇所を

defaults.ctl.card 1
defaults.pcm.card 1

に書き換え、

sudo reboot

最後に再起動します
これで、ハードウェアパルスを使えるようになるはずです
もし後述する LED-Movie-Player での再生時にエラーが出る場合は、led-movie-player.cc 内の

options.disable_hardware_pulsing = false;

の箇所を、

options.disable_hardware_pulsing = true;

にして、

make && sudo make install

と実行してビルドし、一度ハードウェアパルスを使わないモードで再生できるか確認してみて下さい

余談

先程のデモのコマンドにあった –led-no-hardware-pulse ですが、ハードウェアパルスが使えるようになったので

sudo ~/rpi-rgb-led-matrix/examples-api-use/demo -D 0 --led-rows=64 --led-cols=64 --led-chain=2

のように取ってしまっても構いません
–led-no-hardware-pulse を付けない方がちらつきがなく綺麗に描画されます

 LED パネルで動画を再生する

動画を変換する

詳しくは LED-Movie-Player の README を読んでいただきたいのですが、LED パネルで動画を再生する場合、予め指定のフォーマットにした .mp4 形式・.mp3形式のファイルを用意する必要があります
ffmpeg で変換するのが楽ですが、それでも手順としては少し面倒です

LED-Movie-Player に同梱されている LED-Movie-Convert というバッチファイルを使うと、YouTube 等の動画サイトの URL かローカルのファイルのパスを入力するだけで、自動で指定フォーマットへのエンコードと /home/pi/movieplayer/ への配置を行う事ができます

例えば、YouTube等の動画を LED 用に変換するなら、

led-movie-convert (動画のURL) download auto false

とすれば一発でできます (最後の false を true にすると彩度とコントラストを上げて変換します・アニメとかは彩度上げたほうが綺麗に写ります)

led-movie-convert (動画のURL) download "Nantoka_DOUGA" false

第三引数が auto の場合、動画のタイトルを自動でファイル名にします、auto の部分を拡張子なしファイル名にするとそのファイル名で変換・保存されます

ローカルのファイルを変換する場合は、

led-movie-convert /home/pi/test.mp4 file auto false

としてください

led-movie-convert /home/pi/test.mp4 file "Nantoka_DOUGA" false

第三引数が auto の場合、元ファイルのファイル名を自動でファイル名にします、auto の部分を拡張子なしファイル名にするとそのファイル名で変換・保存されます

変換した動画を再生する

sudo led-movie-player "[先程変換したファイルの拡張子なしファイル名]"

と実行すると、LED パネルで動画が再生出来るはずです(最初やったときは感動しました…)

sudo led-movie-player "[先程変換したファイルの拡張子なしファイル名]" 0

と実行すると、動画を無限ループで再生します

sudo led-movie-player "[先程変換したファイルの拡張子なしファイル名]" [ループ回数]

と実行すると、動画をループさせて再生します

sudo led-movie-player "[先程変換したファイルの拡張子なしファイル名]" 0 [LEDパネルの横のピクセル数] [LEDパネルの縦のピクセル数] [LEDパネルの直列接続数] [LEDパネルの並列接続数] 

と実行すると、パネルのサイズを個別に指定できます

また、ハードウェアパルスを有効にしてUSBサウンドカードから音声を再生している場合、

ALSA lib pcm.c:8306:(snd_pcm_recover) underrun occurred

のようなエラーが出ることがありますが、普通に再生出来ているので大丈夫だと思います(原因は不明・どうも Alsa が若干処理に失敗した時に出るらしい(音飛びもしないし何が悪いのだろうか))

あとがき

ちゃんと動画は再生できたでしょうか…?
rpi-rgb-led-matrix には他にも面白いデモソフトが色々入っているので、これ以外にも色々あそべると思います

日本語の情報がない中かなり試行錯誤してかなり大変でした…
この記事が誰かの役に立てば幸いです(何ヶ月も放置していると手順を忘れるので備忘録が主ですが…)

コメント

  1. この記事を参考にさせていただき無事動画を再生させることができました
    ありがとう御座います
    その過程でいくつかエラーが出たので
    解決した方法を一応載せておきます。
    LED-Movie-Player の導入
    自分はここで
    cd LED-Movie-Player
    make && sudo make install
    をしたときにled-matrix.hがないというエラーが出ました。
    解決策としての/home/pi/rpi-rgb-led-matrix/includeの中身を/home/pi/LED-Movie-Playerにぶち込みました。
    次にエラーが出たのは
    led-movie-convert (動画のURL) download auto false
    を実行したときに権限がありませんと出ました
    解決策としてsudo をつけて実行してみるも失敗
    そこでsudo su rootで権限を付与しchmod 777 /usr/local/bin/led-movie-convertで
    パーミッション変更をすることで解決しました
    ついでにled-movie-playerもパーミッションを変更しました
    ちなみに私はUSBサウンドカードを買っていなかったので
    記事にある
    options.disable_hardware_pulsing = false;
    の箇所を、
    options.disable_hardware_pulsing = true;
    にして、
    make && sudo make install
    で無事再生できました。

    長文失礼しました
    改めて素晴らしいソフトを作ってくださった主に感謝申し上げます
    ありがとうございます。

    • いえいえ、ちゃんと再生できたようで何よりです…(他の環境で動くかどうか心配でした…)
      私は Qiita に貼ってあったプログラムをループ対応させただけなので大したことはしてません…(私だけではまず無理でした)
      led-matrix.hがないエラーはおそらく LED-Movie-Player で使っている submodule (rpi-rgb-led-matrix) がダウンロードできていないことによるものです(記事に書くのをすっかり失念していました…)
      led-movie-player ディレクトリに移動したあと、git submodule init と実行すると submodule がダウンロードされるので、正常にビルドできるようになるはずです。
      実行権限の件についても書き忘れていました… 追記しておきます…