04주차 ‐ ESP32 GPIO 입출력 실습 2 - movie-01/SmartDevice GitHub Wiki
04주차 ‐ ESP32 GPIO 입출력 실습 2
📝 개요
- ✅ PWM이란?
- ✅ ADC란?
- ✅ PWM 실습
- ✅ ADC 실습
🔹 PWM이란?
🎛️ **PWM(Pulse Width Modulation)**은 디지털 신호를 이용해 아날로그 신호처럼 동작하도록 하는 기술
📌 원리
- 주기적인 디지털 펄스 폭(듀티 사이클)을 조절하여 출력 전압이나 전류를 제어
📌 활용 예시
- 💡 LED 밝기 조절
- 🔄 모터 속도 제어
- 🎵 오디오 신호 생성
✨ ESP32 PWM 특징
- LEDC 모듈 사용
- 최대 16개 독립 채널 지원
- 분해능 1~16비트 (기본 8비트 = 256단계)
- 주파수 범위: 1Hz ~ 40MHz
- 듀티 사이클 조절 (0~100%)
- GPIO34~39는 입력 전용으로 PWM 출력 불가
⚡PWM 신호 개념
PWM 신호는 일정한 주기로 ON/OFF를 반복하는 디지털 신호이며, "듀티 사이클(Duty Cycle)"에 따라 평균 출력 전압이 결정
📌 기본 개념
- 주기(Period): 한 사이클의 총 시간
- 주파수(Frequency): 초당 반복 횟수
- 듀티 사이클(Duty Cycle, %): ON 상태 비율
- ✅ 0%: 항상 OFF (출력 0V)
- ✅ 50%: ON/OFF 동일 (출력 평균값 50%)
- ✅ 100%: 항상 ON (출력 최대)
ESP32에서 PWM 설정
ESP32의 PWM 기능은 LEDC(Low-Energy Digital Controller) 모듈을 사용하여 설정
📌 PWM 설정 요소
- PWM 채널: 015 (총 16개)
- 주파수: 1Hz ~ 40MHz
- 분해능(Resolution): 116비트 (기본 8비트 → 256단계)
- 듀티 사이클: 0~100%
- 출력 핀(GPIO): PWM 신호를 출력할 핀
아날로그 출력(PWM) – LED 밝기 조절
아날로그 출력(PWM, Pulse Width Modulation)은 디지털 신호를 빠르게 변조하여 아날로그처럼 동작하도록 만드는 기술이다. 마이크로컨트롤러에서 analogWrite() 함수를 사용하면 LED의 밝기를 조절할 수 있다. 0부터 255까지의 값을 입력하여 밝기를 점진적으로 변화시키거나, 주기적인 패턴으로 LED를 점멸시킬 수 있다. 이를 활용하면 부드러운 조명 효과나 모터 속도 조절과 같은 다양한 응용이 가능하다.
📌 필요한 부품
- ✅ ESP32 보드
- ✅ LED 모듈
- ✅ 점퍼 케이블
📌 회로 연결 방법
- LED 모듈
- S: D4
- VCC: 3.3V
- GND: GND
아날로그 출력 코드는 다음과 같이 작성하면 된다.
#define LED_PIN 4 // LED가 연결된 핀 번호
void setup() {
pinMode(LED_PIN, OUTPUT); // LED 핀을 출력 모드로 설정
}
void loop() {
// LED 밝기를 점점 증가 (0 -> 255)
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness); // LED 밝기 설정 (PWM)
delay(10); // 10ms 대기 (부드럽게 밝아지도록)
}
// LED 밝기를 점점 감소 (255 -> 0)
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness); // LED 밝기 설정 (PWM)
delay(10); // 10ms 대기 (부드럽게 어두워지도록)
}
}
결과
https://github.com/user-attachments/assets/1764c8c4-17ea-4206-8ca7-d912be327062
ADC란?
📡ADC(Analog-to-Digital Converter, 아날로그-디지털 변환기)는 아날로그 신호(전압)를 디지털 값으로 변환하는 장치 ESP32는 최대 18개의 ADC 입력 채널을 제공하며, 센서 데이터 측정, 신호 처리, 전압 감지 등에 활용
📌ESP32의 ADC 특징
- ADC1: 8개 채널 (GPIO32-GPIO39)
- ADC2: 10개 채널 (GPIO0, 2, 4, 12-15, 25-27)
- 분해능(Resolution): 기본 12비트 (0~4095 값 출력, 설정 가능)
- 입력 전압 범위: 기본 0~3.3V (조정 가능)
- ADC2는 Wi-Fi와 동시에 사용할 경우 제한됨
- 노이즈 영향이 크므로 평균값 필터링 필요
ADC 활용 사례
- 🌡️ 온도 센서 (LM35 등) 측정
- 🔋 배터리 전압 모니터링
- 🎙️ 아날로그 마이크 신호 분석
주의사항 및 최적화 팁
- ⚠️ ADC2는 Wi-Fi 사용 시 충돌 가능 → ADC1 사용 권장
- ⚠️ 입력 전압이 3.3V를 초과하면 ESP32가 손상될 수 있음
- ⚠️ 정확한 측정을 위해 ADC 캘리브레이션 필요
📌 회로 연결 방법
- LED 모듈
- S: D4
- VCC: 3.3V
- GND: GND
- 가변 저항 모듈
- S: D34
- VCC: 3.3V
- GND: GND
코드 작성
코드 작성 시 해당 매니저의 버전이 3.X.X 이상일 경우 ledcSetup, ledcAttachPin에서 에러가 발생한다. 해결책은 2.X.X로 다운그레이드 하거나 코드를 ledcAttach로 변경하면 된다.
const int potPin = 34; // 가변 저항(Potentiometer)이 연결된 아날로그 핀
const int ledPin = 4; // LED가 연결된 핀 번호
int potValue = 0; // 가변 저항의 값을 저장할 변수
void setup() {
ledcSetup(0, 5000, 8); // 채널 0을 주파수 5000Hz, 8비트 해상도로 PWM 설정
ledcAttachPin(ledPin, 0); // ledPin(4번 핀)을 채널 0에 연결
}
void loop() {
potValue = analogRead(potPin); // 가변 저항에서 아날로그 값을 읽음 (0~4095)
int brightness = map(potValue, 0, 4095, 0, 255); // 0~4095 범위를 0~255로 매핑
ledcWrite(0, brightness); // LED 밝기 조절 (PWM)
delay(10); // 10ms 대기
}
결과
https://github.com/user-attachments/assets/486df44f-805f-4207-baa0-e7818bd4e103