본문 바로가기

ESP32

ESP32 PWM 아날로그 출력 Arduino IDE

반응형

 

 

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에 연결해야 합니다.

 

ESP32로 LED 어둡게 하기

 

 

(이 회로도는 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 리소스가 있습니다. 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^