3주차 ‐ ESP32 GPIO 입출력 실습 - boguuu/SmartDevice_2025-1 GitHub Wiki
- 다목적 입출력 핀으로, 디지털 신호를 입력받거나 출력할 수 있음
- ESP32는 최대 34개의 GPIO 핀을 제공
-
디지털 입력/출력 (HIGH, LOW)
-
아날로그 입력 (ADC)
- ADC(Analog-to-Digital Converter)?
ADC(아날로그-디지털 변환기)는 아날로그 신호(전압)를 디지털 값으로 변환하는 장치입니다. ESP32는 최대 18개의 ADC 입력 채널을 제공하며, 센서 데이터 측정, 신호 처리, 전압 감지 등에 활용
-
PWM 출력 (LED 밝기 조절, 모터 속도 조절)
- PWM(Pulse Width Modulation)?
PWM(펄스 폭 변조)은 디지털 신호를 사용하여 아날로그 출력처럼 보이도록 하는 기법 ESP32는 최대 16채널의 PWM 출력을 지원하며, 주로 LED 밝기 조절, 모터 속도 제어, 오디오 신호 생성 등에 활용
-
사용 가능한 핀
- 대부분의 GPIO 핀은 자유롭게 사용가능
- 단, 일부 핀은 특정 기능이 예약
- 입력 전용 핀: GPIO 34, 35, 36, 39
-
PWM/DAC 출력 가능 핀
- PWM: GPIO 0-19, 21-23, 25-27, 32-33
- DAC: GPIO 25, 26
- Wi-Fi 사용 시 제한되는 핀: ADC2 핀 (GPIO 4, 0, 2, 15, 13, 12, 14, 27, 25, 26)
- 5V: USB 또는 외부 전원 공급 가능
- 3.3V (3V3): 내부 레귤레이터에서 출력된 안정된 전원
- 디지털 입출력(GPIO): 기본적인 HIGH/LOW 신호 출력 및 입력
- ADC (아날로그-디지털 변환): ADC1(0~4095 범위), ADC2(Wi-Fi와 충돌 가능)
- DAC (디지털-아날로그 변환): GPIO25(DAC1), GPIO26(DAC2)
- 터치 센서: GPIO4, 0, 2, 15, 13, 12, 14, 27, 33, 32
- PWM 출력: 모든 GPIO에서 사용 가능 (GPIO34~39 제외)
- 내장 DAC 채널: 2개 (DAC1, DAC2)
- DAC1: GPIO25, DAC2: GPIO26
- 분해능: 8비트 (0 ~ 255 값 출력, 0V ~ 3.3V 범위)
- 출력 전압 범위: 0V ~ 3.3V (VDD에 따라 달라짐)
- 단순한 아날로그 신호 생성 가능 (파형 생성, 전압 제어)
- PWM 방식과 비교하여 출력이 부드러움
항목 | DAC (Digital-to-Analog Converter) | PWM (Pulse Width Modulation) |
---|---|---|
출력 방식 | 순수 아날로그 전압 출력 | 고속 ON/OFF로 평균 전압 생성(디지털 출력) |
해상도 | 8비트 (0~255 단계) | 최대 16비트 (0~65535 단계) |
주파수 제한 | 제한 없음 | 1Hz ~ 40MHz 가능 |
신호 품질 | 부드러운 아날로그 신호 | 고주파 성분 포함 (필터 필요) |
전압 범위 | 0V ~ 3.3V | 0V ~ VDD (평균 전압) |
사용 예 | 오디오 출력, 정밀 신호 생성 | 모터 속도 제어, LED 밝기 조절 |
필터 필요 여부 | 불필요 | 저역통과 필터 필요 |
- DAC 사용 → 부드러운 아날로그 출력이 필요한 경우 (오디오, 정밀 전압 조절)
- PWM 사용 → 스위칭 방식이 효율적인 경우 (모터, LED 제어)
✔️ESP32를 이용하여 LED를 제어
디지털 출력 - GPIO 핀을 HIGH(1) 또는 LOW(0)로 설정하여 전자 장치를 제어하는 방식.
📌회로 연결 방법
- ESP32 GPIO 4 → LED 모듈 S
- ESP32 GND → LED 모듈 G
- ESP32 3.3V → LED 모듈 V
📌필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 점퍼 케이블
#define LED_PIN 4
void setup() {
pinMode(LED_PIN, OUTPUT); // LED 핀을 출력으로 설정
}
void loop() {
digitalWrite(LED_PIN, HIGH); // LED 켜기
delay(1000); // 1초 대기
digitalWrite(LED_PIN, LOW); // LED 끄기
delay(1000); // 1초 대기
}
Digital.Output.LED.on.and.off.mp4
✔️PWM(Pulse Width Modulation) LED 밝기 조절, 모터 속도 제어 등에 사용된다. ESP32의 PWM 기능 0~255 값 범위 설정 가능 (LED 밝기 조절)
아날로그 출력(PWM) - 디지털 신호를 일정한 비율로 조절하여 아날로그처럼 동작하게 하는 방식.
📌 회로 연결 방법
- ESP32 GPIO 4 → LED 모듈 S
- ESP32 GND → LED 모듈 G
- ESP32 3.3V → LED 모듈 V
📌 필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 점퍼 케이블
#define LED_PIN 4
void setup() {
pinMode(LED_PIN, OUTPUT); // LED 핀을 출력 모드로 설정
}
void loop() {
// LED 밝기를 0부터 255까지 점점 증가시키는 루프
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness); // 현재 밝기 값으로 LED 출력
delay(10); // 10ms 대기하여 부드럽게 변화하도록 함
}
// LED 밝기를 255부터 0까지 점점 감소시키는 루프
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness); // 현재 밝기 값으로 LED 출력
delay(10); // 10ms 대기하여 부드럽게 변화하도록 함
}
}
Analog.Output.LED.Brightness.Adjustment.mp4
✔️
디지털 입력 - 버튼, 스위치와 같은 장치에서 HIGH(1) 또는 LOW(0)를 감지하는 방식.
📌 회로 연결 방법
- ESP32 GPIO 4 → LED 모듈 S
- ESP32 GND → LED 모듈 G
- ESP32 GPIO 33 → 버튼 모듈 S
- ESP32 GND → 버튼 모듈 G
📌필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 버튼 모듈 ✅ 점퍼 케이블
#define LED_PIN 4
#define BUTTON_PIN 33
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop() {
if (digitalRead(BUTTON_PIN) == HIGH) { // 풀업 저항 사용❗
digitalWrite(LED_PIN, HIGH); // LED 끄기
} else {
digitalWrite(LED_PIN, LOW); // LED 켜기
}
}
LED.control.with.buttons.-.LED.off.mp4
✔️
버튼을 눌렀을 때 LED가 켜지게 하려면 버튼이 LOW일 때 LED를 HIGH로 설정
#define LED_PIN 4
#define BUTTON_PIN 33
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // 풀다운 저항을 사용❗
digitalWrite(LED_PIN, HIGH); // LED 켜기
} else {
digitalWrite(LED_PIN, LOW); // LED 끄기
}
}
LED.control.with.button.-.LED.on.mp4
ESP32의 GPIO 핀은 기본적으로 내부 풀업( Pull-up ) 및 풀다운( Pull-down ) 저항을 지원
풀업(PULL UP) | 풀다운(PULL DOWN) |
---|---|
ON: LOW(0) | ON: HIGH(1) |
OFF: HIGH(1) | OFF: LOW(0) |
❗풀업 저항 (Pull-up Resistor): 높은 전압(VCC)에 연결된 저항
❗풀다운 저항 (Pull-down Resistor): 낮은 전압(GND)에 연결된 저항
💡이 두 개념은 디지털 회로에서 입력 신호가 불안정해지는 현상(플로팅 현상, Floating Issue)을 방지하기 위해 사용
- 특정 노드가 어떠한 전압(0V 또는 VCC)에도 명확히 연결되지 않은 상태를 의미
- 전압이 불안정하여 0V, 5V 또는 그 중간값이 될 수 있어 예측 불가능한 상태가 발생
- 플로팅 상태에서는 노이즈에 취약하며, 회로의 동작이 불안정해질 가능성이 높음
풀업 저항과 풀다운 저항을 사용하여 입력 신호를 항상 High(1) 또는 Low(0) 상태로 유지함으로써 안정적인 회로 동작을 보장 가능