아두이노 라이브러리 만들기
원문 : 아두이노 공식 홈페이지
아두이노 공식 홈페이지에서 알려주는 아두이노용 라이브러리 만드는 방법을 번역한 문서입니다.
먼저 아두이노 UNO 보드에 내장된 LED를 이용해서 모르스 부호를 깜빡이는 함수를 만들고 이것을 라이브러리로 변환할 것입니다.
더 자세한 정보는 API Style Guide 에 있습니다.
아래는 Morse code 를 LED로 생성해주는 간단한 함수를 만들고, 함수를 이용해서 SOS를 깜빡이는 코드입니다.:
int pin = 13; void setup() { pinMode(pin, OUTPUT); } void loop() { dot(); dot(); dot(); dash(); dash(); dash(); dot(); dot(); dot(); delay(3000); } void dot() { digitalWrite(pin, HIGH); delay(250); digitalWrite(pin, LOW); delay(250); } void dash() { digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); delay(250); }
스케치를 실행하면 13번 핀을 이용해서 SOS 코드가 깜빡이게 됩니다.
라이브러리를 만들기 위해서는 3가지 부분이 이식되어야 합니다.
- dot(), dash() 함수
- LED가 연결된 핀 번호
- 사용할 핀을 초기화 하는 pinMode() 함수
라이브러리를 만들기 위해서는 최소 2개의 파일 – 헤더파일(.h 확장자를 가진 파일)과 소스파일(.cpp 확장자를 가진 파일) 이 필요합니다. 헤더파일은 라이브러리에 사용되는 함수와 변수에 대한 정의(선언)을 가지고 있습니다. 소스파일은 실제 동작 코드를 가지고 있습니다. 우리가 변환할 라이브러리를 “Morse” 라 하고 헤더파일은 Morse.h , 소스파일은 Morse.cpp 로 만들 것입니다.
먼저 헤더파일은 다음과 같이 작성할 수 있습니다. class 구문안에 각각의 함수와 변수를 나열하는 형태입니다.
class Morse { public: Morse(int pin); void dot(); void dash(); private: int _pin; };
헤더파일은 함수와 변수를 나열하는 형태입니다. 여기서 public: 아래로 작성된 부분은 라이브러리 사용자에 의해서 사용가능한 부분이라는 뜻입니다. private: 아래에 있는 함수와 변수는 모두 라이브러리 내에서만 사용하도록 제한한 것들 입니다. 이 전체를 포괄하는 것이 class 이며, Morse 라이브러리는 Morse 클래스를 정의합니다.
각각의 class 는 생성자(constructor) 라는 특별한 함수를 포함하고 있습니다. 생성자는 클래스의 instance를 만들때 사용됩니다. 생성자는 항상 클래스와 같은 이름을 가지고 있고 리턴 타입이 없습니다. (항상 클래스의 인스턴스를 리턴해야 하므로 사용자가 다르게 정의할 수 없습니다.)
헤더 파일에 몇 가지 추가 작업이 필요합니다. 먼저 아래에 있는 #include “Arduino.h” 구문을 사용해야 합니다. 이 구문은 아두이노의 표준 타입과 아두이노 언어에서 미리 정의해둔 상수들을 사용할 수 있게 해줍니다. (일반 스케치를 작성할 때 이 구문은 자동으로 추가되지만 라이브러리에서는 자동으로 추가되지 않습니다.)
#include "Arduino.h"
그리고 헤더 파일 전체를 아래 구문으로 감싸줍니다.
#ifndef Morse_h #define Morse_h // the #include statment and code go here... #endif
이 구문은 라이브러리가 2번 이상 포함(#include) 될 때에도 헤더파일이 한번만 포함되도록 제한해주는 역할을 합니다.
마지막으로 헤더파일의 최상단에 이 헤더파일의 기능과 역할, 만든 날짜, 작성자, 라이센스에 대한 주석을 추가해줍니다.
/* Morse.h - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007. Released into the public domain. */ #ifndef Morse_h #define Morse_h #include "Arduino.h" class Morse { public: Morse(int pin); void dot(); void dash(); private: int _pin; }; #endif
이제 소스파일 Morse.cpp 를 작성할 차례입니다.
먼저 #include 를 이용해서 필요한 헤더 파일들을 불러옵니다. 헤더파일에 정의된 함수와 변수들을 소스파일에서 사용하기 위함입니다.
#include "Arduino.h" #include "Morse.h"
그리고 생성자(constructor)를 작성합니다. 생성자는 클래스의 인스턴스를 만들어 주는 역할을 하므로, 생성자가 실행될 때 LED가 연결된 핀 번호를 받아서 저장해야 합니다. 그리고 해당 핀을 OUTPUT 모드로 초기화 해줘야 합니다.
Morse::Morse(int pin) { pinMode(pin, OUTPUT); _pin = pin; }
이제 함수의 본체 – 동작코드를 작성할 차례입니다.
아레에서 보듯 함수는 Morse:: – 클래스 이름으로 시작하는 부분이 붙습니다. 이것은 이 함수가 Morse 클래스의 한 부분이며 동작코드를 정의할 것임을 의미합니다.
그리고 헤더파일에서 _pin 으로 정의한 변수가 있음을 확인하세요. 이 변수의 이름은 마음대로 지정해도 되지만 보통 “_” 표시를 붙임으로써 이 변수가 private, 내부에서만 사용되는 변수임을 쉽게 알 수 있도록 해줍니다. 또한 함수의 파라미터로 받은 변수와 구분하는 역할도 합니다.
이제 라이브러리 동작코드를 작성할 준비가 완료되었습니다.
void Morse::dot() { digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250); } void Morse::dash() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); }
헤더 파일을 include 해주고, 주석을 추가한 최종 코드는 아래와 같습니다.
/* Morse.cpp - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007. Released into the public domain. */ #include "Arduino.h" #include "Morse.h" Morse::Morse(int pin) { pinMode(pin, OUTPUT); _pin = pin; } void Morse::dot() { digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250); } void Morse::dash() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); }
라이브러리를 만드는 과정이 끝났으므로 이제 라이브러리를 사용하는 방법을 설명할 차례입니다.
아두이노 설치 폴더의 libraries 폴더에 Morse 디렉터리를 만들고 Morse.h 와 Morse.cpp 파일을 넣어줍니다. 이제 아두이노 IDE 를 실행하세요. 만약 Sketch > Import Library 메뉴를 열었을 때 Morse 가 보이지 않는다면 뭔가 문제가 생긴 것입니다. 앞서의 과정을 다시 확인하세요. (파일 확장자도 확인하시구요)
아래는 Morse 라이브러리를 사용해서 SOS 스케치를 다시 작성한 코드입니다.:
#include <Morse.h> Morse morse(13); void setup() { } void loop() { morse.dot(); morse.dot(); morse.dot(); morse.dash(); morse.dash(); morse.dash(); morse.dot(); morse.dot(); morse.dot(); delay(3000); }
원래의 스케치와 몇 가지 다른점이 보이실겁니다.
먼저 최상단에서 #include 구문으로 헤더파일을 추가했습니다. 이 구문으로 Morse 라이브러리를 스케치에서 사용할 수 있으며 연결된 보드로 업로드 할 때 포함되어 전송됩니다. 따라서 필요없는 라이브러리는 #include를 삭제함으로써 지울 수 있고, 보드의 공간도 절약할 수 있습니다.
다음으로 Morse 인스턴스를 만드는 과정입니다.
Morse morse(13);
이 라인이 실행되면 (실제로 setup() 함수보다도 먼저 실행됩니다) Morse 클래스의 생성자(constructor)가 “13” 인자를 가지고 실행됩니다.
setup() 함수가 비어 있음을 확인하세요. Morse 클래스의 생성자에서 이미 pinMode() 로 초기화를 실행하기 때문에 그렇습니다.
마지막으로 dot(), dash() 함수를 부르는 방법입니다. 클래스의 인스턴스가 “morse” 로 생성되었기 때문에 “morse.”를 앞에 붙여서 함수를 호출합니다. 즉 morse 클래스에 정의된 함수를 호출한다는 의미입니다. 하나 이상의 인스턴스를 생성해서 2개 이상의 LED를 제어할 수도 있습니다. :
Morse morse(13); Morse morse2(12);
morse 인스턴스는 13번 핀을, morse2 인스턴스는 12번 핀을 제어하게 됩니다.
라이브러리를 가지고 새로운 스케치를 만들려고보면 라이브러리의 함수나 변수들이 하이라이트 되지 않았을겁니다. 아두이노 IDE에서는 자동으로 이 작업을 해주지 않습니다. 하이라이트 효과를 주려면 calledkeywords.txt 파일을 Morse 디렉터리에 생성하세요. 안에 채울 내용은 아래와 같습니다.:
Morse KEYWORD1 dash KEYWORD2 dot KEYWORD2
각각의 라인은 키워드와 탭 키워드 종류로 구성되어 있습니다. Class 는 KEYWORD1 으로 지정해야 하며, 오렌지 색으로 표시될 겁니다. 함수는 KEYWORD2 로 지정해야 하고, 갈색으로 표시됩니다. 파일작성이 완료되면 아두이노 IDE에서 인식할 수 있도록 프로그램을 재실행 합니다.
라이브러리를 작성했으면 사용방법-예제파일을 제공하는 것이 좋습니다. 먼저 examples 디렉터리를 Morse 디렉터리 안에 만듭니다. 그리고 example 디렉터리 안에 예제 파일이나 폴더를 복사해서 넣으세요. 여기서 마지막에 작성한 예제파일을 넣어주면 됩니다. (You can find the sketch using the Sketch > Show Sketch Folder command.) 아두이노 IDE를 재실행하면 Library-Morse 아이템이 File > Sketchbook > Examples 메뉴안에 있는 것을 확인할 수 있을 것입니다. 코드에는 사용방법을 위한 주석을 충분히 달아주세요.
이 문서에서 사용된 예제파일은 다음 링크에서 받으세요. Morse.zip.
API Style Guide 를 참고하면 라이브러리 작성을 위한 자세한 스타일 가이드를 보실 수 있습니다.