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

    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 | 아날로그 입력 처리

1. 준비물

  • Arduino Board 1개
  • 컴퓨터
  • USB 케이블
  • LED 10개
  • 220ohm 저항 10개
  • 10k 볼륨저항 1개
  • 브레드보드와 점퍼선

2. 미리보기

2.1 BreadBoard에 세팅하기

  • LED를 ActiveHigh 연결로 10개 연결한다.
  • LED는 10개 모두 Cathode(-)쪽이 모두 접지와 연결된다.
  • LED의 Anode(+)쪽이 220 저항과 연결된다.
  • 220 저항의 다른 끝은 아두이노의 각 핀들과 연결한다.
  • LED가 연결되는 아두이노 핀은 3번~12번이다.
  • 이 연결로는 아두이노의 출력핀이 HIGH일 때 LED가 켜진다.
  • 가변저항의 한쪽 끝에는 +5V, 다른 끝에는 접지와 연결한다.
  • 가변저항의 가운데 단자와 AnalogIN A0 단자를 연결한다.

3. 스케치 구성

볼륨으로 입력되는 아날로그 값을 읽어 그 값을 10단계 영역으로 표시되는 LED로 출력하는 내용이다.

  • 아날로그 값을 읽어들인다. 읽은 값은 0~1023 사이의 값이다.
  • 읽어들인 값을 0~9 사이의 값으로 변환한다.
  • 결과 값에 해당하는 LED를 켠다.

4. 스케치 자세히 보기

이번에는 문법보다 먼저 스케치를 보고 분석하는 쪽으로 진행해 보자. 다음 스케치를 입력해서 동작되는 것을 먼저 확인한 다음 내용을 분석한다.

	1:		void setup() {
	2:			pinMode(3, OUTPUT);		// LED 0
	3:			pinMode(4, OUTPUT);		// LED 1
	4:			pinMode(5, OUTPUT);		// LED 2
	5:			pinMode(6, OUTPUT);		// LED 3
	6:			pinMode(7, OUTPUT);		// LED 4
	7:			pinMode(8, OUTPUT);		// LED 5
	8:			pinMode(9, OUTPUT);		// LED 6
	9:			pinMode(10, OUTOUT);		// LED 7
	10:			pinMode(11, OUTPUT);		// LED 8
	11:			pinMode(12, OUTPUT);		// LED 9
	12:		}
	13:
	14:		void loop() {
	15:			int analogIN = 0;
	16:			int panVal = 0;
	17:			int ledPin = 0;
	18:			analogIN = analogRead(A0);
	19:			panVal = map(analogIN, 0, 1023, 0, 9);
	20:			ledPin = panVal+3;
	21:			digitalWrite(ledPin, HIGH);
	22:			delay(100);
	23:			digitalWrite(ledPIn, LOW);
	24:		}
			

4.1 analogRead()

analogRead()는 AD컨버터다. ()안에 아날로그 입력핀을 지정해주면 해당 핀의 상태를 읽어와 디지털 값으로 출력한다. 그래서 analogRead() 앞에 출력을 받을 변수를 지정해 주어야 한다.

	15:			int analogIN = 0;
		.....
	18:			analogIN = analogRead(A0);
				

4.2 map()

map()은 범위를 변경시켜주는 역할을 한다. map(변수, 변수의 값 범위 중 낮은 값, 높은 값, 변경될 값의 낮은 값, 높은 값) 형식이다.

	16:			int panVal =0;
		.....
	19:			panVal = map(analogIN, 0, 1023, 0, 9);
				

analogIN에 저장된 0~1023 사이의 값을 0~9로 출력해라 라는 의미다. 1024단계의 값을 10단계로 바꾸는 것이다. 0~102까지는 0, 103~202까지는 1, 203~302까지는 2 이런 식이다. IF문을 사용할 수도 있겠지만 IF문 10개 쓰는 것 보다 map 한번으로 끝나니 훨씬 수월하다.

  • map(analogIN, 0, 1023, 9, 0); 으로 한다면 analogIN에 입력된 값이 0일때는 9, 1023일때는 0으로 출력된다.
  • map의 결과값은 panVal에 저장된다. panVal은 16번 줄에서 이미 정의되어 있다. 정수형 변수로 초기값은 0이 들어있다.

4.3 LED 출력

아날로그로 입력 받은 값을 10단계로 분리해서 값을 정했다. 이제 이것을 출력한다.

	16:			int ledPin = 0;
		.....
	20:			ledPin = panVal + 3;
	21:			digitalWrite(ledPin, HIGH);
	22:			delay(100);
	23:			digitalWrite(ledPin, LOW);
				

0~9 사이로 지정된 결과 값을 3~12번 핀으로 매칭시키는 과정이다. 0이 나오면 3번 LED, 9가 나오면 12번 LED, 5가 나오면 8번 LED가 켜지면 된다. 방법은? 결과값에 3을 더해주면 된다.

  • 16번 줄에서 정의된 정수형 변수 ledPin에 켜야할 LED번호를 지정하고, ledPin 변수를 사용해 LED를 켜본다.
  • 20번 줄에서 결과값+3 해서 켜야할 LED를 지정했다.
  • 21번 줄에서 지정된 LED를 켜고
  • 22번 줄에서 적당히 딜레이 시간을 가진다음 23번 줄에서 껐다.
  • 루프를 돌아 다시 오는데까지 아주 빠른 시간이 소요되므로, 사람이 볼때는 LED가 꺼져 있는 것을 느끼지 못한다.

5. 과제

  • 5.1 22번 줄, 딜레이 시간을 더 크게, 더 작게 변경해보자.
  • 5.2 23번 줄, LED 끄는 것을 생략하고 실행시켜 보자.
  • 5.3 ledPin 변수를 사용하지 않고 map 변수의 값을 그대로 사용하는 방법을 연구해보자. 한마디로, +3을 하지 않고 처리하는 방법.
  • 5.4 소프트웨어를 변경하여 볼륨을 돌리는 방향과 반대로 움직이게 해보자.
  • 5.5 하드웨어를 변경하여 볼륨을 돌리는 방향과 반대로 움직이게 해보자.
최종수정 2014.02.18 16:35:26