개발자/라즈베리파이4

라즈베리파이 FND Flexible Numeric Display 제어

지구빵집 2022. 8. 31. 08:03
반응형

 

 

라즈베리파이 GPIO를 이용하여 숫자 표시기인 FND에 원하는 숫자를 표시해보자. FND는 공통 애노드 형과 공통캐소드 형이 있다. 쉽게 구별하는 방법은 Anode 형은 성적이 좋은 A급이니까 + 로 생각하여 공통 단자에 VCC를 연결한다고 생각하고 Cathod 형은 성적이 좋지 않으면 받는 C 니까 - 라고 생각하여 공통 단자에 GND가 연결된다고 생각하면 기억하기 쉽다. 

 

 

공통 애노드, 캐소드 타입

 

아래는 공통 애노드형과 공통 캐소드형 FND 에서 숫자를 표시하는 방법을 보여준다.  사실 위에 말한 내용만 기억하면 설명이 필요 없다. 애노드 형은 공통 단자가 VCC 이므로 숫자를 만들 때 해당하는 led 신호선에 LOW를 출력하여 숫자를 만들고, 반대로 캐소드 형은 공통 단자가 GND 이므로 해당하는 segment led 신호선에 HIGH를 출력하면 불이 들어온다. 원리만 알면 쉽다. 그렇다고 아들에게 산수를 가르치거나 와이프에게 운전을 가르치려고 시도하면 안 된다. ^^

 

공통 애노드형 숫자 표시

 

공통 캐소드형 숫자 표시

 

단일 FND를 라즈베리파이에 연결할 경우 아래 연결도를 참고한다.

 

FND 연결도

 

소스코드는 아래와 같다.

 

#include <wiringPi.h>

#define FND_SEL_S0	4	

#define FND_DB_A	6
#define FND_DB_B	12
#define FND_DB_C	13
#define FND_DB_D	16
#define FND_DB_E	19
#define FND_DB_F	20
#define FND_DB_G	26
#define FND_DB_DP  21

#define  A_BIT  0x01
#define  B_BIT  0x02
#define  C_BIT  0x04
#define  D_BIT  0x08
#define  E_BIT  0x10
#define  F_BIT  0x20
#define  G_BIT  0x40
#define  DP_BIT 0x80

#define FND_DB_PIN_NUM	8

const int FndNumberTable[10] = {
    A_BIT | B_BIT | C_BIT | D_BIT | E_BIT | F_BIT ,			// '0'
    B_BIT | C_BIT ,											// '1'
    A_BIT | B_BIT | D_BIT | E_BIT | G_BIT,					// '2'
    A_BIT | B_BIT | C_BIT | D_BIT | G_BIT,					// '3'
    B_BIT | C_BIT | F_BIT | G_BIT,							// '4'
    A_BIT | C_BIT | D_BIT | F_BIT | G_BIT,					// '5'
    C_BIT | D_BIT | E_BIT | F_BIT | G_BIT,					// '6'
//    A_BIT | B_BIT | C_BIT ,									// '7'
    0x27,
    A_BIT | B_BIT | C_BIT | D_BIT | E_BIT | F_BIT | G_BIT,	// '8'
    A_BIT | B_BIT | C_BIT | F_BIT | G_BIT,					// '9'
};
const int FndPinTable[8] = {
	FND_DB_A, FND_DB_B, FND_DB_C, FND_DB_D,
	FND_DB_E, FND_DB_F, FND_DB_G, FND_DB_DP
};

int main (void)
{
	if (wiringPiSetupGpio() == -1)
		return 1;
	
	int i;	
	
	pinMode(FND_SEL_S0, OUTPUT);    //Fnd Sel Pin OUTPUT Set
	
	for(i = 0; i<FND_DB_PIN_NUM; i++) {		
		pinMode(FndPinTable[i], OUTPUT);       //Fnd Data Pin OUTPUT Set
	}
	
	while(1)
	{
		digitalWrite(FND_SEL_S0, LOW);
		for( i = 0; i<FND_DB_PIN_NUM; i++)	{
			if(FndNumberTable[7] & (1<<i)) {
				digitalWrite(FndPinTable[i], HIGH);
			}
			else {
				digitalWrite(FndPinTable[i], LOW);
			}
			delay(1);
		}		
	}
	return 0;
}

 

아래 소스코드를 상세히 설명한다.

 

Program Source Description
#include <wiringPi.h> GPIO access library 헤더파일 선언
#define FND_SEL_S0  4 FND_SEL 포트 S0 핀 정의
#define FND_DB_A  6
#define FND_DB_B  12
#define FND_DB_C  13
#define FND_DB_D  16
#define FND_DB_E  19
#define FND_DB_F  20
#define FND_DB_G  26
#define FND_DB_DP    21
FND_DB 포트 A~DP 핀 정의
#define A_BIT   0x01
#define B_BIT   0x02
#define C_BIT   0x04
#define D_BIT   0x08
#define E_BIT   0x10
#define F_BIT   0x20
#define G_BIT   0x40
#define DP_BIT 0x80
FND 각 핀의 비트 값 정의
#define FND_DB_PIN_NUM  8 FND_DB 포트 핀 개수
const int FndNumberTable[10] = {
A_BIT | B_BIT | C_BIT | D_BIT | E_BIT | F_BIT ,
B_BIT | C_BIT , 
A_BIT | B_BIT | D_BIT | E_BIT | G_BIT,
A_BIT | B_BIT | C_BIT | D_BIT | G_BIT,
B_BIT | C_BIT | F_BIT | G_BIT, 
A_BIT | C_BIT | D_BIT | F_BIT | G_BIT,
C_BIT | D_BIT | E_BIT | F_BIT | G_BIT,
A_BIT | B_BIT | C_BIT , 
A_BIT | B_BIT | C_BIT | D_BIT | E_BIT | F_BIT | G_BIT,
A_BIT | B_BIT | C_BIT | F_BIT | G_BIT,
};
FND의 각 비트 조합으로 표현가능한 숫자 배열 선언
const int FndPinTable[8] = {
FND_DB_A, FND_DB_B, FND_DB_C, FND_DB_D,
FND_DB_E, FND_DB_F, FND_DB_G, FND_DB_DP
};
FND 핀 테이블
int main (void)  
{  
if (wiringPiSetupGpio() == -1)
  return 1;
Wiring PiGPIO를 사용하기 위한 설정
pinMode(FND_SEL_S0, OUTPUT); Fnd Sel Pin OUTPUT Set
int i;
for(i = 0; i< FND_DB_PIN_NUM; i++) {
  pinMode(FndPinTable[i], OUTPUT);
}
Fnd Data Pin OUTPUT Set
while(1)
{
 
  digitalWrite(FND_SEL_S0, LOW); FND_SEL 포트 S0 핀에 LOW 신호 출력
  for( i = 0; i< FND_DB_PIN_NUM; i++)  {
   if(FndNumberTable[5] & (1<<i)) {
   digitalWrite(FndPinTable[i], HIGH);
   }
   else {
  digitalWrite(FndPinTable[i], LOW);
   }
   delay(1);
  }
}
숫자 5에 해당하는 FNDLED를 점등하기 위하여 각 비트에 차례로 HIGH/LOW 신호를 출력
return 0;
}
 

 

컴파일과 실행 명령어는 아래와 같다.

 

컴파일 명령어 gcc o fnd fnd.c -lwiringPi 실행파일명을 fnd로 설정하여 컴파일한다.
실행 sudo ./fnd 프로그램을 실행한다.

 

 

 

반응형