★ Raspberry Piで8x8 LEDマトリックスを制御(1)/スクロール時計表示 ★


実行例(「5/3 14:54」とスクロール表示)

【1】はじめに

Raspberry Piは、本体基板の価格は680円程度と非常に安価なコンピューターで、 その割にはかなり高性能であり、OSにLinuxやWindows10が使用できます。またGPIOがついているので、これをインタフェースとして、色々なセンサーやデバイスを接続することができます。
私も、遅まきながら、Raspberry Piを購入して、さらに自作HWをつなげて遊んでみました。 ネットには、もっと凝ったものはたくさんありますが、私はあまりお金も時間もないのであまり凝ったことができません。
ということで、秋葉原で何となく買った、8x8 LEDマトリックスを使って、 日時をスクロール表示するシンプルな時計のようなものを作成しましたので、紹介します。

【2】Raspberry Piの準備

書籍や、他のHPにもたくさん記事があるのでそちらを参照してください。
私は、あまり、セットアップ等に煩わされたくなかったので、Raspberry Piは、Wi-FiつきのZero WHのセットをAmazonで購入しました。
※「Raspberry Pi Zero WH Starter Kit 8GB」を4,968円で購入しました。GPIOのヘッダピンが既に取り付けられており、またOSイメージが書き込み済みのSDカードや、ケース、電源、USBとVHDIの変換コネクタ類がついているので、妥当な価格と思います。

今回、OSはRaspberry Pi標準のRaspbian(Linux)をインストールしました。


【3】8x8 LEDマトリックス回路

部品表と結線図は、こちらを参照してください。

試作ボードは、穴あきベーク板にジャンパー線をはんだ付けして作成しました。
(数年ぶりに半田ごてを握って、ジャンパーを飛ばそうとすると、見えない・・ダブって見える。仕方なしに、拡大眼鏡を装着しましたが、結局芋半になってしまった(T_T)..)

部品代は全部で1,000円程度です。
8x8 LEDマトリックスは、8端子あるアノード端子をOPEN又は5Vを印可し、8端子あるカソード端子にOPEN又はGNDに接続することで、任意のLEDを点灯させることができます (そのままだと過電流となるため、直列に100~150Ω程度の抵抗をいれる)。 Raspberry Piからは、GBPIO出力をソースドライバー/シンクドライバーというトランジスタアレイを介して制御します。
8x8 LEDマトリックスは、アノード8端子+カソード8端子=16端子となるので、GPIOを16端子分使用します。Raspberry PiのGPIOは、0~26の27端子あるので数としては足ります。
※本HPの方法だと、8x8 LEDマトリックスが2個以上だとGPIO端子が足りなくなるので、破綻してしまいます。ほかのHPを見ると、直接GPIOでの制御は行わず、て、I2C+デコーダ回路などの構成にしているようでした。
Rasberry Piのヘッダピンに接続できるように、穴あきベーク板側にPCB ソケット(2 列×20P )を取り付けています。
LEDマトリックスは、任意の行、又は列について点灯パターンを制御することができます。 但し、複数行は同時制御できないので、各行順次ON/OFFしながらの表示となります(切り替えが速いので人間の目にはわからない)。

<写真>

Raspberry Piと試作ボード

Raspberry Piと試作ボードを接続

裏返したところ

【4】プログラム

ソースコードは、こちらから、ダウンロードしてください(LedWatch.zip)。
Raspberry Piのプログラム言語は、Pythonの使用を想定しています。このため、各種ライブラリーも、Python用となっています。
私も今回少しばかりPythonをかじってみました。しかしながら、GPIO制御ライブラリをダウンロードしようとしてうまくいかず、気の短い私としては、ライブラリを必要としない方法として 昔懐かしいC言語で進めることにしました。

【4-1】サブルーチン

各サブルーチンの説明を以下に記載します
関数名説明
MapGPIOメモリデバイスをオープンして、物理メモリを仮想メモリ上にマップする(初期化処理)
UnmapGPIOメモリデバイスをクローズする(使っていない)
InitGPIOGPIO端子をOUT/INのいずれかに設定する処理。引数:GpioNo=GPIO番号、data=0ならIN設定、data=1ならOUT設定
OutOnGPIO指定したGPIO端子をONにする処理。引数:GpioNo=GPIO番号
OutOffGPIO指定したGPIO端子をOFFにする処理。引数:GpioNo=GPIO番号
FontInitフォントファイル(MSKG.FNT)読み込み、メモリ上の一部フォント(SP,':','/')の位置を移動
write_font文字列をLEDマトリックスに表示する

【4-2】GPIOへのアクセス

C言語では、GPIOレジスタをメモリマップしてアクセスする形になります。
具体的には、ソースコードの、MapGPIO関数を参照してください。

また、本ソースコードでは、GPIOのアドレス(GPIO_BASE)は、以下のように定義しています。

#define GPIO_BASE PERIPHERAL_BASE + 0x00200000

Raspberry Pi Zero と、Raspberry Pi 2ではGPIOのアドレスが異なります。
本ソースコードは、Raspberry Pi Zero用となっています。
Raspberry Pi 2では、下記のコメントアウト行の方を有効にすればうまくいくはずです(試していません)。

#define PERIPHERAL_BASE 0x20000000 // PI0
//#define PERIPHERAL_BASE 0x7E000000 // PI2


Raspberry PiのGPIO制御用レジスタには、以下の3種類があります。

No種類説明
GPIOの機能を設定するレジスタ各GPIOを出力にするか、入力にするかの機能を設定する
GPIO出力を設定するレジスタ各GPIOをOn(5V)にする
GPIO出力をクリアするレジスタ各GPIOをOff(0V)にする

プログラムの起動時にNo.1でGPIOの機能を設定し、No.2でON,No.3でOFF制御を実施します。

各レジスタの仕様をまとめたものと、このレジスタの制御を実施しているコード部分についての説明をPDFにまとめました。 こちらを参照してください

LEDマトリックスを構成する各LEDの行番号および列番号と、そこに接続されているGPIOピンの番号はそれぞれ以下の配列で定義しています。
GXが横方向で、GYが縦方向になりますので結線を変えた場合はこちらを調整してください。

int GX[8] = { 2, 3, 4, 17, 18, 27, 22, 23 };
int GY[8] = { 24, 25, 12, 5, 6, 13, 19, 0 };

GPIOへのアクセスの詳細は、、末尾の【参考】に記載されているHPの記事を参照にしてください。

【4-3】文字のLEDマトリックスへの表示

本プログラムでは、フォントファイルをロードして、そのビット配置に応じて、LEDマトリックスの各LEDを点灯/消灯させています。
フォントファイルは、美咲フォントというものを使用しています。
「PC-E500 SCRNJPN.FNT 形式」を使用しています。
実行時に、HPからダウンロードした「MSKG.FNT」ファイルを同じディレクトリにコピーしてください。
但し、PC-E500形式でのフォントの並びがASCII配列、UNICODEや、SJISなどとは一致しておらずどうなっているのかわかりませんでした。
ASCII配列と一部かぶっていたので、その部分に対して適当にオフセット計算しています。また、スペース、'/'、':'なども全然違うところに あるため、初期化時に無理やり配置しなおしています。
このため、折角の漢字FONTなのに、漢字が使えない状態となっています。
これに関しては、今後の課題です。
なお、文字は90度横になっているため、スクロール処理にビットシフトが不要であり、簡単にすることができています。

【4-4】コンパイルと実行

コンパイルは、LedWatch.cをgccでコンパイルします。
コンソールから下記のようにインプットすると、"LedWatch"という実行ファイルが作成されます。
gcc LedWatch.c -o LedWatch

実行は、以下のように入力してください。
sudo ./LedWatch
【重要】事前に【4-3】に記載した「MSKG.FNT」を同じディレクトリにコピーしておく必要があります。

停止はプログラミングしていないので、[CTRL]+[C]で強制終了させてください。

【参考】

[Lチカ] Raspberry PiでC言語からSoCのレジスタを操作してGPIOを制御する・・・GPIO制御のC言語コードを参考にさせてもらいました。
8×8 ドット日本語フォント「美咲フォント」
【改訂記録】
2018/05/13版:公開
2018/05/20版:誤記修正・写真追加
2018/05/30版:GPIOレジスタを説明するPDFを追加、それに合わせて文章を修正
[ホームへ戻る]

Copyright (c) 1997-2018, BearBeetle, Allrights reserved.