본문으로 바로가기



가변저항(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


결과 영상




댓글을 달아 주세요

  1. 학생 2017.01.06 21:25 신고

    어려운 내용인데 쉬운 설명덕분에 잘 이해했습니다 감사합니다

    • BlogIcon 코딩런 2017.01.07 15:04 신고

      조금 난이도가 있는 내용이죠? ㅎㅎ
      처음부터 이해하려 하지 마시고, 우선은 실습을 먼저 해보고 다음에 프로젝트 할 때 정확히 이해하시면 좋아요!

  2. 메이커 2017.01.10 07:27 신고

    Ied에 저항을 연결 하지 않았네요..
    그런데도 les가 타지도 않고..

    • BlogIcon 코딩런 2017.01.10 09:26 신고

      안녕하세요 메이커님.
      좋은 지적 감사합니다.
      영상을 제작할 때 흐릿하게 보이는면이 있어서 빼고서 진행을 한거구요.
      (11분30초 쯤에 언급을 하긴 했는데... ㅎㅎ)
      직접 실습하실 때에는 저항을 달고 실습을 해주세요.

      저항 없이 실습해도 당장 타지 않는 이유는 부품들마다 자체적으로 보호하기위해 내부적으로 극소량의 내부저항이 들어가 있습니다. 그러므로 무한대의 전류가 흐르진 않겠죠? ^^;

      그래도 실습을 하실 때는 부품과 보드를 보호하기 위해서 당연히 저항을 달아주셔야 합니다.
      회로도는 저항을 달고 다시 올리도록 하겠습니다.
      새해 복 많이 받으세요 ^^

  3. 메이커 2017.01.10 10:08 신고

    친절한 답변 감사합니다

  4. 미대생 2018.02.21 14:00 신고

    예제에서는 가변저항 핀에 -극, ~11, 3.3v 순서대로 연결하셨는데 순서를 바꾸어서 연결해면 안되나요? 바꾸어서 연결해보니 밝기조절이 완전히 안되더라구요.. 그리고 첫번째 예제에서는 왜 굳이 가변저항을 사용하셨는지도 궁금합니다!

티스토리 툴바