2020年3月19日木曜日

Multi-function shield: セグメントLED

4セグLEDを制御する

セグメントLEDの構造

4セグLEDは、Multi-Functionシールドの上部についている4桁の数字を表示できるLEDです。4セグLEDは、セグメントLED x 4個の構成になっています。4セグLEDには12本の信号線が出ています。

  • COL0~COL3(4本): 1個のセグメントLEDを選択するための信号線
  • a ~ g, DP(8本):数字0-9、小数点を表示するための信号線 

図1:4セグLEDの位置
1桁分のセグメントLEDの内部は、8個のLEDで構成されています。各LED(A~DP)の位置は、図2のようになっています。セグメントLEDで数字の「1」を表示するためには、各LED(A~DP)のON・OFFパータンを図2に示します。
図2:セグメントLEDに1を表示させるLEDのパターン
数字0-9とDPを表示するためのLED(a~g、DP)のオンオフパータンを下記にまとめます。
LED abcf efgDP
0 : (0000 0011)  → 0x03
1 : (1001 1111) 0x9F
2 : (0010 0101) 0x25
3 : (0000 1101) 0x0D         
4 : (1001 1001) 0x99 
5 : (0100 1001)  0x49 
6 : (0100 0001)  0x41
7 : (0001 1011)  0x1B
8 : (0000 0001)  0x01   
9 : (0000 1001)  0x09
DP: (1111 1110)  0xFE

これをプログラムコードにすると、
unsigned char NUM_pat[] = {
//    0     1     2     3     4     5     6    7      8    9
   0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1b, 0x01, 0x09
 };

4セグLEDの内部構造

4セグLEDは、「1セグメントLED」x4個の構成の構成になっていますが、4つのセグメントLEDは内部で図4のように接続されています。
図3:4セグLEDの内部構造
各セグメントLEDを選択するために4本の信号線(COL0~COL3)が付いています。これを選択するための配列をプログラムコードで示します:
unsigned char digitSel[] = {0x10, 0x20, 0x40, 0x80};

4セグLEDの制御方法

Multi-Functionシールドには、4セグLEDをシリアル制御するために、74HC595(シフトレジスタIC)が2個付いています。この2個のICを使えば、4セグLEDの12本の信号線を3本の制御信号(CLK,SDI,LCH)で制御することができます。
図4:74HC595(シフトレジスタIC)の位置
各セグメントLEDに数値を表示するためには、
  • 4つのセグメントLEDから1つを選択:COL0~COL3の1本をオンする
    (例)2桁目の選択  COL0-3: 0010 0000 (0x20) 、下位4ビットは未使用
  • 選択したセグメントLEDに数を表示:LED(a~g, DP)のどれかをオンする
    (例)数字0を表示 LED(a-g,DP): 0000-0011 (0x03) 
の、データを送る必要があります。制御信号(CLK,SDI,LCH)を使えばシリアル方式でこのデータパターンを送ることが出来ます。その制御方法を図5に示します。

図4:74HC595の制御方法

  • 74HC595 (右)が4セグLEDのCOL0-3に接続されている
  • 74HC595(左)が4つのセグメントLEDのLED(a-g,DP : 8本)に接続されている。
  • Latch(LCH):L(0V)にすると4セグLEDにつながる信号を保持(固定)する。
  • Clock(CLK)、Serial Data In(SDI):2つの信号を使ってシリアルにデータを4セグLEDにつながる信号線にデータを送る。
上記の例は、2桁目のセグメントに0を表示するために ① 0x03、② 0x20がシリアル方式でデータを送ります。これをプログラムコードで書くと下記のようになります:
#define SDI 8
#define CLK 7
#define LCH 4

void setup() {
  pinMode(SDI, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LCH, OUTPUT);
}

void loop() {
  digitalWrite(LCH, LOW);
  shiftOut(SDI, CLK, LSBFIRST, 0x03);
  shiftOut(SDI, CLK, LSBFIRST,0x20);
  digitalWrite(LCH, HIGH);
  delay(100);
}

4セグLEDに別の数を表示させる

4セグLEDの各セグメント同時に表示させることはできません。各桁に別の数を表示させるためには、図5のように1桁ずつデータをセットし一定時間表示したら、次の桁を一定時間表示します。
図5:4桁表示は各桁を順番に表示させる

#define SDI 8
#define CLK 7
#define LCH 4

unsigned char digit[]= {0x10, 0x20, 0x40, 0x80};
unsigned char numPat[] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1b,0x01,0x09,0xff};
void setup() {
  pinMode(SDI, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LCH, OUTPUT);
}

void loop() {
  digitalWrite(LCH, LOW);
  shiftOut(SDI, CLK, LSBFIRST, numPat[0]);
  shiftOut(SDI, CLK, LSBFIRST, digit[0]);
  digitalWrite(LCH, HIGH);
  delay(10);

  digitalWrite(LCH, LOW);
  shiftOut(SDI, CLK, LSBFIRST, numPat[1]);
  shiftOut(SDI, CLK, LSBFIRST, digit[1]);
  digitalWrite(LCH, HIGH);
  delay(10);

  digitalWrite(LCH, LOW);
  shiftOut(SDI, CLK, LSBFIRST, numPat[2]);
  shiftOut(SDI, CLK, LSBFIRST, digit[2]);
  digitalWrite(LCH, HIGH);
  delay(10);

  digitalWrite(LCH, LOW);
  shiftOut(SDI, CLK, LSBFIRST, numPat[3]);
  shiftOut(SDI, CLK, LSBFIRST, digit[3]);
  digitalWrite(LCH, HIGH);
  delay(10);
}


0 件のコメント:

コメントを投稿