ESP32๋ GPIO34-39๋ฅผ ์ ์ธํ ๋ชจ๋ ํ์ PWM์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. PWM์ ํ์ฉํด์ LED์ ์ธ๊ธฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ถ๋ ฅํ ์ ๋ ์๊ณ , ์๋ณด๋ชจํฐ, ์คํ ๋ชจํฐ, ํผ์์กฐ ์คํผ์ปค ๋ฑ์ผ๋ก ํ์ฉ ๊ฐ๋ฅํ๋ค. ์๋์ด๋ ธ์ AnalogWrite์ ๊ฐ์ด ์ด์ฉํ๋ฉด ๋๋๋ฐ ์๋์ด๋ ธ์ ๋ฌ๋ฆฌ ๋ฐ๋ก ์ค์ ํด์ผํ๋ ๊ฐ๋ค์ด ์กด์ฌํ๋ค.
- Signal Frequency: 1์ด์ ๋ช๋ฒ ON/OFF๋ฅผ ํ ๊ฒ์ธ๊ฐ
- Resolution: PWM ํด์๋, 8bit์ธ ๊ฒฝ์ฐ 0-256(2^8), 16bit์ธ ๊ฒฝ์ฐ 0-65535(2^16)๋ก ์ธ๊ธฐ ์ง์ ๊ฐ๋ฅ
- Duty Cycle: ์ธ๊ธฐ
- PWM Channel: 0-15๋ฒ์ ์๋ ๋ก๊ทธ ์ฑ๋
- ์ ํธ๋ฅผ ์ถ๋ ฅํ GPIOํ: ์ถ๋ ฅ ๊ฐ๋ฅํ ํ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
์์ ๊ฐ์ ๊ฐ๋ค์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
PWM Channel
- 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 ์ฑ๋์ ์์ ๊ฐ์ด 16๊ฐ์ ์๋ ๋ก๊ทธ ์ฑ๋์ด ์กด์ฌํ๋๋ฐ ์ฑ๋๋ง๋ค ํ ๋น๋ ํ์ด๋จธ๊ฐ ๋ค๋ฅด๋ค. ์ฌ๋ฌ ๊ฐ์ ์๋ ๋ก๊ทธ ์ผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฑ๋์ ๋ค๋ฅด๊ฒ ์ค์ ํด์ผํ๋ค.
Duty Cycle
Duty์ ๊ฐ์ ๋ฐ๋ผ ์ถ๋ ฅ์ ์ธ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค. ์์ ์ฌ์ง์์ 8bit์ resolution์ ๊ฐ์ง ๋ dury cycle์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค. 100% duty cycle์ธ ๊ฒฝ์ฐ 8bit resolution์ ์ต๋๊ฐ์ธ analoyWrite(255)์ ๊ฐ์ ๊ฑธ ํ์ธํ ์ ์๋ค.
PWM ์ฌ์ฉ๋ฒ
* ledcSetup(PWM_Channel_Number, Frequency, resolution)
* ledcAttachPin(GPIO_PIN , CHANNEL)
* ledcWrite(CHANNEL, DUTY_CYCLE)
์์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ PWM์ ์ด์ฉํ ์ ์๋ค. ledcSetup์ ์ฌ์ฉํด ์ฑ๋๊ณผ ์ฃผํ์, ํด์๋๋ฅผ ์ค์ ํ๊ณ ledcAttachPin์ผ๋ก ์ค์ ํ ์ฑ๋์ ์ถ๋ ฅ์ ์ด๋ GPIO ํ์ผ๋ก ๋ณด๋ผ ์ง ์ง์ ํ๋ค. ๋ง์ง๋ง์ผ๋ก ledcWrite์ ์ฌ์ฉํด ์ํ๋ ์ฑ๋์ analog๊ฐ์ ์ ์กํ๋ค.
PWM์ผ๋ก LED ์ถ๋ ฅํ๊ธฐ
const int ledPin = 16;
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup() {
ledcSetup(ledChannel, freq, resolution);
ledcAttachPin(ledPin, ledChannel);
}
void loop() {
for (int i = 0; i < 256; i++) {
ledcWrite(ledChannel, i);
delay(10);
}
for (int i = 256; i > 0; i--) {
ledcWrite(ledChannel, i);
delay(10);
}
}
LED๋ฅผ D16์ ์ฐ๊ฒฐํ ํ ESP32๋ณด๋๋ฅผ ์ ํํด ์ ๋ก๋ํ๋ฉด ์ด๋์์ก๋ค๊ฐ ๋ฐ์์ง๋ ๊ฒ์ ๋ฐ๋ณตํ๋ LED๋ฅผ ํ์ธํ ์ ์๋ค.
PWM์ผ๋ก ์๋ณด๋ชจํฐ ์ถ๋ ฅํ๊ธฐ
const int servoPin = 23; //D23์ ์ฐ๊ฒฐ
const int servoChannel = 1;
const int freq = 50;
const int resolution = 16;
void setup() {
ledcSetup(servoChannel, freq, resolution);
ledcAttachPin(servoPin, servoChannel);
}
void loop() {
servoWrite(servoChannel, 90); //90๋ ํ์
delay(1000);
servoWrite(servoChannel, 0); //์๋ ์๋ฆฌ๋ก
delay(1000);
}
void servoWrite(int ch, int deg)
{
int duty = deg * 18.2 + 3277;
ledcWrite(ch, duty);
}
์๋ณด๋ชจํฐ๋ Servo_ESP32๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก ์กด์ฌํด ์ฝ๊ฒ ์๋ณด๋ชจํฐ๋ฅผ ์ ์ดํ ์ ์๋ค. ํ์ง๋ง ledc๋ง์ ์ด์ฉํด์ ์๋ณด๋ชจํฐ๋ฅผ ์ด๋ ต์ง ์๊ฒ ์ ์ดํ ์ ์๋ค. 50Hz๋ก ์ฃผํ์๋ฅผ ์ค์ ํ๊ณ duty๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ์๋ณด๋ชจํฐ์ ์ถ๋ ฅ์ ์ ์ดํ๋ฉด duty๊ฐ์ ๋ฐ๋ผ ์ ์ดํ๋ ์๋ณด๋ชจํฐ์ ๊ฐ๋๋ฅผ ์กฐ์ ํ ์ ์๋ค. 50Hz์ 16bit์ ํด์๋๋ฅผ ์ฌ์ฉํ๋ฉด duty๊ฐ 3277์ธ ๊ฒฝ์ฐ 1ms์ถ๋ ฅ๋ ๋ 0๋, 4915์ธ ๊ฒฝ์ฐ 1.5ms ์ถ๋ ฅ๋๊ณ 90๋, 6554์ธ ๊ฒฝ์ฐ 2ms์ถ๋ ฅ๋๊ณ 180๋๋ก ํ์ ํ๋ค.
์๋ ๋ก๊ทธ ์ถ๋ ฅ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ๊ธฐ
์๋ ๋ก๊ทธ ์ถ๋ ฅ์ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ๋ ์ฑ๋์ด ๊ฒน์น์ง ์๋๋ก ์ฃผ์ํด์ผํ๋ค. ๋ํ LED์ ์๋ณด๋ชจํฐ๊ฐ ์ฌ์ฉํ๋ ์ฃผํ์์ ํด์๋ ๋ชจ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์ด๋จธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์์ pwm channel์ ๋ณด๋ฉด ์ฑ๋ 0๊ณผ 1์ ๊ฐ์ ํ์ด๋จธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ์๋ณด๋ชจํฐ์ led์ ์ฑ๋ 0๊ณผ 1์ ๋ถ์ฌํ๋ฉด ๋ ๊ฐ ์ค ํ๋์ ์ผ์๋ ์๋ํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฑ๋ 0๊ณผ 2์ ๊ฐ์ด ๋ค๋ฅธ ํ์ด๋จธ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์๋๋ LED์ ์๋ณด๋ชจํฐ๋ฅผ ํ ๋ฒ์ ์ ์ดํ๋ ์ฝ๋์ด๋ค. ์๋ณด๋ชจํฐ๊ฐ 90๋๋ก ํ์ ํ๋ค๊ฐ ์ ์๋ฆฌ๋ก ๊ฐ ํ LED๊ฐ ์ผ์ก๋ค ๊บผ์ง๋๋ก ํ์๋ค.
const int servoPin = 23;
const int servoChannel=0;
const int ledPin = 16;
const int ledChannel = 2;
void setup(){
ledcSetup(servoChannel, 50, 16);
ledcAttachPin(servoPin, servoChannel);
ledcSetup(ledChannel, 5000, 8);
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
servoWrite(servoChannel, 90);
delay(1000);
servoWrite(servoChannel, 0);
delay(1000);
ledcWrite(ledChannel, 100);
delay(1000);
ledcWrite(ledChannel, 0);
delay(1000);
}
void servoWrite(int ch, int deg)
{
int duty = deg*18.2 + 3277;
ledcWrite(ch, duty);
}