桜のはなびらどっとねっとロゴ

桜のはなびらどっとねっと

Raspberry Pi2で電光掲示板をつくる

この記事は1年以上前に投稿された記事です。 この警告表示について

IMG_7157_20151231

以前よりRaspberry Pi2にていろいろな種類の表示器を試してきました。
7セグLEDやキャラクタ液晶、グラフィック液晶にカラー液晶。
あとは普通のLEDも表示器といえば表示器ですね。

そんな中、今回は「ドットマトリクスLED」を使ってみたいと思います。
今回は直接制御するのではなく、シフトレジスタ3個とLEDユニットを2個使用して8×16の大きさで使います。

ドットマトリクスLEDとは

ドットマトリクスLEDとは、小さなLEDを二次元配列で敷き詰め、記号や文字、図画などを表示できるようにしたLEDユニットのことです。このLEDは内部で縦一列のカソードと、横一列のアノードが接続されており、これの接続を変更することによって光らせるLEDを変え、その行を高速で切り替えることによって文字等を表示することができるデバイスです。

原理としては、以前複数桁の7セグLEDを表示したときに使用したものと同じです。

7セグLEDや液晶との使い分け

似たようにたくさんのドットを集めて文字等を表示するデバイスに7セグLEDや各種液晶ディスプレイがありますが。これらの使い分けとしては…

  • 7セグLED
    基本的に数字のみだが制御が簡単。
    最近はあまり見かけないが16セグメントLEDを用いることで英字も表示可能。
    数字や簡単な英字のみをなるべく簡単な処理で、表示器から近~中距離で使用するのであればこのデバイスを用いる。既製品で存在する主なサイズは10cm前後のものが中心だが、中には大型のものもあるので範囲としては手のひら~庭程度の広さのものに適している。
  • キャラクタ液晶
    英数字とカタカナ、簡単な記号が表示できる。制御は比較的簡単。
    英文や数字がメインで7セグより情報量を増やしたい場合に有効。液晶なのでバックライトがなければ消費電力は少ない。
    あまり大型の製品は存在しないので、近距離で使用する場合で、簡単な英文まで表示したいのであればこちらを選択する。範囲としては既製品ではあまり大きなものが存在しないので手のひら~目の前程度の範囲に限られる。
  • グラフィック液晶
    液晶のドットマトリクスなので文字や図画も表示できるがフォントを持たないものが多いので表示したい文字のパターンを液晶に転送することになる。ゆえに制御が複雑になる。ただしPCで扱える視覚情報はほぼすべて表示できるのでその制御の煩雑さに応えるだけの利益があります。
    漢字や絵を表示したいのであればこれを使いましょう。
    製品の大きさはさまざまで、7セグLEDよりも小さいものから、100インチ程度のものまでさまざま。
    なので近~遠距離まで様々なところで利用できます。範囲としては手のひらから野球場くらいまでならいけます。※ただし、大きな液晶はたいていHDMIなどのPC入力が備わっていますし。RaspberryPiならそれを利用したほうがいいので、I/Oポートを用いて制御するのであれば~10インチくらいまで、手のひら~目の前程度になるでしょう。
  • ドットマトリクスLED
    基本的にはグラフィック液晶と同様ですが、ホビーユースとして入手できるものは一辺が3~4cmで8ドット程度のものが多く、ドットが荒いので近~中距離、目の前~広めの室内程度の範囲での使用が適しています。また、ある程度光量が確保できるので屋外での使用にも向いています。
    制御は制御装置が付いた完成品もありますが、基本的にLED単体の場合は自分で制御回路を作成する必要があります。8×8ドットのユニット1つ程度なら単純にIOに接続するだけでも使えますが…。

というわけで今回使うドットマトリクスLEDは屋外みたいな光量を必要とする場所で、比較的距離のある所で使用するのに適しています。もちろん室内でも使えますが。

必要なもの

今回はLEDユニットを直接制御するのではなく、シフトレジスタおよびトランジスタアレイを用いて制御したいと思います。ですので2個のドットマトリクスLEDを制御する場合には以下のものが必要になります。

  • 8×8ドットのドットマトリクスLED
    今回は秋月電子で買えるOSL641501-AGを使用。
    使用するドットマトリクスLEDは、8×8タイプのものでしたら基本的に同じように使えるはずですが。
    今回は窒化ガリウム系(多分)で、順方向電圧が3.3Vで扱いやすいこちらのタイプを選びました。
    昔ながらの緑色や赤色、黄色でも構いません。
  • NPN型(反転型)トランジスタアレイ(シンクドライバ) TD62083APG
    トランジスタを複数個1つのパッケージにしたもので、今回はカソード側を切り替えるために使用します。なお、上に示した型番のものは内部に入力抵抗が内蔵されているので、マイコン(今回はシフトレジスタ)→トランジスタアレイの接続に外部抵抗が必要なく、シンプルな回路が構成できます。
  • 適当な抵抗16本
    LEDの電流制限用の抵抗です。必要な明るさと、流す電圧によって適切なものを購入してください。
    今回は5V電源を使用するので手持ちの抵抗で20mAに近くなるように75Ωを使用しました。
    なお、75Ωだと若干オーバーするので80~100Ωの抵抗がいいと思われます。
  • シリアル→パラレルシフトレジスタ 74HC595
    今回はシフトレジスタを使用して3線で制御するのでシフトレジスタが1+桁数分必要になります。ここで製作する内容なら3個必要です。
    なお、シリアル→パラレル変換に使用できるシフトレジスタはいくつか種類がありますが、私はラッチつきの595を使用しました。これならSPIコマンドで制御を行う事が可能ですし、数珠繋ぎにして拡張することも可能ですので。専用ICを使ったり、列切り替えのICのみラッチなしにする手もありますが、部品の入手性や壊れた時の交換しやすさから考えると別にラッチがあっても構わないため、今回は74HC595を使用することにしました。
    メーカーについてですが、このICはどのメーカー製でも互換性があるので、好きなものを使用してください。通販を利用するのであれば、秋月にあるテキサスインスツルーメンツ製の安いものでいいてでしょう。

このほか、プリント基板やRaspberry Piとの接続に使う線材類が必要です。
今回はブレッドボードで軽くテストした後、ハードウェアを先に作りました。

ハードウェアの作成

IMG_7151_20151230

使用した主パーツ一覧。あとはこれに配線とコネクタ類。

ドットマトリクスLEDの内部構造

ドットマトリクスLEDの内部構造は、メーカーの仕様書によればこうなっています。

dmpat

(メーカー仕様書より引用)

上述のとおり縦の1列8個分のLEDのアノード、横1列8個分のカソードがひとまとめになっています。
例えばこの表で1番にGND、16番に3.3Vを接続してみると、以下のように右端の5番目のLEDが点灯します。

IMG_7148_20151230

これを利用して+側にしているIOポートにパターンデータを送信して、-側を順々に切り替えていくことで文字等を表示することが出来ます。(別にプラスとマイナスの制御は逆でも何の問題もないですが。)

トランジスタアレイの使い方

IMG_7164_20160102

ざっくり言うと、トランジスタを複数まとめた製品ですが。
例えばLEDやモーターを複数駆動させる場合に、足三本のトランジスタを使用していたら回路が複雑になってしまいます。そんな時にトランジスタをまとめた製品があれば便利ですね。それがこいつです。

トランジスタアレイは内包されるトランジスタの種類によって シンクドライバ や ソースドライバ と呼ばれることも有ります。また種類も様々で、本品のように、エミッタをまとめ逆起電力吸収用のダイオードや入力抵抗を内蔵したものもあれば、単純にトランジスタのみをまとめたもの。特定用途向けのトランジスタ構成にしたものと、様々な種類が有ります。

今回は-側の切り替えで制御を行うのでシンクドライバと呼ばれるNPN型のダーリントントランジスタアレイを使用します。型番はTD62083APGです。似たような型番で末尾が1~4まで有りますが、1~2は既に入手方法がなく(生産終了?)4は6~15Vの電圧で使用するものなので、Raspberry PiやArduinoで使用する場合は本品を使うことになります。(4を使っても問題は無いですが、抵抗が大きいため最大出力が得られない場合もあると思われます。今回はせいぜい200mA程度なので問題ないでしょうけど。)

メーカーサイトで公開されている仕様書によると、ピン配列は以下のとおりです。

tarray
(メーカー仕様書より引用)

切り欠きのある方から8ピン目までがそれぞれ入力と出力に対応しています。
9番ピンをGNDに接続、1~8番ピンをそれぞれマイコンのI/Oに接続します。
18~11番がそれぞれ向かい合う1~8番のピンに対応しており、ここにLEDのカソード側を接続します。
COMMON端子はモーター制御などで逆起電力を吸収するために使用しますので今回は未接続でも問題ありませんが、念のため電源に接続しておきます。

LEDの電流はアノードに接続された電源から、このトランジスタアレイの18~11番ピンを通り9番ピンのGNDに流れます。

回路

dmatrix

単純に仕様書通りにつないでいるだけです。

桁数を増やす場合は、一番右端の塊を複数作ることで実現しますが、1行のドットを全て点灯させた場合、3桁で480mAと、トランジスタアレイの許容電流ギリギリなので、3桁以上に桁数を増やす場合はトランジスタアレイを別のものにするか、輝度を下げたほうが良さそうです。4桁以上を使う場合は回路の中々の工夫が必要でしょう。もしくは、今回は行で切り替えていますが、列を切り替えることで、桁数が増えてもトランジスタアレイの数は1つで済むでしょう。(その分1サイクルあたりの切り替え回数が増え、ちらつきやすくなる場合があるので、それも考えると10桁は超えないほうがいいかもしれません。)その場合は今回とは逆の、ソースドライバを用いて制御するほうが良いかも知れません。

基板の作成

IMG_7152_20151230

今回使用した基板はSunhayatoのICB-504ですが、2桁だと半分で収まるので半分にしました。IMG_7153_20151230

部品の位置決めを行っています。
74HC595には最上位ビットを出力する機能がありますので、そこにもう一つの74HC595を接続して数珠つなぎにすることにより、8bit・16bitと拡張する機能があります。これを利用して今回はたった3本の制御線と電源線の計5本の線で制御してみたいと思います。
なお、回路図を見ればわかると思いますが、接続方法は列切り替え用のシフトレジスタをマスターとして接続しています。その後は1桁目・2桁目…という順に接続していきます。

IMG_7154_20151230

はんだづけした状態。LEDユニットは少し内側にしました。

IMG_7158_20151231

裏面はこんな感じです。見事なパスタが出来上がっていますね。
ちなみに途中でウレタン線が太くなっていますが。これは特に深い意味はなく、単に細い線の在庫が切れたためです。

IMG_7155_20151231

コンソールによるSPIにて\xff\xff\xffを送信し、全てのLEDを点灯させて動作確認を行いました。

この方法で行うと上下左右が反転してしまったので、本来下向きのところを上向きで使っています。
配線を入れ替えて修正してもいいのだけど。この方が制御がしやすいのでこのままでいきます。

制御

上下反転させるので下から上に表示していきます。
左右は物理的に反転しているので制御プログラム上では反転させる必要はありません。

今回は文字を表示させるプログラムを作ります。
文字の表示はフォントデータからいろいろやってもいいのですが、今回もBMPの文字一覧ファイルから読み込もうと思います。

プログラムに関しては基本的に前回グラフィック液晶で文字を表示したものを簡素化させた感じです。
なお、フォントデータファイルについては以下の通りに作成してください。

  • JISコードで全角文字が並んだ画像ファイル
  • 1文字あたりは8x8px以内
  • Windows形式のモノクロBMPファイル
    ペイントで「モノクロビットマップ」を選んで作成できる。
  • 画像ファイルの回転等は不要

今回は前回同様美咲フォントの画像版を使用。これをダウンロードしてモノクロBMPに変えるだけでOK。

コーディング

前回のコードをほぼそのまま、転送部分が変わっているだけなので詳細は省きます。

文字コードを変換して連結する部分はこんな感じです。

文字コード変換は前回のまま、前回は原理を説明するために-1-0xA0にしていましたが、今回は不要なのでくっつけました。
そのあとは最初に1桁目を8bitシフトして転送。その後にOR演算で2桁目をくっつけています。
普通なら文字数に応じて変更できるコードを書くべきですが。今回は2文字固定なのでこういう方法をとりました。

全体のコードは以下の通りです。

これをコンパイルします。(今回は特別なライブラリ指定は必要ないです。)

※文字コードはEUC-JPを指定すること。
コンパイル時の文字コード・ローケル・端末の文字コード。すべてEUC-JPで統一。
端末でログインする場合はコンパイル時と端末のコードでとりあえず使える。

IMG_7157_20151231

コンパイルしたものに「さく」を入力し表示させてみた状態

CXno742UoAEMJfZ

「賀正」を入力してみた。あまり複雑な文字は読みにくいですね。

終わりに

ドットマトリクスLEDの制御方法は以上です。

今回は簡単に制御するために8×16にしてみましたが、実用的なものを作るのであれば16×32は最低ほしいところですね。(このLED1つ320円するんで結構な金額になりますが…。)縦8pxだと英数字・記号やかな・カナは問題ないのでそれに絞った用途であれば8×32くらいでいいかもしれません。(もしくは文字を流すか…。)

ドットマトリクスLEDはきれいでなんかかっこいいので制御法を覚えておきたいアイテムですね!

コメントを残す

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