Guida alla conversione del cablaggio Arduino
Gli schizzo e le librerie di Arduino Cablaggio possono essere copiati/incollati in un progetto Arduino Cablaggio all'interno di Visual Studio ed eseguire in Raspberry Pi 2, Raspberry Pi 3 o Minnowboard Max. A volte ci sono alcune modifiche che devono essere apportate a questi file per renderle più compatibili con l'ambiente Windows o la scheda con cui si lavora. Questa guida illustra tali modifiche e problemi comuni che possono verificarsi durante la distribuzione di progetti Arduino Cablamento.
Conversione
Aggiornamento dei pin
Potrebbe andare senza dire, ma molti schizzo e librerie (soprattutto quelli per gli schermi arduino) possono contenere riferimenti a pin di connettore specifici per i dispositivi Arduino. Si vuole personalizzare gli schizzo per usare i pin del connettore appropriati per il dispositivo in uso e la configurazione in uso.
Arduino Cablaggio richiede infine un numero di pin del connettore fisico per tutte le funzioni che fanno riferimento a "pin". È possibile usare direttamente questi numeri, ma sono stati forniti anche alcuni nomi di pin predefiniti che corrispondono ai pin del connettore su schede specifiche.
Ad esempio, il connettore fisico pin 29 su un Raspberry Pi 2 e 3 è noto anche come GPIO5
. È possibile impostare GPIO pin 5 su uno stato HIGH su un Raspberry Pi 2 e 3 usando uno dei comandi seguenti:
pinMode( 29, OUTPUT );
digitalWrite( 29, HIGH );
oppure
pinMode( GPIO5, OUTPUT );
digitalWrite( GPIO5, HIGH );
I nomi dei pin predefiniti sono disponibili in pins_arduino.h e inclusi in ogni progetto Arduino Cablamento, ma poiché ci saranno pin fisici diversi disponibili a seconda della configurazione hardware che si sta creando, abbiamo anche incluso una tabella qui per descrivere quali nomi di pin sono disponibili per ogni dispositivo.
Raspberry Pi 2 e 3
Definire il pin | Numero di pin corrispondente |
---|---|
LED_BUILTIN | onboarding LED |
GPIO* where * refers to [0, 27] |
fare riferimento al diagramma di pinout |
GCLK | 7 |
GEN* where * refers to [0, 5] |
*fare riferimento al diagramma di pinout |
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
Definire il pin | Numero di pin corrispondente |
---|---|
GPIO* where * refers to [0, 9] |
fare riferimento al diagramma di pinout |
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 |
Problemi comuni
Non è possibile trovare il modello di progetto Visual C++ di Visual C++ "Arduino Wiring Application" in Visual Studio
Causa: l'estensione Modelli di progetto IoT di Windows per Visual Studio non è installata.
Soluzione: è necessario installare l'estensione di Visual Studio per i modelli di progetto IoT di Windows prima di poter creare progetti Arduino Wiring in Visual Studio. Passare alla pagina dell'estensione Modelli di progetto windows IoT Core per scaricare l'estensione da Visual Studio Gallery!
ERRORE: "identificatore non trovato" quando si chiama una funzione
Causa: questo errore si verifica durante il processo del linker quando viene richiamata una funzione che non è ancora stata dichiarata nel documento.
Soluzione: in C++, tutte le funzioni devono essere dichiarate prima di essere richiamate. Se è stata definita una nuova funzione nel file di disegno, la dichiarazione o l'intera implementazione della funzione deve essere superiore a qualsiasi tentativo di richiamarlo (in genere nella parte superiore del documento).
Esempio:
Il blocco di codice seguente genererà l'errore "'myFunction': identificatore non trovato"
void setup()
{
}
void loop()
{
myFunction();
}
void myFunction()
{
//do something
}
Esistono due soluzioni. Prima di tutto, è possibile dichiarare la funzione sopra tutte le chiamate. In genere, questa dichiarazione viene eseguita nella parte superiore del file.
// Declare function here
void myFunction();
void setup()
{
}
void loop()
{
myFunction();
}
// And, define the function here
void myFunction()
{
//do something
}
In alternativa, è possibile spostare l'intera implementazione della funzione sopra le chiamate. Ciò ha l'effetto di dichiarare e definire la funzione contemporaneamente.
void setup()
{
}
void myFunction()
{
//do something
}
void loop()
{
myFunction();
}
La soluzione si blocca infinitamente quando viene inizializzata
Si verifica un problema noto che può causare un blocco infinito (deadlock) di una soluzione C++ durante l'inizializzazione. Questo tipo di problema potrebbe verificarsi se la soluzione sembra bloccarsi per sempre e non è possibile usare il debugger per "interrompere" qualsiasi istruzione nelle sezioni setup() o loop() dell'applicazione Arduino Cablatura.
Causa: un oggetto viene creato o viene chiamata una funzione che porta a un'azione asincrona prima che la soluzione abbia completato l'inizializzazione. Probabilmente causata dal costruttore di un oggetto che chiama una funzione API come pinMode
.
Soluzione: spostare tutti i costruttori di oggetti e le chiamate di funzione dalla sezione di inizializzazione del codice e nel setup()
blocco.
Esempio 1:
L'esecuzione di questo schizzo chiama una funzione chiamata setPinModes()
prima che la soluzione stessa sia stata inizializzata. La soluzione verrà visualizzata per l'esecuzione, ma verrà bloccata 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 soluzione è riportata di seguito, è stata semplicemente spostata l'esecuzione della setPinModes()
setup()
funzione:
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;
}
Esempio 2:
L'esecuzione di questo schizzo crea un oggetto nello stack prima setup()
di essere chiamato. Poiché l'oggetto chiama pinMode
nel costruttore, questo causerà anche un deadlock. Si tratta di un problema non comune, ma può verificarsi con oggetti di determinate librerie (ad esempio la libreria Arduino LiquidCrystal
).
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject myObject;
void setup()
{
}
void loop()
{
myObject.doSomething();
}
La soluzione è riportata di seguito. L'oggetto è stato modificato in un puntatore a un oggetto e è stato spostato l'inizializzazione dell'oggetto in setup()
.
class MyObject
{
public:
MyObject()
{
pinMode( GPIO5, OUTPUT );
}
void doSomething()
{
//...
}
};
MyObject *myObject;
void setup()
{
myObject = new MyObject();
}
void loop()
{
myObject->doSomething();
}
Uso Serial.print()
e Serial.println()
Molti sketch Arduino usano Serial
per stampare i dati nella console seriale (se aperti) o per scrivere nelle righe seriali (USB o tx/rx).
Nelle versioni precedenti di Lightning SDK il supporto hardware Serial
non è stato incluso, quindi è stata fornita una Log()
funzione che verrà stampata nella finestra di output del debugger in Visual Studio. Serial.print*()
o Serial.write()
deve essere rimosso.
Tuttavia, a partire da Lightning SDK v1.1.0, è stato aggiunto Hardware Serial
il supporto e entrambe Serial.print*()
le funzioni sono Serial.write()
completamente supportate. Quindi, se si copia uno schizzo creato per un Arduino, non sarà necessario sostituire uno di questi riferimenti seriali nella versione di Windows IoT dello schizzo.
Inoltre, è stata estesa la funzionalità di Serial.print()
e Serial.println()
, per l'output alla finestra del debugger quando un debugger è collegato, oltre alla scrittura nei pin seriali hardware.
La stampa di output di debug è impostata come impostazione predefinita perché la lettura dell'output è quella che la maggior parte degli utenti desidera quando esegue gli schizzo. Tuttavia, tale funzionalità può essere disabilitata anche; Ad esempio, per migliorare le prestazioni, chiamare Serial.enablePrintDebugOutput(false);
semplicemente per disabilitarlo nello schizzo. Per riabilitarlo, chiamare Serial.enablePrintDebugOutput(true);
. La scrittura nei pin seriali hardware non è influenzata da tali chiamate.
Nota, non è necessario collegare alcuna periferica ai pin seriali, ad esempio un FTDI, per ottenere l'output inviato alla finestra del debugger. Tuttavia, è necessario assicurarsi che la finestra del debugger sia aperta durante il debug dell'applicazione.
I modelli di progetto sono stati aggiornati nella pagina dell'estensione Modelli di progetto Di Windows IoT Core per abilitare l'uso dell'hardware Serial
in uscita. Tuttavia, se l'applicazione Arduino Cablatura è già stata creata usando una versione precedente del modello di progetto, è necessario aggiornare il progetto all'ultimo SDK Lightning, v1.1.0 o versione successiva e 2) aggiungere la funzionalità del dispositivo seriale hardware richiesto all'appxManifest per poter usare Serial
.
Requisiti di funzionalità del dispositivo seriale hardware
La funzionalità seriale hardware in Windows 10 IoT Core richiede dichiarazioni di funzionalità del dispositivo aggiunte al manifesto AppX.
Trovare il file nel progetto digitando il nome del file Package.appxmanifest
in Esplora soluzioni. Fare quindi clic con il pulsante destro del mouse sul file e scegliere "Apri con...". Scegliere 'XML (Text) Editor' e fare clic su 'OK'.
Nell'editor di file manifesto appx aggiungere DeviceCapability serialcommunication
al progetto come nel frammento XML seguente:
<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>
Aggiornare il progetto all'SDK Fulmine più recente
I progetti Di cablaggio Arduino dipendono dal pacchetto Nuget di Lightning SDK per implementare le funzioni e le dichiarazioni di Arduino necessarie, nonché l'interfaccia con il driver Lightning. L'SDK Fulmine più recente conterrà i miglioramenti più recenti e le correzioni di bug. Per eseguire l'aggiornamento all'SDK di Lightning più recente, seguire questa procedura:
- Nella Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere "Gestisci pacchetti Nuget..."
- In Gestione pacchetti NuGet passare alla scheda 'Installato'. Verrà visualizzato il pacchetto Microsoft.IoT.Lightning installato
- Le versioni disponibili verranno elencate nella casella combinata "Version".
- Scegliere la versione più recente e fare clic su "Aggiorna" per aggiornare il pacchetto.
- Si noti che per eseguire l'aggiornamento a una versione non definitiva, assicurarsi di selezionare anche la casella di controllo "Includi versione preliminare".