PWM(Pulse Width Modulation)
PWM 이란 Pulse Width Modulation의 준말로 펄스의 폭을 컨트롤 하는 주기 제어방법입니다. 출력되는 전압값을 일정한 비율(duty)동안은 High를 유지하고, 나머지는 Low를 출력하여 아래와 같은 사각파의 출력을 만들어 내는데, PWM을 사용하면 0V와 5V 사이의 아날로그 값을 모사할 수도 있으며, 제어 및 통신에서도 많이 사용됩니다.
analogWrite
아두이노에서는 analogWrite 함수를 통해서 이러한 PWM 출력을 제공하는데, analogWrite 함수의 인자로는 0~255까지의 정수가 들어갈 수 있습니다. 이 값에 따라 PWM의 duty가 0~100%로 변하게 됩니다.
led_gradation.ino
int ledPin = 6; // LED connected to digital pin 6 int val = 0; // variable to store the read value void setup() { pinMode(ledPin, OUTPUT); // sets the pin as output } void loop() { analogWrite(ledPin, val); // analogWrite values from 0 to 255 delay(5); val += 1; if(val >= 256) val = 0; }
서보 모터 제어하기
서보 모터 또한 PWM으로 각도 제어가 가능합니다. 통상적으로, 서보 모터를 제어하는 PWM은 20ms 정도의 주기를 가지고 있으며, 1ms ~ 2ms의 High 신호에 따라 0도 에서 180도까지 회전합니다. 반면 analogWrite 로 발생되는 PWM은 약 490Hz(핀마다 다름) 정도의 빠른 주기를 가지고 있는데, 따라서 해당 PWM 신호는 서보 모터를 제어하기 부적합 합니다. 해당 예제에서 우리는 미리 만들어 진 Servo 라이브러리를 사용하여 서보 모터를 제어 해 볼 것입니다.
servo.ino
#include <Servo.h> Servo myservo; // create servo object to control a servo int pos = 0; // variable to store the servo position void setup(){ myservo.attach(6); // attaches the servo on pin 6 to the servo object } void loop(){ for(pos=0; pos<=180; pos++){ // goes from 0 degrees to 180 degrees myservo.write(pos); delay(15); } for(pos=180; pos >=0; pos--){ // goes from 180 degrees to 0 degrees myservo.write(pos); delay(15); } }