NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDEの使い方(ライブラリの自作編)

イメージ 1
ArduinoIDEでライブラリ自作方法!

 Arduino IDEで使用するライブラリを自作する方法をまとめてみました!
 内容としては以下1~6項目ですが、実質1~4項目で作れます!

サンプルプログラム : プログラム例を元に一部をライブラリ化
ヘッダファイル : 必須ファイル1(クラス・関数等の名前を決める)
ソースファイル : 必須ファイル2(関数の内容等を記入)
ライブラリの使い方 : 作ったライブラリの使い方
キーワードファイル : 補足ファイル1(ライブラリのコードをハイライト!)
サンプルプログラム : 補足ファイル2(配布する時はサンプルプログラムも!)

Arduinoライブラリ用APIを作成する詳細な方法については、
APIスタイルガイドを参照ください。

1. サンプルプログラム

1.1 例
 図1プログラムは、実行すると13ピンに接続されたLEDを点滅させSOS(遭難信号)のモールス信号を出力します。
 このプログラムを例に、以下①~③についてライブラリ化を行います
①実際に点滅するdot関数とdash関数
②どのピンをLED出力に使用するかを決定するために関数が使用するPin変数
③ピンを出力として初期化するpinMode関数
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);}
図1:ライブラリ変換前のプログラム例

1.2 ライブラリに必要なファイル
 ライブラリには、少なくとも以下2つのファイルが必要です。
〇ヘッダファイル(拡張子.h)
 ライブラリの定義を記入します。これは内部にあるすべてのもののリストです。
〇ソースファイル(拡張子.cpp)
 実際に仕事をする関数を記入します。

2. ヘッダファイル

2.1 クラス
 モールス(Morse)信号のライブラリと言う事で、ヘッダファイル名を「Morse.h」とします。
 ヘッダファイルを作成するには、ArduinoIDE画面(一番上の図)右上にある「▼」ボタンをクリック → 「新規タブ」 → 「新規ファイルの名前:」欄に「Morse.h」と入力します。
 ヘッダーファイルのコアは、ライブラリ内の各関数の行で構成され、必要な変数と共に図2の様にクラス※1にまとめられます。

※以下補足です

※1:クラスとは、関数と変数の集合であり、すべてが1つの場所にまとめられている設計図の事。またクラス(設計図)のインスタンス※2(実体)を作成するために使用されるコンストラク※3という特別な関数があります。コンストラク※3はクラスと同じ名前で戻り型はありません。
※2:インスタンスとはオブジェクト指向で出てくる概念のひとつで設計図(クラス)を具現化した「実体」の事。
※3:コンストラクタとは、クラスのインスタンス生成時に実行される特別なメソッドで、主にそのクラスのメンバ変数を初期化するときに使用します。 通常のメソッド同様に引数を指定することも可能です。
class Morse{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;};
図2:クラスの構造

2.2 インクルード
 通常のプログラムではArduino言語の標準の型と定数に自動的にアクセスできますが、ライブラリからではアクセス出来ません。
 アクセスする為には図3のよう#include文で、「”Arduino.h”」を呼び出す必要が有ります。(前述のクラス定義の上にあります)
#include "Arduino.h"
図3:Arduino.hのインクルード

2.3 ヘッダーファイルの構造
 ヘッダーファイル全体を、図4の構造で包みます。
 これで#includeが作ったライブラリを2回インクルードしてしまう問題を防ぐことができます。
#ifndef Morse_h 
#define Morse_h 

//ここに#include文とプログラムがあります。

#endif
図4:ヘッダーファイルの構造

2.4 完成したヘッダーファイル
 最後に、ライブラリの一番上に「ライブラリ名・簡単な説明・作成者名、日付、ライセンス」等のコメントを図5の様に付けて完成です。
/*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
図5:完成した「ヘッダーファイル」

3. ソースファイル

 次に、ソースファイルMorse.cppのさまざまな部分について説明します。
 ソースファイルを作成するには、ArduinoIDE画面(一番上の図)右上にある「▼」ボタンをクリック → 「新規タブ」 → 「新規ファイルの名前:」欄に「Morse.cpp」と入力します。

3.1 インクルード
 最初に図6のライブラリを#include文で読み込みます。
 これにより、残りのコードArduino標準関数とヘッダーファイルの定義にアクセス出来る様にします。
#include "Arduino.h" 
#include "Morse.h"
図6:Arduino標準関数とヘッダーファイル定義をインクルード

3.2 コンストラク※3
 クラス※1(設計図)のインスタンス※2(実体)を作成するとき実行するコンストラク※3(方法)を図7の様に記入します。
 今回は、ユーザーが信号出力に使用したいピンを指定します。
 また他の関数で使用するためにプライベート変数に保存します。
Morse::Morse(int pin){
  pinMode(pin, OUTPUT);
  _pin = pin;}
図7:コンストラク

3.3 関数の登録
 ライブラリ化する1.1.①関数を、図8の通り関数の名前の前に「Morse ::」を付け、変数名pinの前に「_」を付け変えて記入します。

〇「Morse ::」
 これは、関数がMorseクラスの一部であることを示しています。
 クラス内の他の関数でもこれが再び表示されます。

〇「_」(アンダースコア)
 プライベート変数「_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);}
図8:関数のライブラリ化

3.4 完成したソースファイル
 最後に、ソースファイルの先頭にコメントヘッダを含めるのが一般的です。
 ソースファイルの全体は図9の通りです。
/*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);}
図9:完成した「ソースファイル」

4. ライブラリの使い方

4.1 ライブラリのインストール
 最初にプログラムブックディレクトリのライブラリサブディレクトリの中にMorseディレクトリを作成します。
 次にMorse.hとMorse.cppファイルをディレクトリにコピーまたは移動します。
 ArduinoIDEを起動し、メニュー → スケッチ → ライブラリをインクルードの順に開くと、一覧中にMorseが表示されます。
 ライブラリが表示されていない場合は、ファイルの拡張子が「.cpp」と「.h」で終わることを確認してください。(例えば「.pde」または「.txt」拡張子を付けない)

4.2 ライブラリの使用例
 1.1でインストールしたライブラリを使って図1プログラムを書き直したものが図10です。
 図1プログラムの一部がライブラリに移動したという他にも、図10プログラムにはいくつかの違いがあります。
 違いを4.3~4.5に示します
#include <Morse.h>  /*一番上の図の様に、インストールせずにヘッダ・ソースファイルを新規タブとしてプログラムに付けていれば 「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);}
図10:完成したライブラリを使った「プログラム」

4.3 #include文
 最初に、図10プログラムの先頭に#include文を追加しています。
 これにより、ボードにMorseライブラリも送信される様になり、このライブラリをプログラムから利用可能になります
 プログラムでライブラリが不要になったら、#include文を削除してメモリ領域を節約する必要があります。

 次に、Morseクラス※1インスタンス※2を作成します。
 インスタンス※2には「morse」等のを図11の様に付ける必要があります。
 この行が実行されると(実際にはsetup関数の前であっても)、Morseクラス※1のコンストラク※3が呼び出され、ここで指定した引数(この場合は13)が渡されインスタンス※2が構築されます。
 インスタンス※2が構築されたときに、ライブラリ内でpinMode関数が呼び出されるため、図10のsetup関数が中は空になります。
Morse morse(13);
図11:Morseクラスのインスタンス(morse)を引数「_pin=13」で作成

 インスタンス名と引数を変えて複数のインスタンスを作成する事も可能です。
 複数の引数(今回はピン番号)別に作成した複数のインスタンス(図11,12)は、各インスタンス※2専用変数「_pin」を持ち、それぞれの専用変数に引数が格納されます。
 つまり、複数のインスタンスを作成したい場合は、以下に示す例の様に引数別にインスタンス名(例)を入力します。
Morse morse2(12);
図12:Morseクラスのインスタンス(morse2)を引数「_pin=12」で作成

4.5 dot関数とdash関数
 最後に、13ピンにドット出力であれば「morse.dot();」、12ピン出力にダッシュ出力であれば「morse2.dash();」の様に、Morseライブラリの関数(dot、dash)を呼び出します。

5. 補足:キーワードファイル

 ArduinoIDEにはソースコードのハイライト(シンタックスハイライト)機能が備わっており、自作したライブラリの関数に対して何色で表示するかを指定する事が出来ます。
 ※このファイルが無くてもライブラリは動作しますが、関数がハイライトされていないと、書いた関数がIDEに認識されているかどうか心配になります

5.1 ファイル作成
 Morseディレクトリにkeywords.txtというファイルを作成します。

5.2 記入方法
 作成したファイル中には図13の様に記入します。
 各行には「キーワード名 → タブ(スペースではない) → キーワードの種類※4の順序で記入します。
※4:キーワードの種類:KEYWORD1:オレンジ色、KEYWORD2:茶色

 キーワードファイル作成後、コードにハイライトを反映させる為には、ArduinoIDEを再起動させる必要があります。
Morse   KEYWORD1
dash    KEYWORD2
dot     KEYWORD2
図13:キーワードファイルの記入例

6. 補足:サンプルプログラム

 自作のライブラリを人々に提供する場合、プログラムの例を付けるとより分かり易いです

6.1 examplesディレクトリ作成
 これを行うには、Morseディレクトリ内にexamplesディレクトリを作成します。

6.2 プログラム例のコピー
 次に、上で書いたプログラムを含むディレクトリ(SOS※5と呼ぶ)をexamplesディレクトリに移動またはコピーします。
※5:SOSは、ArduinoIDEメニューから、「スケッチ → スケッチのフォルダを表示」をクリックして見つけることができます。

6.3 確認
 ArduinoIDEを再起動し、メニューから「ファイル → スケッチの例 → > Examplesメニューの中」に作成したライブラリの項目が表示され、これにはプログラム例を含んでいます。
 ライブラリの使い方をよりよく説明するコメントを追加することもできます。
 キーワードと例を含むライブラリが完成し、それをチェックアウトしたい場合、Morse.zipとしてそれをダウンロードする事ができます。

7. まとめ

 自作ライブラリが作れれば煩雑なプログラムもスッキリします!

イメージ 1イメージ 3
励みになりますのでよければクリック下さい(^o^)/




この商品は、スイッチサイエンスウェブショップが販売し、Amazon.co.jp が発送します。 この出品商品にはコンビニ・ATM・ネットバンキング・電子マネー払いが利用できます。