Arduinoは手軽に電子機器を作成できるように工夫された便利なマイコンボードです。
しかしながら、あらかじめプログラムされた特定のタスクを正確に実行するマイコンは、処理中の状況を表示することが苦手です。
そのような時に活躍するのがLEDを格子状に並べたLEDドットマトリクスです。LEDドットマトリクスは点灯するLEDのパターンでアルファベットや数字、記号などを表現する電子部品ですが、制御が大変というイメージがあります。
本記事ではArduinoでLEDドットマトリクスを制御するポイントを紹介します。
LEDドットマトリクスを使った表示(イメージ)
目次
1. LEDドットマトリクスとは
よく目にするLEDドットマトリクスは、縦8個、横8個で格子状にLEDを並べたパネルです。8個×8個のLEDは通常のLEDを点灯/消灯するのと同様に制御でき、点灯パターンを工夫することで文字や簡単な図形を表現できます。
LEDドットマトリクスのLEDの数は製品によって異なりますが、本記事では縦8個、横8個のLEDが並ぶ製品を例に紹介します。
LEDドットマトリクスの制御方法は普通のLEDと大きな違いがなく、単に64個(8個×8個)のLEDを点灯/消灯と同じように点灯できます。ArduinoとLEDを使った電子工作はDevice Plusでも何度も紹介しているので合わせて参照してみてください。
LEDが64個実装されているので、128本(64個×2組)の端子があると考えてしまいますが、実際のLEDドットマトリクスには16本の端子しかありません。
縦8個、横8個のLEDが並ぶLEDドットマトリクスには「列方向に並ぶ8個のLEDのアノード」が全て接続され、同じように「行方向に並ぶ8個のLEDのカソード」も全て接続されています。8本のアノード端子と8本のカソード端子で64個のLEDを制御します。
LEDドットマトリクスは、合計16本(アノード8本・カソード8本)の通電を細かく切り替えて64個のLEDの点灯/消灯をコントロールし「LEDを高速で点滅させて点灯しているように見える」現象を利用しています。
例えば、左上のLED(1行目1列目)、2行目2列目、3行目3列目、・・・、8行目8列目というように斜めに並ぶLEDを点灯させる場合は
「1列目のアノードを5Vに、1行目のカソードをグランドに」
「2列目のアノードを5Vに、2行目のカソードをグランドに」
「3列目のアノードを5Vに、3行目のカソードをグランドに」
・・・
「8列目のアノードを5Vに、8行目のカソードをグランドに」
のように高速で配線を切り替えてLEDの点灯状態を制御します。(説明の都合上、電流制限抵抗は省略)
LEDドットマトリクスのLEDは列方向のアノード、行方向のカソードと格子状に配線されているため、「特定の列を5Vに」「特定の行をグランドに」のように接続することで格子の交差する部分にあるLEDを点灯させています。
これをArduinoで高速に繰り返すことで、16本(8本×2組)しかない端子でも64個のLEDの点灯/消灯を実現します。この点灯方式を「ダイナミック点灯」と呼びます。
ここからの回路の説明は
「列方向に並ぶ8個のLEDのアノードが全て接続」
「行方向に並ぶ8個のLEDのカソードが全て接続」
されているLEDドットマトリクスを例に解説します。
製品によってはアノードとカソードが逆のものもあるので、使用前に必ずデータシートを確認してください。
2. 準備
以下のものを用意してください。
Arduino Mega 2560
Arduino IDE
ブレッドボード
LEDドットマトリクス
8×8
抵抗
330Ω 8本(LEDの破損防止用)
いつもの電子工作ではArduino Unoを使用しますが、LEDドットマトリクスの制御には16本のデジタル入出力ピンが必要です。今回は、ピン数に余裕のあるArduino Mega 2560を選択します。
上記に加えてブレッドボード用のジャンパワイヤ、USBケーブルが必要です。
3. スケッチ
以下がスケッチ全体です。スケッチのあとに解説が続きます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | int toDisplay[][8] = { {1,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0}, {1,0,0,0,0,0,1,0}, {1,0,0,0,0,0,0,0}, {1,1,1,1,0,0,1,0}, {1,0,0,1,0,0,1,0}, {1,0,0,1,0,0,1,0}, {1,0,0,1,0,0,1,0} }; void setup() { for ( int i=0; i<8; i++) { pinMode(i+2, OUTPUT); digitalWrite(i+2, LOW); pinMode(i+46, OUTPUT); digitalWrite(i+46, HIGH); } } void loop() { for ( int i=0; i<8; i++) { digitalWrite(i+46, LOW); for ( int j=0; j<8; j++) { digitalWrite(j+2, toDisplay[i][j]); } delay(10); digitalWrite(i+46, HIGH); } } |
最初はLEDドットマトリクスの点灯パターンを定義する配列です。
01 02 03 04 05 06 07 08 09 10 | int toDisplay[][8] = { {1,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0}, {1,0,0,0,0,0,1,0}, {1,0,0,0,0,0,0,0}, {1,1,1,1,0,0,1,0}, {1,0,0,1,0,0,1,0}, {1,0,0,1,0,0,1,0}, {1,0,0,1,0,0,1,0} }; |
本記事では縦8個、横8個のLEDが並ぶLEDドットマトリクスを使用するので、配列も8×8の二次元配列を定義します。
配列上の1は点灯、0は消灯を意味します。スケッチを実行するとLEDドットマトリクスに「hi」と表示されます。
続いてsetup()関数です。
1 2 3 4 5 6 7 8 | void setup() { for ( int i=0; i<8; i++) { pinMode(i+2, OUTPUT); digitalWrite(i+2, LOW); pinMode(i+46, OUTPUT); digitalWrite(i+46, HIGH); } } |
ここではArduinoボードのピンの動作を設定します。
本記事で使用する縦8個、横8個のLEDが並ぶLEDドットマトリクスにはアノード端子が8本、カソード端子が8本あります。そこでアノードの8本をArduinoボードの2〜9番ピンに、カソードの8本を46〜53番ピンに割り当てます。
スケッチ上で1本ずつピンの状態を設定するのは大変なのでfor文を使用してピンの動作を「出力」に指定し、全てのアノードをLOW、全てのカソードをHIGHに初期化します。(グランド側の電位が高いためLEDに電流は流れません)
以下はloop()関数です。
01 02 03 04 05 06 07 08 09 10 11 12 | void loop() { for ( int i=0; i<8; i++) { digitalWrite(i+46, LOW); for ( int j=0; j<8; j++) { digitalWrite(j+2, toDisplay[i][j]); } delay(10); digitalWrite(i+46, HIGH); } } |
ここでは、点灯パターンが定義されている配列toDisplayの内容に従ってLEDを点灯/消灯します。
LEDドットマトリクスは列方向の8個のアノード、行方向の8個のカソードが内部で接続されているので、二重にしたfor文を使って点灯するLEDの「行(i)」「列(j)」を指定しながら64個のLEDを順次制御します。
点灯する場合は行(カソード)をLOWに、列(アノード)をHIGHに設定します。消灯は行(カソード)をLOWに、列(アノード)をLOWです。また、行(カソード)がHIGHに設定されると、行方向の8個全ては消灯します。
ここでLOWは0、HIGHは1を意味します。
外側のfor文(i)は行の指定です。LEDの点灯/消灯を制御する対象の行となるので最初にLOWに設定します。
続いて内側のfor文(j)は列の指定です。制御の対象となる行は外側のfor文で既に指定されているので、この行にあるLEDの点灯/消灯を左側から個別に指定し、配列toDisplayの要素を元にLEDの点灯状態を制御します。(0:LOW、1:HIGH)
delay(10)の設定値(引数)を大きくすればLEDは明るく点灯しますがちらつきが目立つようになります。反対に値を小さくすればLEDは暗く光ります。用途に合わせて調整してください。
4. 配線
配線は「Arduinoボード(2〜9番ピン) ≫ LEDドットマトリクスのアノード ≫ LEDドットマトリクスのカソード ≫ 抵抗(330Ω) ≫ Arduinoボード(46〜53番ピン)」と電流が流れるように行います。
縦8個、横8個のLEDが並ぶLEDドットマトリクスにはアノード端子が8本、カソード端子が8本あります。
8本のアノード端子を1列目は2番ピン、2列目は3番ピンとそれぞれArduinoボードの2〜9番ピンに接続します。
同様に8本のカソード端子を1行目は46番ピン、2行目は47番ピンとそれぞれArduinoボードの46〜53番ピンに接続します。カソード端子とArduinoの間には電流制限抵抗(330Ω)が必要です。
LEDドットマトリクスの端子は1列目、2列目、・・・というように順番通りに配線が並んでいません。「何番の端子が縦8個、横8個のどのLEDのアノード/カソードにつながるのか?」は製品によって異なります。本記事で紹介しているLEDドットマトリクスは列方向がアノード、行方向がカソードにつながっています。製品によっては列方向がカソード、行方向がアノードの場合もあるため、使用前に必ずデータシートで確認してください。
ArduinoボードとLEDドットマトリクスの16本の端子(Arduinoとカソードの間には抵抗)の接続が終わったら配線は完了です。
ArduinoボードとパソコンをUSBケーブルで接続してください。
LEDドットマトリクス上に「hi」と表示されれば成功です。
表示されない場合や文字が崩れてしまう場合は配線が間違っている可能性があります。データシートで「どの端子が内部のどのLEDに接続されているのか?」を確認してください。
5. まとめ
今回はLEDドットマトリクスの使用方法を説明しました。LEDドットマトリクスの制御には多くのピンが必要なのでArduinoボードにはArduino Mega 2560を選定しました。Arduino Mega 2560は入出力ピンに余裕があるのでLEDドットマトリクスを複数個並べれば、より大きな表示デバイスも作成できます。ちなみに、8×8のLEDドットマトリクス一個だけならArduino Unoでも制御できます。
LEDドットマトリクスの制御は配線の数が多いので少々複雑なイメージがありますが、単体のLEDを点灯/消灯させるのと原理は変わりません。慣れてしまえば手軽にArduinoボードで表示機能を追加できます。ぜひチャレンジしてみてください。