오디오 쿠키는 작고 재미있는 오디오 툴들을 제작합니다

    EW4SM 목차
  1. LED Level Meter
  2. 기초 회로 실습
  3. Arduino
    1. 프로그래밍 기초
    2. 연산자와 IF문
    3. PAN Knob 구현
    4. FOR Loop, 레벨 표시
    5. Serial로 값 표시
    6. DO-WHILE 문법
    7. FUNCTION 사용
  4. Mini Powered Speaker
  5. Fader Box
    1. Passive Volume
    2. Transformer
    3. Digital UP/DOWN
    4. Digital Volume I
    5. Digital Volume II
    6. Fader ADC
    7. Balanced Output
    8. D.Volume & Balanced
    9. Flying Fader
  6. USB AudioBox (DAC)
    1. AudioBox
  7. MIDI Controller 만들기
    1. Hardware Setup
    2. MIDI Spec.
    3. MIDI Software Programming

Basic Sketch / Function 사용하기

반복되는 문장을 간단하게 줄여주는 Function을 사용하는 실습입니다. FND라는 문자 출력 디스플레이를 사용합니다.

1. 미리보기

FND에 대하여...

  • FND는 LED 8개가 들어있는 출력 장치다.
  • 일반적으로 숫자나 문자를 표시하는데 사용한다.
  • LED는 위쪽부터 시계방향으로 a, b, c, d, e, f 기호로 표시하고 가운데 있는 LED는 g, 옆에 있는 소숫점 표시 LED를 dot 라고 부른다.
  • LED가 8개 사용되지만, FND 한 글자에 10개의 접점이 있다.
  • 접점 10개 중 8개는 각 LED의 Anode 혹은 Cathod 쪽과 연결되어 있다.
  • 나머지 2개 접점은 공통 Anode 혹은 공통 Cathod다.
  • FND가 공통 Anode 타입인지 Cathod 타입인지 구입할때 잘 살펴야 한다.
  • 공통 Anode, Cathod에 아두이노 출력의 Low/High를 제공하면 FND 전체가 켜지고 꺼진다.

2. 준비물

  • 컴퓨터
  • USB 케이블
  • Arduino Board 1개
  • 브레드보드와 점퍼선
  • FND 1개
  • FND가 없을 땐 LED 8개
  • 220ohm 저항 8개

3. BreadBoard에 세팅하기

  • LED 8개를 Active LOW로 3~10번에 연결한다.
  • 11번은 FND의 CA에 연결한다.
  • FND가 없으면 LED의 Anode쪽에 아두이노 11번을 연결한다.

4. 스케치

	1:	#define		fnd_a		3
	2:	#define		fnd_b		4
	3:	#define		fnd_c		5
	4:	#define		fnd_d		6
	5:	#define		fnd_e		7
	6:	#define		fnd_f		8
	7:	#define		fnd_g		9
	8:	#define		fnd_dot		10
	9:	#define		fnd_vcc		11
	10:
	11:	void setup() {
	12:		for(int i=fnd_a; i<=fnd_vcc; i++) pinMode(i, OUTPUT);
	13:	}
	14:
	15:	void fndOn() {
	16:		digitalWrite(fnd_vcc, HIGH);
	17:	}
	18:
	19:	void fndOff() {
	20:		digitalWrite(fnd_vcc, LOW);
	21:	}
	22:
	23:	void fndSet(int a, int b, int c, int d, int e, int f, int g, int dot) {
	24:		digitalWrite(fnd_a, a);
	25:		digitalWrite(fnd_b, b);
	26:		digitalWrite(fnd_c, c);
	27:		digitalWrite(fnd_d, d);
	28:		digitalWrite(fnd_e, e);
	29:		digitalWrite(fnd_f, f);
	30:		digitalWrite(fnd_g, g);
	31:		digitalWrite(fnd_dot, dot);
	32:	}
	33:
	34:	void loop() {
	35:		fndOn();
	37:		for(int i = 0; i < 10; i++) {
	38:			switch(num) {
	39:				case 0 : fndSet(LOW, LOW, LOW, LOW, LOW, LOW, HIGH, HIGH);	break;
	40:				case 1 : fndSet(HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH);	break;
	41:				case 2 : fndSet(LOW, LOW, HIGH, LOW, LOW, HIGH, LOW, HIGH);	break;
	42:				case 3 : fndSet(LOW, LOW, LOW, LOW, HIGH, HIGH, LOW, HIGH);	break;
	43:				case 4 : fndSet(HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW, HIGH);	break;
	44:				case 5 : fndSet(LOW, HIGH, LOW, LOW, HIGH, LOW, LOW, HIGH);	break;
	45:				case 6 : fndSet(HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, HIGH);	break;
	46:				case 7 : fndSet(LOW, LOW, LOW, HIGH, HIGH, LOW, HIGH, HIGH);	break;
	47:				case 8 : fndSet(LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH);	break;
	48:				case 9 : fndSet(LOW, LOW, LOW, HIGH, HIGH, LOW, LOW, HIGH);	break;
	49:			}
	50:			delay(500);
	51:		}
	52:	}
			

5. 스케치 자세히 보기

5.1 Function 사용하기

				15:	void fndOn() {
				16:		digitalWrite(fnd_vcc, HIGH);
				17:	}
				18:
				19:	void fndOff() {
				20:		digitalWrite(fnd_vcc, LOW);
				21:	}
				
  • 라인 15에서 처음 보는 Function이 나왔다. 펑션은 함수라고도 한다.
  • fndOn() 이라는 함수인데, 이름에서 보는 것 처럼 fnd를 ON 시킨다는 함수다. 아두이노에 들어있는 함수가 아니라 직접 만들어 쓰는 함수다.
  • 내용을 보면 fnd_vcc 핀을 HIGH로 한다는 뜻이다. 기존의 스케치에서 흔히 보던 내용이다.
  • 이렇게 함수를 만들면 아무데서나 fndOn() 이라는 이름으로 사용할 수 있다.
  • fndOff()도 마찬가지다. 내용만 다르다. fnd를 끄는데 사용한다.

5.2 함수 만들기

함수의 형식은 다음과 같다.

					반환값 함수이름(함수에 넘겨주느 값) {
						함수에 포함하는 명령어들
					}
				
  • 반환값: 함수의 결과를 돌려주는 값이다. 돌려주는 값의 타입을 써준다. 예를들어 정수형 값을 돌려줄 때는 int 라고 쓴다.
  • 돌려주는 값이 없을 때는 void 라고 쓴다. 지금까지 보고 있는 setup, loop 등이 여기에 해당한다.
  • 함수 이름: 아두이노가 사용하고 있는 단어가 아니면 상관 없다. 보통은 좀 긴 이름으로 지으면 아두이노와 겹치지 않는다. 무작정 긴 이름을 만드는 것 보다, 함수의 내용을 연상할 수 있는 이름이 좋다. 여기서 사용한 fndOn, fndOff 같은 이름이 그런 예다.
  • 함수에 넘겨주는 값: 함수 내부에서 사용할 참조 값을 써준다. 변수 타입도 함께 써야 한다. 다른 곳에서 이 함수를 호출할때 이 변수 타입에 맞게 넘겨주는 값을 구성해야 한다.
  • 다음에 나오는 함수인 fndSet()을 가지고 더 살펴보자.

5.3 다른 함수 fndSet()

FND 디스플레이를 세팅하는 함수다. 내용은 아두이노의 출력 8개를 지정하는 것이다. 자주 사용하는 명령어를 모아 함수를 만들어 두면 프로그래밍이 수월해진다.

				23:	void fndSet(int a, int b, int c, int d, int e, int f, int g, int dot) {
				24:		digitalWrite(fnd_a, a);
				25:		digitalWrite(fnd_b, b);
				26:		digitalWrite(fnd_c, c);
				27:		digitalWrite(fnd_d, d);
				28:		digitalWrite(fnd_e, e);
				29:		digitalWrite(fnd_f, f);
				30:		digitalWrite(fnd_g, g);
				31:		digitalWrite(fnd_dot, dot);
				32:	}
				
  • FND 디스플레이에 글자 하나를 쓸 때마다 digitalWrite()를 8번이나 써야 한다. -_-;
  • 그래서 위와 같이 fndSet() 이라는 함수를 만들어 놓으면 글자 하나를 출력할때 1번만 명령어를 보내면 된다.
  • 23번줄을 살펴보자. 반환값으로 void이 명시되었다. 돌려주는 값이 없다는 뜻ㅇ다. FND에 출력만 하고 값을 돌려주지는 않는다.
  • 이 함수의 이름은 fndSet이라고 지었다.
  • () 안의 내용은 이 함수에 넘겨주는 값으로 a~dot 까지 8개가 사용되었다. 각 변수들은 모두 int 타입이다.
  • 24번~31번 줄은 FND의 각 LED를 세팅하는 명령어들이다.
  • () 안에 지정한 변수 이름들은 함수 내에서 그대로 사용할 수 있다. 변수 a로 넘겨받은 값은 함수 내에 a 라고 쓴 지점에 그대로 쓰인다.

5.4 SWITCH 문법

				38:			switch(num) {
				39:				case 0 : fndSet(LOW, LOW, LOW, LOW, LOW, LOW, HIGH, HIGH);	break;
								.....
				49:			}
				
  • SWITCH 문법은 ( ) 안의 변수 값에 따라 처리 내용이 달라진다.
  • num 값이 나올 수 있는 경우를 case 로 분리한다.
  • num 값이 0 일때 case 0 : 에 해당하는 명령어를 실행한다.
  • case 에 해당하는 명령어는 break; 를 만날 때까지 많은 명령어를 포함 할 수 있다.
  • 위 경우에서 fndSet() 함수를 쓰지 않고 digitalWrite() 를 8번 사용할 수도 있지만, 편리한 방법을 두고 돌아갈 필요는 없으니 그렇게 사용하지는 않는다.
  • break; 를 사용하지 않으면 다음 case 로 넘어가 다음 case의 명령어를 실행한다. break; 를 만나거나 switch 문장의 {} 가 끝날때까지 다음 명령어로 계속 넘어간다.
  • case 0 에서 fndSet() 함수를 한번 실행했다. () 안에 넘겨주는 값 8개를 세팅했다.
  • SWITCH 대신 IF문으로 구성해도 가능하지만, 편리한 방법을 두고 돌아가는 방법이라 할 수 있겠다.

FND가 없을 때 실습

  • LED를 위쪽부터 a, b, c, d, e, f, g, dot 로 배정하고 세팅한다.
  • 실습은 공통 Anode 타입을 사용했으므로, 여기서도 8개 LED의 Anode를 공통으로 하는 회로를 구성한다.
  • LED 배치가 FND와 다르다는 것 말고는 실습 내용이 모두 똑 같다.

7. 과제

  • 6.1 FND가 다음 숫자로 넘어갈 때 깜빡이도록 만들어보자.
  • 6.2 FND에 숫자를 표시하지 않고 테두리에서 빙글빙글 맴도는 모양으로 출력해보자.

아두이노 기초 문법은 여기까지입니다. 다음 부터는 조금 더 재미있는 프로젝트로 나아갈 것입니다. 기대해주세요~~ ^^

최종수정 2014.02.18 16:35:27