일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 아두이노
- Arduino
- 3D Printer
- FDM
- 큐라
- 파이썬
- Arduino IDE
- python
- support
- Servo Motor
- MHEV
- 드론
- Arduino Servo Motor
- Theo Jansen Mechanism
- Arduino LED example
- Arduino Ultrasonic Sensor
- Cura 사용법
- LG gram
- Jansen Linkage
- 큐라 사용법
- 서보 모터
- Drone
- Cura
- gcode
- 3D 프린터
- 아두이노 LED 예제
- 테오 얀센 메커니즘
- 적층형 3D 프린터
- 2020 LG gram
- 아두이노 서보 모터
- Today
- Total
Mechanic 공방
10. 아두이노 LED 실습 (3) with PWM 제어 본문
저번 포스팅까지는 단순히 LED의 on/off 제어를 해보았다.
이번 포스팅에서는 아두이노 디지털 핀의 기능 중 하나인 'PWM 제어'를 사용하여 LED의 밝기를 제어하며 on/off 시켜보도록 하겠다.
회로도 구성에 앞서, PWM 제어에 대하여 간단하게 알아보겠다.
[PWM 제어]
PWM 제어란, Pulse Width Modulation의 약자로서 디지털 신호의 주기를 조절하여 이를 아날로그 신호처럼 사용하게 해주는 제어 방식 중 하나이다.
아래 그림은 디지털 신호의 주기를 변화시키면 신호가 어떻게 변화하는지 쉽게 보여주는 그림이다.
위 그림과 같이, 기존에 0V와 5V의 두 가지 신호 형태만 가진 디지털 신호의 주기를 변화시킴으로써 아날로그 신호와 같은 형상의 신호를 생성해 내는 것이 PWM 제어의 핵심이다.
Duty Cycle의 퍼센트가 높아질수록 5V 신호를 더 많이 내보낸다고 생각하면 된다.
즉, LED를 PWM 방식으로 제어한다면 빠른 주기로 on/off 시킴으로써 밝기를 조절한다고 생각하면 된다.
이를 LED 밝기에 비유해보자면, 100% duty cycle에 가까워질수록 최대 밝기가 된다고 보면 된다.
아두이노에서는 이를 총 256단계로 나눌 수 있으며, 0부터 255까지의 숫자를 부여함으로써 PWM 제어를 수행하게 된다.
[회로 구성]
회로도의 경우 저번 포스팅과 동일한 구성이다.
마찬가지로 저항을 사용하고 싶다면 아래와 같이 구성하면 된다.
[코드 작성]
저번 포스팅에서는 LED를 순서대로 on/off 되도록 코드를 작성하였다면, 이번 포스팅에서는 순서대로 on/off가 되지만 각 on/off 과정이 보다 부드럽게 이루어지도록 (즉, 밝기를 조절하며 on/off 되도록) 작성하였다.
#define LED1 9
#define LED2 10
#define LED3 11
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
for (int i=0;i<256;i++) {
analogWrite(LED1,i);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
delay(10);
}
for (int i=255;i>-1;i--) {
analogWrite(LED1,i);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
delay(10);
}
delay(50);
for (int i=0;i<256;i++) {
digitalWrite(LED1,LOW);
analogWrite(LED2,i);
digitalWrite(LED3,LOW);
delay(10);
}
for (int i=255;i>-1;i--) {
digitalWrite(LED1,LOW);
analogWrite(LED2,i);
digitalWrite(LED3,LOW);
delay(10);
}
delay(50);
for (int i=0;i<256;i++) {
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
analogWrite(LED3,i);
delay(10);
}
for (int i=255;i>-1;i--) {
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
analogWrite(LED3,i);
delay(10);
}
delay(50);
}
for문과 analogWrite() 함수를 사용하여 반복문으로 LED의 밝기 조절을 구현하였다.
analogWrite() 함수의 경우, 지정한 핀에 아날로그 신호를 입력시킬 수 있게 해주는 함수이다.
0부터 255까지의 숫자를 사용하여 신호를 입력하며, 이를 통해 LED의 밝기를 조절할 수 있다.
다만 아두이노 우노의 경우 PWM 신호를 출력할 수 있는 핀이 지정되어 있기 때문에, PWM 기능을 사용하기 위해서는 지정된 핀을 사용해야 한다. (D3,5,6,9,10,11)
for문의 경우 조건문을 사용하여 원하는 만큼 해당 구문을 반복하여 실행할 수 있게 해주는 구문이다.
조건문에는 3가지의 요소가 포함되며, 반복 횟수를 결정할 변수의 선언 및 초기화, 반복 횟수 결정을 위한 범위 설정, 변수의 단계별 증감 방식 결정의 3가지가 필요하다.
위 코드의 경우 ‘i’라는 변수를 반복 횟수를 결정하기 위한 변수로 선언하였으며, 0부터부터 256 미만까지 1씩 증가하는 for문과 255부터 -1 이전까지 1씩 감소하는 for문을 반복하게 된다.
결과적으로 각 for문은 총 255번 반복하면서 LED의 밝기를 조절하게 되는 것이다.
특이점으로는 for문 내부에 10ms씩의 delay() 함수를 추가하였는데, 이는 LED의 밝기가 변하는 것을 직접 확인하기 위해 밝기 변화 과정을 느리게 진행시키기 위함이다.
최종적으로 위 코드는 각 LED를 점점 밝게 켰다가 다시 점점 어둡게 끄는 동작을 반복하게 된다.
[동작 영상]
'아두이노 (Arduino)' 카테고리의 다른 글
12. 풀업 저항, 풀다운 저항 (플로팅 현상) (0) | 2020.07.25 |
---|---|
11. 아두이노 LED 실습 (4) with Button module (0) | 2020.07.19 |
9. 아두이노 LED 실습 (2) (0) | 2020.07.17 |
8. 아두이노 LED 실습 (1) (0) | 2020.07.12 |
7. 아두이노 LED Blink 예제 실습 (0) | 2020.07.12 |