Arduino IDE를 사용한 ESP32 PWM(아날로그 출력)
Arduino IDE를 사용하여 ESP32로 PWM 신호를 생성하는 방법을 알아보세요. analogWrite를 사용하는 방법과 LEDC API를 사용하는 방법의 두 가지 방법을 설명합니다. 예를 들어, LED를 희미하게 하는 간단한 회로를 만들어 보겠습니다.
이 튜토리얼을 진행하기 전에 Arduino IDE에 ESP32 애드온을 설치해야 합니다. 아직 설치하지 않았다면 다음 튜토리얼을 따라 Arduino IDE에 ESP32를 설치하세요.
Arduino IDE 2에 ESP32 보드 설치(Windows, Mac OS X, Linux)
이 튜토리얼은 ESP32 보드 애드온 버전 3.X 이상과 호환됩니다. 자세한 내용은 마이그레이션 가이드에서 확인하세요.
목차
ESP32 PWM 컨트롤러
analogWrite
LEDC 기능
ESP32로 LED 어둡게 하기
analogWrite를 사용한 ESP32 PWM 예제 - 코드
LEDC API를 사용한 ESP32 PWM 예제 - 코드
필요한 부품
이 튜토리얼을 따르려면 다음 부품이 필요합니다.
ESP32 DOIT DEVKIT V1 보드 - 최고의 ESP32 개발 보드 읽기
3x 5mm LED
3x 330Ω 저항(또는 유사한 값)
브레드보드
점퍼 와이어
ESP32 LED PWM 컨트롤러
ESP32에는 6~16개의 독립 채널(ESP32 모델에 따라 다름)이 있는 LED PWM 컨트롤러가 있으며, 이를 구성하여 다양한 속성의 PWM 신호를 생성할 수 있습니다.
PWM 신호를 생성하고 동일한 결과를 얻는 데 사용할 수 있는 다양한 기능이 있습니다. analogWrite(Arduino 보드에서처럼)를 사용하거나 LEDC 함수를 사용할 수 있습니다.
analogWrite
가장 기본적인 함수는 analogWrite로, PWM 신호를 생성할 GPIO와 듀티 사이클 값(0~255)을 인수로 받습니다.
void analogWrite(uint8_t pin, int value);
예를 들어:
void analogWrite(2, 180);
주파수 및 해상도 설정
analogWriteResolution 및 analogWriteFrequency 함수를 사용하여 선택한 핀에서 PWM 신호의 해상도와 주파수를 설정할 수 있습니다.
해상도를 설정하려면:
void analogWriteResolution(uint8_t pin, uint8_t resolution);
주파수를 설정하려면:
void analogWriteFrequency(uint8_t pin, uint32_t freq);
LEDC 함수
또는 Arduino-ESP32 LEDC API를 사용할 수 있습니다. 먼저 LEDC 핀을 설정해야 합니다. ledcAttach 또는 ledcAttachChannel 함수를 사용할 수 있습니다.
ledcAttach
ledcAttach 함수는 주어진 주파수와 해상도로 LEDC 핀을 설정합니다. LEDC 채널은 자동으로 선택됩니다.
bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution);
이 함수는 구성이 성공하면 true를 반환합니다. false가 반환되면 오류가 발생하고 LEDC 채널이 구성되지 않습니다.
ledcAttachChannel
LEDC 채널을 수동으로 설정하려면 대신 ledcAttachChannel 함수를 사용할 수 있습니다.
bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel);
이 함수는 구성이 성공하면 true를 반환합니다. false가 반환되면 오류가 발생하고 LEDC 채널이 구성되지 않습니다.
ledcWrite
마지막으로, 이전 두 함수 중 하나를 사용하여 LEDC 핀을 설정한 후 ledcWrite 함수를 사용하여 PWM 신호의 듀티 사이클을 설정합니다.
void ledcWrite(uint8_t pin, uint32_t duty);
이 함수는 듀티 사이클 설정이 성공하면 true를 반환합니다. false가 반환되면 오류가 발생하고 듀티 사이클이 설정되지 않습니다.
자세한 내용과 LEDC PWM 컨트롤러의 모든 기능은 공식 문서를 확인하세요.
ESP32로 LED 디밍하기
ESP32로 PWM 신호를 생성하는 방법을 보여주기 위해 LED의 밝기를 어둡게 하는(시간이 지남에 따라 밝기를 증가 및 감소시키는) 두 가지 간단한 예를 만들어 보겠습니다. analogWrite를 사용한 예와 LEDC 함수를 사용한 예를 하나 더 제공하겠습니다.
회로도
다음 회로도와 같이 LED를 ESP32에 연결합니다. LED는 GPIO 16에 연결해야 합니다.
(이 회로도는 30개의 GPIO가 있는 ESP32 DEVKIT V1 모듈 버전을 사용합니다. 다른 모델을 사용하는 경우 사용하는 보드의 핀아웃을 확인하세요.)
참고: 출력으로 작동할 수 있는 한 원하는 핀을 사용할 수 있습니다. 출력으로 작동할 수 있는 모든 핀은 PWM 핀으로 사용할 수 있습니다. ESP32 GPIO에 대한 자세한 내용은 다음을 참조하세요. ESP32 핀아웃 참조: 어떤 GPIO 핀을 사용해야 합니까?
analogWrite를 사용한 ESP32 PWM 예제 - 코드
Arduino IDE를 열고 다음 코드를 복사합니다. 이 예제에서는 analogWrite 함수를 사용하여 시간이 지남에 따라 LED 밝기를 증가 및 감소시킵니다.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO 16
void setup() {
// set the LED as an output
pinMode(ledPin, OUTPUT);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
}
LED가 연결된 핀을 정의하는 것으로 시작합니다. 이 예제에서 LED는 GPIO 16에 연결됩니다.
const int ledPin = 16; // 16은 GPIO 16에 해당합니다.
setup()에서 pinMode() 함수를 사용하여 LED를 출력으로 구성해야 합니다.
pinMode(ledPin, OUTPUT);
loop()에서 듀티 사이클을 0~255 사이에서 변경하여 LED 밝기를 높입니다.
// LED 밝기를 높입니다.
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// PWM으로 LED 밝기를 변경합니다.
analogWrite(ledPin, dutyCycle);
delay(15);
}
듀티 사이클을 설정하기 위해 analogWrite() 함수를 사용하는 것을 주목하세요. LED 핀과 듀티 사이클을 인수로 전달하기만 하면 됩니다.
analogWrite(ledPin, dutyCycle);
마지막으로 듀티 사이클을 255~0 사이에서 변경하여 밝기를 낮춥니다.
// LED 밝기 감소
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// PWM으로 LED 밝기 변경
analogWrite(ledPin, dutyCycle);
delay(15);
}
예제 테스트
ESP32에 코드를 업로드합니다. 올바른 보드와 COM 포트를 선택했는지 확인합니다. 회로를 살펴봅니다. 시간이 지남에 따라 밝기가 증가하고 감소하는 디머 LED가 있어야 합니다.
Arduino IDE를 사용한 ESP32 PWM - 아날로그 출력 LED 0으로 설정 LED 꺼짐
Arduino IDE를 사용한 ESP32 PWM - 아날로그 출력 LED 50으로 설정
Arduino IDE를 사용한 ESP32 PWM - 아날로그 출력 LED 최대 밝기 100으로 설정
Arduino IDE를 사용한 ESP32 PWM - 아날로그 출력 LED 75로 설정
LEDC API를 사용한 ESP32 PWM 예제 - 코드
Arduino IDE를 열고 다음 코드를 복사합니다. 이 예제는 ESP32 LEDC 함수를 사용하여 시간이 지남에 따라 LED 밝기를 증가시키고 감소시킵니다.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
// setting PWM properties
const int freq = 5000;
const int resolution = 8;
void setup(){
// configure LED PWM
ledcAttach(ledPin, freq, resolution);
// if you want to attach a specific channel, use the following instead
//ledcAttachChannel(ledPin, freq, resolution, 0);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
}
LED가 연결된 핀을 정의하는 것으로 시작합니다. 이 예에서 LED는 GPIO 16에 연결됩니다.
const int ledPin = 16;
PWM 속성(주파수 및 해상도)을 설정합니다.
// PWM 속성 설정
const int freq = 5000; const int resolution = 8;
8비트 해상도를 사용하므로 듀티 사이클은 0~255 사이의 값을 사용하여 제어됩니다.
setup()에서 LEDC 핀을 설정합니다. 다음과 같이 ledcAttach 함수를 사용합니다.
ledcAttach(ledPin, freq, resolution);
이렇게 하면 기본 PWM 채널에서 이전에 정의한 주파수 및 해상도로 LEDC 핀이 구성됩니다.
PWM 채널을 직접 설정하려면 대신 ledcAttachChannel을 사용해야 합니다. 이 함수의 마지막 인수는 PWM 채널 번호입니다.
ledcAttachChannel(ledPin, freq, resolution, 0);
마지막으로 loop()에서 시간이 지남에 따라 LED의 밝기를 증가시키거나 감소시킵니다.
다음 줄은 LED 밝기를 증가시킵니다.
// LED 밝기 증가
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// PWM으로 LED 밝기 변경
ledcWrite(ledPin, dutyCycle);
delay(15);
}
듀티 사이클을 설정하기 위해 ledcWrite() 함수를 사용하는 것을 주목하세요. LED 핀과 듀티 사이클을 인수로 전달하기만 하면 됩니다.
ledcWrite(ledPin, dutyCycle);
마지막으로, 밝기를 줄이기 위해 듀티 사이클을 255와 0 사이에서 변화시킵니다.
// LED 밝기 감소
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// PWM으로 LED 밝기 변경
ledcWrite(ledPin, dutyCycle);
delay(15); }
예제 테스트
ESP32에 코드를 업로드합니다. 올바른 보드와 COM 포트를 선택했는지 확인합니다. 회로를 살펴보세요. 이전 예와 마찬가지로 시간이 지남에 따라 밝기가 증가하거나 감소하는 디머 LED가 있어야 합니다.
마무리
요약하면, 이 문서에서는 Arduino IDE와 함께 ESP32의 LED PWM 컨트롤러를 사용하여 LED를 어둡게 하는 방법을 배웠습니다. 배운 개념은 신호에 올바른 속성을 설정하여 PWM으로 다른 출력을 제어하는 데 사용할 수 있습니다.
여러분이 좋아할 만한 다른 ESP32 리소스가 있습니다.
- Getting Started with ESP32 Dev Module
- ESP32 Pinout Reference: Which GPIO pins should you use?
- ESP32 Digital Inputs and Digital Outputs (Arduino IDE)
- ESP32 ADC – Read Analog Values with Arduino IDE
- ESP32 with PIR Motion Sensor using Interrupts and Timers
- More ESP32 Tutorials and Projects
'ESP32' 카테고리의 다른 글
ESP32 ADC 읽기 Arduino IDE (2) | 2024.12.24 |
---|---|
ESP32 디지털 입력 및 디지털 출력(Arduino IDE) (2) | 2024.12.20 |
ESP32 Pinout 참조: 어떤 GPIO 핀을 사용해야 합니까? (1) | 2024.12.19 |
ESP32 Multiple DS18B20 다중 온도 센서 사용법 (4) | 2024.12.16 |
ESP32 DS18B20 온도 센서(단일, 다중, 웹 서버) (1) | 2024.12.14 |
ESP-Now 통신 프로토콜을 사용하여 ESP32로 LED를 제어하는 방법 (1) | 2024.12.12 |
VS Code와 PlatformIO에서 ESP32, ESP8266 개발 환경 (2) | 2024.12.10 |
PlatformIO란 무엇인가요? (0) | 2024.12.06 |
더욱 좋은 정보를 제공하겠습니다.~ ^^