소프트웨어에서 어떤 arduino 보드 (또는 어떤 컨트롤러)를 감지합니까?


14

Uno 또는 Mega (또는 Due)에서 작업하려는 프로젝트가 있으며 소프트웨어의 두 가지 버전이 필요하지 않은 경우 좋을 것입니다. 예를 들어, Mega에서 SoftwareSerial을 사용하려면 Uno의 핀과 다른 핀을 사용해야합니다. 소프트웨어 직렬에 대한 문서를 참조하십시오 . 어쨌든, Uno를 사용하고 있음을 감지하면 TX / RX에 핀 4와 5를 사용할 수 있으며 Mega를 사용하는 경우 소프트웨어는 핀 10과 11을 감지하고 사용합니다 (및 물론 다른 방식으로 연결해야하지만 최소한 소프트웨어는 동일합니다.

답변:


16

런타임

내 지식으로는 보드 유형을 감지 할 수 없지만 ATmega 장치 ID를 읽을 수 있습니다. 이 질문을 수행하는 방법을 확인하십시오. 실행 중에 ATmega 또는 ATtiny 장치 서명을 읽을 수 있습니까? 이 방법을 사용하면 핀아웃뿐만 아니라 여러 레지스터 할당이 변경됩니다. 따라서 코드가 훨씬 더 복잡해질 수 있습니다. 장점은 것입니다 경우 모든 변경 레지스터 할당 및 기타 하드웨어 종속성을 주위에 작업을 관리, 당신은에서 직접 장치를 프로그래밍하는 하나의 .HEX 파일을 사용할 수 있습니다 avrdude.

컴파일 시간

보드 / 컨트롤러 유형을 알아내는 또 다른 방법은 컴파일 타임입니다. 기본적으로 Arduino IDE에 구성된 장치 유형에 따라 코드의 일부를 컴파일하거나 매크로를 설정합니다. 이 예제 코드를 확인하십시오 :

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_CAPTURE_SIZE 7168
#define CAPTURE_SIZE 7168
#elif defined(__AVR_ATmega328P__)
#define DEBUG_CAPTURE_SIZE 1024
#define CAPTURE_SIZE 1024
#else
#define DEBUG_CAPTURE_SIZE 532
#define CAPTURE_SIZE 532
#endif

코드 스 니펫은 https://github.com/gillham/logic_analyzer/wiki 에서 뻔뻔스럽게 복사되었습니다 . 장치에 대한 더 많은 속임수가 있는지 코드를 확인하십시오.

호스트 운영 체제에 따라 지원되는 컨트롤러 유형은 다음 파일에서 찾을 수 있습니다.

  • 리눅스 : /usr/lib/avr/include/avr/io.h
  • 윈도우 : ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

위의 코드를 처리하는 C- 전 처리기의 사용은 아마도이 사이트에서 다루지 않을 것입니다. 자세한 질문은 http://stackoverflow.com 이 더 좋습니다.

Linux를 사용하는 경우 다음을 입력하여 지원되는 모든 컨트롤러 유형을 쉽게 찾을 수 있습니다.

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'

.. \ Arduino \ hardware \ tools \ avr \ avr \ include \ avr \ io.h Windows 용
mpflaga

@mpflaga 나는 대답을 업데이트했다. 입력을위한 Thnx.
jippie

모든 AVR 특정 사전 정의 매크로는 avr-libc 문서에 나열되어 있습니다 .
Ignacio Vazquez-Abrams 4

Arduino IDE는 어떻게 보드 정보를 얻습니까? ( Tools > Get Board Info) 직렬 연결에서 문자열 확인을 원했기 때문에 응용 프로그램이 시작될 때 올바른 COM 포트를 자동으로 선택할 수 있습니다. 분명히 IDE가 이것을 할 수 있기 때문에, 위의 방법을 사용한다면 어떤 생각입니까?
n00dles

@ n00dles 위에서 설명한 방법은 원하는 것과 다릅니다. Arduino.SE에 대한 자체 질문의 가치가 있습니다. 보드 정보 얻기를 확인할 수 없습니다. 사용 가능한 Arduino 버전이 아닙니다.
jippie

6

Arduino 하드웨어 사양에 명시된 바와 같이 Arduino IDE는 boards.txt build.board속성에 정의 된대로 각 보드의 매크로를 정의 합니다. 그 값이 추가됩니다 ARDUINO_그래서, 예를 들어, 당신이 관심있는 보드 매크로는 다음과 같습니다

  • 우노 : ARDUINO_AVR_UNO
  • 메가 2560 : ARDUINO_AVR_MEGA2560
  • 정당한: ARDUINO_SAM_DUE

코드에서 이러한 매크로를 사용하는 방법의 예 :

#if defined(ARDUINO_AVR_UNO)
//Uno specific code
#elif defined(ARDUINO_AVR_MEGA2560)
//Mega 2560 specific code
#elif defined(ARDUINO_SAM_DUE)
//Due specific code
#else
#error Unsupported hardware
#endif

나는 이것이 질문에 대한 가장 간단하고 정확한 대답이라고 말하고 싶습니다. 그것이 받아 들여 졌으면 좋겠다.
Erutan409

4

보드 스니핑을 수행하는 쉬운 방법은 ArduinoManager와 같은 라이브러리를 사용하는 것입니다. 이를 통해 보드 이름과 기능을 쉽게 얻을 수 있습니다 https://github.com/backupbrain/ArduinoBoardManager

위에서 설명한 기술을 사용하여 거의 모든 Arduino 보드에 대한 많은 정보를 공개하므로 다양한 환경에 배포 할 수있는 프로젝트를 만드는 데 좋습니다.

Arduino 프로젝트에 다운로드하여 포함하십시오.

#include "ArduinoBoardManager.h"

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features

void setup() {
  Serial.begin(9600);

  Serial.print("Board is compatible with Arduino ");
  Serial.println(arduino.BOARD_NAME);

  Serial.println("Speed/SRAM/Flash: ");
  Serial.print(ArduinoBoardManager::MAX_MHZ);
  Serial.println(ArduinoBoardManager::SRAM_SIZE);
  Serial.println(ArduinoBoardManager::FLASH_SIZE);

  // Board features (multiple serial ports on Mega, for example)
  if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) {
    Serial.println("Your board supports multiple serial connections");
  }

}

void loop() {
}

Arduino Uno의 결과 출력은 다음과 같습니다.

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Arduino 보드 모델 및 버전결정하기 위해이 라이브러리 (예제 코드 포함)를 만드는 프로세스는 내 블로그에 자세히 설명되어 있습니다.


ArduinoBoardManager.h 의 Arduino Due 인식이 올바르지 않을 수 있습니다 . 이 게시물을 참조하십시오 .
Ulrich Stern

프로젝트에 라이센스를 표시하십시오.
arun

2

Arduio Due와 호환되는 모든 보드

#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due compatible
// your Arduino Due compatible code here
#endif

(자세한 내용은 sam3.h 파일을 참조하십시오 .)

Arduino Due (대상 보드 제외)를 타겟팅하려는 경우 다음을 사용할 수 있습니다

#if defined (_VARIANT_ARDUINO_DUE_X_)
// your Arduino Due code here
#endif

(이것은 Arduino Due 's variant.h 파일에 정의되어 있습니다.)

Adam F의 신용 /programming//a/21058963/354144


1

Arduino Due는 AVR과 다른 프로세서 제품군 (ARM)이므로 세 가지 모두에 대해 동일한 실행 파일 을 사용할 수 없습니다 . 그러나 포트를 읽는 구문이 AVR과 ARM 파트에서 동일하다고 가정 할 때 동일한 소스 코드를 가질 수 있으며 실행 파일은 두 개뿐입니다 (동일한 코드는 다시 컴파일하지 않고 Uno와 Mega에서 실행되므로).

보드에서 프로그램에서 아직 사용하지 않는 두 개의 디지털 핀을 선택하여 보드 ID로 높거나 낮게 묶어 다시 컴파일 할 필요없이 런타임에 보드 유형을 확인할 수 있습니다. 예를 들어, 선택한 핀이 PC1 및 PC3 인 경우 :

 PC1   PC3   Board ID
  0     0      Uno
  0     1      Mega
  1     0      Due
  1     1      spare

그런 다음 전원을 켤 때 포트를 읽고 프로그램에서 변수를 설정하십시오.

하나의 핀만 묶을 수있는 또 다른 방식은 아날로그 입력 핀을 사용하고 저항 분배기를 사용하여 0.25V 단위로 다른 전압을 얻을 수 있도록 저항을 선택하는 것입니다. 나는이 기술을 사용하여 보드 유형뿐만 아니라 같은 보드에 대한 보드 개정판을 지정했습니다 (어떤 의미에서 새로운 보드 유형 임).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.