다음을 통해 공유


Arduino 배선 포팅 가이드

Arduino Wiring 스케치 및 라이브러리는 Visual Studio 내의 Arduino Wiring 프로젝트에 복사/붙여넣고 Raspberry Pi 2, Raspberry Pi 3 또는 Minnowboard Max에서 실행할 수 있습니다. Windows 환경 또는 작업 중인 보드와 호환되도록 이러한 파일을 약간 수정해야 하는 경우가 있습니다. 이 가이드에서는 이러한 수정 사항과 Arduino Wiring 프로젝트를 배포할 때 발생할 수 있는 일반적인 문제에 대해 설명합니다.

포팅

핀 업데이트

그것은 말할 여지없이 갈 수 있지만, 많은 스케치 및 라이브러리 (특히 arduino 방패에 대한) Arduino 장치에 대한 특정 커넥터 핀에 대한 참조를 포함 할 수 있습니다. 스케치를 사용자 지정하여 작업 중인 디바이스 및 사용 중인 구성에 적절한 커넥터 핀을 사용하려고 합니다.

Arduino Wiring은 궁극적으로 '핀'을 참조하는 모든 함수에 대한 물리적 커넥터 핀 번호가 필요합니다. 이러한 숫자를 직접 사용할 수 있지만 특정 보드의 커넥터 핀에 해당하는 미리 정의된 핀 이름도 제공했습니다.

예를 들어 Raspberry Pi 2 및 3의 물리적 커넥터 핀 29를 라고 GPIO5도 합니다. 다음 명령 중 하나를 사용하여 Raspberry Pi 2 및 3에서 GPIO 핀 5를 HIGH 상태로 설정할 수 있습니다.

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

또는

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

미리 정의된 핀 이름은 pins_arduino.h 에서 찾을 수 있으며 모든 Arduino Wiring 프로젝트에 포함될 수 있지만 빌드하는 하드웨어 설정에 따라 사용할 수 있는 물리적 커넥터 핀이 다르기 때문에 각 디바이스에 사용할 수 있는 핀 이름을 설명하는 테이블도 여기에 포함되어 있습니다.

Raspberry Pi 2 및 3

핀아웃 다이어그램

핀 정의 해당 핀 번호
LED_BUILTIN 온보딩 LED
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

일반적인 문제

Visual Studio에서 "Arduino Wiring Application" Visual C++ 프로젝트 템플릿을 찾을 수 없습니다.

원인: Visual Studio용 Windows IoT 프로젝트 템플릿 확장이 설치되어 있지 않습니다.

해결 방법: Visual Studio에서 Arduino Wiring 프로젝트를 만들려면 먼저 Windows IoT 프로젝트 템플릿용 Visual Studio 확장을 설치해야 합니다. 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++ 솔루션이 무한히 중단(교착 상태)될 수 있는 알려진 문제가 있습니다. 솔루션이 영원히 중단되는 것처럼 보이고 Arduino Wiring 애플리케이션의 setup() 또는 loop() 섹션에 있는 문에 디버거를 사용하여 '중단'할 수 없는 경우 이러한 유형의 문제가 발생할 수 있습니다.

원인: 개체가 만들어지거나 함수가 호출되어 솔루션 초기화가 완료되기 전에 비동기 작업이 발생합니다. 와 같은 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 스케치는 직렬 콘솔에 데이터를 인쇄하거나(열려 있는 경우) 직렬 줄(USB 또는 tx/rx)에 쓰는 데 사용합니다 Serial . 이전 버전의 Lightning SDK에서는 하드웨어 Serial 지원이 포함되지 않았으므로 Visual Studio의 디버거 출력 창에 인쇄할 함수를 제공 Log() 했습니다. Serial.print*() 또는 Serial.write() 를 제거해야 했습니다.

그러나 Lightning SDK v1.1.0부터 지원이 추가 Hardware Serial 되었으며 또는 Serial.write() 함수가 모두 Serial.print*() 완전히 지원됩니다. 따라서 Arduino용으로 빌드된 스케치를 복사하는 경우 스케치의 Windows IoT 버전에서 이러한 직렬 참조를 바꿀 필요가 없습니다.

또한 하드웨어 직렬 핀에 쓰는 것 외에도 및 Serial.println()Serial.print() 기능을 확장하여 디버거가 연결되면 디버거 창으로 출력합니다. 디버그 출력 인쇄는 해당 출력을 읽는 것이 대부분의 사용자가 스케치를 실행할 때 원하는 내용이므로 기본값으로 설정됩니다. 그러나 해당 기능을 사용하지 않도록 설정할 수도 있습니다. 예를 들어 성능을 향상시키려면 를 호출 Serial.enablePrintDebugOutput(false); 하여 스케치에서 사용하지 않도록 설정합니다. 다시 사용하도록 설정하려면 를 호출 Serial.enablePrintDebugOutput(true);합니다. 하드웨어 직렬 핀에 쓰는 것은 이러한 호출의 영향을 받지 않습니다.

디버거 창으로 출력을 보내려면 FTDI와 같은 직렬 핀에 주변 장치를 연결할 필요가 없습니다. 그러나 애플리케이션을 디버그하는 동안 디버거 창이 열려 있는지 확인해야 합니다.

디버거 출력

Windows IoT Core 프로젝트 템플릿 확장 페이지에서 프로젝트 템플릿이 업데이트되어 하드웨어 Serial 를 사용할 수 있습니다. 그러나 이전 프로젝트 템플릿 버전을 사용하여 Arduino Wiring 애플리케이션을 이미 만든 경우 1) 프로젝트를 최신 Lightning SDK, v1.1.0 이상으로 업그레이드하고 2) 를 사용할 Serial수 있도록 AppxManifest에 필요한 하드웨어 직렬 디바이스 기능을 추가해야 합니다.

하드웨어 직렬 디바이스 기능 요구 사항

Windows 10 IoT Core 하드웨어 직렬 기능을 사용하려면 AppX 매니페스트에 추가된 디바이스 기능 선언이 필요합니다.

솔루션 탐색기에서 파일 Package.appxmanifest 이름을 입력하여 프로젝트에서 파일을 찾습니다. 그런 다음 파일을 마우스 오른쪽 단추로 클릭하고 '함께 열기...'를 선택합니다. 'XML(텍스트) 편집기'를 선택하고 '확인'을 클릭합니다.

Package.appxmanifest 업데이트

appx 매니페스트 파일 편집기에서 다음 XML 코드 조각과 같이 DeviceCapability를 프로젝트에 추가 serialcommunication 합니다.

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

프로젝트를 최신 Lightning SDK로 업그레이드

Arduino Wiring 프로젝트는 Lightning 드라이버와의 인터페이스뿐만 아니라 필요한 Arduino 배선 함수 및 선언을 구현하기 위해 Lightning SDK Nuget 패키지 에 의존합니다. 최신 Lightning SDK에는 최신 개선 사항 및 버그 수정이 포함됩니다. 최신 Lightning SDK로 업그레이드하려면 다음 단계를 수행합니다.

  • 솔루션 탐색기 프로젝트를 마우스 오른쪽 단추로 클릭하고 'Nuget 패키지 관리...'를 클릭합니다.
  • NuGet 패키지 관리자에서 '설치됨' 탭으로 이동합니다. Microsoft.IoT.Lightning 패키지가 설치되어 있어야 합니다.
  • 사용 가능한 버전은 '버전' 콤보 상자 내에 나열됩니다.
  • 최신 버전을 선택하고 '업데이트'를 클릭하여 패키지를 업데이트합니다.
  • 시험판 버전으로 업그레이드하려면 '시험판 포함' 확인란도 검사 합니다.

NuGet 패키지 관리자