15時15分22秒この記事は4年ほど前に投稿された記事です。この記事の内容は古くなっている可能性があります。更新日時にご注意ください。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で扱いやすいこちらのタイプを選びました。昔ながらの緑色や赤色、黄色でも構いません。TD62083APGトランジスタを複数個1つのパッケージにしたもので、今回はカソード側を切り替えるために使用します。上に示した型番のものは内部に入力抵抗が内蔵されているので、マイコン(今回はシフトレジスタ)→トランジスタアレイの接続に外部抵抗が必要なく、シンプルな回路が構成できます。適当な抵抗16本LEDの電流制限用の抵抗です。必要な明るさと、流す電圧によって適切なものを購入してください。今回は5V電源を使用するので手持ちの抵抗で20mAに近くなるように75Ωを使用しました。75Ωだと若干オーバーするので80~100Ωの抵抗がいいと思われます。74HC595今回はシフトレジスタを使用して3線で制御するのでシフトレジスタが1+桁数分必要になります。ここで製作する内容なら3個必要です。シリアル→パラレル変換に使用できるシフトレジスタはいくつか種類がありますが、私はラッチつきの595を使用しました。これならSPIコマンドで制御を行う事が可能ですし、数珠繋ぎにして拡張することも可能ですので。専用ICを使ったり、列切り替えのICのみラッチなしにする手もありますが、部品の入手性や壊れた時の交換しやすさから考えると別にラッチがあっても構わないため、今回は74HC595を使用することにしました。メーカーについてですが、このICはどのメーカー製でも互換性があるので、好きなものを使用してください。通販を利用するのであれば、秋月にあるテキサスインスツルーメンツ製の安いものでいいてでしょう。Piとの接続に使う線材類が必要です。今回はブレッドボードで軽くテストした後、ハードウェアを先に作りました。使用した主パーツ一覧。あとはこれに配線とコネクタ類。ドットマトリクスLEDの内部構造ドットマトリクスLEDの内部構造は、メーカーの仕様書によればこうなっています。(メーカー仕様書より引用)上述のとおり縦の1列8個分のLEDのアノード、横1列8個分のカソードがひとまとめになっています。この表で1番にGND、16番に3.3Vを接続してみると、以下のように右端の5番目のLEDが点灯します。これを利用して+側にしているIOポートにパターンデータを送信して、-側を順々に切り替えていくことで文字等を表示することが出来ます。(別にプラスとマイナスの制御は逆でも何の問題もないですが。)トランジスタアレイの使い方ざっくり言うと、トランジスタを複数まとめた製品ですが。LEDやモーターを複数駆動させる場合に、足三本のトランジスタを使用していたら回路が複雑になってしまいます。そんな時にトランジスタをまとめた製品があれば便利ですね。呼ばれることも有ります。種類も様々で、本品のように、エミッタをまとめ逆起電力吸収用のダイオードや入力抵抗を内蔵したものもあれば、単純にトランジスタのみをまとめたもの。特定用途向けのトランジスタ構成にしたものと、様々な種類が有ります。今回は-側の切り替えで制御を行うのでシンクドライバと呼ばれるNPN型のダーリントントランジスタアレイを使用します。型番はTD62083APGです。PiやArduinoで使用する場合は本品を使うことになります。(4を使っても問題は無いですが、抵抗が大きいため最大出力が得られない場合もあると思われます。今回はせいぜい200mA程度なので問題ないでしょうけど。)メーカーサイトで公開されている仕様書によると、ピン配列は以下のとおりです。(メーカー仕様書より引用)切り欠きのある方から8ピン目までがそれぞれ入力と出力に対応しています。9番ピンをGNDに接続、1~8番ピンをそれぞれマイコンのI/Oに接続します。18~11番がそれぞれ向かい合う1~8番のピンに対応しており、ここにLEDのカソード側を接続します。COMMON端子はモーター制御などで逆起電力を吸収するために使用しますので今回は未接続でも問題ありませんが、念のため電源に接続しておきます。LEDの電流はアノードに接続された電源から、このトランジスタアレイの18~11番ピンを通り9番ピンのGNDに流れます。単純に仕様書通りにつないでいるだけです。桁数を増やす場合は、一番右端の塊を複数作ることで実現しますが、1行のドットを全て点灯させた場合、3桁で480mAと、トランジスタアレイの許容電流ギリギリなので、3桁以上に桁数を増やす場合はトランジスタアレイを別のものにするか、輝度を下げたほうが良さそうです。4桁以上を使う場合は回路の中々の工夫が必要でしょう。今回は行で切り替えていますが、列を切り替えることで、桁数が増えてもトランジスタアレイの数は1つで済むでしょう。(その分1サイクルあたりの切り替え回数が増え、ちらつきやすくなる場合があるので、それも考えると10桁は超えないほうがいいかもしれません。)その場合は今回とは逆の、ソースドライバを用いて制御するほうが良いかも知れません。今回使用した基板はSunhayatoのICB-504ですが、2桁だと半分で収まるので半分にしました。部品の位置決めを行っています。74HC595には最上位ビットを出力する機能がありますので、そこにもう一つの74HC595を接続して数珠つなぎにすることにより、8bit・16bitと拡張する機能があります。これを利用して今回はたった3本の制御線と電源線の計5本の線で制御してみたいと思います。回路図を見ればわかると思いますが、接続方法は列切り替え用のシフトレジスタをマスターとして接続しています。その後は1桁目・2桁目...という順に接続していきます。LEDユニットは少し内側にしました。裏面はこんな感じです。見事なパスタが出来上がっていますね。ちなみに途中でウレタン線が太くなっていますが。これは特に深い意味はなく、単に細い線の在庫が切れたためです。コンソールによるSPIにて\xff\xff\xffを送信し、全てのLEDを点灯させて動作確認を行いました。この方法で行うと上下左右が反転してしまったので、本来下向きのところを上向きで使っています。配線を入れ替えて修正してもいいのだけど。この方が制御がしやすいのでこのままでいきます。上下反転させるので下から上に表示していきます。左右は物理的に反転しているので制御プログラム上では反転させる必要はありません。今回は文字を表示させるプログラムを作ります。文字の表示はフォントデータからいろいろやってもいいのですが、今回もBMPの文字一覧ファイルから読み込もうと思います。プログラムに関しては基本的に前回グラフィック液晶で文字を表示したものを簡素化させた感じです。フォントデータファイルについては以下の通りに作成してください。JISコードで全角文字が並んだ画像ファイル1文字あたりは8x8px以内Windows形式のモノクロBMPファイルペイントで「モノクロビットマップ」を選んで作成できる。今回は前回同様美咲フォントの画像版を使用。これをダウンロードしてモノクロBMPに変えるだけでOK。コーディング前回のコードをほぼそのまま、転送部分が変わっているだけなので詳細は省きます。文字コードを変換して連結する部分はこんな感じです。EUC-JPからJISコードを計算する。本来は0xA0を引くことで算出できるが。転送するパターンを作成する。1文字目のパターンを8bitシフトして転送後、2文字目をORでくっつける。EUC-JPからJISコードを計算する。本来は0xA0を引くことで算出できるが。転送するパターンを作成する。1文字目のパターンを8bitシフトして転送後、2文字目をORでくっつける。(255-font_data[font_size[0]-(1+s+(jis_code[2]*8))][jis_code[3]]);文字コード変換は前回のまま、前回は原理を説明するために-1-0xA0にしていましたが、今回は不要なのでくっつけました。そのあとは最初に1桁目を8bitシフトして転送。その後にOR演算で2桁目をくっつけています。普通なら文字数に応じて変更できるコードを書くべきですが。今回は2文字固定なのでこういう方法をとりました。全体のコードは以下の通りです。