Servo 라이브러리는 서보 모터(servo motor)의 제어를 위한 객체를 정의한 것이다. 서보모터는 R/C카의 조향장치나 마이크로로봇의 구동장치로 쓰이는 모터로서 신호선 한 가닥으로 0도~180도의 각도를 조절할 수 있는 것이다.

[그림 1] 서보 모터의 외형

그림에서 보듯이 전원선인 Vcc/GND와 신호선 세 가닥이 인터페이스의 전부이다. 모터축의 각도는 신호선으로 인가되는 펄스폭으로 조정된다.

[그림 2] 서보 모터의 신호선으로 인가되는 펄스(pulse)

[그림 2]에 서보모터의 신호선으로 인가되는 펄스를 도시하였다. 주기 B는 3ms~20ms 의 범위를 가지며 주기가 짧을 수록 모터축의 회전 속도가 빨라진다. 펄스의 폭 A는 1.5ms 일때 중심각도인 0도를 가리키게 되고 1ms(최소값 0.7ms)일때 –90도, 2ms(최대값 2.3ms)일 때 +90도를 갖는다. 즉, 이 펄스폭을 조절하여 –90도에서 90도 사이의 원하는 각도를 가지도록 제어할 수 있는 것이다.


 아두이노의 Servo 라이브러리는 이러한 펄스를 발생시키는 기능을 구현하고 있으며 사용자는 세부 동작 원리를 알지 못하더라도 라이브러리 함수를 사용하는 방법만 알면 서보모터를 제어할 수 있다. 생성자는 입력인수가 없는 것 하나이며 멤버함수로 다음과 같은 것들이 있다.


  • void attach(pin) : 서보모터의 신호선이 연결된 핀을 지정한다.

  • void attach(pin, min_us, max_us) : 펄스폭 A의 최소, 최대값까지 지정한다.

  • void write(angle) : 각도를 지정한다. (angle: 0~180)

  • void writeMicroseconds(us) :펄스폭 A를 us단위로 지정한다.

  • int read() : 현재 각도를 읽는다.반환값은 [0, 180]의 정수.

  • boolean attached() : 서보모터 핀이 지정되어 있는지 검사한다.

  • void detach() : 서보모터의 지정된 핀을 내부적으로 제거한다.

실험에 사용된 서보모터는 SG-90이라는 초소형 모터이다.

[그림 3] SG-90 초소형 서보 모터

첫 번째 예제

 첫 번째로 서보모터를 설정하고 중심각도를 유지하는 간단한 예제를 작성해 보자.

#include <Servo.h>
Servo sm;
void setup() {
   sm.attach(9); //9번 핀에 서보모터의 신호선을 연결
   sm.write(90); //90도(중심각) 각도로 회전
}
void loop() {
}

두 번째 예제

 두 번째로 서보모터 축이 0도에서 180도로 계속 왕복 운동을 하도록 프로그램을 작성해 보자.


#include <Servo.h>
Servo sm;
void setup() {
   sm.attach(9); //9번 핀에 서보모터의 신호선을 연결
}
void loop() {
   sm.write(0); //0도로 회전
   delay(2000);
   sm.write(180); //180도로 회전
   delay(2000);
}


 이와 같이 servo 라이브러리를 사용하면 간편하게 디지털 핀 하나를 이용하여  서보 모터를 제어할 수 있으며 동시에 다수의 서보 모터를 제어하는 것도 가능하다.



Posted by 살레시오
,

 아두이노는 주변 기기들을 간편하게 제어할 수 있는 다양한 라이브러리가 존재한다. arduino.cc 에서는 이들 라이브러리를 표준 라이브러리와 그외의 것들로 구분하는데 표준 라이브러리는 아두이노 IDE에 포함된 것으로 다음과 같은 것들이 있다.


[표 1] 아두이노 표준 라이브러리

라이브러리명

기능

비고

EEPROM

EEPROM에 읽고 쓰는 기능을 하는 함수들.

Ethernet

Arduino Ethernet Shield를 이용한 인터넷 접속.

Firmata

시리얼 프로토콜을 이용하여 PC와 연결하여 데이터를 주고 받기.

GSM

GSM shield를 이용하여 GSM/GRPS 네트워크에 접속하기.

LiquidCrystal

LCD 제어.

SD

SD카드에 읽고 쓰기.

Servo

서보모터 제어.

SPI

SPI(Serial Peripheral Interface) 통신.

SoftwareSerial

시리얼통신을 소프트웨어적으로 구현한 것.

Stepper

스테핑모터 구동.

TFT

Arduino TFT screen에 문자, 이미지, 도형 표시하기.

WiFi

Arduino WiFi shield를 이용하여 인터넷 접속하기.

Wire

TWI (I2C) 통신.


[표 2] 특수 라이브러리

라이브러리명

기능

비고

Audio

SD카드에 저장된 오디오파일 재싱.

Due

Scheduler

다중 non-blocking 태스크 관리.

USBHost

마우스와 키보드 같은 USB주변장치와의 통신.

Esplora

Esplora 보드의 센서와 작동기를 쉽게 접근하도록 함.

Esplora

Keyboard

연결된 컴퓨터에 키보드 입력 전송.

Leonardo, Micro,Due,Esplora

Mouse

연결된 컴퓨터의 마우스 커서 제어.


[표 3] 기타 라이브러리 (사용하기 위해서는 설치 과정이 필요함)

라이브러리명

기능

비고

Messenger

PC로부터의 텍스트기반 메시지 처리.

통신

NewSoftwareSerial

SoftwareSerial 라이브러리의 개선판

OneWire

1-wire protocol을 사용하는 장치 제어(Dallas Semiconductor)

PS2Keyboard

PS2 키보드로부터 문자 읽어들이기.

Simple Message System

아두이노와 PC간 메시지 보내기.

SSerial2Mobile

휴대폰을 이용하여 문자메세지나 이메일 보내기.

Webduino

확장가능한 웹서버 라이브러리(이더넷쉴드)

X10

AC전원선으로 x10신호 보내기.

XBee

XBee와의 통신.

SerialControl

시리얼 통신으로 다른 아두이노 제어하기


Capacitive Sensing

두 개 혹은 그 이상의 핀을 정전식 터치센서로 사용.

센싱

Debounce

(버튼으로부터) 바운싱을 제거하기.


GFX

기반 클래스(표준 그래픽 루틴)

디스플레이/LED

GLCD

KS0108 칩 기반의 그래픽 LCD 라이브러리

Improved LCD library

LCD라이브러리의 오류 수정 버전

LedControl

LED행렬/7세그먼트 제어 (MAX7221/MAX7219)

LedControl

여러개의 LED를 Maxim칩으로 제어하는 다른 라이브러리

LedDisplay

HCMS-20xx 스크롤링 LED디스틀레이 제어.

Matrix

기본적인 LED매트릭스를 제어하는 라이브러리.

PCD8544

Nokia55100 LCD 제어기(Adafruit ind.)

Sprite

LED매트릭스의 애니메이션 사용을 위한 기반 클래스

ST7735

1.8“ TFT 128x160 스크린 제어 라이브러리(adafruit)


FFT

오디오 혹은 다른 아날로그 신호의 주파수 해석.

audio

Tone

오디오 주파수의 구형파 생성.


TLC5940

16채널 12비트 PWM 제어기

PWM


DateTime

현재 날짜와 시간을 추적.

타이밍

Metro

정해진 시간 간격으로 수행.

MsTimer2

타이머2를 써서 매 N밀리초마다 정해진 일을 수행


PString

버퍼에 프린팅을 하기위한 가벼운 클래스

유틸

Streaming

프린트문을 간략히 하기위한 메쏘드

 여기에 소개된 리스트 외에도 사용자들이 작성한 수 많은 라이브러리들이 공유되고 있다. 따라서 본인이 필요한 기능을 구현하기 위해서 직접 작성하기 전에 그 기능을 지원하는 라이브러리가 있는지 검색해 보는 과정을 거쳐야 한다.



Posted by 살레시오
,

 아두이노 우노의 경우 PWM주파수가 980Hz (5,6번 핀)와 490Hz(3, 9, 10, 11번 핀)로 고정되어 있다. 보통의 경우(LED의 밝기를 제어한다든가 소형 모터를 돌릴 때)에는 이 주파수를 사용하는 것에 별 문제는 없다.

[표 1] 아두이노 우노의 pwm 주파수

핀 번호

PWM 주파수

5, 6

980Hz

3, 9, 10,11

490Hz

하지만 중소형 이상의 DC모터를 구동하는 경우에는 보통 10KHz 이상의 PWM 주파수를 사용하므로 아두이노에서 제공하는 기본 주파수로는 DC모터를 구동하기에 적절하지 않다. 이 주파수가 중요한 이유는 만약 PWM주파수가 너무 낮다면 모터의 속도를 정밀하게 제어할 수 없으며 모터에서 소음이 발생하는 경우도 있기 때문이다.

 

 이런 경우에 PWM 주파수를 변경해야 하는데 아두이노의 표준 API에는 아쉽게도 PWM의 주파수를 조절할 수 있는 함수를 제공하지 않지만 사용자가 만들어 놓은 라이브러리가 있다. 아래의 페이지에 자세하게 설명되어 있다.

다운로드 받은 파일의 압축을 풀면 세 개의 폴더가 있는데 이 중 PWM 폴더를 아래의 폴더에 복사하여 붙여넣는다.

<아두이노 IDE 설치 폴더>\Arduino\libraries

윈도우즈 시스템에서는 보통 아래의 폴더이다.

C:\Program Files\Arduino\libraries

그러면 아두이노 IDE에 다음 [그림 6.6.1]과 같은 항목이 생성된다. 이 항목을 선택하면 텍스트 에디터에 다음과 같이 인클루드문이 추가된다.

#include <PWM.h>

이것으로 이 라이브러리를 사용할 준비가 된 것이다.


[그림 1] pwm.h를 메뉴에서 인클루드하는 방법

이 라이브러리에서는 다음과 같이 다섯 개의 전역 함수를 제공한다.


[표 1] pwm.h에서 제공하는 전역 함수들

함수명

기능

InitTimers()

Initializes all timers. Needs to be called before changing the timers frequency or setting the duty on a pin

InitTimersSafe()

Same as InitTimers() except timer 0 is not initialized in order to preserve time keeping functions

pwmWrite(uint8_t pin, uint8_t val)

Same as 'analogWrite()', but it only works with initialized timers. Continue to use analogWrite() on uninitialized timers

SetPinFrequency(int8_t pin, int32_t frequency)

Sets the pin's frequency (in Hz) and returns a bool for success. 주파수 범위는 31Hz~2MHz 사이이다.

Sets the pin's frequency (in Hz) and returns a bool for success. 주파수 범위는 31Hz~2MHz 사이이다.

SetPinFrequencySafe(int8_t pin, int32_t frequency)

Same as SetPinFrequency except it does not affect timer 0. 주파수 범위는 31Hz~2MHz 사이이다.


여기서 보면 InitTimers() 와 SetPinFrequency() 함수는 함께 사용되는데 이 함수들은 내부적으로 timer0번을 초기화시킨다. 따라서 시간 관련 함수인 millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작하지 않는다. 그리고 3, 5, 9, 10번 핀을 PWM 핀으로 사용할 수 있다.

 반면 InitTimersSafe()와 SetPinFrequency() 함수는 역시 쌍으로 사용되는데 timer0를 초기화시키지 않으므로 시간 관련 함수들이 정상적으로 동작한다. 그리고 3,9,10번 핀을 PWM으로 사용할 수 있다. 두 경우 모두 PWM값을 쓰기 위해서는 analogWrite()함수 대신 pwmWrite()함수를 사용한다.


[표 2] pwm.h 의 두 함수 그룹 비교

함수 그룹

특징

장단점

적용 핀

InitTimers()

SetPinFrequency()

timer0

초기화

millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작하지 않는다.

3,

5,

9,

10

InitTimersSafe()

SetPinFrequencySafe()

timer0

초기화

안함

millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작한다.

3,

9,

10


시간 관련 함수들이 정상적으로 동작 하지 않는 것은 큰 문제이므로 InitTimersSafe() 과 SetPinFrequencySafe() 함수를 사용하는 것이 좋을 것이다.



Posted by 살레시오
,