開發自己的 86Duino 程式庫

本文件將解釋如何替 86Duino 建立新的程式庫。

86Duino 函式庫的格式,在舊版 86Duino Coding 1xx 開發環境基本上與 Arduino 1.5.2 相容,在新版 86Duino Coding 2xx 開發環境與 Arduino 1.5.8 相容,因此使用者可以參考 Arduino library tutorial 頁面來撰寫 86Duino 程式庫。(注意在舊版 86Duino Coding 1xx 開發環境上,有個限制與 Arduino 不同:任何在 86Duino 程式庫內的檔案須符合 DOS 8.3 filename規範,也就是說任何檔案的檔案名稱最多支援長度至八個字母以及在 ”.” 後最長為三個字母的副檔名。這個限制是來自 DOSBOX 模擬器,86Duino Coding 1xx 開發環境所用來編譯程式的工具之一。在新版 86Duino Coding 2xx 開發環境已沒有此限制。)

我們將會由建立一個利用 LED 燈閃爍來製造摩斯密碼的範例來解釋如何將函式轉換成程式庫。轉換成程式庫後可以輕易的令其他使用者來使用你所撰寫的程式或更新並改進它。

我們使用此簡易產生摩斯密碼的草稿碼作為範例:

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);
}

若執行此草稿碼將會以 pin13 閃爍出 SOS (緊急呼叫) 的摩斯密碼。

此草稿碼有一些不同的部分是我們必須要加進程式庫內的。首先,當然是 dot() 以及 dash() 這兩個用來控制閃爍的函式。第二,用來指定以哪隻 ledPin 腳來閃爍出摩斯密碼的 pin 變數。最後,將pin 腳初始化成輸出模式時所呼叫的 pinMode() 。

讓我們開始將草稿碼轉換成函式庫!

一個程式庫至少需要兩個檔案:一個標頭檔 (附檔名為 .h) 以及一個原始碼檔 (副檔名為.cpp)。標頭檔內所放的是此程式庫的定義,通常包含著程式庫內所有函式或變數的清單。原始碼檔內則放著實際用來執行的程式碼。我們將此程式庫稱為 Morse,因此我們的標頭檔必須為 Morse.h。讓我們看看其內容為何,雖然一開始單看標頭檔會有些混淆,但之後配合原始碼檔即可釐清。

標頭檔的核心是由程式庫內所有函式的定義所組成,並將程式庫內所使用的變數以類別的方式封裝起來。

class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};

一個類別只是單純的函式與變數的集合。這些函式以及變數可以是 public的,意味著任何其他使用你程式庫的函式都可以存取。或者可以是 private的,代表著只有同一類別內的函式可以存取。每個類別都會有一個特別的函式稱為 constructor,這是用來建立一個類別的 instance 時所使用的。建構元的名稱會與類別名稱相同,且沒有回傳型態。

在標頭檔內還需要加入一些其他東西。一個是 #include 指令,它令你可以存取 Arduino/86Duino 所使用的程式語言中的標準型態與常數 (一般草稿碼會自動加入,但程式庫須自行加入)。此指令的使用方式如下 (必須放在類別定義程式碼的上方):
#include "Arduino.h"
最後,標頭檔常被一組看起來詭異的架構所包裹住。

#ifndef Morse_h
#define Morse_h
 
// the #include statment and code go here...
 
#endif

基本上,此架構可以預防其他使用者 #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 命令讓此程式庫可使用 Arduino/86Duino 的標準函式並連結至你的標頭檔。
#include "Arduino.h"
#include "Morse.h"

再來是建構元:此段程式碼在有人要建立此類別的實體時呼叫。在此範例中,使用者須指定要使用哪根 pin 腳。我們將此 pin 腳初始化成輸出狀態後將此變數儲存於 private 變數以供其他類別內的函式使用。

Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

在此段程式碼內有一些奇怪的地方。首先是在函式名稱前的 Morse:: 符號。這代表此函式是屬於 Morse 別的成員函式。在撰寫其他此類別的成員函式時將會再見到它。第二個地方是我們的 private 變數 _pin。此變數可以是任何你喜歡的名字,只要與標頭檔內的定義吻合即可。在此加入一條底線是一般用來方便辨認此變數屬於private,且也可以與傳入的參數做為分別 (如此範例的參數pin )。

接下來是之前從草稿碼抽出要做成程式庫的部分。看起來大致上與之前相同,除了在函式名稱前面多加上了 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);
}

最後,通常會於原始碼檔的最上方以註解方式留下相關資訊。最終原始碼檔如下:

/*
  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);
}

以上即完成了程式庫。讓我們看看如何使用你所建立的程式庫。

首先,建立一個 Morse 資料夾並放置在 libraries 資料夾內。再將 Morse.h 以及 Morse.cpp 放入 Morse 資料夾內。啟動 86Duino 編譯環境後,開啟草稿碼 > 匯入程式庫即可看到 Morse 在清單內。當草稿碼使用到此程式庫內的功能時將會編譯此程式庫。如果檔案未被編譯,請確認檔案副檔名確實為 .h 或 .cpp (不可使用其他副檔名如 .pde 或 .txt)

讓我們利用剛做出的程式庫來重寫一次打出摩斯密碼 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 程式庫的功能並將 Morse 程式庫編入機器碼傳至板子處執行。若是草稿碼內不再使用 Morse 程式庫了,使用者應該要刪除 #include 命令來節省空間。

第二,我們為 Morse 類別建立了一個實體稱做 morse:
Morse morse(13);

當這行命令被執行時 (通常是於 setup() 函式被執行之前),將會呼叫 Morse 類別的建構元並傳送指定的參數 (在此範例中為 13)。

注意我們的 setup() 是空的,因為原先呼叫 pinMode() 的步驟被移入程式庫內了 (當建構實體時會呼叫)。

最後,呼叫 dot() 以及 dash() 程式的部分須加入實體名稱做為前綴也就是 morse. 。我們可能會建立多個 Morse 類別的實體,但每個實體所用的 pin 腳是儲存於各自的 _pin 成員變數內。當我們以其中一個實體的名稱來呼叫成員函式時,將會以該實體所儲存的成員變數內容來執行。
Morse morse(13);
Morse morse2(12);

如此一來,若是利用實體 morse2.dot()_pin 來呼叫 dot 函式時變數將會是12。

當嘗試過新的草稿碼後,你可能會發現我們程式庫內所使用的關鍵字並不會被編譯環境改變顏色加以標記。這是由於 86Duino 軟體並不能自動的辨認出程式庫內所定義的東西 (即使標頭檔內寫得很明確),因此我們必須給予一些提示。在 Morse 資料夾內建立一個檔案名為 keywords.txt ,其檔案內容如下:
Morse KEYWORD1
dash KEYWORD2
dot KEYWORD2

每行內有想被當作關鍵字的名稱以及一個 tab 鍵 (非空白鍵) 以及關鍵字的種類。類別名稱的關鍵字種類通常為 KEYWORD1 ,在草稿碼編輯視窗內將被標識為橘色。函式的關鍵字種類通常為 KEYWORD2 ,在草稿碼編輯視窗內將被邊是為棕色。修改後須重新啟動 86Duino 編譯環境關鍵字的設定才能順利運作。

你也可以提供其他使用者有關此程式庫的範例草稿碼。建立一個 examples 資料夾並放置在 Morse 資料夾內。並將含有草稿碼的資料夾 (此範例我們稱之為 SOS) 移至 examples 資料夾內 (可藉由草稿碼 > 顯示草稿碼的所在目錄來找到草稿碼位置)。重啟 86Duino 執行環境後,可以在檔案 > 範例清單內找到 Morse。在草稿碼內也可加入一些註解來解釋如何使用此程式庫。

上述的範例程式庫是取自 Arduino tutorial,使用者可從 Arduino 的網站上下載: Morse.zip.


函式庫參考主頁面

86Duino 參考的文本是根據 Creative Commons Attribution-ShareAlike 3.0 License,部分文本是從 the Arduino reference 修改的。 參考中的代碼示例已發佈到公共領域。

發表評論

上部へスクロール