Raspberry Piで電光掲示板を作る
新幹線などに乗ったとき、こんな表示を見たことがありませんか?
御存知、「電光掲示板」です。
もちろん、画像のものは、新幹線車両専用に設計されたものですが、電子工作でもこの電光掲示板を作る事ができます。
この記事では、Raspberry Piを使って、電光掲示板を作成してみます。
Raspberry Pi 電光掲示板で検索すると、色々参考になるサイトが出て来ます。
この後の部品や接続については、こちらのサイトを参考にしました。
目次
電光掲示板に必要な部品
電光掲示板の正体は、フルカラーのLEDを縦横に並べたものです。
「LEDマトリクス」で検索すると部品として売られています。
こちらの製品は、縦方向に32個、横方向に64個のフルカラーLEDが並んだものなので、2048個のLEDを使用している事になります。
このLEDマトリクスを点灯させるためには、直流5Vの電力が必要です。
一枚程度なら、使っていないスマホの充電器をバラしたりすれば確保できますが、二枚以上使うのであれば、専用電源も用意した方が良いです。
Raspberry Piは、Raspberry Pi3b+を使用しました。
他に細かい部品としては、LEDマトリックスの制御信号が16ピンのフラットケーブルでやりとりされる為、このようなピンがついています。
Raspberry PiのGPIOと、このフラットケーブルを接続する為の幾つかの部品を購入しました。
あとは、電源とコンセントを繋ぐのに、ホームセンターで電灯線と電源プラグを購入してあります。
Raspberry PiとLEDマトリックスを接続する
まず、LEDマトリクスのピンヘッダと、Raspberry PiのGPIOを接続する必要があります。
接続を図にすると、このようになります。
ちなみにこれはピンボックスを上から見た図なので、ジャンプワイヤなどで繋ぐ場合は、反転させる必要があります。
最初、ジャンプワイヤでやってうまくいかなかったので、思い切って上記のボックスタイププラグ、Raspberry Pi用ユニバーサル基板、ラズパイ用スタッキングコネクタを用いて、このような治具を作成しました。
Raspberry Pi用ユニバーサル基板は、ピン横のホールが夫々のピンと繋がっているため、接続図の指定ホールからピンボックスに結線してハンダ付けしました。
この自作パーツをRaspberry PiのGPIOに挿し、リボンケーブルを結線すればOKです。
電源の方は、ネジで固定するタイプなので、家庭用の電灯線と、LEDマトリックスに付属のケーブルをネジ止めします。
テスターで計ったところ、わたしの購入した電源は調整なしにピッタリ5Vでした。
次に、LEDマトリックスに電源を繋ぎ、Raspberry Piの信号線を接続します。
わたしのは、プラグが少し固かったです。破損しないよう注意が必要です。
LEDマトリックスの制御ライブラリをインストールする
ハード面が準備できたので、LEDマトリックスの制御ライブラリをインストールします。
制御ライブラリは、Gitにて公開されているので、Raspberry Piの適当なディレクトリにダウンロードします。
通常、Raspberry Pi はpiユーザーがデフォルトなので、piユーザーのhomeディレクトリにダウンロードしましょう。
$ cd $HOME ← 今のユーザーのホームディレクトリに移動する
$ git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
これにより、homeディレクトリには rpi-rgb-led-matrix というディレクトリが出来ているはずなので、そちらに移動し、ビルドします。
$ cd rpi-rgb-led-matrix
$ make -C examples-api-use
これでLEDマトリックスを制御するライブラリが組み込まれた事になります。
ライブラリには、デモプログラムが入っているため実行してみましょう。
デモプログラムは、できあがった rpi-rgb-led-matrix ディレクトの下位ディレクトリ examples-api-use に入っています。
$ sudo ./rpi-rgb-led-matrix/examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-cols=64 -D 0
このデモプログラムは四角形がクルクル回転します。
あれれ? おっかしいぞ~
まず、こういった場合、結線を確認しましょう。
ネットの情報の中で、結線図のDの位置が空欄のものがありました。
わたしも自作の治具の結線で怪しいものが1本ありました。
また、Raspberry Piは、既に最初の型からかなり進化し、現在は3Bや4と付いている通り、第三世代、第四世代になっています。
処理速度が上がった結果、GPIOから出る信号も早くなり、マトリクス側が処理仕切れないという場合があるようです。
この場合、–led-slowdown-gpio というGPIOを遅くするパラメータを指定します。
Raspberry Pi3b+ではこの値に2以上。Raspberry Pi4の場合、4を指定する必要があるようです。
$ sudo ./rpi-rgb-led-matrix/examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-cols=64 --led-slowdown-gpio=2 -D 0
無事、デモが表示されたので、Raspberry Piにインストールしたライブラリも、LEDマトリックスとの結線も正常という事になります。
複数枚のLEDマトリックスを繋ぐ
縦32ドット、横64ドットは近くで見るとけっこう迫力がありますが、さらに縦横に繋いで大きな表示にする事ができます。
まずは、2枚のLEDマトリックスパネルを、横に繋いでみましょう。
接続は簡単で、Raspberry Piに繋がっているパネルのDATA_OUTと、追加するパネルのDATA_INを付属のリボンケーブルで繋ぎます。
電源からのプラグも、1枚目と同じように挿してください。
先ほどのデモプログラムで、今度はより電光掲示板らしいものを流してみましょう。
$ sudo ./rpi-rgb-led-matrix/examples-api-use/demo --led-no-hardware-pulse --led-rows=32 --led-chain=2 --led-cols=64 --led-slowdown-gpio=2 -D 1 ./rpi-rgb-led-matrix/examples-api-use/runtext.ppm
2枚を繋げた事により、–led-chain=2 と、2枚が繋がっている事を指定しています。
すると、このように2枚のLEDマトリックスを絵や文字列が流れていきます。
大分、電光掲示板らしくなってきました。
日本語が流れるようにする
動いたり、アルファベットが流れるのは判ったので、日本語が流れるようにしてみます。
使用するのは、デモと同じ場所にある scrolling-text-example というプログラムです。
使い方を説明します。/home/pi/rpi-rgb-led-matrix/examples-api-use/scrolling-text-example [options] <text>
テキストを取り込み、速度でスクロールさせる -s
オプション
-s <speed> : 1秒あたりのおおよその文字数です。(スクロールしない場合は0)
-l <loop-count> : テキストを何回ループさせるか。-1でエンドレス(デフォルト)
-f <font-file> : 指定されたフォントを使用します。
-x <x-origin> : テキストを表示する X-Origin (デフォルト: 0)
-y <y-origin> : テキストを表示するY原点 (デフォルト: 0)
-t <track=spacing>: 文字の間隔ピクセル(デフォルト: 0)
-C <r,g,b> :文字色。デフォルト255,255,0
-B <r,g,b> : 背景色。デフォルトは0,0,0
--led-gpio-mapping=<name> : 使用するGPIOマッピングの名前です。デフォルトは "regular"
--led-rows=<rows> : パネル行数です。通常、8、16、32、64です。(デフォルトは32).
--led-cols=<cols> : パネルカラム。通常32または64。(デフォルト: 32).
--led-chain=<chained> : デイジーチェーン接続されたパネルの数です.(デフォルト: 1).
--led-parallel=<parallel> : パラレルチェーン。
--led-multiplexing=<0..18> : Muxタイプ。0=direct、1=Stripe、2=Checkered、3=Spiral、4=ZStripe、5=ZnMirrorZStripe、6=coreman、7=Kaler2Scan、8=ZStripeUnven、9=P10-128x4-Z、10=QiangLiQ8、11=InversedZStripe。12=P10Outdoor1R1G1-1; 13=P10Outdoor1R1G1-2; 14=P10Outdoor1R1G1-3; 15=P10CoremanMapper; 16=P8Outdoor1R1G1; 17=FlippedStripe; 18=P10Outdoor32x16HalfScan (Default.XXX) 0)
--led-pixel-mapper : ピクセルを配置するためのピクセルマッパーのセミコロン区切りのリストです。
コロンの後にオプションのパラメータを付ける 例: "U-mapper;Rotate:90"
利用可能です。"Mirror"、"Rotate"、"U-mapper"、"V-mapper". デフォルト: ""
--led-pwm-bits=<1..11> : PWMビット(初期値:11)です。
--led-brightness=<percent> : 輝度(%)(デフォルト:100)。
--led-scan-mode=<0..1> : 0 = プログレッシブ、1 = インターレース (デフォルト: 0).
--led-row-addr-type=<0..4>: 0 = デフォルト、1 = ABアドレスのパネル、2 = ダイレクトローセレクト、3 = ABCアドレスのパネル、4 = ABC Shift + DEダイレクト(デフォルト: 0)です。
--led-show-refresh : リフレッシュレートを表示します。
--led-limit-refresh=<Hz> : リフレッシュレートをこの周波数(Hz)に制限します。リフレッシュ速度を一定に保つのに有効です。
負荷のかかるシステムで一定のリフレッシュ・レートを実現します。0=制限なし。デフォルト: 0
--led-inverse : マトリックスに逆色があるかどうかを切り替えます。
--led-rgb-sequence : マトリックスのLEDの色を入れ替えるかどうか(デフォルトは "RGB")
--led-pwm-lsb-nanoseconds : LSBのPWMナノ秒(デフォルト: 130)
--led-pwm-dither-bits=<0..2> : 下位ビットの時間ディザリング (デフォルト: 0)
--led-no-hardware-pulse : ハードウェア・ピン・パルス発生を使用しない。
--led-panel-type=<name> : 特殊なパネルを初期化するために必要です。サポートされています。'fm6126a'、'fm6127'。
--led-slowdown-gpio=<0..4>: スローダウンGPIOです。高速なPis/低速なパネルに必要(デフォルト:2(Pi4で2、その他1))。
--led-daemon : プロセスをデーモンとしてバックグラウンドで実行するようにします。
--led-no-drop-privs : ハードウェアの初期化後に 'root' から権限を落とさないようにする。
www.DeepL.com/Translator(無料版)で翻訳しました。
説明にはこのようにあるので、BDF(Bitmap Distribution Format)形式のフォントが必要です。
いろいろ情報を探すうち、こちらのサイト様に行き当たりました。
この中で、otfやttfフォントをbdfフォントに変換するツールを紹介しているサイト様に行き当たりました。
では、この情報を参考に、さざなみフォントをbdfフォントに変換してみます。
まず、適当なディレクトリにさざなみフォントをダウンロードします。
piのhomeフォルダには、Downloadというディレクトリがありますので、この中にfontというディレクトリを作成し、ダウンロードしましょう。
$ cd Downloads
$ mkdir font
$ cd font
$ wget https://ja.osdn.net/projects/efont/downloads/10087/sazanami-20040629.tar.bz2
$ ls
sazanami-20040629.tar.bz2
$ tar -jxvf sazanami-20040629.tar.bz2
$ ls
sazanami-20040629 sazanami-20040629.tar.bz2
ディレクトリを作り、フォントをダウンロードし、解凍しました。
フォントが入手できたので、上記のサイト 2. フォントの変換 (otf2bdf) に従い、bdfフォントへの変換ツールを入手して、変換します。
$ cd sazanami-20040629
$ sudo apt install otf2bdf
$ otf2bdf -p 28 -r 75 -o sazanami-mincho.bdf sazanami-mincho.ttf
さざなみフォントの明朝をbdfフォントに変換した、sazanami-mincho.bdfが作成されます。
-pの値でフォントの大きさが指定できます。
32×64なので、32から少し余裕を持って、28ドットとしました。
あとは、このフォントを指定してやると、日本語の文字列がスクロールします。
$ sudo /home/pi/rpi-rgb-led-matrix/examples-api-use/scrolling-text-example --led-cols=64 --led-rows=32 --led-chain=2 --led-no-hardware-pulse --led-slowdown-gpio=2 -f /home/pi/Downloads/font/sazanami-20040629/sazanami-mincho.bdf ウクライナ難民が400万人超える…UNHCRの最大想定人数、5週間で上回る
scrolling-text-example をデフォルトで使用しているため、黄色い文字ですが、正常に日本語の文章がスクロールしています。
また、同じくデフォルトの設定では、無限にループし続けるため、Ctrl+Cのキー操作で止めない限り、この文章がずっと表示されつづけます。
かなり「電光掲示板」として完成してきました。
次の記事では、枚数を縦2枚×横3枚の計6枚に増やし、外部からデータを取得できるようにして、実際のお店に納品した様子をご紹介します。
続きを楽しみにしています!!!是非!!!!!!!!!
ありがとうございます。遅筆ですがなんとか5月中にはアップできるようがんばります.