Leitfaden zur Arduino-Kabelportierung
Arduino Kabelskizzen und Bibliotheken können in ein Arduino-Kabelprojekt in Visual Studio kopiert/eingefügt werden und auf Raspberry Pi 2, Raspberry Pi 3 oder Minnowboard Max ausgeführt werden. Manchmal müssen diese Dateien geringfügig geändert werden, um sie mit der Windows-Umgebung oder dem Board, mit dem Sie arbeiten, kompatibel zu machen. In diesem Leitfaden werden diese Änderungen sowie häufige Probleme behandelt, die bei der Bereitstellung von Arduino-Verdrahtungsprojekten auftreten können.
Portieren
Pins aktualisieren
Es mag selbstverständlich sein, aber viele Skizzen und Bibliotheken (insbesondere solche für Arduino-Shields) enthalten Möglicherweise Verweise auf bestimmte Connectorpins für Arduino-Geräte. Sie sollten Ihre Skizzen so anpassen, dass sie die entsprechenden Anschlussstifte für das Gerät, an dem Sie arbeiten, und die von Ihnen verwendete Konfiguration verwenden.
Arduino-Verdrahtung erfordert letztendlich eine physische Pinnummer für alle Funktionen, die sich auf "Pins" beziehen. Sie können diese Nummern direkt verwenden, aber wir haben auch einige vordefinierte Pinnamen bereitgestellt, die den Steckerpins auf bestimmten Boards entsprechen.
Der physische Stecker pin 29 auf einem Raspberry Pi 2 und 3 wird beispielsweise auch als GPIO5
bezeichnet. Sie können GPIO Pin 5 auf einem Raspberry Pi 2 und 3 mit einem der folgenden Befehle auf den Status HIGH festlegen:
pinMode( 29, OUTPUT );
digitalWrite( 29, HIGH );
oder
pinMode( GPIO5, OUTPUT );
digitalWrite( GPIO5, HIGH );
Die vordefinierten Pinnamen finden Sie in pins_arduino.h und sind in jedem Arduino-Verdrahtungsprojekt enthalten. Da jedoch je nach Hardwareeinrichtung, für die Sie erstellen, verschiedene physische Anschlussstifte verfügbar sind, haben wir hier auch eine Tabelle hinzugefügt, in der beschrieben wird, welche Pinnamen für jedes Gerät verfügbar sind.
Raspberry Pi 2 und 3
Anheften definieren | Entsprechende Pinnummer |
---|---|
LED_BUILTIN | Onboard-LED |
GPIO* where * refers to [0, 27] |
Siehe Pinout-Diagramm |
GCLK | 7 |
GEN* where * refers to [0, 5] |
*Siehe Pinoutdiagramm |
SCL1 | 5 |
SDA1 | 3 |
CS0 (oder CE0 oder SS) | 24 |
CS1 (oder CE1) | 26 |
SCLK (oder SCK) | 23 |
MISO | 21 |
MOSI | 19 |
RXD | 10 |
TXD | 8 |
Minnowboard Max
Anheften definieren | Entsprechende Pinnummer |
---|---|
GPIO* where * refers to [0, 9] |
Siehe Pinout-Diagramm |
SCL | 13 |
SDA | 15 |
CS0 (oder CE0 oder SS) | 5 |
SCLK (oder SCK) | 11 |
MISO | 7 |
MOSI | 9 |
CTS1 | 10 |
RTS1 | 12 |
RX1 | 8 |
TX1 | 6 |
RX2 | 19 |
TX2 | 17 |
Häufige Probleme
Visual C++-Projektvorlage "Arduino-Verdrahtungsanwendung" in Visual Studio nicht gefunden
Ursache: Die Windows IoT-Projektvorlagen-Erweiterung für Visual Studio ist nicht installiert.
Lösung: Sie müssen die Visual Studio-Erweiterung für Windows IoT-Projektvorlagen installieren, bevor Sie Arduino-Verdrahtungsprojekte in Visual Studio erstellen können. Wechseln Sie zur Erweiterungsseite für Windows IoT Core-Projektvorlagen , um die Erweiterung aus dem Visual Studio-Katalog herunterzuladen!
FEHLER: "Bezeichner nicht gefunden" beim Aufrufen einer Funktion
Ursache: Dieser Fehler tritt während des Linkervorgangs auf, wenn eine Funktion aufgerufen wird, die noch nicht im Dokument deklariert wurde.
Lösung: In C++ müssen alle Funktionen deklariert werden, bevor sie aufgerufen werden. Wenn Sie eine neue Funktion in Ihrer Skizzendatei definiert haben, muss entweder die Deklaration oder die gesamte Implementierung der Funktion über allen Versuchen zum Aufrufen der Funktion liegen (normalerweise am Anfang des Dokuments).
Beispiel:
Der folgende Codeblock löst den Fehler "'myFunction': Bezeichner nicht gefunden" aus.
void setup()
{
}
void loop()
{
myFunction();
}
void myFunction()
{
//do something
}
Es gibt zwei Lösungen. Zunächst können Sie die Funktion über allen Aufrufen deklarieren. In der Regel erfolgt diese Deklaration am Anfang der Datei.
// Declare function here
void myFunction();
void setup()
{
}
void loop()
{
myFunction();
}
// And, define the function here
void myFunction()
{
//do something
}
Alternativ können Sie die gesamte Implementierung der Funktion über alle Aufrufe verschieben. Dies hat den Effekt, dass die Funktion gleichzeitig deklariert und definiert wird.
void setup()
{
}
void myFunction()
{
//do something
}
void loop()
{
myFunction();
}
Meine Lösung hängt unendlich, wenn sie initialisiert wird
Es gibt ein bekanntes Problem, das dazu führen kann, dass eine C++-Lösung beim Initialisieren unendlich hängen bleibt (Deadlock). Diese Art von Problem tritt möglicherweise auf, wenn Sie feststellen, dass Ihre Lösung scheinbar für immer hängen bleibt und Sie den Debugger nicht verwenden können, um eine Anweisung in den Abschnitten setup() oder loop() Ihrer Arduino-Verdrahtungsanwendung zu "unterbrechen".
Ursache: Ein Objekt wird erstellt oder eine Funktion aufgerufen, die zu einer asynchronen Aktion führt, bevor die Lösung die Initialisierung abgeschlossen hat. Es wird wahrscheinlich durch den Konstruktor eines Objekts verursacht, der eine API-Funktion wie pinMode
aufruft.
Lösung: Verschieben Sie alle Objektkonstruktoren und Funktionsaufrufe aus dem Initialisierungsabschnitt des Codes in den setup()
Block.
Beispiel 1:
Die Ausführung dieser Skizze ruft eine Funktion auf, die aufgerufen setPinModes()
wird, bevor die Lösung selbst initialisiert wurde. Die Lösung scheint ausgeführt zu werden, hängt aber unendlich.
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;
}
Die Lösung ist unten, wir haben einfach die Ausführung von setPinModes()
in die setup()
Funktion verschoben:
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;
}
Beispiel 2:
Die Ausführung dieser Skizze erstellt ein Objekt auf dem Stapel, bevor setup()
aufgerufen wurde. Da das Objekt in seinem Konstruktor aufruft pinMode
, verursacht dies auch einen Deadlock. Dies ist ein ungewöhnliches Problem, kann aber bei Objekten aus bestimmten Bibliotheken (z. B. der Arduino-Bibliothek LiquidCrystal
) auftreten.
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject myObject;
void setup()
{
}
void loop()
{
myObject.doSomething();
}
Die Lösung finden Sie unten. Wir haben das Objekt in einen Objektzeiger geändert und die Initialisierung des Objekts in setup()
verschoben.
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject *myObject;
void setup()
{
myObject = new MyObject();
}
void loop()
{
myObject->doSomething();
}
Verwenden von Serial.print()
und Serial.println()
Viele Arduino-Skizzen verwenden Serial
zum Drucken von Daten in der seriellen Konsole (sofern geöffnet) oder zum Schreiben in die seriellen Leitungen (USB oder tx/rx).
In früheren Versionen des Lightning SDK war die Hardwareunterstützung Serial
nicht enthalten. Daher haben wir eine Log()
Funktion bereitgestellt, die im Debuggerausgabefenster in Visual Studio gedruckt wird. Serial.print*()
oder Serial.write()
musste entfernt werden.
Ab Lightning SDK v1.1.0 haben wir jedoch Unterstützung hinzugefügt Hardware Serial
, und beide Serial.print*()
Funktionen oder Serial.write()
werden vollständig unterstützt. Wenn Sie also eine für ein Arduino erstellte Skizze kopieren, müssen Sie keinen dieser seriellen Verweise in der Windows IoT-Version der Skizze ersetzen.
Darüber hinaus haben wir die Funktionalität von Serial.print()
und Serial.println()
erweitert, um in das Debuggerfenster auszuzugeben, wenn ein Debugger angefügt ist – zusätzlich zum Schreiben in die seriellen Hardware-Pins.
Der Debugausgabedruck ist als Standard festgelegt, da das Lesen dieser Ausgabe das ist, was die meisten Benutzer beim Ausführen ihrer Skizzen wünschen. Diese Funktionalität kann jedoch auch deaktiviert werden. Um z. B. die Leistung zu verbessern, rufen Sie Serial.enablePrintDebugOutput(false);
einfach auf, um sie in Ihrer Skizze zu deaktivieren. Rufen Sie zum erneuten Aktivieren auf Serial.enablePrintDebugOutput(true);
. Das Schreiben an die seriellen Hardware-Pins ist von diesen Aufrufen nicht betroffen.
Beachten Sie, dass Sie keine Peripheriegeräte an Ihre seriellen Pins wie ein FTDI anfügen müssen, um die Ausgabe an das Debuggerfenster zu senden. Sie müssen jedoch sicherstellen, dass das Debuggerfenster geöffnet ist, während Ihre Anwendung debuggen wird.
Die Projektvorlagen wurden auf der Erweiterungsseite für Windows IoT Core-Projektvorlagen aktualisiert, um die Verwendung von Hardware Serial
sofort zu aktivieren. Wenn Ihre Arduino-Verdrahtungsanwendung jedoch bereits mit einer älteren Projektvorlagenversion erstellt wurde, müssen Sie 1) Ihr Projekt auf das neueste Lightning SDK v1.1.0 oder höher aktualisieren und 2) Ihrem AppxManifest die erforderliche Hardware serial-Gerätefunktion hinzufügen, um verwenden Serial
zu können.
Hardware Serielle Gerätefunktionen
Für die serielle Hardwarefunktionalität in Windows 10 IoT Core sind Gerätefunktionsdeklarationen erforderlich, die dem AppX-Manifest hinzugefügt werden.
Suchen Sie die Datei Package.appxmanifest
in Ihrem Projekt, indem Sie den Dateinamen im Projektmappen-Explorer eingeben. Klicken Sie dann mit der rechten Maustaste auf die Datei, und wählen Sie "Mit öffnen" aus. Wählen Sie "XML (Text)Editor" aus, und klicken Sie auf "OK".
Fügen Sie im appx-Manifestdatei-Editor deviceCapability serialcommunication
ihrem Projekt wie im folgenden XML-Codeausschnitt hinzu:
<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>
Aktualisieren Ihres Projekts auf das neueste Lightning SDK
Die Arduino-Kabelprojekte sind vom Lightning SDK Nuget-Paket abhängig, um die erforderlichen Arduino-Verdrahtungsfunktionen und -deklarationen sowie die Schnittstelle mit dem Lightning-Treiber zu implementieren. Das neueste Lightning SDK enthält die neuesten Verbesserungen und Fehlerbehebungen. Führen Sie die folgenden Schritte aus, um ein Upgrade auf das neueste Lightning SDK durchzuführen:
- Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und klicken Sie auf "Nuget-Pakete verwalten...".
- Wechseln Sie im NuGet-Paket-Manager zur Registerkarte "Installiert". Das Microsoft.IoT.Lightning-Paket sollte installiert sein.
- Verfügbare Versionen werden im Kombinationsfeld "Version" aufgeführt.
- Wählen Sie die neueste Version aus, und klicken Sie auf "Aktualisieren", um Ihr Paket zu aktualisieren.
- Hinweis: Wenn Sie ein Upgrade auf eine Vorabversion durchführen möchten, aktivieren Sie auch das Kontrollkästchen "Vorabversion einschließen".