달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

부품:

세븐 세그먼트SR-4156K, MAX7221 1개, 10K저항 1개, 0.1uF과 10uF커패시터 1개씩

 

부품설명:


<그림 1>과 <그림 2>는 각각 SR-4156K와 MAX7221의 핀 배치입니다.

3.10에서는 아두이노 핀을 12개 사용했지만

24P DIP IC인 MAX7221를 이용하여

아두이노의 3개의 핀만으로 같은 디스플레이를 구현하겠습니다~

<표 1>은 MAX7221의 각 핀의 역할을 나타내고 있습니다.

이번에 사용하는 핀은 GND와 V+를 포함해서  

SEG DP~SEG G, DIG0~DIG3, CS, CLK, DIN, ISET핀들 입니다.  

우선 SEG DP~SEG G 핀들은 세븐 세그먼트에 각각 연결하는 핀이구요~

DIG0~DIG3또한 세븐 세그먼트의 Digit핀들과 각각 매칭시키는 핀입니다.

CS핀이 LOW상태일 때만, 

아두이노에서 MAX7221에 데이터가 보내져서 저장됩니다. 

CLK는 아두이노로부터의 클락이 입력되어,  

MAX7221의 내부 쉬프트 레지스터로 이동합니다. 

DIN은 데이터가 입력됩니다.

마지막으로, ISET는 세그먼트LED에 흐르는 최대 전류를 설정하기 위해서,  

외부 저항과 연결하여 V+와 연결합니다.  

 

회로연결:

첫번째 부분은 7-세그먼트와 MAX7221을 연결하는 부분입니다.

7-세그먼트와 MAX7221의 SEG dp,a,b,c,d,e,f,g를 각각 매칭하고,

7-세그먼트의 맨 오른쪽 Digit부터 순서대로 0, 1, 2, 3의 Digit를 각각 매칭합니다.

두번째 부분은 아두이노에서 MAX7221에 신호를 보내기위해서 연결하는 부분입니다.

아두이노와 MAX7221의 핀을 회로와 맞게 연결해야합니다~

세번째는 부분은 칩에 전원을 연결하는 부분입니다.

A부분은 GRD와 , B부분은 V+와 연결합니다.

B부분의 18핀에 연결되어 있는 저항을 연결하지 않으면 LED가 켜지지 않습니다.

이 저항은 LED에 흐를 최대전류를 제어하기 위해 사용합니다.

저는 33K를 사용했습니다.

10K를 사용하면 더 밝아집니다.

그리고 그림에는 나와있지 않지만,  

A와 B에 0.1uF과 10uF커패시터을 병렬로 연결합니다. 

왜냐하면 LED가 켜지거나 꺼질때 발생되는 잡음을 예방하기 위해서 입니다. 

 

코드: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <SPI.h>
 
const int CS = 10;
const int numberOfDigits = 4;
 
void setup()
{
  //initialize SPI
  SPI.begin();
  pinMode(CS, OUTPUT);
  //when CS pin LOW, All SPI commands are received by that chip.
  digitalWrite(CS, LOW);
  sendCommand(12, 1);
  sendCommand(15, 0);
  sendCommand(10, 8);
  sendCommand(11, numberOfDigits);
  sendCommand(9, 255);
  //until it is set HIGH.
  digitalWrite(CS, HIGH);
}
 
void loop()
{
  for(int n=0; n<10000; n++)
  {display4Number(n);
   delay(100);}
}
 
//This function extracts the value of each digit
void display4Number( int number )
{
  for(int i = 1; i <= numberOfDigits; i++)
  {
    byte character = number % 10;
    //suppress zeros
    if( (i>1) && (number == 0) )
    character = 0xf;
    
    sendCommand(i, character);
    
    number = number / 10;
  }
}
 
//This function sends the value of each digit to the MAX7221.
void sendCommand( int command, int value)
{
  digitalWrite(CS, LOW);
  SPI.transfer(command);
  SPI.transfer(value);
  digitalWrite(CS, HIGH);
}

 

 

코드설명:

우선, 아두이노에는 SPI(본체에 연결하는 주변접속기)장치와 통신을 할 수 있도록 하는  

SPI라이브러리가 포함되어있습니다. 

그래서 #include <SPI.h>로 라이브러리를 불러왔습니다.

여기서는 두개의 라이브러리 함수가 사용되고 있습니다.

하나는 setup()함수 부분에 SPI.begin()으로  

MAX7221을 초기화합니다. 

그리고 또 하나는 sendCommand()함수 부분에 SPI.transfer()으로  

SPI메세지를 보내는 함수입니다. 

그 다음으로, setup()함수 내부을 보세요.

CS핀이 LOW상태가 된후,

sendCommand()함수로 MAX7221에 여러가지 명령을 보냄니다.

그리고 CS핀을 다시 HIGH로 만듭니다.

아래부분에 sendCommand()함수를 보면 입력된 두 값이

SPI.transfer()함수에 의하여 MAX7221에 보내졌다는 것을 알 수 있습니다.

각각의 명령은 식별자 값으로 되어있기때문에,

보낸 명령들을 이해하기 위해서는 표 2의 오른쪽에 HEX CODE를 봐야합니다.

sendCommand(12, 1)은 셧다운 모드로 설정한 것입니다.

sendCommand(15. 0)은 디스플레이 테스트를 끈것입니다.

sendCommand(10, 8)은 강도를 조절한 것으로

0~15의 범위중에서 중간인 8로 설정했습니다.

sendCommand(11, numberOfDigits)는 MAX7221에서  

4Digit까지의 스캔으로 제한한 것입니다. 

sendCommand(9, 255)는 표준 7-세그먼트를 사용할 수 있도록 설정한 것입니다.

그 다음으로, loop()함수를 보시죠.

0~9999까지의 수가 display4Number()함수에 입력됩니다.

그러면 display4Number()함수를 이해해 보겠습니다.

display4Number()함수는 4자리수가 입력되면

각각의 디지트와 수를 추출하는 함수입니다.

예를 들어 4자리수가 2457이면

(디지트, 수)로 표현했을 때

(1, 7) (2, 5) (3, 4) (4, 2)로 추출하여  

이 값들을 sendcommand()함수에 보내는 것입니다. 

이 명령들을 이해하기 위해서 다시 <표2>의 HEX CODE를 봐야겠네요~

식별자값으로 1~8까지는 각각의 디지트를 의미합니다.

그러니까 sendcommand(1, 7)은 Digit0에 숫자 7을 나타내어라

sendCommand(2, 5)는 Digit1에 숫자 5를 나타내어라

sendCommand(3, 4)는 Digit2에 숫자 4를 나타내어라

sendCommand(4, 2)는 Digit3에 숫자 2를 나타내어라라는 명령인거죠.

그리고 

 if( (i>1) && (number == 0) )

      character = 0xf  

이 코드는 숫자가 0012일 때

앞의 두 디지트는 켜지 않고 12만 켜지게 하는 것입니다.

식별자값 0xf는 세그먼트를 끄는 값이기 때문입니다.

[출처] [세븐세그먼트] 3|작성자 DEW


:
Posted by youjin.A