Raspberry Piで電光掲示板を作る

新幹線などに乗ったとき、こんな表示を見たことがありませんか?

御存知、「電光掲示板」です。

もちろん、画像のものは、新幹線車両専用に設計されたものですが、電子工作でもこの電光掲示板を作る事ができます。

この記事では、Raspberry Piを使って、電光掲示板を作成してみます。

Raspberry Pi 電光掲示板で検索すると、色々参考になるサイトが出て来ます。

この後の部品や接続については、こちらのサイトを参考にしました。

電光掲示板に必要な部品

電光掲示板の正体は、フルカラーのLEDを縦横に並べたものです。

「LEDマトリクス」で検索すると部品として売られています。

こちらの製品は、縦方向に32個、横方向に64個のフルカラーLEDが並んだものなので、2048個のLEDを使用している事になります。

このLEDマトリクスを点灯させるためには、直流5Vの電力が必要です。

一枚程度なら、使っていないスマホの充電器をバラしたりすれば確保できますが、二枚以上使うのであれば、専用電源も用意した方が良いです。

Raspberry Piは、Raspberry Pi3b+を使用しました。

他に細かい部品としては、LEDマトリックスの制御信号が16ピンのフラットケーブルでやりとりされる為、このようなピンがついています。

DSC_0068

Raspberry PiのGPIOと、このフラットケーブルを接続する為の幾つかの部品を購入しました。

フラットケーブル ボックスタイププラグ
created by Rinker
Raspberry Pi用ユニバーサル基板
created by Rinker
連結ピンソケット 2×20(40P) ラズパイ用スタッキングコネクタ
created by Rinker

あとは、電源とコンセントを繋ぐのに、ホームセンターで電灯線と電源プラグを購入してあります。

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枚に増やし、外部からデータを取得できるようにして、実際のお店に納品した様子をご紹介します。

Raspberry Piで電光掲示板を作る” に対して2件のコメントがあります。

  1. 引田伊作 より:

    続きを楽しみにしています!!!是非!!!!!!!!!

    1. kazuhiro より:

      ありがとうございます。遅筆ですがなんとか5月中にはアップできるようがんばります.

コメントを残す

メールアドレスが公開されることはありません。