아두이노
[아두이노] PWM으로 LED 밝기 제어
다락공방
2024. 8. 5. 15:37
했던 실습들... 을 정리겸 기초적인 것부터 다시 채워가보려고 한다.
PWM(Pulse Width Modulation)이란?
디지털 신호는 0과 1로 이루어져 아날로그 신호처럼 다양한 값을 가질 수 없다.
이런 한계를 해결하기 위해 디지털 신호의 펄스폭을 조절하여 마치 아날로그 신호처럼 보이게하는 것이 PWM이다
아날로그 출력을 내기 위해서는 DAC(Digital Analog Converter)가 필요한데, 사용한 보드처럼 대부분의 아두이노보드는 지원하지 않는다.
디지털 신호를 마치 아날로그 신호처럼 보내기 위해 PWM을 사용한다고 생각하면 된다. 앞선 STM32에서도 PWM으로 모터 제어를 했듯이, 다양한 분야에 많이 쓰인다.
펄스폭을 조절한다는것은 0과 1의 주기 신호에서 1의 길이를 조절한다고 생각하면 된다.
0~255로 아날로그 신호 출력(bit 성능에 따라 달라짐)으로 생각하면 1의 비율만큼 아날로그 출력값이 나온다고 생각하면 된다.
void loop() {
for(int dutyCyle=0;dutyCycle<=255;dutyCycle++){
ledcWrite(ledChannel,dutyCycle);
delay(3);
}
// for loop를 통해 dutyCycle을 0~255로 증가시키며 loop를 돌게 하였다.
// ledcWrite 함수를 통해 RED 색상의 LED 채널에 dutyCycle을 할당하였다.
// delay함수를 통해 각 루프당 얼마나 머무를지를 설정하였다.
for(int dutyCyle=255;dutyCycle>=0;dutyCycle--){
ledcWrite(ledChannel,dutyCycle);
delay(3);
}
// for loop를 통해 dutyCycle을 255~0으로 감소시키며 loop를 돌게 하였다.
// ledcWrite 함수를 통해 RED 색상의 LED 채널에 dutyCycle을 할당하였다.
//delay함수를 통해 각 루프당 얼마나 머무를지를 설정하였다.
for(int dutyCyle=0;dutyCycle<=255;dutyCycle++){
ledcWrite(ledChannel+1,dutyCycle);
delay(3);
}
for(int dutyCyle=255;dutyCycle>=0;dutyCycle--){
ledcWrite(ledChannel+1,dutyCycle);
delay(3);
}for(int dutyCyle=0;dutyCycle<=255;dutyCycle++){
ledcWrite(ledChannel+2,dutyCycle);
delay(3);
}
for(int dutyCyle=255;dutyCycle>=0;dutyCycle--){
ledcWrite(ledChannel+2,dutyCycle);
delay(3);
}
// 해당 부분은 맨처음 진행했던 RED LED에서의 FOR LOOP와 구성방식이 같으며, LED 채널의 값만 1, 2씩 증가시켜 GREEN, BLUE에 맞는 채널에 dutycycle을 할당하였다.
// 따라서 각 불빛이 밝아졌다 꺼지기를 RGB 순서대로 진행될것이고, LOOP문을 통해 이 동작이 반복될 것이라는 것을 예측할 수 있다.
}
결과
사용한 보드가 좀 특수한 교육용 보드 kesper-A보드인데, 3색 LED가 내장되어있어 각 색상의 LED의 밝기가 세졌다 줄었다를 확인할 수 잇었다.