달력

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
2016. 2. 12. 04:14

마이크 녹음 하기 작품/A.I2016. 2. 12. 04:14


먼저 마이크가 컴퓨터에 연결되어서 인식되고 있는지 확인한다. 다음 명령어를 커맨드 라인에 쳐서 확인.

lsusb



그다음, 마이크 녹음 볼륨을 높여야 한다. 

다음 명령어를 입력하고 -> F6번을 눌리고 -> 오디오 장치를 선택한 후 -> F4를 누르고 -> 마이크의 음성을 높인다.

alsamixer

    

녹음 프로그램이 마이크를 제대로 인식하는 지 확인한다.

arecoed -l


녹음을 한다.

arecord -D plughw:1,0 test.wav


녹음한 것을 들어본다.

play test.wav






참고

http://diyhacking.com/best-voice-recognition-software-for-raspberry-pi/

http://linux.die.net/man/1/arecord

'작품 > A.I' 카테고리의 다른 글

녹음  (0) 2016.07.01
A.I 소스  (0) 2016.02.12
test to speech  (0) 2016.02.12
google speech to text  (0) 2016.02.10
링크  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 12. 00:02

test to speech 2016. 2. 12. 00:02

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2016. 2. 11. 06:19

system() 함수 Lilux2016. 2. 11. 06:19

http://sosal.kr/18

http://bokdong2.tistory.com/46

'Lilux' 카테고리의 다른 글

부트로고 변경하기  (0) 2016.02.12
api 천국  (0) 2016.02.12
파일 및 폴더 이동 명령어 - cp , mv  (0) 2016.02.09
vi 에디터 꾸미기  (0) 2016.02.09
리눅스 기본 명령어  (0) 2016.01.31
:
Posted by youjin.A
2016. 2. 10. 00:21

google speech to text 2016. 2. 10. 00:21

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2016. 2. 9. 21:24

파일 및 폴더 이동 명령어 - cp , mv Lilux2016. 2. 9. 21:24

cp

파일이나 폴더를 다른 디렉터리에 복사시키는 명령어

cp    [옵션]    [복사할 대상]    [목적지의 위치 및 이름]


[복사할 대상]에는 복사하고자 하는 파일이나 폴더를 입력한다. 이때 복사대상은 절대주소든 상대주소든 상관없이 주소를 적어줘야 한다.

[목지지의 위치 및 이름]에는 붙여쓰기 할 위치를 적거나 복사를 할 때 바꿀 이름을 적는다. 

최종 목적지의 이름이 존재하지 않으면 그 이름으로 복사 대상의 이름을 바꿔서 저장한다.

폴더를 복사할 경우 [옵션]에 -r 넣어준다.

cp    test    ../folder2/copy_test

- /folder2 폴더가 없으면 오류.

- /folder2/copy_test 폴더가 없으면 test파일을 folder2폴더 아래에 copy_test라는 이름으로 복사. => /folder2/copy_test

- /folder2/copy_test 폴더가 있으면 test파일을 folder2폴더 아래로 복사. => /folder2/copy_test/test



예)

위의 예제에서 folder2는 비어있는 폴더이다.

folder1에는 test라는 파일이 있으며 파일의 내용은 "hello / world" 이다.

이제 folder1에 있는 test라는 파일을 forder2에 복사해보자.


 맨 윗줄의 명령어는 파일 test를 folder2에 copy_test라는 이름으로 복사한 것이다.

확인하기 위해서 folder2로 이동하면 copy_test라는 파일이 생긴것을 알 수 있고 그 내용이 folder1에 있던 test와 같음을 확인하였다. 



mv

파일이나 폴더를 다른 디렉토리로 옮기는 명령어.

mv    [옵션]    [원본 파일이나 폴더]    [목적지 폴더 및 이름]


사용 원리는 cp와 똑같다. 

다만 차이점은 cp를 쓰면 원본 파일이 원래 있는 디렉터리에 그대로 있지만 mv를 쓰면 원래 파일은 없어진다.


예)

위의 cp 예제에 이어서 바로 mv명령어를 써보았다. 

    

현재 folder1에는 test라는 파일이 있다.

mv명령어로 folder2로 파일을 origin_test라는 이름으로 바꿔서 옮긴다음에는 folder1에 test파일이 없는 것을 확인할 수 있다.






'Lilux' 카테고리의 다른 글

부트로고 변경하기  (0) 2016.02.12
api 천국  (0) 2016.02.12
system() 함수  (0) 2016.02.11
vi 에디터 꾸미기  (0) 2016.02.09
리눅스 기본 명령어  (0) 2016.01.31
:
Posted by youjin.A
2016. 2. 9. 19:20

vi 에디터 꾸미기 Lilux2016. 2. 9. 19:20

/ect/vim 폴더에 vimrc라는 파일이 있는데 이것이 vi의 설정 파일이다.

여기에 있는 내용들을 모두 지우고 다음의 명령문들을 복붙하면 vi 에디타에 각 줄의 넘버와 들여쓰기 등등의 기능을 쓸 수 있다.


  set autoindent " 자동으로 들여쓰기를 한다.

  set cindent " C 프로그래밍을 할때 자동으로 들여쓰기를 한다.

  set smartindent " 좀더 똑똑한 들여쓰기를 위한 옵션이다.

  set nowrapscan " 검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않는다.

  set nobackup " 백업 파일을 만들지 않는다.

  set visualbell " 키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 한다.

  set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸)를 보여준다.

  set tabstop=4 " Tab을 눌렀을 때 8칸 대신 4칸 이동하도록 한다.

  set shiftwidth=4 " 자동 들여쓰기를 할때 4칸 들여쓰도록 한다.

  set number

  set bs=2

  set nocp

  colorscheme evening

  syntax on

  if $LANG[0] == 'k' && $LANG1 == 'o'

  set fileencoding=korea

  endif


다음은 위의 설정들을 적용한 다음 vi에티터를 쓴 화면이다.



'Lilux' 카테고리의 다른 글

부트로고 변경하기  (0) 2016.02.12
api 천국  (0) 2016.02.12
system() 함수  (0) 2016.02.11
파일 및 폴더 이동 명령어 - cp , mv  (0) 2016.02.09
리눅스 기본 명령어  (0) 2016.01.31
:
Posted by youjin.A
2016. 2. 8. 22:56

74HC595 hello world! 아두이노/출력2016. 2. 8. 22:56

우노는 I/O핀이 총 20개인데 74HC595를 사용하면 핀 3개를 이용해서 사용할 포트를 거의 무한대로 늘릴 수 있다!!!

74HC595는 시프트 레지스터 중 하나인 직렬 입력/병렬 출력 시프트 레지스터에여.

칩 하나당 데이터 핀1에 8개의 출력을 병렬로 낼 수 있다는 것이죠!

그 원리는 테블렛을 산 기념으로 동영상으로 설명 ㅋㅋ

회로:

 

ST_CP에 1uF 커패시터가 GND와 연결되어 있는데, 이게 없으면 업로드 할 때, LED가 다 꺼진다.

즉, 업로드 전 LED상태 -> LED다 꺼짐-> 업로드한 LED상태로 ...

별 문제는 아니지만 왜 이런 현상이 일어나는지는 잘 모르겠다.

1uF을 붙여주면 업로드 전 LED상태 -> 업로드한 LED상태로 정상적으로 넘어간다.

 

 

이미지 뽑기:

http://www.georgegardner.info/electronics/arduino/easy-font-creation-for-led-matrix-from-truetype-system-fonts.html

이 사이트에서 글 읽다가 엄청난 프로그램 발견!!
http://www.mikroe.com/glcd-font-creator/#/ GLCD font creator라는 무료 프로그램이다.
이 프로그램은 이용하면 원하는 이미지를 내가 그리면 자동으로 16진수로 나온다.
원래는 노가다로 해야됨... ㅋㅋ
예를 들어 파일->뉴폰트->뉴를 클릿해서 내가 다음과 같은 이미지를 그리면~

 

 

그리고 파일->뉴폰트->임폴트를 누르고 mikro C를 누르면 아래와 같이 16진수가 나옴

 

 

 

코드:

위에서 설명한 595의 원리를 이용해서 다음 이미지를 순차적으로 한줄로 나오게 해봤다.

그러므로 만든 것을 좌우로 빠르게 흔들면 다음과 같은 이미지를 볼 수 있을 것이다.

이것은 POV 즉, 잔상효과의 기본 원리가 되죵

 

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
const int DS = 2;
const int SH_CP = 3;
const int ST_CP = 4;
int image[]={0x08, 0x18, 0x3C, 0x7E, 0xFF, 0x7E, 0x3C, 0x18};
 
void setup()
{
  pinMode(DS, OUTPUT);
  pinMode(SH_CP, OUTPUT);
  pinMode(ST_CP, OUTPUT);
}
 
void loop()
{
  for(int i=0; i<8; i++){
  update74595(image[i]);
  delay(500);
  }
}
 
void update74595(int data)
{
  digitalWrite(ST_CP, LOW);
  shiftData(DS, SH_CP, data);
  digitalWrite(ST_CP, HIGH);//rising edge on storage register
}
 
void shiftData(int DS, int SH_CP, int data)
{
  for(int i=7; i>=0; i--)
  {
    digitalWrite(SH_CP, LOW);
    boolean oneBit = bitRead(data, i);
    digitalWrite(DS, oneBit);
    digitalWrite(SH_CP, HIGH);//rising edge on shift register
  }
}

 

 

 

:
Posted by youjin.A

위와 같이 찰리플랭싱 회로로 연결되어 있는 상태에서 불빛을 이동시키는 것을 해본다. 

 

부품:

앞에서 만든 charlieplexing 모듈(330옴 저항 4개, LED 12개)

 

회로:

 

 

코드:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const int pins[] = {2, 3, 4,5};
const int pairs[][2]={{1,0},{2,0},{2,1},{3,0},{3,1},{3,2}};
int numberOfPins = sizeof(pins)/sizeof(pins[0]);
int sizeOfLeds= numberOfPins * (numberOfPins-1);
int top[][12]={
{1,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0},
{1,1,1,0,0,0,0,0,0,0,0,0},
{1,1,1,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0,0},
{1,1,1,1,1,1,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0,0,0,0,0},
{0,0,1,1,1,1,1,1,0,0,0,0},
{0,0,0,1,1,1,1,1,1,0,0,0},
{0,0,0,0,1,1,1,1,1,1,0,0},
{0,0,0,0,0,1,1,1,1,1,1,0},
{0,0,0,0,0,0,1,1,1,1,1,1},
{0,0,0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,0,0}};
 
int sizeOfRow = sizeof(top)/sizeof(top[0]);
int sizeOfCol = sizeof(top[0])/sizeof(top[0][0]);
 
void setup()
{
}
 
void loop()
{
  for(int i=0; i<sizeOfRow; i++)
  showCharlieplexing(top[i], 100);  
}
 
void showCharlieplexing(int * image, unsigned long duration)
{
  unsigned long start = millis();
  while( start + duration > millis())
     multiplexing(image);
}
 
//repeat on instant
void multiplexing(int * image)
{
     for(int j=0; j<sizeOfCol; j++)
     {
      int pixel = image[j];
      setLed(j, pixel);
    
      delayMicroseconds(300);
      //delay(100);
  
      setLed(j, LOW);  
     }
}
  
void setLed(int led, boolean state)
{
 //check the OUTPUT pins
  int indexA = pairs[led/2][0];
  int indexB = pairs[led/2][1];
  int pinA = pins[indexA];
  int pinB = pins[indexB];
 
  for(int i=0; i < numberOfPins ; i++) 
  {
    //make rest of pins INPUT mode
   if(state == 1)
   if(pins[i] != pinA && pins[i] != pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);}
    //make the pins INPUT mode 
   if(state == 0)
   if(pins[i] == pinA || pins[i] == pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);
     return;}
  }
 
 //if even, right way. if odd, changed.    
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  if(led % 2 == 0)
  {digitalWrite(pinA, HIGH);
   digitalWrite(pinB, LOW);}
   else
  {digitalWrite(pinA, LOW);
   digitalWrite(pinB, HIGH);}
}

 


:
Posted by youjin.A

부품:

charlieplexing 모듈(330옴 저항 4개, LED 12개)

 

부품설명:

앞서 했던 8*8 도트 매트릭스는 이미 만들어진 회로를 산 것이였습니다.

이번 charlieplexing 모듈은 만들어 보겠습니다. 

이 방법으로 핀4개로 LED 12를 제어할 수 있습니다.  

330옴 저항과 4개와 LED 12개를 위와 같이 연결합니다.

charlieplexing 회로의 원리는

LED는 오직 애노드가 캐소드보다 양극일 때만 켜진다는 사실입니다. 

즉, LED3은 오직!! 핀0이 HIGH이고 핀2가 LOW일만 켜지잖아요? 

이 방법을 사용하면  

5개의 핀으로 5*4=20개의 LED 

6개의 핀으로 6*5=30개의 LED 

7개의 핀으로 7*6=42개의 LED를 제어할 수 있습니다. 

 

회로: 

아두이노 디지털 핀 2,3,4,5에 연결합니다.

우리는 여기서 0~5의 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
53
54
55
56
57
58
59
60
61
62
63
64
65
const int pins[] = {2, 3, 4,5};
const int pairs[][2]={{1,0},{2,0},{2,1},{3,0},{3,1},{3,2}};
int numberOfPins = sizeof(pins)/sizeof(pins[0]);
int sizeOfLeds= numberOfPins * (numberOfPins-1);
 
void setup()
{
}
 
void loop()
{
  //light LED useing multipexing one by one in sequence
  multiplexing(6);   
}
 
//repeat on instant
void multiplexing(byte Level)
{
  for(int i=0 ; i<sizeOfLeds ; i++)
   {
    if(i<Level)
    setLed(i, HIGH);
    else
    setLed(i, LOW);
    
    delayMicroseconds(300);
    //delay(300);
  
    setLed(i, LOW);  
   }
}
  
void setLed(int led, boolean state)
{
 //check the OUTPUT pins
  int indexA = pairs[led/2][0];
  int indexB = pairs[led/2][1];
  int pinA = pins[indexA];
  int pinB = pins[indexB];
 
  for(int i=0; i < numberOfPins ; i++) 
  {
    //make rest of pins INPUT mode
   if(state == 1)
   if(pins[i] != pinA && pins[i] != pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);}
    //make the pins INPUT mode 
   if(state == 0)
   if(pins[i] == pinA || pins[i] == pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);
     return;}
  }
 
 //if even, right way. if odd, changed.    
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  if(led % 2 == 0)
  {digitalWrite(pinA, HIGH);
   digitalWrite(pinB, LOW);}
   else
  {digitalWrite(pinA, LOW);
   digitalWrite(pinB, HIGH);}
}

 

 

코드설명:

우선, charliepexing 회로를 제어하는 것을 이해하기 위해서

가장 아래에 있는 setLed() 함수부터 설명하겠습니다. 

setLed(LED번호, HIGH)는 LED를 켜고, setLed(LED번호, LOW)는 LED를 끕니다. 

setLed(LED번호, HIGH)부터 설명할게요~ 

각 LED를 켜기위해서는 핀의 상태는 다음과 같아야 합니다. 

 LED

 핀

 0

10 

11 

 1

 L

 H

0

0

L

I

H

H

I

I

L

I

H

0

0

0

0

0

0

0

0

0

1

0

0

I

H

I

L

0

0

0

0

0

0

0

0

0

0

1

0

L

I

I

H

0

0

0

0

0

0

0

0

0

0

0

1

H

I

I

L

그래서 맨먼저 LED 번호를 입력받으면,

OUTPUT핀을 체크합니다. 여기서 OUTPUT은 HIGH와 LOW를 설정하는 것이죠~

그리고 변수 pinA와 pinB에 아두이노 핀 번호를 저장합니다.

예를 들어, LED0을 켜려면,

OUTPUT핀은 1과 0이고,

pinA와 pinB에 아두이노 핀 번호 2와 3을 저장합니다.

다음으로, HIGH이니까 (state==1)인 경우,

OUTPUT핀이 아닌 핀들은 INPUT모드로 설정합니다.

그래서 다른 핀들이 켜지지 않도록 합니다.

예를 들어, LED0인 경우 2,3번 핀은 I모드가 되는 거죠.

다음으로, LED번호가 짝수일 경우에는 pinA를 H로 pinB를 L로 설정하고,

LED번호가 홀수일 경우에는 pinA를 L로 pinB를 H로 설정합니다.

예를 들어, LED0인 경우 1번 핀이 H, 2번 핀이 L로 설정됩니다.

이렇게 해서 LED번호를 입력하면 분홍색 표와 같이 핀이 설정 되는 것입니다.

setLed(LED번호, LOW)는 중간에 if(state == 0)을 보세요. 

이 경우에는, 위에서 체크하여 pinA,B에 저장된 핀들이  

INPUT모드로 설정되어 입력된 LED가 꺼지게 되죠. 

그리고 return; 때문에 함수가 종료되죠. 

이제 charlieplexing 제어를 이해하셨나요?  

결국 켜고자 하는 LED를 입력받아서 분홍색 표와 같이 핀들을 설정하는 것이죠^^! 

 

 

그럼, 코드의 처음부터 설명하겠습니다. 

loop()함수를 보세요.  

multiplexing()함수에 6이 입력되에 있는 데, 이것은 6개의 LED를 켠다는 것입니다. 

그럼,  multiplexing()함수를 이해해 보겠습니다. 

백문이 분허일견이죠?  

delayMicroseconds(300);  //delayMicroseconds(300); 

 //delay(300);을                delay(300);                   으로 바꾸어 업로드 해봅시다 

그럼 앞서와 같이 LED가하나하나 씩 순서대로 켜집니다. 

이것을 setLed()함수로 구현한 것이죠! 

이렇게 하여 우리가 보기에는 동시에 켜진것으로 인식되는 것이죠!     


:
Posted by youjin.A

부품:

세븐 세그먼트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