051_가변저항_전압분배손잡이 🔘🕹️

도로시와 지니가 함께하는 와이퍼 접촉식 분압 원리, ADC 10비트 변환 및 아날로그 다이얼 제어 실습
- 👧 도로시: “교수님! 지니야! 오디오 볼륨을 올리거나 선풍기 바람 세기를 조절할 때 부드럽게 돌리는 손잡이 있잖아! 아두이노는 내가 손잡이를 몇 도 돌렸는지 어떻게 정확히 알아채?”
- 👨🏫 이호진 교수님: “그 회전 손잡이 속 핵심 부품이 바로 가변저항(Potentiometer, 포텐셔미터) 이란다! 손잡이를 돌리는 물리적 각도에 따라 0V부터 5V까지 전압을 자유자재로 나누어 만들어내지!”
-
🐶 토토: “바우! 손잡이를 오른쪽으로 돌리면 숫자가 1023까지 쑥쑥 올라간다 멍!”
- 🖥️ 강의 슬라이드: slides.md
1. 가변저항의 외형과 3개 핀의 비밀

🎛️ 양 끝 전원과 가운데 가변 출력 단자
가변저항에는 3개의 금속 다리가 나란히 배치되어 있습니다:
- 양쪽 1번 & 3번 단자 (고정 저항선 양단):
- 각각 아두이노 5V 전원과 GND(0V) 에 연결합니다.
- 내부의 원호 모양 저항체 전체가 연결되므로 두 핀 사이의 총 저항값(예: 10kΩ)은 항상 일정합니다.
- 가운데 2번 단자 (와이퍼 / 신호 출력 핀):
- 회전축(Knob)을 돌릴 때마다 내부의 금속 접촉자(Wiper)가 저항선 위를 부드럽게 미끄러집니다.
- 접촉 위치에 따라 0V ~ 5V 사이의 중간 분배 전압이 아두이노 A0 ~ A5 아날로그 핀으로 출력됩니다!
2. 작동 메커니즘: 와이퍼 접촉과 전압 분배 법칙

🔬 저항체 길이의 비율이 곧 전압의 비율!
- 내부 저항체의 전체 길이를 $L$, 와이퍼가 위치한 지점까지의 길이를 $x$라 하면: \(R_1 = R_{\text{total}} \times \frac{x}{L}, \quad R_2 = R_{\text{total}} - R_1\)
- 가운데 2번 단자에서 출력되는 전압 $V_{\text{out}}$은 전압 분배 법칙에 의해 완벽한 선형 관계식을 따릅니다: \(V_{\text{out}} = 5\text{V} \times \frac{R_1}{R_1 + R_2} = 5\text{V} \times \left(\frac{x}{L}\right)\)

- 손잡이를 왼쪽 끝으로 끝까지 돌렸을 때 ($x = 0$): $V_{\text{out}} = 0\text{V}$ (ADC 값: 0)
- 손잡이를 정중앙에 두었을 때 ($x = 0.5L$): $V_{\text{out}} = 2.5\text{V}$ (ADC 값: 약 512)
- 손잡이를 오른쪽 끝으로 돌렸을 때 ($x = L$): $V_{\text{out}} = 5.0\text{V}$ (ADC 값: 1023)
3. 하드웨어 결선과 브레드보드 배선도
// 가변저항 분배 전압(0~5V)을 10비트 디지털 값(0~1023)으로 읽기
int potVal = analogRead(A3);
🔌 브레드보드 3핀 연결 가이드
- 가변저항 1번 핀: 아두이노 5V 파워 레일에 연결.
- 가변저항 2번 핀 (가운데): 아두이노 A3 아날로그 핀에 연결.
- 가변저항 3번 핀: 아두이노 GND 파워 레일에 연결.
- PWM 출력 LED: 아두이노 디지털 11번 핀 ➡️ 220Ω 저항 ➡️ LED 애노드(+) ➡️ 캐소드(-) ➡️ GND.
4. 실습 1 전체 코드: 가변저항 아날로그 값 읽기 (Arduino C++)
💻 시리얼 모니터로 손잡이 회전 각도 관측하기
// 가변저항 가운데 핀이 연결된 아날로그 입력 핀 정의
const int POT_PIN = A3;
void setup() {
// PC 시리얼 모니터 통신 시작 (9600 bps)
Serial.begin(9600);
Serial.println("==========================================");
Serial.println(" Potentiometer ADC Reader Initialized ");
Serial.println("==========================================");
}
void loop() {
// 1. A3 핀의 아날로그 전압을 10비트 디지털 숫자로 변환 (0 ~ 1023)
int adcValue = analogRead(POT_PIN);
// 2. 아날로그 숫자를 실제 전압(0.0V ~ 5.0V)으로 환산
float voltage = adcValue * (5.0 / 1023.0);
// 3. 시리얼 모니터에 정돈된 데이터 출력
Serial.print("Raw ADC: ");
Serial.print(adcValue);
Serial.print(" | Calculated Voltage: ");
Serial.print(voltage, 2);
Serial.println(" V");
// 0.1초 대기
delay(100);
}
5. 실습 2 전체 코드: map() 함수로 LED 밝기 조광 다이얼 만들기

💻 0~1023 입력을 0~255 PWM 밝기로 부드럽게 연동하기
const int POT_PIN = A3; // 가변저항 핀
const int LED_PIN = 11; // PWM 밝기 제어 핀
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 1. 가변저항 입력 읽기 (0 ~ 1023)
int potValue = analogRead(POT_PIN);
// 2. 10비트 입력을 8비트 PWM 출력 범위(0 ~ 255)로 선형 변환
int brightness = map(potValue, 0, 1023, 0, 255);
// 3. LED에 아날로그(PWM) 신호 출력
analogWrite(LED_PIN, brightness);
// 디버깅 출력
Serial.print("Pot: ");
Serial.print(potValue);
Serial.print(" -> LED Brightness: ");
Serial.println(brightness);
delay(50);
}
6. 실습 3 확장: 3개 가변저항으로 RGB 무지개 팔레트 만들기

- 3채널 아날로그 입력 (A0, A1, A2):
- 3개의 가변저항을 각각 아두이노의 A0(빨강), A1(초록), A2(파랑)에 연결합니다.
- RGB LED 컬러 믹싱:
- 각 손잡이를 돌려 $R, G, B$ 각각의 빛의 세기(0~255)를 독립적으로 조절하면, 빛의 삼원색 합성을 통해 16,777,216가지(24비트 트루 컬러) 의 모든 빛깔을 자유자재로 만들어낼 수 있습니다!
// 가변저항 측정값 구간에 따라 LED 단계별 점등
if (value < 256) {
digitalWrite(ledPins[0], HIGH);
} else if (value < 512) {
digitalWrite(ledPins[1], HIGH);
} else if (value < 768) {
digitalWrite(ledPins[2], HIGH);
} else {
digitalWrite(ledPins[3], HIGH);
}
🌟 도로시와 지니의 핵심 요약 노트!
| 손잡이 위치 | 내부 와이퍼 접촉점 | 출력 전압 ($V_{\text{out}}$) | 아두이노 ADC 값 | LED 밝기 (brightness) |
|---|---|---|---|---|
| 반시계 방향 끝 | GND에 밀착 | 0.0 V | 0 | 0 (소등) |
| 정중앙 (12시 방향) | 저항체 정중앙 | 2.5 V | 약 512 | 128 (중간 밝기) |
| 시계 방향 끝 | 5V에 밀착 | 5.0 V | 1023 | 255 (최대 밝기) |
- 👧 도로시: “가변저항 손잡이를 돌리는 물리적 각도가 0V부터 5V까지 전압으로 나뉘고,
analogRead()로 0~1023 숫자로 읽히는 과정이 너무 신기해!” - 👨🏫 이호진 교수님: “맞아!
map()함수를 쓰면 LED 조명 다이얼부터 서보 모터 각도 컨트롤러까지 무엇이든 조종할 수 있단다.” - 🐶 토토: “바우! 다음 시간엔 가변저항 2개가 합체된 게임기 조이스틱을 만나러 가자 멍!”
서브목차