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の位置 |
図2:セグメントLEDに1を表示させるLEDのパターン |
LED abcf efgDP
0 : (0000 0011) → 0x03
1 : (1001 1111) → 0x9F
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の内部構造 |
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)の位置 |
- 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)
図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につながる信号線にデータを送る。
#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); }