9. 아두이노를 이용한 FND 제어 - 스마트 폰으로 제어하는 아두이노 -
강의 개요 FND(flexible numeric display) FND 제어 숫자 표시기란 뜻으로 여러 개의 세그먼트 LED들이 모여 숫자를 표시할 수 있도록 만들어짐 비교적 가격이 저렴하고 어두운 장소에서도 정보 표현이 잘되어 많이 사용 FND 제어 표현할 정보를 배열 등에 저장하여 이용
9.1 FND 세그먼트 FND 세그먼트 표시기 7개의 세그먼트에 1개의 점(dot)까지 하여 8개의 LED로 구성 정보를 표현하기 위하여 1byte 단위로 조합된 데이터 활용 8개의 LED가 8자의 숫자 모양으로 배치 a, b, c, d, e, f, g, dot 8개의 LED의 한쪽 부분은 공통으로 접속 Common-Cathode형 : Cathode(-) 공통으로 접속되는 경우 Common-Anode형 : Anode(+)가 공통으로 접속되는 경우는
9.2 FND 제어
예제 9.1 아두이노에서 FND 제어 Common-Anode형 세그먼트의 a, b, c, d, e, f, g, dot에 아두이노 보드의 디지털입출력 핀 2~9번을 순서대로 연결하여 숫자 "0"을 표현
예제 9.1의 주요개념 FND 세그먼트의 LED는 모양은 다르지만 실제 구동 방법은 LED와 유사 표시하고자 하는 글자에 맞게 해당 비트 LED를 ON 숫자 "0"을 표현할 수 있는 FND 세그먼트의 a, b, c, d, e, f, g, dot에 대응하는 데이터를 아두이노 보드의 디지털입출력 핀 2~9번으로 출력
예제 9.1의 스케치 void setup(){ for (int i=2; i<=9; i++){ pinMode(i, OUTPUT); } 세그먼트의 a, b, c, d, e, f, g, dot에 디지털입출력 핀 2~9번을 연결하고, 출력모드 설정 void loop() { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(9, HIGH); a = 0 b = 0 c = 0 d = 0 e = 0 f = 0 g = 1 dot = 1
예제 9.1의 스케치(배열 활용) int segPins[8]={2,3,4,5,6,7,8,9}; int degData0[8]={0,0,0,0,0,0,1,1}; FND 세그먼트에 사용할 입출력 핀 저장 "0"을 표시하기 위한 데이터 void setup() { for(int i=0; i<8; i++) { pinMode(segPins[i], OUTPUT); } void loop() { for(int i=0; i<8; i++) { digitalWrite(segPins[i], degData0[i]); 배열 segPins[i]에서 FND의 a~f, dot에 연결된 핀을 순서대로 호출 degData0[i])의 각 핀에 대응하는 bit 데이터를 출력
예제 9.2 2차원 배열을 사용한 아두이노에서 FND 제어 주요개념 CA형 세그먼트에 숫자 0, 1, 2, 3, 4를 표시하려면, 각 표현 숫자를 나타내기 위하여 데이터 배열을 만들어 사용
데이터 배열 사용 1차원 배열 구성 2차원 배열 구성 int degData0[8]={0, 0, 0, 0, 0, 0, 1, 1}; int degData1[8]={1, 0, 0, 1, 1, 1, 1, 1}; int degData2[8]={0, 0, 1, 0, 0, 1, 0, 1}; int degData3[8]={0, 0, 0, 0, 1, 1, 0, 1}; int degData4[8]={1, 0, 0, 1, 1, 0, 0, 1}; int degData[5][8]={{0, 0, 0, 0, 0, 0, 1, 1}, {1, 0, 0, 1, 1, 1, 1, 1}, {0, 0, 1, 0, 0, 1, 0, 1}, {0, 0, 0, 0, 1, 1, 0, 1}, {1, 0, 0, 1, 1, 0, 0, 1}, {0, 1, 0, 0, 1, 0, 0, 1}}
예제 9.2의 스케치 int segPins[8]={2,3,4,5,6,7,8,9}; int degData[5][8]={{0,0,0,0,0,0,1,1}, {1,0,0,1,1,1,1,1}, {0,0,1,0,0,1,0,1}, {0,0,0,0,1,1,0,1}, {1,0,0,1,1,0,0,1}}; FND 세그먼트에 사용할 입출력 핀 저장 숫자 "0"~"4"을 표시하기 위한 데이터 배열 void setup() { for(int i=0; i<8; i++) { pinMode(segPins[i], OUTPUT); } FND의 a~g와 dot에 연결된 핀을 출력모드로 선언 void disFND(int j){ digitalWrite(segPins[i], degData[j][i]); delay(1000); FND 출력 함수 8개의 디지털입출력 핀에 j번째 숫자 표현을 위한 bit 데이터 출력 1초간 j번째 숫자 표현 유지 void loop() { for(int j=0; j<8; j++) { disFND(j); j번째 숫자 표현을 위한 FND 출력함수 호출
예제 9.2의 스케치(함수구조 적용) int segPins[ ]={2,3,4,5,6,7,8,9}; 세그먼트에 연결할 디지털입출력 핀 지정 int segData[4][8]={{0,0,0,0,0,0,1,1}, {1,0,0,1,1,1,1,1}, {0,0,1,0,0,1,0,1}, {0,0,0,0,1,1,0,1}}; “0”을 나타내기 위한 데이터 “1”을 나타내기 위한 데이터 “2”을 나타내기 위한 데이터 “3”을 나타내기 위한 데이터 void setup() { for(int i=0; i<8; i++) { pinMode(segPins[i], OUTPUT); } 지정된 디지털입출력 핀을 출력모드로 선언 void seg_ft(int segP[ ], int segD[ ]) { int i; for (i=0; i<8; i++) { digitalWrite(segP[i], segD[i]); delay(500); 세그먼트 표시 함수 void loop() { loop의 시작 int segP[8], segD[8]; for (int j=0; j<4; j++) { for (int i=0; i<8; i++) { segP[i]=segPins[i]; segD[i]=segData[j][i]; seg_ft(segP, segD); 세그먼트 함수 호출 loop의 끝
9.3 HBE-MCU-Multi FND 모듈을 이용한 제어 2개의 7-Segment LED로 구성 2개의 FND는 각각 A와 B로 구분
FND 모듈의 회로도 7-Segment LED의 구조 Common Cathode형의 FND 8개의 입력 신호선 : SA_A~SA_H, SB_A~SB_H
7-Segment에서 16진수 표시 16 진수 16진수 표현 7-세그먼트의 비트값 데이터 값 ( HEX ) H G F E D C B A 1 0X3F 0X06 2 0X5B 3 0X4F 4 0X66 5 0X6D 6 0X7D 7 0X27 8 0X7F 9 0X6F 0X77 0X7C 0X39 0X5E 0X79 0X71
예제 9.3 아두이노 Mega 보드와 FND 모듈을 사용한 제어 500ms 마다 FND 에 0~ 9 , A ~ F, '_' , '.' 순차 출력 주요개념 Mega 보드 모듈의 핀 22, 24, 26, 28, 30, 32, 34, 36번을 FND 모듈의 SA_A~SA_H과 연결
예제 9.3의 스케치 byte FND[8] = {22,24,26,28,30,32,34,36}; byte FND_DATA[]={0x3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7C, 0X07, 0X7F, 0X67, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71, 0X08, 0X80}; byte cnt = 0; 사용할 핀을 배열 FND로 선언 배열 FND_DATA에 0~9, A~F, 밑줄, 점을표현할 18개의 FND 표현 데이터 저장 void setup() { byte z; for(z=0; z<8; z++) pinMode(FND[z], OUTPUT); } void FND_display(byte data) { for(z=0;z<8;z++) digitalWrite(FND[z], bitRead(data,z)); 함수 FND_display(int data) 선언 배열 FND_DATA의 숫자/문자 데이터 순서에 따라 출력 void loop() { FND_display(FND_DATA[cnt]); cnt++; if(cnt>17) cnt=0; delay(1000); 변수 cnt 를 17까지 증가시키면서 그 값에 해당하는 숫자/문자를 함수 FND_display()를 호출하여 출력
예제 9.3의 실행 1초 간격으로 0~9, A~F, -, dot가 순서대로 FND 표현 "byte FND[8] = {22,24,26,28,30,32,34,36};" FND 제어에 사용되는 핀을 배열로 지정, 출력모드로 설정 FND_DATA[ ]는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, F, -, dot를 FND에 표현하기 위하여 표 9.1의 FND 참조하여 작성 FND에 "0"을 표현하고 싶으면, FND_DATA[0] 사용 "9"를 표현하고 싶으면, FND_DATA[9] 사용 void FND_display(byte data) 함수 FND에 표현하려는 데이터를 배열 FND_DATA[]에서 참조하여 FND 모듈에 출력하는 함수 "if(cnt>17) cnt=0;“ FND_ DATA[cnt] 배열의 인덱스 cnt가 배열 인덱스 범위인 0~17을 벗어나지 않도록 하기 위한 명령
연습과제 세그먼트가 1초 간격으로 숫자 '0'부터 '9'까지 순차적으로 표시하며, 각 표시 후 0.5초 마다 세그먼트의 도트(dot)를 깜빡이도록 하시오. 세그먼트를 이용하여 영문으로 Goodbye나 Hello 등을 나타내시오. 다음 도형 8개를 만들고, 8bit 스위치에 의하여 표시되도록 하시오.
연습과제 SW0을 누르면 숫자 0, SW1을 누르면 세그먼트에 숫자 1, SW2를 누르면 숫자 2, SW3을 누르면 숫자 3을 각가 세그먼트에 표시하고, 스위치도 눌리지 않으면 세그먼트가 꺼져 있는 프로그램을 작성하자. 전자 주사위는 세그먼트에 1부터 6까지의 수가 빠르게 보이다가, 스위치를 누르면 정지되어 현재 보이는 숫자로 주사위 게임을 할 수 있는 게임을 만들어 보자. ① SW1을 누르면 세그먼트에 숫자를 1부터 6까지 빠르게 표시 ② SW0을 누르면 세그먼트에 숫자 변화를 멈추고 현재 숫자를 표시 ③ 다시 SW1을 누르면 세그먼트에 숫자를 빠르게 동작 ④ 이 과정(①-③번)을 계속 반복
홀짝 게임과 유사하게 주사위 값 중 2에서 5사이에 하나를 설정하고, 2개의 FND 중 하나는 S0 스위치를 누를 때마다 2에서 5까지 순환해서 증가한다. 즉, 5다음에 다시 2부터 스위치 누를 때마다 1씩 증가되는 주사위게임을 만들어 보자.