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 모듈
  • ✅ 점퍼 케이블

image

📌 회로 연결 방법

  • LED 모듈
    • S: D4
    • VCC: 3.3V
    • GND: GND

image

아날로그 출력 코드는 다음과 같이 작성하면 된다.

#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

image


코드 작성

코드 작성 시 해당 매니저의 버전이 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