Compartilhar via


Guia de Portabilidade de Fiação do Arduino

Os esboços e bibliotecas do Arduino Wiring podem ser copiados/colados em um projeto Arduino Wiring dentro do Visual Studio e executados no Raspberry Pi 2, Raspberry Pi 3 ou Minnowboard Max. Às vezes, há pequenas modificações que precisam ser feitas nesses arquivos para torná-los mais compatíveis com o ambiente do Windows ou com o quadro com o qual você está trabalhando. Este guia abordará essas modificações, bem como os problemas comuns que você pode encontrar ao implantar projetos do Arduino Wiring.

Portabilidade

Atualizando pinos

Pode ser sem dizer, mas muitos esboços e bibliotecas (especialmente aqueles para escudos arduino) podem conter referências a pinos de conector específicos para dispositivos Arduino. Você desejará personalizar seus esboços para usar os pinos de conector apropriados para o dispositivo no qual você está trabalhando e a configuração que está usando.

A fiação Arduino exige, em última análise, um número de pino do conector físico para todas as funções que se referem a "pinos". Você pode usar esses números diretamente, mas também fornecemos alguns nomes de pino predefinidos que correspondem a pinos de conector em placas específicas.

Por exemplo, o conector físico fixa 29 em um Raspberry Pi 2 e 3 também é conhecido como GPIO5. Você pode definir o pino GPIO 5 como um estado ALTO em um Raspberry Pi 2 e 3 usando um dos seguintes comandos:

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

ou

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

Os nomes de pino predefinidos podem ser encontrados em pins_arduino.h e incluídos em cada projeto da Arduino Wiring, mas como haverá diferentes pinos de conector físico disponíveis dependendo da configuração de hardware para a qual você está criando, também incluímos uma tabela aqui para descrever quais nomes de pinos estão disponíveis para cada dispositivo.

Raspberry Pi 2 e 3

Diagrama de Pinout

Fixar Definir Número do Pino Correspondente
LED_BUILTIN LED integrado
GPIO* where * refers to [0, 27] consulte o diagrama de pinout
GCLK 7
GEN* where * refers to [0, 5] *consulte o diagrama de pinout
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

Máximo de Minnowboard

Diagrama de Pinout 1

Fixar Definir Número do Pino Correspondente
GPIO* where * refers to [0, 9] consulte o diagrama de pinout
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

Problemas comuns

Não é possível encontrar o modelo de projeto "Aplicativo de Conexão Arduino" do Visual C++ no Visual Studio

Causa: a extensão Modelos de Projeto do Windows IoT para Visual Studio não está instalada.

Solução: você deve instalar a Extensão do Visual Studio para Modelos de Projeto do Windows IoT antes de poder criar projetos do Arduino Wiring no Visual Studio. Acesse a página de extensão Modelos de Projeto do Windows IoT Core para baixar a extensão da Galeria do Visual Studio!

ERRO: "identificador não encontrado" ao chamar uma função

Causa: esse erro ocorre durante o processo do vinculador quando uma função é invocada que ainda não foi declarada no documento.

Solução: no C++, todas as funções devem ser declaradas antes de serem invocadas. Se você tiver definido uma nova função no arquivo de esboço, a declaração ou toda a implementação da função deverá estar acima de qualquer tentativa de invocá-la (normalmente na parte superior do documento).

Exemplo:

O seguinte bloco de código gerará o erro "'myFunction': identificador não encontrado"

void setup()
{

}

void loop()
{
    myFunction();
}

void myFunction()
{
    //do something
}

Há duas soluções. Primeiro, você pode declarar a função acima de qualquer invocação. Normalmente, essa declaração é feita na parte superior do arquivo.

// Declare function here
void myFunction();

void setup()
{

}

void loop()
{
    myFunction();
}

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

Como alternativa, você pode mover toda a implementação da função acima de qualquer invocação. Isso tem o efeito de declarar e definir a função ao mesmo tempo.

void setup()
{
}

void myFunction()
{
    //do something
}

void loop()
{
    myFunction();
}

Minha solução trava infinitamente ao ser inicializada

Há um problema conhecido que pode fazer com que uma solução C++ trava infinitamente (deadlock) ao ser inicializada. Talvez você esteja enfrentando esse tipo de problema se descobrir que sua solução parece travar para sempre e não é possível usar o depurador para 'invadir' qualquer instrução nas seções setup() ou loop() do aplicativo Arduino Wiring.

Causa: um objeto está sendo criado ou uma função está sendo chamada, o que leva a uma ação assíncrona antes que a solução termine de inicializar. Provavelmente, isso é causado pelo construtor de um objeto que chama uma função de API como pinMode.

Solução: mova quaisquer construtores de objeto e chamadas de função para longe da seção de inicialização do código e para o setup() bloco.

Exemplo 1:

A execução desse esboço chama uma função chamada setPinModes() antes que a solução em si seja inicializada. A solução parecerá ser executada, mas travará 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;
}

A solução está abaixo, simplesmente movemos a execução de setPinModes() para a setup() função :

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

Exemplo 2:

A execução desse esboço cria um objeto na pilha antes setup() de ser chamado. Como o objeto chama pinMode em seu construtor, isso também causará um deadlock. Esse é um problema incomum, mas pode ocorrer com objetos de determinadas bibliotecas (como a biblioteca Arduino LiquidCrystal ).

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

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

MyObject myObject;

void setup()
{
}

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

A solução está abaixo. Alteramos o objeto para um ponteiro de objeto e movemos a inicialização do objeto para setup().

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

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

MyObject *myObject;

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

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

Usando Serial.print() e Serial.println()

Muitos esboços do Arduino usam Serial para imprimir dados no console serial (se aberto) ou para gravar nas linhas serial (USB ou tx/rx). Em versões anteriores do SDK do Lightning, o suporte a hardware Serial não foi incluído, portanto, fornecemos uma Log() função que será impressa na janela de saída do depurador no Visual Studio. Serial.print*() ou Serial.write() teve que ser removido.

No entanto, a partir do SDK do Lightning v1.1.0, adicionamos Hardware Serial suporte e ambas as Serial.print*() funções ou Serial.write() têm suporte total. Portanto, se você estiver copiando um esboço criado para um Arduino, não precisará substituir nenhuma dessas referências serial na versão IoT do Windows do esboço.

Além disso, estendemos a funcionalidade de Serial.print() e Serial.println(), para a saída para a janela do depurador quando um depurador é anexado , além de gravar nos pinos serial de hardware. A impressão de saída de depuração é definida como o padrão, pois ler essa saída é o que a maioria dos usuários gostaria ao executar seus esboços. No entanto, essa funcionalidade também pode ser desabilitada; por exemplo, para melhorar o desempenho, basta chamar Serial.enablePrintDebugOutput(false); para desabilitá-lo em seu esboço. Para habilitá-lo novamente, chame Serial.enablePrintDebugOutput(true);. A gravação nos pinos serial de hardware não é afetada por essas chamadas.

Observe que você não precisa anexar nenhum periférico aos seus pinos serial, como um FTDI, para obter a saída enviada para a janela do depurador. No entanto, você precisará verificar se a janela do depurador está aberta enquanto o aplicativo está sendo depurado.

Saída do depurador

Os modelos de projeto foram atualizados na página de extensão Modelos de Projeto do Windows IoT Core para habilitar o uso de Hardware Serial pronto para uso. No entanto, se o aplicativo Arduino Wiring já tiver sido criado usando uma versão mais antiga do modelo de projeto, você precisará de 1) Atualizar seu projeto para o SDK lightning mais recente, v1.1.0 ou posterior e 2) adicionar a funcionalidade de dispositivo Serial de Hardware necessária ao seu AppxManifest para poder usar Serial.

Requisitos de funcionalidade de dispositivo serial de hardware

A funcionalidade serial de hardware em Windows 10 IoT Core requer declarações de funcionalidade do dispositivo adicionadas ao manifesto appX.

Localize o arquivo Package.appxmanifest em seu projeto digitando o nome do arquivo no gerenciador de soluções. Em seguida, clique com o botão direito do mouse no arquivo e escolha "Abrir com...". Escolha 'Editor XML (Texto) ' e clique em 'OK'.

Atualizando Package.appxmanifest

No editor de arquivos de manifesto appx, adicione o serialcommunication DeviceCapability ao seu projeto como no seguinte snippet 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>

Atualizar seu projeto para o SDK do Lightning mais recente

Os projetos de Fiação do Arduino dependem do pacote Nuget do SDK do Lightning para implementar as funções e declarações necessárias do Arduino Wiring, bem como da interface com o driver Lightning. O SDK mais recente do Lightning conterá as melhorias e correções de bugs mais recentes. Para atualizar para o SDK do Lightning mais recente, siga estas etapas:

  • No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e clique em 'Gerenciar Pacotes Nuget...'
  • No Gerenciador de Pacotes NuGet, vá para a guia 'Instalado'. Você deverá ver o pacote Microsoft.IoT.Lightning instalado
  • As versões disponíveis serão listadas dentro da caixa de combinação "Versão".
  • Escolha a versão mais recente e clique em 'Atualizar' para atualizar seu pacote.
  • Observe que, para atualizar para uma versão de pré-lançamento, certifique-se de marcar a caixa de seleção "Incluir pré-lançamento".

Gerenciador de Pacotes NuGet