본문으로 바로가기



가변저항(Potentiometer)



가변저항이란 저항 값이 고정되지 않는 것을 의미한다. 즉, 사용자의 편의에 따라 저항값을 줄이고 늘리면서 소리의 크기나 밝기 조절 등을 할 수 있는 것을 가변저항이라 한다.

가변저항은 크게 위와같이 드라이버를 사용하여 바꿔주거나 손으로 직접 돌려서 바꿀 수 있는 가변저항이 있다. 드라이버를 사용하는 가변저항은 저항값을 자주 바꿀일이 없을 때 많이 사용하며(내부적인 부품등 으로), 손으로 직접 제어하는 가변저항은 저항 값을 자주 바꿀 때 사용한다(라디오나 밝기를 조절하는 전등같은 경우).


analogWrite(), analogRead()


analog값은 digital값과 다르게 HIGH, LOW가 아니라 조금 더 상세한 값을 지정할 수 있다. digital값은 5V(HIGH), 0V(LOW)값 밖에 표현을 할 수없기 때문에 0V와 5V사이의 값은 analog값으로 표현을 해 주어야 한다.

analogWrite()값은 0~255로 표현이 가능하고, analogRead()값은 0~1023까지 표현할 수 있다. 그러므로 analogRead()를 통해 입력받은 값을 1/4하면 analogWrite()로 출력하여 0~5V까지 표현을 할 수 있다. 

digital값의 LOW(0V)는 analog값으로 0, digital값의 LOW(5V)는 analog값으로 255로 변환할 수 있다. 즉, 2.5V를 표현하고자 한다면 analog값으로 255/2를 하면 대략 127로 표현할 수 있다.

analogWrite()함수를 사용하려면 PWM으로 지정된 핀에서만 가능하다. (3, 5, 6, 9, 10, 11)


PWM(Pulse Width Modulation)


아두이노 보드에 ~표시가 있는 3, 5, 6, 9, 10, 11번 핀을 PWM으로 사용할 수 있다.

아두이노는 핀으로 출력 전압을 조절하는 기능은 없다. 대신 이 PWM을 이용하면 출력 전압을 조절할 수 있다.  

PWM(Pulse Width Modulation)은 펄스 폭 변조를 말하며, 말 그대로 펄스의 폭의 주기를 제어하는 방법이다.

위의 그림을 보면 맨위 그림은 0V를 나타내며, 맨 아래 그림은 5V를 나타낸다. 사이의 값들은 일정하게 펄스폭을 조절하여 on/off를 빠르게 반복하는 형태이다. 이렇게 출력되는 전압값을 일정한 펄스폭은 5V를 유지하고, 나머지 비율은 0V를 주기로 출력하며 전압의 크기를 조절할 수 있다.


PWM 심화


이 내용은 조금더 깊게 이해하고자 하는 분만 보길 바라며, 초보자는 그냥 넘어가도록 한다.

파형의 특성을 살펴보자면, 디지털 시스템에서 나타나는 대부분의 파형은 일련의 펄스로 구성되며, 이를 펄스열이라 하고, 이는 주기 펄스와 비주기 펄스로 분류된다. 주기 펄스 파형은 주기(period, T) 즉 일정한 시간 간격으로 파형이 반복되는 것 중에 하나를 말하며, 주파수(frequency, f)는 주기의 반복률로, 단위는 Hz이다. 비주기 펄스 파형은 일정한 간격으로 반복되지 않고, 펄스폭도 다르며, 펄스 사이의 시간 간격도 다른 펄스들로 구성되어 있다. 펄스(디지털) 파형의 주파수는 주기의 역수로서, f=1/T or T=1/f로 나타낼 수 있다.

주기적인 디지털 펄스 파형의 중요한 특성 중의 하나는 듀티 사이클(Duty Cycle)로서, 이는 주기에 대한 펄스폭의 비를 의미하고, 다음과 같이 백분율로 나타낸다. Duty Cycle=(펄스 폭 / T) x 100%

<최신 디지털 공학 10판 참고>

이러한 식들을 이용해 심화된 프로젝트를 하고자 할 때 유용하게 사용하길 바란다. 참고로 아두이노는 500Hz의 주파수를 가지고 있으므로, T=1/f을 이용하면 주기는 2ms라는 것을 알 수 있다.


실습 내용


1. for문을 이용하여 led의 밝기를 점차 밝게 해보자. 

2. 가변저항을 이용하여 led의 밝기를 조절하자


준비물


아두이노, 브레드보드, 점퍼선 6개, led 1개, 가변저항 1개


회로도





소스코드


실습 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
int led = 11;
 
void setup() {
 
}
 
void loop() {
  for(int i=0; i<256; i++)
  {
    analogWrite(led, i);
    delay(10);
  }
}
cs

ex3-1_led.ino



실습2. 

1
2
3
4
5
6
7
8
9
10
int led = 11;
 
void setup() {
  
}
 
void loop() {
  int a = analogRead(A1);
  analogWrite(led, a/4);
}
cs

ex3-2_led.ino


결과 영상