Поделиться через


Руководство по переносу arduino Wiring

Эскизы и библиотеки Arduino Wiring можно скопировать или вставить в проект Arduino Wiring в Visual Studio и запустить на Raspberry Pi 2, Raspberry Pi 3 или Minnowboard Max. Иногда в эти файлы необходимо внести небольшие изменения, чтобы сделать их более совместимыми со средой Windows или с доской, с которой вы работаете. В этом руководстве рассматриваются эти изменения, а также распространенные проблемы, с которыми вы можете столкнуться при развертывании проектов Arduino Wiring.

Перенос

Обновление контактов

Это может быть само собой разумеется, но многие эскизы и библиотеки (особенно для экранов arduino) могут содержать ссылки на конкретные контакты соединителей для устройств Arduino. Вам потребуется настроить эскизы, чтобы использовать соответствующие контакты соединителя для устройства, с которым вы работаете, и используемой конфигурации.

Arduino Wiring в конечном итоге требует номера физического соединителя для всех функций, которые ссылаются на "контакты". Вы можете использовать эти номера напрямую, но мы также предоставили некоторые предварительно определенные имена контактов, которые соответствуют контактам соединителей на определенных платах.

Например, контакт физического соединителя 29 на Raspberry Pi 2 и 3 также называется GPIO5. Вы можете установить контакт GPIO 5 в состояние HIGH на Raspberry Pi 2 и 3 с помощью любой из следующих команд:

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

или

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

Предварительно определенные имена контактов можно найти в pins_arduino.h и включены в каждый проект Arduino Wiring, но так как в зависимости от конфигурации оборудования, для которого вы создаете, будут доступны различные физические контакты соединителей, мы также включили таблицу здесь, чтобы описать, какие имена контактов доступны для каждого устройства.

Raspberry Pi 2 и 3

Схема закрепления

Определение закрепления Соответствующий номер контакта
LED_BUILTIN встроенный светодиодный индикатор
GPIO* where * refers to [0, 27] см. схему закрепления
GCLK 7
GEN* where * refers to [0, 5] *см. схему закрепления
SCL1 5
SDA1 3
CS0 (или CE0 или SS) 24
CS1 (или CE1) 26
SCLK (или SCK) 23
МИСО 21
MOSI 19
RXD 10
TXD 8

MinnowBoard Max

Схема закрепления 1

Определение закрепления Соответствующий номер контакта
GPIO* where * refers to [0, 9] см. схему закрепления
SCL 13
SDA 15
CS0 (или CE0 или SS) 5
SCLK (или SCK) 11
МИСО 7
MOSI 9
CTS1 10
RTS1 12
RX1 8
TX1 6
RX2 19
TX2 17

Распространенные проблемы

Не удается найти шаблон проекта "Arduino Wiring Application" Visual C++ в Visual Studio

Причина. Расширение windows IoT Project Templates для Visual Studio не установлено.

Решение. Прежде чем создавать проекты Arduino Wiring в Visual Studio, необходимо установить расширение Visual Studio для шаблонов проектов Интернета вещей Windows. Перейдите на страницу расширения шаблоны проектов Windows IoT Core , чтобы скачать расширение из коллекции Visual Studio.

ОШИБКА: "идентификатор не найден" при вызове функции

Причина. Эта ошибка возникает во время процесса компоновщика при вызове функции, которая еще не была объявлена в документе.

Решение. В C++ все функции должны быть объявлены перед их вызовом. Если вы определили новую функцию в файле эскиза, объявление или вся реализация функции должны быть выше любых попыток ее вызова (обычно в верхней части документа).

Пример:

Следующий блок кода вызовет ошибку "myFunction: идентификатор не найден"

void setup()
{

}

void loop()
{
    myFunction();
}

void myFunction()
{
    //do something
}

Существует два решения. Во-первых, можно объявить функцию над любыми вызовами. Как правило, это объявление выполняется в верхней части файла.

// Declare function here
void myFunction();

void setup()
{

}

void loop()
{
    myFunction();
}

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

Кроме того, можно переместить всю реализацию функции над любыми вызовами. Это имеет эффект одновременного объявления и определения функции.

void setup()
{
}

void myFunction()
{
    //do something
}

void loop()
{
    myFunction();
}

Мое решение бесконечно зависает при инициализации

Существует известная проблема, из-за которой решение C++ может бесконечно зависать (взаимоблокировка) при инициализации. У вас может возникнуть проблема такого типа, если вы обнаружите, что решение зависло навсегда и вы не можете использовать отладчик для "взлома" какой-либо инструкции в разделах setup() или loop() приложения Arduino Wiring.

Причина. Создается объект или вызывается функция, которая приводит к асинхронному действию до завершения инициализации решения. Скорее всего, это вызвано тем, что конструктор объекта вызывает функцию API, например pinMode.

Решение. Переместите все конструкторы объектов и вызовы функций из раздела инициализации кода в setup() блок.

Пример 1:

Выполнение этого эскиза вызывает функцию, вызываемую setPinModes() до инициализации самого решения. Решение будет выполняться, но будет бесконечно зависать.

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

Решение приведено ниже. Мы просто переместили выполнение setPinModes() в функцию setup() :

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

Пример 2.

Выполнение этого эскиза создает объект в стеке до setup() вызова . Так как объект вызывает pinMode в своем конструкторе, это также приведет к взаимоблокировке. Эта проблема является редкой, но может возникать с объектами из определенных библиотек (например, библиотеки Arduino LiquidCrystal ).

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

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

MyObject myObject;

void setup()
{
}

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

Решение приведено ниже. Мы изменили объект на указатель объекта и переместили инициализацию объекта setup()в .

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

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

MyObject *myObject;

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

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

Использование Serial.print() и Serial.println()

Многие эскизы Arduino используются для Serial печати данных в последовательной консоли (при открытии) или для записи в последовательные линии (USB или tx/rx). В предыдущих версиях пакета SDK Lightning поддержка оборудования Serial не была включена, поэтому мы предоставили Log() функцию, которая будет выводить данные в окно вывода отладчика в Visual Studio. Serial.print*() или Serial.write() пришлось удалить.

Однако начиная с пакета SDK Lightning версии 1.1.0 мы добавили Hardware Serial поддержку, и обе Serial.print*() функции или Serial.write() полностью поддерживаются. Таким образом, при копировании эскиза, созданного для Arduino, вам не нужно будет заменять какие-либо из этих серийных ссылок в версии эскиза Для Интернета вещей Windows.

Кроме того, мы расширили Serial.print() функциональные возможности и Serial.println()для вывода данных в окно отладчика при подключении отладчика в дополнение к записи в аппаратные последовательные контакты. Отладочная печать выходных данных используется по умолчанию, так как большинство пользователей хотят прочитать эти выходные данные при выполнении эскизов. Однако эту функциональность также можно отключить. Например, чтобы повысить производительность, просто вызовите Serial.enablePrintDebugOutput(false); , чтобы отключить его в эскизе. Чтобы снова включить его, вызовите Serial.enablePrintDebugOutput(true);. Эти вызовы не влияют на запись в аппаратные последовательные контакты.

Обратите внимание, что не нужно присоединять периферийные устройства к последовательным контактам, таким как FTDI, чтобы получать выходные данные, отправляемые в окно отладчика. Однако во время отладки приложения необходимо убедиться, что окно отладчика открыто.

Выходные данные отладчика

Шаблоны проектов были обновлены на странице расширения "Шаблоны проектов Windows IoT Core" , чтобы включить использование аппаратного обеспечения Serial . Однако если приложение Arduino Wiring уже было создано с помощью более старой версии шаблона проекта, вам потребуется 1) обновить проект до последней версии пакета SDK Lightning версии 1.1.0 или более поздней версии и 2) добавить необходимую возможность аппаратного серийного устройства в AppxManifest, чтобы иметь возможность использовать Serial.

Требования к возможностям устройства с последовательным оборудованием

Для аппаратной последовательности в Windows 10 IoT Базовая необходимо, чтобы в манифест AppX были добавлены объявления возможностей устройства.

Найдите файл Package.appxmanifest в проекте, введя его имя в обозревателе решений. Затем щелкните файл правой кнопкой мыши и выберите команду "Открыть с помощью...". Выберите "Редактор XML (текст)" и нажмите кнопку "ОК".

Обновление Package.appxmanifest

В редакторе файла манифеста appx добавьте serialcommunication DeviceCapability в проект, как показано в следующем фрагменте 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>

Обновление проекта до последней версии пакета SDK Для Lightning

Проекты Arduino Wiring зависят от пакета NuGet пакета Sdk Lightning для реализации необходимых функций и объявлений Arduino Wiring, а также интерфейса с драйвером Lightning. Последняя версия пакета SDK Для Lightning будет содержать последние улучшения и исправления ошибок. Чтобы выполнить обновление до последней версии пакета SDK Для Lightning, выполните следующие действия.

  • В Обозреватель решений щелкните проект правой кнопкой мыши и выберите пункт "Управление пакетами NuGet..."
  • В диспетчере пакетов NuGet перейдите на вкладку Установленные. Вы увидите установленный пакет Microsoft.IoT.Lightning.
  • Доступные версии будут перечислены в поле со списком "Версия".
  • Выберите последнюю версию и нажмите кнопку "Обновить", чтобы обновить пакет.
  • Обратите внимание, что для обновления до предварительной версии обязательно проверка флажок "Включить предварительную версию".

Диспетчер пакетов NuGet