아두이노프로세싱 프로그래밍

아두이노 우노 7세그먼트 LED 프로그램:I

coding art 2017. 3. 1. 18:44
728x90


우선 동영상을 통해 7세그먼트 LED의 16개 문자를 순차적으로 디스플레이 하는 것을 관찰해 보자.



7세그먼트 LED는 점을 포함하여 8개의 조각으로 이루어진다. 이 7세그먼트LED는 좌측에서 볼 수 있듯이 가운데가 공통 즉 Common으로 사용된다. 2가지 즉 양극(Anode:애노우드) 형과 음극(Cathode:케소우드) 형이 있을 수 있는데 상기의 그림은 양극 형이다. 즉 공통 단자에 양의 전압 또는 HIGH 상태 즉 +를 가하고 아래쪽의 8개 단자를 아두이노 우노 디지털 출력 단자와 연결하여 0V 또는 LOW 상태를 가하면 7세그먼트가 on 된다.


양극 형인지 음극 형인지 여부는 3.3V 이하의 전압을 공통(Common)과 아래 8개 중 하나의 핀에 가해서 on 이 되는지 on 이 안되면 전압 방향을 바꿔 확인해 보면 된다.


7세그먼트든 삼색LED 이든 또는 단색 LED 이든 전류를 제한하기 위한 저항은 필수적이다. 사실 삼색 LED 나 7 세그먼트에서 3개 또는 8개의 LED가 동시에 병렬적으로 on 될 경우 이들 LED의 합성 저항 값이 작아지므로 LED의 갯 수가 많을수록 전류제한 저항 값이 좀 더 큰 것이 좋을 듯하다. 하지만 300옴 정도면 LED on 실험에서 충분하다고 본다.


7세그먼트 LED를 on OFF 하기 위한 8개의 배선을 아두이노 우노의 디지털 출력 핀 2에서 9번까지를 할당한다. 즉 프로그램에서 FND[8]에 지정된 값이 바로 디지털 출력 핀 설정이다.
참고로 핀 0 과 1은 시리얼 통신에 할당되어 있음에 유의한다.


그 다음에 FND_DATA[] 어레이에서는 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E 및 점(.) 에 해당하는 데이터를 사전에 설정해야 한다.

첫 번째 데이터 0XC0 예를 보기로 하자. 0X는 단지 16진법 또는 Hexa 라는 뜻이다. 중요한 부분은 C0이다. 16진법에서 C는 십진법으로는 12에 해당한다. 12를 2진법의 비트 형태로 표현하면 즉 1X2^3+1X2^2+0X2^1+0X2^0 이므로 앞 계수를 따내면 1100이 된다. 아울러 16진법의 0은 2진법에서 0000 이 된다. 즉 16진법의 C0는 2진법으로 1100 0000 이 된다.

1 1 0 0  0 0 0 0
---------------
H G F E D C B A


지금 사용하는 7세그먼트가 양극 형이라면  3.3V 또는 5V의 전압이 가해진 전류제한 저항과 함께 공통(Common) 단자가 HIGH 상태이므로 출력 데이터 핀 G 와 H에 같이 HIGH 상태를 출력해 주면 8번 핀 G 와 9번 핀 H 세그먼트에는 전압 차가 0이 되어 OFF가 되며 나머지 출력 데이터 핀에는 LOW를 출력하게 되어 F,E,D,E,B,A 세그먼트의 LED는 on이 된다. 결과는 “0”을 보여주게 된다.


끝에서 두 번째 데이터 0XF7은 2진법으로 1111 0111이 되어 D만 on이 되는데 이는 언더 바 즉(_)를 나타낸다.

마찬가지로 0X7F는 2진법으로 0111 1111이 되어 H만 on이 되는데 이는 점(.)을 보여주게 된다.

정수형 변수 cnt는 0에서 17까지 즉 18개 7세그먼트 문자 개수를 나타낸다. 


setup()에서 아두이노 2번 핀에서 9번 핀에 해당하는 8개의 데이터 핀을 출력 즉 OUTPUT으로 설정한다.


loop() 문에서 처음 FND_display(FND_DATA[cnt]);를 실행하면 cnt=0이므로 0XC0가 data 변수로 FND_display()로 넘겨지고 bitRead(data,z)에서 z를 0에서 7까지 8번 loop를 돌려 7번째 와 8번째가 “1” 이라는 점을 확인하고 FND(z)의 값을 HIGH 상태로 설정해 준다. 그러면 digitalWrite() 명령에 의해 해당 핀에 HIGH 상태를 출력해 주면 현재 양극 형 7세그먼트 LED 이므로 나머지 세그먼트들만 on이되어 “0”을 보여 주게 된다.


이 7세그먼트 LED on OFF 아두이노 배선 프로그램은 아두이노 NodeMCU 에서도 그대로 사용될 예정인데 NodeMCU에서는 GPIO 데이터 핀 번호가 아두이노 우노와 같으므로 배선 순서가 순차적이 아닌 좀 꼬인 상태가 될 것이다.


7segment_LED_ON_OFF


byte FND[8] = {2,3,4,5,6,7,8,9};
byte FND_DATA[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XF7,0X7F};

 byte cnt = 0;

 void setup() {
 byte z;
  for(z=0; z<8; z++) {
   pinMode(FND[z],OUTPUT);
  }
 }
 
 void FND_display( byte data) {
   byte z;
   for(z=0; z<8; z++) {
     digitalWrite(FND[z],bitRead(data,z));
   }
 }

 void loop() {
  FND_display(FND_DATA[cnt]);
  cnt++;
  if( cnt>17) cnt = 0;
  delay(1000);
 }//끝