ArduinoでLED Matrixを使う

Arduino
DSC_2356.JPG

こんどはLED Matrixを使う

LED Matrixとは

LED MatrixはLEDを格子状に並べた素子です。簡易的なディスプレイとしてよく使用されています。Arduino UNO R4 WiFi ではボード上にもチップLEDによるマトリクスがありますが、今回は汎用部品のLED Matrixを使用します。

ArduinoでLED Matrixを駆動する

今回は、LED Matrixの駆動方式として、7セグメントLED×4桁の時と同じくダイナミック点灯を採用します。つまり、同時に点灯するのはいずれかの『横一列』だけで、それを高速で順次切り替えていくことにより全面LEDが同時に点灯しているように見せかけるのです。

製作&実験

では早速、このLED Matrixを点灯させる実験を行いましょう。

回路図

回路は7セグメントLED×4桁のときとよく似ています。7セグメントLEDの桁数が8桁に増えたのだと思えばこの回路構成も理解できるでしょう。

Arduino側は制御用に全部で16の出力端子が必要です。Arduinoのデジタル入出力端子は0~13の14端子ですが、D0とD1はUSB通信と、D13はボード上のLEDと回路を共用しているため使用を避け、Analog入力端子のうちA0~A4の5つを出力端子に切り替えることで16端子を用意しています。

電流制限抵抗は7セグメントLEDと同じにしてあります。カタログによると1088ASのLEDは順方向電圧降下が2.1V以上あるようなので、LED1つあたりの電流は~6.2mA、トランジスタに流れる電流は最大で50mA程度となります。

使用部品

種類型番数量備考参考リンク参考価格
LEDマトリクス1088AS18×8 赤色LED
トランジスタ2SC18158NPN高周波用秋月電子通商100円(20個パック)
抵抗器470Ω8カラーコード黄・紫・茶秋月電子通商150円(100本パック)
抵抗器4.7kΩ8カラーコード黄・紫・朱秋月電子通商130円(100本パック)
ブレッドボード1標準サイズのもの
ジャンパ線オス-オス(短)8ブレッドボード上
ジャンパ線オス-オス(長)17Arduino-ブレッドボード間
ジャンパ線オス-メス(長)16ブレッドボード-1088AS間

トランジスタや抵抗器は、7セグメントLED×4桁の時と種類が同じで数が増えただけです。

LED Matrix 1088AS

今回は 1088AS という LED Matrix 素子を使用します。赤色LEDが8×8個並んでいる、もっとも入手が容易なタイプです(特にこの製品にこだわりがあるわけではないので、同種のものなら何でもかまいません)。

ピン端子は上下に2列、8本ずつです。ピン同士の間隔は2.54mmのICピッチなのですが、上下の列の間隔が2.54mmの整数倍ではないため、ブレッドボードや万能基板に刺すことが出来ませんので注意してください(なぜかLED Matrixにはそういう製品が多いです…)。今回はオス-メスのジャンパ線を16本使用して配線しています。

内部回路および端子配列は下図のようになっています。端子が回路から想像しやすいような順に並んでいないのがややこしいです。

1088ASの場合、端子の列が上下に来るように置いたとき、縦方向に並ぶLEDはアノードが接続され、横方向に並ぶLEDはカソードが接続されています。

部品によっては、これとは逆に『横方向にカソード接続/縦方向にアノード接続』となっているものもあります(たとえば同じ1088シリーズの1088Bはダイオードの極性が1088Aとは逆です)。

配線図

今回は非常に配線が多いので、よく見て配線してください。カラフルなのは近い線を辿りやすいように色を分けているだけで、GNDの配線が黒にしてある以外は色そのものには意味はありません。

実物はこんな感じです。かなり線がごちゃつくので、少しでも線がまとまるようにArduinoとの配線はフラットケーブルを使用しています。部品の項でも解説したとおり、LED Matrixとの配線はオス-メスのジャンパ線を使用しています。

プログラム

C++
int rowPin[8]={12,11,10,A0,A1,A2,A3,A4};
int colPin[8]={9,8,7,6,5,4,3,2};

int pattern[5][8][8] =
{ 
  {
    {0,0,0,0,0,0,0,0},  // ア
    {1,1,1,1,1,1,1,0},
    {0,0,0,0,0,0,1,0},
    {0,0,0,1,0,1,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,1,1,0,0,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,0,0,0},  // イ
    {0,0,0,0,0,1,1,0},
    {0,0,0,1,1,0,0,0},
    {0,1,1,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,1,0,0,0,0},  // ウ
    {1,1,1,1,1,1,1,0},
    {1,0,0,0,0,0,1,0},
    {1,0,0,0,0,0,1,0},
    {0,0,0,0,0,0,1,0},
    {0,0,0,0,0,1,0,0},
    {0,0,0,1,1,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,0,0,0},  // エ
    {0,1,1,1,1,1,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {1,1,1,1,1,1,1,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,1,0,0},  // オ
    {0,0,0,0,0,1,0,0},
    {0,1,1,1,1,1,1,0},
    {0,0,0,0,1,1,0,0},
    {0,0,0,1,0,1,0,0},
    {0,0,1,0,0,1,0,0},
    {0,1,0,0,0,1,0,0},
    {0,0,0,0,0,0,0,0}
  }
};

void setup() {
  for(int i=0; i<8; i++){
    pinMode(rowPin[i], OUTPUT);
    digitalWrite(rowPin[i], LOW);
    pinMode(colPin[i], OUTPUT);
    digitalWrite(colPin[i], LOW);
  }
}

void loop() {
  for(int i=0; i<5; i++){
    for(int j=0; j<100; j++){
      for(int y=0; y<8; y++){
        for(int x=0; x<8; x++){
          digitalWrite(colPin[x], pattern[i][y][x]);
        }
        digitalWrite(rowPin[y], HIGH);
        delay(2);
        digitalWrite(rowPin[y], LOW);
      }
    }
  }
}

プログラムの解説

端子の定義
C++
int rowPin[8]={12,11,10,A0,A1,A2,A3,A4};
int colPin[8]={9,8,7,6,5,4,3,2};

使用する端子を配列に格納しています。col(アノード)とrow(カソード)で配列を分けています。

表示(文字)パターンの定義
C++
int pattern[5][8][8] =
{ 
  {
    {0,0,0,0,0,0,0,0},  // ア
    {1,1,1,1,1,1,1,0},
    {0,0,0,0,0,0,1,0},
    {0,0,0,1,0,1,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,1,1,0,0,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,0,0,0},  // イ
    {0,0,0,0,0,1,1,0},
    {0,0,0,1,1,0,0,0},
    {0,1,1,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,1,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,1,0,0,0,0},  // ウ
    {1,1,1,1,1,1,1,0},
    {1,0,0,0,0,0,1,0},
    {1,0,0,0,0,0,1,0},
    {0,0,0,0,0,0,1,0},
    {0,0,0,0,0,1,0,0},
    {0,0,0,1,1,0,0,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,0,0,0},  // エ
    {0,1,1,1,1,1,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0},
    {1,1,1,1,1,1,1,0},
    {0,0,0,0,0,0,0,0}
  },
  {
    {0,0,0,0,0,1,0,0},  // オ
    {0,0,0,0,0,1,0,0},
    {0,1,1,1,1,1,1,0},
    {0,0,0,0,1,1,0,0},
    {0,0,0,1,0,1,0,0},
    {0,0,1,0,0,1,0,0},
    {0,1,0,0,0,1,0,0},
    {0,0,0,0,0,0,0,0}
  }
};

今回は『ア』『イ』『ウ』『エ』『オ』を順に表示することにして、この5文字の点灯パターンを配列変数 pattern[][][] に定義しています。

setup()関数
C++
void setup() {
  for(int i=0; i<8; i++){
    pinMode(rowPin[i], OUTPUT);
    digitalWrite(rowPin[i], LOW);
    pinMode(colPin[i], OUTPUT);
    digitalWrite(colPin[i], LOW);
  }
}

setup()関数内では、使用するすべての端子を pinMode()関数で出力に設定し、また電位を LOW(LED消灯)にしています。

今回は端子数が足りないので、アナログ入力端子も出力端子として使用します。『アナログ入力端子』と紹介されているので入力しか出来ないのかと思いきや、実は pinMode()関数で OUTPUT を指定するとデジタル出力端子として使用できるのです。

loop()関数
C++
void loop() {
  for(int i=0; i<5; i++){
    for(int j=0; j<100; j++){
      for(int y=0; y<8; y++){
        for(int x=0; x<8; x++){
          digitalWrite(colPin[x], pattern[i][y][x]);
        }
        digitalWrite(rowPin[y], HIGH);
        delay(2);
        digitalWrite(rowPin[y], LOW);
      }
    }
  }
}

loop内は4重のループになっています。

一番内側、変数xのループでは、LED Matrixの1行分の点灯データをセットしています。
セットし終わったら、y番目のrowのトランジスタをオンにしてその1行を点灯させ、delay()関数で2msだけ待ってから消灯します。

変数yのループは、LED Matrixの点灯する行(row)を一番上から順に変更していきます。

変数jのループは、1つの文字を一定時間保つためのものです。

変数iのループは、『ア』『イ』『ウ』『エ』『オ』の文字を順次切り替えています。

実行結果

文字フォントはかなりテキトーなのですが、まぁちゃんと読めますね。ダイナミック点灯ですが全面が同時に点灯しているように見えます。

ちなみに、わざと行の切り替えを遅くするとこんな感じです。制御の原理がよくわかると思います。

コメント

タイトルとURLをコピーしました