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
---------------------------------------------------------------
#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 路徑,它有兩種
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 也會有類似的關係。
沒有留言:
張貼留言