ESP32 보드에서는 아두이노의 analogWrite() 함수를 사용하지 못하고 대체 함수인 ledcWrite() 함수를 사용해야 한다.
ESP32에는 3개의 하드웨어 타이머가 있고 3개의 타이머를 사용하여 16개의 아날로그 출력을 할 수 있으며 그 출력은 채널 번호(0 ~ 15)를 할당하여 사용한다.
아두이노와 비교하면서 살펴보자.
setup() 함수 설정
아두이노 : pinMode(pwm_ledPin, OUTPUT); // 디지털과 아날로그 핀의 입력/출력을 설정한다.
ESP32 : ledcAttachPin(pwm_ledPin, pwm_channel) // 아날로그 핀과 사용할 아날로그 채널(0~15 채널) 연결(0~15 채널)
ledcSetup(pwm_channel, freq, resolution) // 아날로그 채널에 대한 설정(freq: 보통 5000, resolution : 보통 8)
loop() 함수에서의 사용
아두이노 : analogWrite(pwm_ledPin, h_pwm); // 설정된 아날로그 핀에 값 대입
ESP32 : ledcWrite(pwm_channel, h_pwm); // 설정된 아날로그 채널에 값 대입
아두이노는 아날로그 핀을 기준으로 아날로그 출력이 이루어지고 ESP32는 아날로그 채널을 기준으로 아날로그 출력이 됨을 알 수 있다.
ESP32 라이브러리의 esp32-hal-ledc.c 에서 아날로그 채널마다 할당된 타이머를 확인할 수 있다.
* LEDC Chan to Group/Channel/Timer Mapping
** ledc: 0 => Group: 0, Channel: 0, Timer: 0
** ledc: 1 => Group: 0, Channel: 1, Timer: 0
** ledc: 2 => Group: 0, Channel: 2, Timer: 1
** ledc: 3 => Group: 0, Channel: 3, Timer: 1
** ledc: 4 => Group: 0, Channel: 4, Timer: 2
** ledc: 5 => Group: 0, Channel: 5, Timer: 2
** ledc: 6 => Group: 0, Channel: 6, Timer: 3
** ledc: 7 => Group: 0, Channel: 7, Timer: 3
** ledc: 8 => Group: 1, Channel: 0, Timer: 0
** ledc: 9 => Group: 1, Channel: 1, Timer: 0
** ledc: 10 => Group: 1, Channel: 2, Timer: 1
** ledc: 11 => Group: 1, Channel: 3, Timer: 1
** ledc: 12 => Group: 1, Channel: 4, Timer: 2
** ledc: 13 => Group: 1, Channel: 5, Timer: 2
** ledc: 14 => Group: 1, Channel: 6, Timer: 3
** ledc: 15 => Group: 1, Channel: 7, Timer: 3
// PWM, setup() 함수 설정 코드
ledcAttachPin(pwm_ledPin, pwm_channel); // Esp32 analogWrite
ledcSetup(pwm_channel, 5000, 8); // Esp32 analogWrite
// PWM, loop() 함수 설정 코드
ledcWrite(pwm_channel, h_pwm); // analogWrite() 대체 함수 - 가변저항 LED 제어
int ledPin = 15;
int val = 0; // analog값 0 ~ 255 저장, 초기값 설정 및 변경값 저장 변수 지정
void setup() {
// pinMode(ledPin, OUTPUT) 역할
ledcAttachPin(ledPin, 0); // ledcAttachPin(ledPin, ledChannel) led 채널과 세팅값 연결
ledcSetup(0, 5000, 8); // ledcSetup(ledChannel, freq, resolution) -> led 채널별(0~15채널) 세팅값
}
void loop() {
ledcWrite(0, val); // analogWrite(Pin, value) -> ledcWrite(ledChannel, value)
delay(10);
val += 1;
if(val >=256)
val = 0;
}
주의할 점은 GPIO 34, 35, 36, 37, 38, 39번 핀은 PWM을 출력하지 못한다.
상기 핀은 아날로그 입력 또는 디지털 입력/출력에만 사용할 수 있다.
PWM GPIO: 2, 4, 12 ~ 19, 21, 22, 23, 25, 26, 27, 32, 33 중 16개(16 채널) 사용하여 제어 가능
아래 코드는 RGB LED를 제어하는 스케치이다.
#define redPin 17
#define greenPin 16
#define bluePin 4
void setup() { // pinMode(redPin, OUTPUT); -> ledcAttachPin(redPin, ledChannel) + ledcSetup(ledChannel, freq, resolution)
ledcAttachPin(redPin, 0); // ledcAttachPin(redPin, ledChannel) led 채널과 세팅값 연결
ledcAttachPin(greenPin, 1);
ledcAttachPin(bluePin, 2);
ledcSetup(0, 5000, 8); // R 채널 channel: 0, 5000Hz, 8bits = 256(0 ~ 255)
ledcSetup(1, 5000, 8); // G 채널
ledcSetup(2, 5000, 8); // B 채널
}
void loop() {
setColor(255, 0, 0); // red
delay(1000);
setColor(0, 255, 0); // green
delay(1000);
setColor(0, 0, 255); // blue
delay(1000);
setColor(255, 255, 0); // yellow
delay(1000);
setColor(80, 0, 80); // purple
delay(1000);
setColor(0, 255, 255); // aqua
delay(1000);
}
void setColor(int red, int green, int blue) {
ledcWrite(0, red); // analogWrite(Pin, value) -> ledcWrite(ledChannel, value)
ledcWrite(1, green);
ledcWrite(2, blue);
}
'Arduino' 카테고리의 다른 글
아두이노 - 배열 값 shuffle, 배열의 값을 무작위 순서대로 섞는 방법 (0) | 2019.10.07 |
---|---|
아두이노 - random() 함수 사용하기, 랜덤함수 (0) | 2019.10.06 |
아두이노 - 무드등, 블루투스 연결 스마트폰 원격제어 (0) | 2019.10.05 |
ESP32 - 피에조 부저, 곰 세 마리 멜로디, tone() 대체 ledcWriteNote(), ledcWriteTone(), pitches.h 이용 (0) | 2019.10.04 |
ESP32 - 터치 센서를 활용한 터치 버튼, 터치 키패드 (0) | 2019.10.02 |
아두이노 끼리 연결, 시리얼 통신을 통한 float 값 송신 및 수신 (6) | 2019.10.01 |
아두이노 - 무드등 예제, RGB LED 제어 (0) | 2019.09.28 |
아두이노 - ADC 핀을 이용한 터치 센서의 구현 (0) | 2019.09.24 |