Arduino 連接移植指南
Arduino 線路草圖和程式庫可以複製/貼到 Visual Studio 內的 Arduino 線路專案,並在 Raspberry Pi 2、Raspberry Pi 3 或 Minnowboard Max 上執行。 有時候需要對這些檔案進行些微的修改,使其與 Windows 環境更相容,或是您正在使用的面板。 本指南將涵蓋這些修改,以及部署 Arduino 連接專案時可能會遇到的常見問題。
移植
更新釘選
這可能不說,但許多草圖和程式庫 (特別是 arduino 防護) 可能包含 Arduino 裝置特定連接器針腳的參考。 您會想要自訂您的草圖,以針對您正在使用的裝置使用適當的連接器針腳,以及您使用的設定。
Arduino 連接最終需要實體連接器接腳編號,才能代表任何參考「針腳」的函式。 您可以直接使用這些數位,但我們也提供了一些預先定義的針腳名稱,對應到特定面板上的連接器針腳。
例如,Raspberry Pi 2 和 3 上的實體連接器針腳 29 也稱為 GPIO5
。 您可以使用下列其中一個命令,將 GPIO 針腳 5 設定為 Raspberry Pi 2 和 3 上的 HIGH 狀態:
pinMode( 29, OUTPUT );
digitalWrite( 29, HIGH );
或
pinMode( GPIO5, OUTPUT );
digitalWrite( GPIO5, HIGH );
預先定義的針腳名稱可以在 pins_arduino.h 中找到,並包含在每個 Arduino 線路專案中,但因為根據您建置的硬體設定,會有不同的實體連接器接腳可用,我們也在這裡包含一個表格來描述每個裝置可用的針腳名稱。
Raspberry Pi 2 和 3
釘選定義 | 對應的針腳號碼 |
---|---|
LED_BUILTIN | 上線 LED |
GPIO* where * refers to [0, 27] |
請參閱釘選圖 |
GCLK | 7 |
GEN* where * refers to [0, 5] |
*請參閱釘選圖 |
SCL1 | 5 |
SDA1 | 3 |
CS0 (或 CE0 或 SS) | 24 |
CS1 (或 CE1) | 26 |
SCLK (或 SCK) | 23 |
醬 | 21 |
MOSI | 19 |
RXD | 10 |
TXD | 8 |
Minnowboard Max
釘選定義 | 對應的針腳號碼 |
---|---|
GPIO* where * refers to [0, 9] |
請參閱釘選圖 |
SCL | 13 |
SDA | 15 |
CS0 (或 CE0 或 SS) | 5 |
SCLK (或 SCK) | 11 |
醬 | 7 |
MOSI | 9 |
CTS1 | 10 |
RTS1 | 12 |
RX1 | 8 |
TX1 | 6 |
RX2 | 19 |
TX2 | 17 |
常見問題
在 Visual Studio 中找不到 「Arduino 連接應用程式」Visual C++ 專案範本
原因:未安裝適用于 Visual Studio 的 Windows IoT 專案範本擴充功能。
解決方案:您必須先安裝適用于 Windows IoT 專案範本的 Visual Studio 延伸模組,才能在 Visual Studio 中建立 Arduino 連接專案。 請前往 Windows IoT 核心版專案範本延伸模組頁面 ,從 Visual Studio 資源庫下載延伸模組!
錯誤:呼叫函式時找不到識別碼
原因:當叫用尚未在檔中宣告的函式時,連結器進程期間就會發生此錯誤。
解決方案:在 C++ 中,所有函式都必須在叫用之前宣告。 如果您已在草圖檔案中定義新的函式,則宣告或函式的整個實作必須高於任何嘗試叫用它 (通常位於檔頂端) 。
範例:
下列程式碼區塊會引發錯誤 「'myFunction': 找不到識別碼」
void setup()
{
}
void loop()
{
myFunction();
}
void myFunction()
{
//do something
}
有兩個解決方案。 首先,您可以宣告函式高於任何調用。 一般而言,此宣告會在檔案頂端完成。
// Declare function here
void myFunction();
void setup()
{
}
void loop()
{
myFunction();
}
// And, define the function here
void myFunction()
{
//do something
}
或者,您可以將函式的整個實作移至任何調用上方。 這同時具有宣告和定義函式的效果。
void setup()
{
}
void myFunction()
{
//do something
}
void loop()
{
myFunction();
}
我的解決方案在初始化時無限停止回應
已知問題可能會導致 C++ 解決方案在初始化時無限停止回應 (死結) 。 如果您發現解決方案似乎永遠停止回應,而且您無法使用偵錯工具來「中斷」至 Arduino 連接應用程式之 setup () 或 loop () 區段中的任何語句,您可能會遇到這種問題。
原因:正在建立物件,或正在呼叫函式,這會導致解決方案完成初始化之前發生非同步動作。 這可能是由呼叫 API 函式的物件建構函式所造成,例如 pinMode
。
解決方案:將任何物件建構函式和函式呼叫從程式碼的初始化區段移至 setup()
區塊。
範例 1:
此草圖的執行會在初始化方案本身之前呼叫函 setPinModes()
式。 解決方案看起來將會執行,但會無限停止回應。
bool setPinModes();
int pin = GPIO5;
bool initialized = setPinModes();
void setup()
{
}
void loop()
{
if( initialized )
{
//do something
}
}
bool setPinModes()
{
if( pin < 0 ) return false;
pinMode( pin, OUTPUT );
return true;
}
解決方案如下,我們只是將 的執行 setPinModes()
移至 函 setup()
式:
bool setPinModes();
int pin = GPIO5;
bool initialized;
void setup()
{
initialized = setPinModes();
}
void loop()
{
if( initialized )
{
//do something
}
}
bool setPinModes()
{
if( pin < 0 ) return false;
pinMode( pin, OUTPUT );
return true;
}
範例 2:
此草圖的執行會在呼叫 之前 setup()
,于堆疊上建立 物件。 由於物件在其建構函式中呼叫 pinMode
,這也會造成死結。 這是罕見的問題,但可能會發生來自特定程式庫的物件 (,例如 Arduino LiquidCrystal
程式庫) 。
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject myObject;
void setup()
{
}
void loop()
{
myObject.doSomething();
}
解決方案如下。 我們已將物件變更為物件指標,並將物件的初始化 setup()
移至 。
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject *myObject;
void setup()
{
myObject = new MyObject();
}
void loop()
{
myObject->doSomething();
}
使用 Serial.print()
和 Serial.println()
許多 Arduino 草圖會在開啟) 或寫入 USB 或 tx/rx) (序列行時,使用 Serial
將資料列印至序列主控台 (。
在舊版的 Lightning SDK 中,未包含硬體 Serial
支援,因此我們提供了一個 Log()
函式,它會列印至 Visual Studio 中的偵錯工具輸出視窗。 Serial.print*()
或 Serial.write()
必須移除。
不過,從 Lightning SDK v1.1.0開始,我們新增 Hardware Serial
了支援,且已完全支援 或 Serial.print*()
Serial.write()
函式。 因此,如果您要複製為 Arduino 建置的草圖,則不需要取代 Windows IoT 版草圖中的任何序列參考。
此外,我們已在附加偵錯工具時擴充 和 Serial.println()
的功能 Serial.print()
,以在附加偵錯工具時輸出至偵錯工具視窗,除了寫入硬體序列針腳之外。
偵錯輸出列印會設定為預設值,因為讀取該輸出是執行其草圖時大部分使用者想要的輸出。 不過,也可以停用該功能;例如,若要改善效能,只要呼叫 Serial.enablePrintDebugOutput(false);
以在您的草圖中停用它即可。 若要重新啟用它,請呼叫 Serial.enablePrintDebugOutput(true);
。 寫入硬體序列針腳不會受到這些呼叫的影響。
請注意,您不需要將任何周邊附加至 FTDI 之類的序列針腳,即可取得傳送至偵錯工具視窗的輸出。 不過,在偵錯應用程式時,您必須確定偵錯工具視窗已開啟。
專案範本已在 Windows IoT 核心專案範本擴充功能頁面上 更新,可使用現用的硬體 Serial
啟用。 不過,如果您的 Arduino 線路應用程式已使用較舊的專案範本版本建立,您必須 1) 將您的專案升級至最新的 Lightning SDK v1.1.0 或更新版本,而 2) 將必要的硬體序列裝置功能新增至 AppxManifest 才能使用 Serial
。
硬體序列裝置功能需求
Windows 10 IoT 核心版中的硬體序列功能需要將裝置功能宣告新增至 AppX 資訊清單。
Package.appxmanifest
在方案總管中輸入檔案名,以尋找專案中的檔案。 然後,以滑鼠右鍵按一下檔案,然後選擇 [開啟方式...]。 選擇 [XML (文本) 編輯器],然後按一下 [確定]。
在 appx 資訊清單檔案編輯器中 serialcommunication
,將 DeviceCapability 新增至您的專案,如下列 XML 程式碼片段所示:
<Capabilities>
<Capability Name="internetClient" />
<!-- General Arduino Wiring required capabilities -->
<iot:Capability Name="lowLevelDevices" />
<DeviceCapability Name="109b86ad-f53d-4b76-aa5f-821e2ddf2141"/>
<!-- The serialcommunication capability is required to access Hardware Serial. -->
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort"/>
</Device>
</DeviceCapability>
</Capabilities>
將您的專案升級至最新的閃電 SDK
Arduino 線路專案相依于 Lightning SDK Nuget 套件 ,以實作必要的 Arduino 線路函式和宣告,以及與 Lightning 驅動程式的介面。 最新的閃電 SDK 將包含最新的改善和錯誤修正。 若要升級至最新的 Lightning SDK,請遵循下列步驟:
- 在方案總管中,以滑鼠右鍵按一下您的專案,然後按一下 [管理 Nuget 套件...]
- 在 NuGet 套件管理員中,移至 [已安裝] 索引標籤。您應該會看到已安裝 Microsoft.IoT.Lightning 套件
- 可用的版本將會列在 [版本] 下拉式方塊內。
- 選擇最新版本,然後按一下 [更新] 以更新您的套件。
- 請注意,若要升級至發行前版本,請務必同時核取 [包含發行前版本] 核取方塊。