Guía de portabilidad de cableado de Arduino
Los bocetos y bibliotecas de Cableado de Arduino se pueden copiar o pegar en un proyecto de cableado de Arduino dentro de Visual Studio y ejecutarse en Raspberry Pi 2, Raspberry Pi 3 o Minnowboard Max. A veces hay ligeras modificaciones que deben realizarse en estos archivos para que sean más compatibles con el entorno de Windows o con la placa con la que trabajas. En esta guía se tratarán esas modificaciones, así como los problemas comunes en los que puede encontrarse al implementar proyectos de cableado de Arduino.
Migración
Actualizar patillas
Puede pasar sin decir, pero muchos bocetos y bibliotecas (especialmente los de escudos arduino) pueden contener referencias a pines de conector específicos para dispositivos Arduino. Querrá personalizar los bocetos para usar los pines de conector adecuados para el dispositivo en el que está trabajando y la configuración que está usando.
El cableado de Arduino requiere en última instancia un número de patilla de conector físico para todas las funciones que hacen referencia a "patillas". Puede usar estos números directamente, pero también hemos proporcionado algunos nombres de patillas predefinidos que corresponden a patillas de conector en paneles específicos.
Por ejemplo, el conector físico ancla 29 en raspberry Pi 2 y 3 también se conoce como GPIO5
. Puede establecer la patilla GPIO 5 en un estado HIGH en raspberry Pi 2 y 3 mediante cualquiera de los siguientes comandos:
pinMode( 29, OUTPUT );
digitalWrite( 29, HIGH );
or
pinMode( GPIO5, OUTPUT );
digitalWrite( GPIO5, HIGH );
Los nombres de patillas predefinidos se pueden encontrar en pins_arduino.h e incluirlos en cada proyecto de cableado de Arduino, pero dado que habrá diferentes patillas de conector físico disponibles en función de la configuración de hardware para la que esté compilando, también hemos incluido una tabla aquí para describir qué nombres de patilla están disponibles para cada dispositivo.
Raspberry Pi 2 y 3
Definir anclar | Número de patilla correspondiente |
---|---|
LED_BUILTIN | LED incorporado |
GPIO* where * refers to [0, 27] |
consulte diagrama de anclaje. |
GCLK | 7 |
GEN* where * refers to [0, 5] |
*Consulte el diagrama de anclaje. |
SCL1 | 5 |
SDA1 | 3 |
CS0 (o CE0 o SS) | 24 |
CS1 (o CE1) | 26 |
SCLK (o SCK) | 23 |
MISO | 21 |
MOSI | 19 |
RXD | 10 |
TXD | 8 |
Minnowboard Max
Definir anclar | Número de patilla correspondiente |
---|---|
GPIO* where * refers to [0, 9] |
consulte diagrama de anclaje. |
SCL | 13 |
SDA | 15 |
CS0 (o CE0 o SS) | 5 |
SCLK (o SCK) | 11 |
MISO | 7 |
MOSI | 9 |
CTS1 | 10 |
RTS1 | 12 |
RX1 | 8 |
TX1 | 6 |
RX2 | 19 |
TX2 | 17 |
Problemas habituales
No se encuentra la plantilla de proyecto "Aplicación de cableado de Arduino" de Visual C++ en Visual Studio
Causa: La extensión plantillas de proyecto de Windows IoT para Visual Studio no está instalada.
Solución: debe instalar la extensión de Visual Studio para plantillas de proyecto de Windows IoT para poder crear proyectos de cableado de Arduino en Visual Studio. Vaya a la página de extensión Plantillas de proyecto de Windows IoT Core para descargar la extensión desde la Galería de Visual Studio.
ERROR: "identificador no encontrado" al llamar a una función
Causa: este error se produce durante el proceso del vinculador cuando se invoca una función que aún no se ha declarado en el documento.
Solución: en C++, todas las funciones deben declararse antes de invocarse. Si ha definido una nueva función en el archivo de croquis, la declaración o toda la implementación de la función debe estar por encima de cualquier intento de invocarla (normalmente en la parte superior del documento).
Ejemplo:
El siguiente bloque de código generará el error "'myFunction': identificador no encontrado".
void setup()
{
}
void loop()
{
myFunction();
}
void myFunction()
{
//do something
}
Hay dos soluciones. En primer lugar, puede declarar la función por encima de cualquier invocación. Normalmente, esta declaración se realiza en la parte superior del archivo.
// Declare function here
void myFunction();
void setup()
{
}
void loop()
{
myFunction();
}
// And, define the function here
void myFunction()
{
//do something
}
Como alternativa, puede mover toda la implementación de la función por encima de cualquier invocación. Esto tiene el efecto de declarar y definir la función al mismo tiempo.
void setup()
{
}
void myFunction()
{
//do something
}
void loop()
{
myFunction();
}
Mi solución se bloquea infinitamente al inicializarse
Hay un problema conocido que puede hacer que una solución de C++ se bloquee infinitamente (interbloqueo) al inicializarse. Es posible que esté experimentando este tipo de problema si encuentra que la solución parece que se bloquea para siempre y no puede usar el depurador para "interrumpir" en cualquier instrucción de las secciones setup() o loop() de la aplicación De cableado de Arduino.
Causa: se está creando un objeto o se llama a una función que conduce a una acción asincrónica antes de que la solución haya terminado de inicializarse. Es probable que se deba a que el constructor de un objeto llame a una función de API como pinMode
.
Solución: mueva los constructores de objetos y las llamadas de función lejos de la sección de inicialización del código y al setup()
bloque .
Ejemplo 1:
La ejecución de este croquis llama a una función llamada setPinModes()
antes de que se haya inicializado la propia solución. La solución parecerá ejecutarse, pero se bloqueará infinitamente.
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 solución se encuentra a continuación, simplemente hemos movido la ejecución de setPinModes()
a la setup()
función :
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;
}
Ejemplo 2:
La ejecución de este boceto crea un objeto en la pila antes setup()
de llamarse. Dado que el objeto llama pinMode
a en su constructor, esto también provocará un interbloqueo. Se trata de un problema poco común, pero puede producirse con objetos de determinadas bibliotecas (como la biblioteca arduino LiquidCrystal
).
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject myObject;
void setup()
{
}
void loop()
{
myObject.doSomething();
}
A continuación se muestra la solución. Hemos cambiado el objeto a un puntero de objeto y hemos movido la inicialización del objeto a setup()
.
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject *myObject;
void setup()
{
myObject = new MyObject();
}
void loop()
{
myObject->doSomething();
}
Uso Serial.print()
y Serial.println()
Muchos bocetos de Arduino usan Serial
para imprimir datos en la consola serie (si están abiertos) o para escribir en las líneas serie (USB o tx/rx).
En versiones anteriores del SDK de Lightning, no se incluía la compatibilidad con hardware Serial
, por lo que proporcionamos una Log()
función que se imprimirá en la ventana de salida del depurador en Visual Studio. Serial.print*()
o Serial.write()
tenía que quitarse.
Sin embargo, a partir de Lightning SDK v1.1.0, hemos agregado Hardware Serial
compatibilidad y ambas Serial.print*()
Serial.write()
funciones son totalmente compatibles. Por lo tanto, si va a copiar un boceto creado para Arduino, no tendrá que reemplazar ninguna de estas referencias serie en la versión de Windows IoT del boceto.
Además, hemos ampliado la funcionalidad de Serial.print()
y Serial.println()
, para generar la salida a la ventana del depurador cuando se adjunta un depurador, además de escribir en las patillas serie de hardware.
La impresión de salida de depuración se establece como el valor predeterminado, ya que leer esa salida es lo que la mayoría de los usuarios querrían al ejecutar sus bocetos. Sin embargo, esa funcionalidad también se puede deshabilitar; Por ejemplo, para mejorar el rendimiento, simplemente llame Serial.enablePrintDebugOutput(false);
a para deshabilitarlo en el boceto. Para volver a habilitarlo, llame a Serial.enablePrintDebugOutput(true);
. La escritura en los pines serie de hardware no se ve afectada por esas llamadas.
Tenga en cuenta que no es necesario adjuntar ningún periférico a los pins serie, como FTDI, para obtener la salida enviada a la ventana del depurador. Sin embargo, deberá asegurarse de que la ventana del depurador está abierta mientras se depura la aplicación.
Las plantillas de proyecto se han actualizado en la página de extensión Plantillas de proyecto de Windows IoT Core para habilitar el uso de hardware Serial
de forma predeterminada. Sin embargo, si la aplicación De cableado de Arduino ya se ha creado con una versión anterior de la plantilla de proyecto, deberá actualizar el proyecto a la versión más reciente del SDK de Lightning, v1.1.0 o posterior y 2) agregue la funcionalidad necesaria del dispositivo serie de hardware a appxManifest para poder usar Serial
.
Requisitos de funcionalidad del dispositivo serie de hardware
La funcionalidad serie de hardware en Windows 10 IoT Core requiere declaraciones de funcionalidad del dispositivo agregadas al manifiesto de AppX.
Para buscar el archivo Package.appxmanifest
en el proyecto, escriba el nombre de archivo en el Explorador de soluciones. A continuación, haga clic con el botón derecho en el archivo y elija "Abrir con...". Elija "Editor xml (texto) y haga clic en "Aceptar".
En el editor de archivos de manifiesto appx, agregue DeviceCapability serialcommunication
al proyecto como en el siguiente fragmento de código 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>
Actualización del proyecto al SDK de Lightning más reciente
Los proyectos de Cableado de Arduino dependen del paquete Nuget del SDK de Lightning para implementar las funciones y declaraciones de cableado de Arduino necesarias, así como la interfaz con el controlador Lightning. El SDK de Lightning más reciente contendrá las últimas mejoras y correcciones de errores. Para actualizar al SDK de Lightning más reciente, siga estos pasos:
- En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y haga clic en "Administrar paquetes Nuget...".
- En el Administrador de paquetes NuGet, vaya a la pestaña "Instalado". Debería ver el paquete Microsoft.IoT.Lightning instalado.
- Las versiones disponibles se mostrarán dentro del cuadro combinado "Versión".
- Elija la versión más reciente y haga clic en "Actualizar" para actualizar el paquete.
- Observe que para actualizar a una versión preliminar, asegúrese de activar también la casilla "Incluir versión preliminar".