2020년 8월 28일 금요일

가변저항 : 가장 편하게 전압의 크기를 조절할 수 있는 전자소자

가변저항

가장 편하게 전압의 크기를 조절할 수 있는 전자소자

안녕하세요 ! 하늘입니다. :)

  오늘은 회로를 구성할 때 상당히 많이 쓸 수 있는 소자, 전압을 가장 쉽게 조절할 수 있는 소자에 대해서 소개해드리려고 합니다.

  가변저항 이라는 소자 입니다. 혹은 분압기, potentiometer 등으로 다르게 불려지고 있습니다.

가변 저항

볼륨 조절 장치에 들어 있는 가변 저항

다양한 음향장비에 들어있는 가변 저항


1. 용어 및 정의

  먼저 용어를 읽어봅시다.

  가변 (변하게 하는 것이 가능한) + 저항 이란 뜻으로 임의로 그 크기를 조절할 수 있는 저항이라는 뜻을 가지고 있습니다.


2. 가능한 기능들

  저항이 거의 모든 전자회로에서 다양한 방법으로 쓰이기 때문에 성질이 비슷한 가변 저항 역시 설계자가 원하는 바에 따라 상당히 다양하게 쓰일 수 있습니다.

  가능한 기능의 주요 예시

- 저항 조절

- 저항에 따른 전류 조절

전압의 크기를 조절

  오늘 자세히 알아볼 것은 전압의 크기를 조절하기 위한 가변저항의 사용 방법입니다. 우리 주위에서 볼 수 있는 스피커나 음향장비에서의 볼륨조절장치에 들어있는 가변저항이 이제 설명할 내용과 같은 방법으로 사용 되었습니다.


3. 구조 및 원리

  가변저항의 원리를 알기 위해서는 가변저항의 구조를 볼 필요가 있습니다.

가변 저항


가변 저항의 구조


  가변 저항의 내부를 보게 되면 위의 그림과 같이 3개의 핀이 검은색 저항 물질(resistive material)에 닿아 있는 것을 볼 수 있습니다. (회색 부분은 검은색 부분에 비해서 상대적으로저항이 작은 물질이므로 저항의 크기를 무시할 수 있습니다.) 

 그러면 A 단자부터 W단자까지의 저항은 A부터 와이퍼가 닿아있는 부분까지의 검은 부분의 저항이 됩니다. 만약 와이퍼가 시계방향으로 움직이게 되면 그 길이가 길어져 저항의 A-W까지의 저항의 크기가 커지게 됩니다. 왜냐하면 저항의 크기는 길이에 비례하기 때문이죠.
  R = k * l / A ( k : 비례 상수, l : 저항의 길이, A : 저항의 단면적)

  반대로 W단자 부터 B단자까지의 저항의 크기는 길이가 짧아져서 줄어들게 됩니다.

  위와 같이 저항의 크기를 회전각도에 따라서 조절할 수 있기 때문에 가변저항이라는 이름이 붙었습니다.


4. 전압 분배기 회로

  따라서 이제 회로의 모습으로 구성을 해봅시다. 결국 가변저항은 구조부분에서 설명한 것과 같이 회전각도에 따라 값이 변하는 두개의 저항으로 이루어져 있음을 알 수 있습니다. 이 구조를 이용해서 단자에 연결만 잘 한다면 아주 쉽게 전압의 크기를 조절 할 수 있는 회로를 만들 수 있습니다.

  다음은 전압을 조절하는 회로 (전압 분배기)의 회로도입니다. A단자를 바꾸고자 하는 전압에 / W단자를 내보내고자 하는 전압에 / B를 0V (ground, 접지)에 연결하면 다음과 같은 모습이 됩니다.


전압나눔(Voltage divider) 회로란 - 저항분배의 법칙
전압 분배기 회로

  여기서 Vin은 주어져 있는 상수라고 볼 수 있고 와이퍼의 회전 각도에 따라서 R1, R2가 변하게 됩니다. 이 때, Vout이 어떻게 되는지 전압값을 구해봅시다. (가정 : Vout으로 흐르는 전류의 크기는 매우 작다.)

  Vin과 0V (접지) 사이에는 현재 총 저항 R1 + R2가 있습니다.

  따라서 R1, R2를 관통하는 전류의 크기 I = (Vin - 0) / (R1 + R2) 입니다.

  (옴의 법칙 : V = I * R )

  그러면 R2 양 끝에 걸리는 전압  Vout - 0 = I * R2 = R2 / (R1 + R2) * Vin 이 됩니다.

  즉, Vout = R2 / (R1 + R2) * Vin

  R2 / (R1 + R2) 는 회전 각도에 따라서 0 ~ 1의 값을 가집니다. 왜냐하면 R1 + R2는 검은부분의 총 길이에 해당하는 저항이므로 변하지 않는 값이고, 와이퍼가 반시계 방향으로 갈수록 W-B사이의 저항값 R2 커져서 1에 가까운 값이 되기 때문입니다.


  따라서 겉에 보여지는 결과를 보자면, A단자 : Vin / W단자 : Vout / B단자 : 0V 일때, 손잡이를 반시계 방향으로 돌리면 각도에 비례해서 최대 Vin의 값을 W단자에 출력을 하고, 반대로 돌리면 0V의 값을 W단자에 출력을 하게 됩니다.

  즉, W단자에 0 ~ Vin 의 전압이 출력됩니다.


5. 예제

  아두이노 혹은 전자회로를 온라인으로 구성할 수 있는 시뮬레이터 '팅커캐드 (tinkercad.com)'를 이용했습니다.

  두 가지 예제를 준비했는데, 첫째는 아두이노를 이용하지 않고 전압의 크기를 바로 조절해 LED의 밝기를 조절하는 회로이고, 두번째는 가변저항에서 들어오는 값을 아두이노를 이용해 변수로 저장을 하고 밝기가 아닌 점멸시간을 조절하는 회로 입니다.

  연습을 통해 이해에 도움이 되길 바랍니다. 


예제 1. 전압의 크기를 이용해 LED의 밝기를 조절해봅시다.

https://www.tinkercad.com/things/adTlX8jqiuD-control-brightness-with-a-potentiomter

  사용 부품

- 건전지 1.5V 3개 (직렬)

- 분압기

- LED

- 저항 220옴


  위와같이 회로도를 구성하고 시뮬레이션을 실행해봅시다.

  현재 와이퍼가 4.5V 쪽으로 향해 있기 때문에, 노란 선을 따라 Vout = 4.5V가 흐르게 됩니다.

  반대로 시계방향으로 완전히 돌리면 0V 쪽으로 향해 있기 때문에 노란 선을 따라 Vout = 0V가 흐르게 됩니다.


  사용법이 매우 간단하고 직관적이지 않나요? 따라서 조절이 필요한 다양한 회로에서 간편히 사용할 수 있습니다.


예제 2. 아두이노와 가변저항을 이용해 LED의 점멸시간을 조절해 봅시다.

  가변저항은 위의 예제와 같이 전압의 크기를 할 때만 쓰이지 않습니다. 가변저항에서 내보내는 전압 값을 하나의 변수로 저장을 하고 아두이노를 이용해서 가공을 한다면 더 다양한 방법으로 쓸 수 있습니다.

https://www.tinkercad.com/things/3efVVCYUFVp-control-flashing-time-with-a-potentiomter

사용 부품

- 아두이노 우노

- 분압기

- LED

- 저항 220옴


회로 구성

  가변저항에서 내보내는 값을 읽을 것이기 때문에 A0 analog in 핀으로 연결했고, led는 D3핀에 연결합니다.


코드

// 가변저항으로 점멸 시간 조절
int v_pot = 0; //가변 저항에서 들어오는 값 저장할 변수
void setup()
{
  pinMode(3, OUTPUT); //LED를 D3핀에 연결
  Serial.begin(9600);
}
void loop()
{
  v_pot = analogRead(A0);
  //A0핀에 들어오는 전압 값 v_pot에 저장
  //0~5V 에 따라 0~1023의 값이 저장됨
  
  Serial.println(v_pot);
  //v_pot에 어떤 값이 들어왔는지 출력
  
  digitalWrite(3, HIGH); //LED 켜짐
  delay(v_pot * 3); // 0 ~ 3068 micro초 만큼 지연
  
  digitalWrite(3, LOW); // LED 꺼짐
  delay(v_pot * 3);
  
}

회전 각에 따라시리얼 모니터에 출력되는 값 : 0 ~ 1023

주요 함수들 설명

analogRead(A0);

- A0핀으로 들어오는 전압값을 읽고 그에 비례하는 값 출력

- 입력값 0 ~ 5V 에 따라 0 ~ 1023의 값 출력


delay(v_pot * 3);

- v_pot에 0 ~ 1023의 값이 저장되므로 0 ~ 1023 마이크로 초까지 지연가능

- 너무 적어서 임의로 3을 곱해서 최대 3초까지 지연가능하게 설정


예제 2-1. map 함수를 이용하여 예제 2를 변형

  위의 예제에서 시간을 조절하기 위해서 임의로 *3을 했습니다.

  하지만 예를 들어서 회전각에 따라 3 ~ 5초로 설정을 하고 싶을 경우 어떻게 코드를 적을 수 있을까요?


  v_pot (0 ~ 1023) -> v_pot2 (3000 ~ 5000) 으로 바꿔야 하기 때문에

  v_pot2 = 2000 / 1023 * v_pot + 3000 이런식으로 구성할 수 있긴 합니다만.. 계수들을 정할 때 계산을 해야하기 때문에 번거롭습니다.

  이럴 때는 map이라는 함수를 이용해서 간단히 변경할 수 있습니다.


v_pot2 = map(v_pot, 0, 1023, 3000, 5000)

- 0 ~ 1023의 범위에 들어오는 v_pot의 값을

- 3000 ~ 5000으로 재배치한다.

  참 편리한 함수라고 생각합니다. 이것을 이용해서 예제2의 코드 부분을 살짝 변경해봅시다.

변경된 코드

https://www.tinkercad.com/things/1XInkXR0mLX-control-flashing-time-with-a-potentiometer-2

// 가변저항으로 점멸 시간 조절
int v_pot = 0; //가변 저항에서 들어오는 값 저장할 변수
int v_pot2 = 0; //재배치한 v_pot의 값을 저장할 변수
void setup()
{
  pinMode(3, OUTPUT); //LED를 D3핀에 연결
  Serial.begin(9600);
}
void loop()
{
  v_pot = analogRead(A0);
  //A0핀에 들어오는 전압 값 v_pot에 저장
  //0~5V 에 따라 0~1023의 값이 저장됨
  
  Serial.println(v_pot);
  //v_pot에 어떤 값이 들어왔는지 출력
  
  v_pot2 = map(v_pot, 0, 1023, 3000, 5000);
  //0 ~ 1023의 값을 3000 ~ 5000으로 변경
  
  digitalWrite(3, HIGH); //LED 켜짐
  delay(v_pot2); // 3000 ~ 5000 micro초 만큼 지연
  
  digitalWrite(3, LOW); // LED 꺼짐
  delay(v_pot2);
  
}

  실행하게 되면 3초 ~ 5초의 간격으로 점멸하는 LED회로를 구성할 수 있습니다.


  여기까지가 오늘 설명하고 싶은 가변저항에 대한 내용이었습니다. 읽어주셔서 감사하고 오늘 배운 가변저항을 활용해 재밌는 making에 도움이 되길 바래요 :)