2019年1月2日 星期三

ROSA 系統開發 60 ─ Arduino 的 #include 與 #define

http://4rdp.blogspot.com/2019/01/rosa-60-arduino-include-define.html

2019 祝大家新年快樂,2018 年時間投入在 4rdp 四格益智拼圖的開發,今年將再度回歸 ROSA  (Robot Operating System for Arduino) 開發,經過一年時間沉潛,沈思若要 ROSA 更加普及,須要將它寫成函式庫型態,所以我就從這地方出發。

ROSA 有一點與其他函式庫不同的地方,它有比較完整的程式架構,希望 Arduino 初階入門的朋友只要改動一些設定就可以立即使用,因此 C/C++ 語言中 #include 和 #define 是非常重要的語法,所以本節說明相關要點。

我們先建立一個 ROSA_Timer.ino 主程式,程式碼如下:

#define ledPin 13  // 第13隻接腳控制 LED 明滅。
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  digitalWrite(ledPin, HIGH); // 設定PIN13腳位為高電位= 5V ,LED 發亮
  delay(500); // 等待500 毫秒,也就發亮 0.5 秒
  digitalWrite(ledPin, LOW); // 設定PIN13腳位為低電位= 0V ,LED 熄滅
  delay(500); // 等待500 毫秒,也就熄滅 0.5 秒
}
------------------------------------------------------------

接下來 ROSA_Timer.ino 程式改寫為:

#define ledPin 13  // 第13隻接腳控制 LED 明滅。
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  led();
}

另外新增一個 ROSA_LED.cpp 程式

void led()
{
  digitalWrite(ledPin, HIGH); // 設定PIN13腳位為高電位= 5V ,LED 發亮
  delay(500); // 等待500 毫秒,也就發亮 0.5 秒
  digitalWrite(ledPin, LOW); // 設定PIN13腳位為低電位= 0V ,LED 熄滅
  delay(500); // 等待500 毫秒,也就熄滅 0.5 秒
}

程式編譯過程會出現下列錯誤
error: 'led' was not declared in this scope
---------------------------------------------------------------


這時 ROSA_Timer.ino 程式要修改為

#define ledPin 13  // 第13隻接腳控制 LED 明滅。
#include "ROSA_LED.h"
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  led();
}

另外新增一個 ROSA_LED.h 檔案

extern void led();


程式編譯過程又出現不同的錯誤
error: 'ledPin' was not declared in this scope
---------------------------------------------------------------


ROSA_Timer.ino 程式刪除 #define 再修改為

#include "ROSA_LED.h"
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  led();
}


ROSA_LED.h 檔案加入 #define

#define ledPin 13  // 第13隻接腳控制 LED 明滅。
extern void led();


ROSA_LED.cpp 程式加入 #include

#include "ROSA_LED.h"
void led()
{
  digitalWrite(ledPin, HIGH); // 設定PIN13腳位為高電位= 5V ,LED 發亮
  delay(500); // 等待500 毫秒,也就發亮 0.5 秒
  digitalWrite(ledPin, LOW); // 設定PIN13腳位為低電位= 0V ,LED 熄滅
  delay(500); // 等待500 毫秒,也就熄滅 0.5 秒
}


程式編譯過程又出現其它不同的錯誤
error: 'HIGH' was not declared in this scope
------------------------------------------------------------------

這時把 ROSA_LED.cpp 程式再補上

#include
#include "ROSA_LED.h"
void led()
{
  digitalWrite(ledPin, HIGH); // 設定PIN13腳位為高電位= 5V ,LED 發亮
  delay(500); // 等待500 毫秒,也就發亮 0.5 秒
  digitalWrite(ledPin, LOW); // 設定PIN13腳位為低電位= 0V ,LED 熄滅
  delay(500); // 等待500 毫秒,也就熄滅 0.5 秒
}


這才終於沒有任何錯誤產生,由此得知,要消除未宣告的錯誤,必須把 #define 放在該檔案前頭或是 #include 含入。
-------------------------------------------------------------------

因為希望 ROSA 可以提供一些程式選項讓使用者簡單設定,可以不必寫太多程式即可利用 ROSA 在一些常見的機器人控制應用上,玩家專注於動作編輯的創作,而 ROSA 的內部系統開發就由專業的韌體工程師來進行。所以再來研究 Arduino #include 路徑,它有兩種 系統路徑以及 "xxxx" 程式路徑,雖然未來 ROSA 想發展成函式庫型態,但是函式庫是無法 #include 主程式這邊的設定,所以只好退而求其次,發展類程式庫,把這些程式改放到下階目錄跟玩家的程式相區隔,現在在 ROSA_Timer.ino 的目錄下,新增一個 ROSA 目錄,然後把 ROSA_LCD.cppROSA_LCD.h 移到這個目錄,程式編譯後出現
fatal error: ROSA_LED.h: No such file or directory
------------------------------------------------------------------

因此 ROSA_Timer.ino 修改為

#include ".\ROSA\ROSA_LED.h"
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  led();
}

程式編譯後出現
undefined reference to `led()'
-------------------------------------------------------------------

再把 ROSA_Timer.ino 修改為

#include ".\ROSA\ROSA_LED.cpp"
// setup() 函數只會於電源啟動時執行1次
void setup() 
{
  // 設定第 13 支腳為輸出模式
  pinMode(ledPin, OUTPUT);
}
// loop() 函數會不斷的重複執行
void loop()
{
  led();
}


編譯成功
------------------------------------------------------------------

希望各位能從這樣的除錯過程了解 Arduino 的 #define 與 #include,未來 ROSA 的 #define 與 #include 也會有類似的關係。

沒有留言:

張貼留言