091
[C/C++] ESP32와 Potentiometer를 이용하여 LED의 밝기 조절하기 본문
01. ADC(Analog-to-Digital Converter)& DAC(Digital-to-Analog Converter)
(1) ADC : 연속적인 아날로그 신호(전압, 전류 등)를 컴퓨터가 이해할 수 있는 이산적인 디지털 값(0과 1)로 변환하는 장치
- 동작 과정 : 아날로그 입력 -> 샘플링 -> 양자화 -> 이진수(디지털 값)로 변환 (ex) 포텐션미터
- ESP32의 ADC 사양
항목 | 설명 |
해상도(Resolution) | 최대 12-bit까지 지원(8-bit,9-bit,10-bit지원) |
값 범위(Value Range) | 12-bit 모드 : 0 ~4095(기본) / 10-bit 모드 : 0 ~1023 |
입력 전압 범위(Input Voltage Range) | 0V ~ 3.3V ( 3.3V 초과 시 ESP32가 손상될 수 있음) |
ADC 채널(ADC 채널) | - ADC1 : GPIO 32 ~ 39(Wi-Fi 사용 가능) - ADC2 : GPIO 0, 2, 4, 12, 25, 27 (Wi-Fi 사용시 불가능) |
기준 전압(Reference Voltage, Vref) | 기본적으로 1.1V, GPIO 25를 사용하여 외부 기준 전압을 사용 가능 |
비선형 오차 문제(Non-linearity Issue) | 0.1V 이하 % 2.5V 이상에서는 ADC의 정확도가 낮아질 수 있음 |
* ADC1, ADC2는 물리적인 핀이 아니라 내부에 존재하는 두개의 컨트롤러이며, 핀맵에 나타나있는 ADC0, 3, 4 등의 표시는 ADC1_CHANNEL0이라는 의미의 채널 숫자를 의미함
(2) DAC : 디지털 신호(이진수)를 사람이 이해할 수 있는 연속적인 아날로그 신호(전압, 전류)로 변환하는 장치
- 동작 과정 : 디지털 입력 -> 해당 값에 맞는 전압으로 변환 -> 필터링 -> 아날로그 신호 생성 (ex) 스피커로 소리를 출력하는 것
02. 포텐션미터(Potentiomete)와 멀티미터(Multimeter)
- 포텐션미터 : 가변 저항기로, 회전하거나 슬라이드할 수 있는 방식으로 저항을 조절할 수 있는 전자 부품으로, 전압 분배기의 역할을 해 출력 전압을 조절하는 사용됨 (ex) ADC 신호 조절, LED 밝기 조절
-> 포텐션미터에는 VCC, 중간핀(wiper), GND, 이렇게 3가지의 핀이 존재하며 중간 핀을 통해 출력되는 것
- 멀티미터 : 전압, 전류, 저항 등을 측정할 수 있는 전자 측정 도구, 디지털과 아날로그 두 가지 타입이 있으며, 전기 회로의 상태를 확인하는데 사용됨 (ex) 저항 측정, DC/AC 전압(V) 측정
03. 포텐션미터를 이용하여 LED의 밝기를 조절하는 방법
(1) 하드웨어 :
* 포텐션미터
(ESP32의 3.3V) → (포텐션미터의 VCC 핀) → (포텐션미터의 출력 핀) → (ESP32의 ADC 핀, 예: GPIO 34)
(포텐션미터의 GND 핀) → (GND) // 남은 전류
* LED밝기 조절
(ESP32의 PWM 출력 핀, 예: GPIO 4) → (220Ω 저항) → (LED + 다리) → (LED - 다리) → (GND)
⚡️포텐션미터의 전류 흐름 조절
1️⃣ 3.3V -> VCC : ESP32에서 포텐션미터의 VCC핀으로 전류를 보내줘서 최대전압이 얼마인지 알 수 있게 해줌
2️⃣ VCC -> Wiper(출력핀) : 사용자가 조절한 만큼의 전압이 출력 핀을 통해 ESP32의 ADC핀으로 들어가게 됨
3️⃣ 출력핀 -> ADC 핀 : ADC는 위에서 설명했 듯 아날로그를 디지털 값으로 변환해주는 역할을 하며, 포텐션미터에서 흘러들어온 전압(0~3.3V)를 디지털 값인(0~4095)로 변환해줌
Q1. 흐름에서 GND와 연결된 부분이 없는데 왜 포텐션미터의 GND와 EPS32의 GND를 연결해야하나요?
A1. 포텐션미터는 VCC와 GND의 사이의 전압을 와이퍼를 통해 변화시켜 주는데 그것의 기준점이 되는 GND값이 얼마인지 연결을 통해 나타내야 합니다. 만약 와이퍼 조절을 통해 중간 정도의 전압을 이용하게 된다면 남은 전압은 GND핀을 통해 ESP32의 GND핀으로 흘러들어가게 됩니다.
💡LED의 전류 흐름 조절은 이전과 마찬가지로 전압과 LED 사이에 저항기를 배치해두고 긴다리(양극)에서 짧은다리(음극)으로 전류를 흐르게 하는 것이 제일 중요하다.
(2) 소프트웨어 :
- 포텐션미터를 이용하여 LED 밝기를 조절하는 코드
#define POTENTIOMETER_PIN 34
#define LED_PIN 4
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
}
void loop(){
int potValue = analogRead(POTENTIOMETER_PIN);
int pwmValue = map(potValue, 0, 4095, 0, 255);
analogWrite(LED_PIN, pwmValue);
Serial.print("Variable resistor value : ");
Serial.print(potValue);
Serial.print(" -> PWM OUT : ");
Serial.println(pwmValue);
delay(100);
}
- Serial.begin(115200)을 통해 ESP32와 PC 간의 통신을 시작함을 나타내고 115200은 보드 전송 속도를 의미함
- analogRead(POTENTIOMETER_PIN)을 통해 ADC에서 변환된 디지털 값(0~4095) 범위의 정수값으로 반환함
- map() 함수를 통해 0~4095에서 0~255(PWM 신호의 범위에 맞게 조정)으로 값을 매핑시켜줌
- analogWrite(LED_PIN, pwmValue)을 통해 PWM 신호의 범위에 맞게 조정해줌
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] LCD에 원하는 글자를 출력하기 (4) | 2025.03.24 |
---|---|
[C/C++] ESP32와 Potentiometer를 이용하여 모드 설정 후 변경하기 (4) | 2025.03.15 |
[C/C++] 기본적인 전기/전자 기초 개념 정리 (2) | 2025.03.07 |
[C/C++] ESP32를 사용하여 LED 키고 꺼지게 만들기 (4) | 2025.02.28 |
[C/C++] Arduino IDE에서 ESP32를 사용하기 위한 환경설정하기 (3) | 2025.02.27 |