Partager via


Guide de portage de câblage Arduino

Les croquis et bibliothèques de câblage Arduino peuvent être copiés/collés dans un projet Arduino Câblage à l’intérieur de Visual Studio et s’exécuter sur Raspberry Pi 2, Raspberry Pi 3 ou Minnowboard Max. Parfois, de légères modifications doivent être apportées à ces fichiers afin de les rendre plus compatibles avec l’environnement Windows ou la carte avec laquelle vous travaillez. Ce guide couvre ces modifications ainsi que les problèmes courants que vous pouvez rencontrer lors du déploiement de projets de câblage Arduino.

Portage

Mise à jour des épingles

Cela peut aller sans dire, mais de nombreuses esquisses et bibliothèques (en particulier celles pour les boucliers Arduino) peuvent contenir des références à des broches de connecteur spécifiques pour les appareils Arduino. Vous devez personnaliser vos croquis pour utiliser les broches de connecteur appropriées pour l’appareil sur lequel vous travaillez et la configuration que vous utilisez.

Arduino Câblage nécessite en fin de compte un numéro de broche de connecteur physique pour toutes les fonctions qui font référence à des « broches ». Vous pouvez utiliser ces nombres directement, mais nous avons également fourni des noms de broches prédéfinis qui correspondent à des broches de connecteur sur des cartes spécifiques.

Par exemple, la broche de connecteur physique 29 sur un Raspberry Pi 2 et 3 est également appelée GPIO5. Vous pouvez définir l’état HIGH de la broche GPIO 5 sur un Raspberry Pi 2 et 3 à l’aide de l’une des commandes suivantes :

pinMode( 29, OUTPUT );
digitalWrite( 29, HIGH );

ou

pinMode( GPIO5, OUTPUT );
digitalWrite( GPIO5, HIGH );

Les noms de broches prédéfinis se trouvent dans pins_arduino.h et sont inclus dans tous les projets Arduino Câblage, mais étant donné qu’il existe différentes broches de connecteur physiques disponibles en fonction de la configuration matérielle pour laquelle vous créez, nous avons également inclus un tableau ici pour décrire les noms de broches disponibles pour chaque appareil.

Raspberry Pi 2 et 3

Diagramme d’épinglage

Définir le code pin Numéro de code pin correspondant
LED_BUILTIN LED intégrée
GPIO* where * refers to [0, 27] reportez-vous au diagramme d’épinglage
GCLK 7
GEN* where * refers to [0, 5] *reportez-vous au diagramme d’épinglage
SCL1 5
SDA1 3
CS0 (ou CE0 ou SS) 24
CS1 (ou CE1) 26
SCLK (ou SCK) 23
MISO 21
MOSI 19
RXD 10
TXD 8

Minnowboard Max

Diagramme d’épinglage 1

Définir le code pin Numéro de code pin correspondant
GPIO* where * refers to [0, 9] reportez-vous au diagramme d’épinglage
SCL 13
SDA 15
CS0 (ou CE0 ou SS) 5
SCLK (ou SCK) 11
MISO 7
MOSI 9
CTS1 10
RTS1 12
RX1 8
TX1 6
RX2 19
TX2 17

Problèmes courants

Impossible de trouver le modèle de projet Visual C++ « Arduino Cablage Application » dans Visual Studio

Cause : l’extension Modèles de projet Windows IoT pour Visual Studio n’est pas installée.

Solution : vous devez installer l’extension Visual Studio pour les modèles de projet Windows IoT avant de pouvoir créer des projets Arduino Câblage dans Visual Studio. Accédez à la page de l’extension Modèles de projet Windows IoT Core pour télécharger l’extension à partir de visual Studio Gallery !

ERREUR : « identificateur introuvable » lors de l’appel d’une fonction

Cause : cette erreur se produit pendant le processus de l’éditeur de liens lorsqu’une fonction qui n’a pas encore été déclarée dans le document est appelée.

Solution : en C++, toutes les fonctions doivent être déclarées avant d’être appelées. Si vous avez défini une nouvelle fonction dans votre fichier de croquis, la déclaration ou l’implémentation entière de la fonction doit se trouver au-dessus de toute tentative d’appel (généralement en haut du document).

Exemple :

Le bloc de code suivant génère l’erreur « 'myFunction': identificateur introuvable »

void setup()
{

}

void loop()
{
    myFunction();
}

void myFunction()
{
    //do something
}

Il existe deux solutions. Tout d’abord, vous pouvez déclarer la fonction au-dessus de n’importe quel appel. En règle générale, cette déclaration est effectuée en haut du fichier.

// Declare function here
void myFunction();

void setup()
{

}

void loop()
{
    myFunction();
}

// And, define the function here
void myFunction()
{
    //do something
}

Vous pouvez également déplacer l’implémentation entière de la fonction au-dessus des appels. Cela a pour effet de déclarer et de définir la fonction en même temps.

void setup()
{
}

void myFunction()
{
    //do something
}

void loop()
{
    myFunction();
}

Ma solution se bloque à l’infini lors de l’initialisation

Il existe un problème connu qui peut entraîner le blocage infini d’une solution C++ (blocage) lors de l’initialisation. Vous rencontrez peut-être ce type de problème si vous constatez que votre solution semble se bloquer pour toujours et que vous ne pouvez pas utiliser le débogueur pour « entrer » dans une instruction dans les sections setup() ou loop() de votre application Arduino Câblage.

Cause : un objet est en cours de création ou une fonction est appelée, ce qui conduit à une action asynchrone avant la fin de l’initialisation de la solution. Cela est probablement dû au constructeur d’un objet appelant une fonction API comme pinMode.

Solution : déplacez les constructeurs d’objets et les appels de fonction de la section d’initialisation du code vers le setup() bloc.

Exemple 1 :

L’exécution de cette esquisse appelle une fonction appelée setPinModes() avant l’initialisation de la solution elle-même. La solution semble s’exécuter, mais se bloque à l’infini.

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;
}

La solution est ci-dessous, nous avons simplement déplacé l’exécution de setPinModes() vers la setup() fonction :

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;
}

Exemple 2 :

L’exécution de ce croquis crée un objet sur la pile avant setup() que n’ait été appelé. Étant donné que l’objet appelle pinMode dans son constructeur, cela entraîne également un blocage. Il s’agit d’un problème rare, mais peut se produire avec des objets de certaines bibliothèques (comme la bibliothèque Arduino LiquidCrystal ).

class MyObject
{
public:
    MyObject()
    {
        pinMode( GPIO5, OUTPUT );
    }

    void doSomething()
    {
        //...
    }
};

MyObject myObject;

void setup()
{
}

void loop()
{
    myObject.doSomething();
}

La solution est ci-dessous. Nous avons remplacé l’objet par un pointeur d’objet et déplacé l’initialisation de l’objet vers setup().

class MyObject
{
public:
    MyObject()
    {
        pinMode( GPIO5, OUTPUT );
    }

    void doSomething()
    {
        //...
    }
};

MyObject *myObject;

void setup()
{
    myObject = new MyObject();
}

void loop()
{
    myObject->doSomething();
}

Utilisation de Serial.print() et Serial.println()

De nombreux croquis Arduino utilisent Serial pour imprimer des données dans la console série (si elle est ouverte) ou pour écrire dans les lignes série (USB ou tx/rx). Dans les versions antérieures du Kit de développement logiciel (SDK) Lightning, la prise en charge matérielle Serial n’était pas incluse. Nous avons donc fourni une Log() fonction qui imprime dans la fenêtre de sortie du débogueur dans Visual Studio. Serial.print*() ou Serial.write() a dû être supprimé.

Toutefois, à compter du Kit de développement logiciel (SDK) Lightning v1.1.0, nous avons ajouté Hardware Serial la prise en charge et les deux Serial.print*() fonctions ou Serial.write() sont entièrement prises en charge. Par conséquent, si vous copiez un croquis conçu pour un Arduino, vous n’avez pas besoin de remplacer l’une de ces références série dans la version Windows IoT de l’croquis.

En outre, nous avons étendu les fonctionnalités de Serial.print() et Serial.println()pour générer une sortie vers la fenêtre du débogueur lorsqu’un débogueur est attaché, en plus d’écrire dans les broches série matérielles. L’impression de sortie de débogage est définie comme valeur par défaut, car la lecture de cette sortie est ce que la plupart des utilisateurs voudraient lors de l’exécution de leurs croquis. Toutefois, cette fonctionnalité peut également être désactivée ; Par exemple, pour améliorer les performances, appelez Serial.enablePrintDebugOutput(false); simplement pour le désactiver dans votre croquis. Pour le réactiver, appelez Serial.enablePrintDebugOutput(true);. L’écriture dans les broches série matérielles n’est pas affectée par ces appels.

Notez que vous n’avez PAS besoin d’attacher un périphérique à vos broches série, comme un FTDI, pour que la sortie soit envoyée à la fenêtre du débogueur. Toutefois, vous devez vous assurer que la fenêtre du débogueur est ouverte pendant le débogage de votre application.

Sortie du débogueur

Les modèles de projet ont été mis à jour sur la page d’extension Modèles de projet Windows IoT Core pour activer l’utilisation du matériel Serial prête à l’emploi. Toutefois, si votre application Arduino Wiring a déjà été créée à l’aide d’une version antérieure du modèle de projet, vous devez 1) mettre à niveau votre projet vers la dernière version du SDK Lightning, version 1.1.0 ou ultérieure, et 2) ajouter la fonctionnalité d’appareil série matérielle requise à votre AppxManifest pour pouvoir utiliser Serial.

Configuration requise pour les capacités d’appareil série matérielle

La fonctionnalité série matérielle dans Windows 10 IoT Standard nécessite l’ajout de déclarations de capacité d’appareil au manifeste AppX.

Recherchez le fichier Package.appxmanifest dans votre projet en tapant son nom dans l’Explorateur de solutions. Ensuite, cliquez avec le bouton droit sur le fichier et choisissez « Ouvrir avec ... ». Choisissez « Éditeur XML (texte) », puis cliquez sur « OK ».

Mise à jour de Package.appxmanifest

Dans l’éditeur de fichier manifeste appx, ajoutez deviceCapability serialcommunication à votre projet, comme dans l’extrait de code XML suivant :

<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>

Mettre à niveau votre projet vers la dernière version du SDK Lightning

Les projets Arduino Wiring dépendent du package Nuget du SDK Lightning pour implémenter les fonctions et déclarations Arduino Wiring requises, ainsi que l’interface avec le pilote Lightning. La dernière version du SDK Lightning contiendra les dernières améliorations et correctifs de bogues. Pour effectuer une mise à niveau vers la dernière version du Kit de développement logiciel (SDK) Lightning, procédez comme suit :

  • Dans le Explorateur de solutions, cliquez avec le bouton droit sur votre projet, puis cliquez sur « Gérer les packages Nuget... »
  • Dans le Gestionnaire de package NuGet, accédez à l’onglet « Installé ». Vous devriez voir le package Microsoft.IoT.Lightning installé
  • Les versions disponibles seront répertoriées dans la zone de liste déroulante « Version ».
  • Choisissez la dernière version, puis cliquez sur « Mettre à jour » pour mettre à jour votre package.
  • Notez que pour effectuer une mise à niveau vers une version préliminaire, veillez également à case activée la case « Inclure la préversion ».

Gestionnaire de package NuGet