共用方式為


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

釘選圖 1

釘選定義 對應的針腳號碼
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 (文本) 編輯器],然後按一下 [確定]。

更新 Package.appxmanifest

在 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 套件
  • 可用的版本將會列在 [版本] 下拉式方塊內。
  • 選擇最新版本,然後按一下 [更新] 以更新您的套件。
  • 請注意,若要升級至發行前版本,請務必同時核取 [包含發行前版本] 核取方塊。

NuGet 套件管理員