Arduino : 코드에서 보드 유형을 얻는 방법


13

다른 Arduino 보드에서 컴파일 할 수있는 스케치를 작성하고 싶습니다. 보드가 현재 연결된 PC에 표시하고 싶습니다.

이것은 사용자가 USB 케이블을 통해 PC를 내 스케치를 실행하는 Arduino / Teensy 보드에 연결하고 스케치는 시리얼을 통해 PC에 연결된 보드를 알려줍니다. PC 에서이 데이터를 수신하여 표시하는 C # 응용 프로그램을 실행합니다.

따라서 스케치가 컴파일 될 때 선택된 보드가 필요합니다.

아두 이노 보드 셀렉터

https://github.com/backupbrain/ArduinoBoardManager 에서 코드를 찾았 지만 올바른 결과를 얻지 못했습니다 (여러 보드가 없다는 사실 제외).

다음은 코드의 스 니펫입니다.

static const uint8_t BOARD_MICRO= 0x04;

....
#elif defined(__AVR_Atmega32U4__) // Yun 16Mhz, Micro, Leonardo, Esplora
  static const uint8_t BOARD = 0x04;
  static const uint8_t NUM_BITS = 8;
  static const uint16_t CPU = __AVR_Atmega32U4__;
  static const unsigned long SRAM_SIZE = 2500;
  static const unsigned long EEPROM_SIZE = 1000;
  static const unsigned long FLASH_SIZE = 32000;
#elif defined(.....

따라서이 코드는 Yun 16MHz, Micro, Leonardo y Esplora에 대해 동일한 결과 (BOARD = 0x04 = Micro)를 제공합니다.

C 코드에서 사용자가 Arduino 컴파일러 메뉴에서 선택한 문자열을 정확히 얻는 방법이 있습니까?


2
arduino IDE를 사용하여 펌웨어를 빌드하는 경우 F_CPU ARDUINO 및 AVR_whatever 외에 프로젝트 수준 #define을 컴파일러에 전달할 준비가 없습니다 . arduinio IDE 대신 makefile을 사용하여 빌드해야합니다. arduino.SE 사이트를 확인하십시오. Nick과 Ignatio는 좋은 예가 있습니다.
MarkU

Arduino.SE에서 흥미로운 것을 찾을 수 없습니다. (스웨덴어?)
Elmue

@Elmue arduino.StackExchange.com은 Arduino SE입니다.
Avamander

아아 확인. 그러나 arduino.se는 존재합니다!
Elmue

“현재 보드가 연결된 PC에 표시하고 싶습니다”는 컴파일 및 업로드 된 스케치가 실행될 때 표시하거나 스케치가 컴파일되는 동안 또는 IDE가 특정 위치에 앉아있는 동안 표시한다는 의미입니까? 보드 부착? (후자의 경우 보드 선택은 1.6.3 IDE의 가장 낮은 줄에 표시되지만 이전 또는 다른 IDE가있는 경우 아닐 수 있습니다.) (첫 번째 경우에는 직렬 모니터에 표시 하시겠습니까?) ?)
James Waldby-jwpat7

답변:


17

Charlie Hanson과 jantje의 도움으로 범용 솔루션을 찾았습니다!

모든 Arduino 프로그래머가 보드 이름을 얻는 방법을 파악하기 위해 동일한 고통을 겪어야하는 것은 유감이므로 모든 사람이 복사하여 붙여 넣을 수 있도록 공개 코드를 공개 할 것입니다.

여기있어:

#if defined(TEENSYDUINO) 

    //  --------------- Teensy -----------------

    #if defined(__AVR_ATmega32U4__)
        #define BOARD "Teensy 2.0"
    #elif defined(__AVR_AT90USB1286__)       
        #define BOARD "Teensy++ 2.0"
    #elif defined(__MK20DX128__)       
        #define BOARD "Teensy 3.0"
    #elif defined(__MK20DX256__)       
        #define BOARD "Teensy 3.2" // and Teensy 3.1 (obsolete)
    #elif defined(__MKL26Z64__)       
        #define BOARD "Teensy LC"
    #elif defined(__MK64FX512__)
        #define BOARD "Teensy 3.5"
    #elif defined(__MK66FX1M0__)
        #define BOARD "Teensy 3.6"
    #else
       #error "Unknown board"
    #endif

#else // --------------- Arduino ------------------

    #if   defined(ARDUINO_AVR_ADK)       
        #define BOARD "Mega Adk"
    #elif defined(ARDUINO_AVR_BT)    // Bluetooth
        #define BOARD "Bt"
    #elif defined(ARDUINO_AVR_DUEMILANOVE)       
        #define BOARD "Duemilanove"
    #elif defined(ARDUINO_AVR_ESPLORA)       
        #define BOARD "Esplora"
    #elif defined(ARDUINO_AVR_ETHERNET)       
        #define BOARD "Ethernet"
    #elif defined(ARDUINO_AVR_FIO)       
        #define BOARD "Fio"
    #elif defined(ARDUINO_AVR_GEMMA)
        #define BOARD "Gemma"
    #elif defined(ARDUINO_AVR_LEONARDO)       
        #define BOARD "Leonardo"
    #elif defined(ARDUINO_AVR_LILYPAD)
        #define BOARD "Lilypad"
    #elif defined(ARDUINO_AVR_LILYPAD_USB)
        #define BOARD "Lilypad Usb"
    #elif defined(ARDUINO_AVR_MEGA)       
        #define BOARD "Mega"
    #elif defined(ARDUINO_AVR_MEGA2560)       
        #define BOARD "Mega 2560"
    #elif defined(ARDUINO_AVR_MICRO)       
        #define BOARD "Micro"
    #elif defined(ARDUINO_AVR_MINI)       
        #define BOARD "Mini"
    #elif defined(ARDUINO_AVR_NANO)       
        #define BOARD "Nano"
    #elif defined(ARDUINO_AVR_NG)       
        #define BOARD "NG"
    #elif defined(ARDUINO_AVR_PRO)       
        #define BOARD "Pro"
    #elif defined(ARDUINO_AVR_ROBOT_CONTROL)       
        #define BOARD "Robot Ctrl"
    #elif defined(ARDUINO_AVR_ROBOT_MOTOR)       
        #define BOARD "Robot Motor"
    #elif defined(ARDUINO_AVR_UNO)       
        #define BOARD "Uno"
    #elif defined(ARDUINO_AVR_YUN)       
        #define BOARD "Yun"

    // These boards must be installed separately:
    #elif defined(ARDUINO_SAM_DUE)       
        #define BOARD "Due"
    #elif defined(ARDUINO_SAMD_ZERO)       
        #define BOARD "Zero"
    #elif defined(ARDUINO_ARC32_TOOLS)       
        #define BOARD "101"
    #else
       #error "Unknown board"
    #endif

#endif

이 코드를 새 헤더 파일에 넣고 프로젝트에 #include 할 수도 있습니다.

PD 보드와 CPU 모델에 대한 추가 정보를 얻으려면 avr_cpunames.h 파일을 검색하십시오.


또 다른 한가지. "return"? ";"대신에 #pragma 경고 보드 이름을 알 수없는 경우
jantje

1.) "?"를 교체했습니다 # 오류와 함께. 2) 문자열이 실제로 문제가되지 않는다고 생각합니다. 마지막에 하나의 문자열 만 컴파일된다는 것을 이해 했습니까? 위의 내용을 설명하는 내 업데이트를 참조하십시오. 가장 긴 문자열은 11 바이트입니다. 약 11 바이트를 신경 쓰도록 코드를 너무 많이 최적화 해야하는 경우 열거 형을 정의하고 문자열 대신 반환하는 것이 좋습니다. 그러면 함수는 11 대신 1 바이트를 반환합니다.
Elmue

3.) 그리고 유지 보수성에 관한 것 : 그런 기능을 작성해야하는 것이 슬프다. 이것은 이미 컴파일러와 함께 설치되는 헤더 파일의 일부 여야하며 개발자가 유지 관리하고 모든 새 버전으로 업데이트해야합니다.
Elmue

2) 사이즈에 비고 할 때 실수했습니다. 나는 5 시간 전에 그 말을했다. 그 죄송합니다. 3) 유지 보수성이 문제이다. 나는 과거에 매우 비슷한 코드를 작성했습니다. 나는 많은 다른 사람들도 가지고 있다고 확신합니다. "더 나은 IDE 솔루션"을 선호하는 이유는 유지 관리 성입니다. 나는 모든 "더 나은 IDE"가 내가 대답에서 언급 한 것과 비슷한 해결책을 가질 것이라고 확신한다. 그것을 보완으로 참조하십시오 : Arduino IDE를 능가하고 있습니다.
jantje

잘못된 의견을 쓴 경우 삭제하는 것이 가장 좋습니다.
Elmue

2

이것은 리눅스에서 비슷한 것이 존재 해야하는 Windows 모드입니다.

첫 번째는 빠르고 쉽습니다. 아래 설명에 따라 사용중인 platform.txt 파일을 수정하십시오. 이 단점은 각 릴리스마다 platform.txt 파일을 변경해야한다는 것입니다.

레시피에 -DBOARD = \ "$ {build.board} \"를 추가하십시오. 이것은 허용합니다

   const char boardName[]=BOARD;

boardName에 문자열 "ARDUINO_AVR_LEONARDO"(레오나르도)를 제공합니다.

두 번째 방법은 더 나은 IDE로 전환하는 것입니다 (다른 사람들이 이미 제안한 것처럼). arduino eclipse 플러그인의 작성자로서 arduino eclipse 플러그인을 사용하는 것이 좋습니다. arduino eclipse 플러그인에서 다음과 같이 수행하십시오 : 프로젝트-> 속성-> arduino-> "컴파일 옵션"탭을 마우스 오른쪽 버튼으로 클릭하십시오.

-DBOARD=\"${A.BUILD.BOARD}\" 

C 및 C ++에 추가 필드에.

위의 코드를 컴파일합니다.

부록

나는 당신이 "좋은 이름"을 원한다는 것을 몰랐습니다. arduino IDE의 platform.txt 에서이 문제를 해결할 수 있는지 확실하지 않습니다. arduino Eclipse 플러그인에서 위의 fixe를 변경하십시오.

-DBOARD=\"${A.NAME}\"

정의 보드에서 좋은 이름 (Leonardo "Arduino Leonardo"의 이름)을 가져옵니다.


downvoter 또는 다른 사람이 이것이 왜 downvoting이 필요한지 지정하도록 친절합니까?
jantje

1.) 예, StackExchange는 투표를 한 모든 사람이 설명을 쓰도록 강요해야합니다. (내 다운 보트가 아니었다.) 2.)이 문제를 해결하기 위해 Eclipse를 사용할 필요는 없다. 3.) 여기 내 대답을 참조하십시오.
Elmue

Elmue, 1) 동의 해 주셔서 감사합니다 :-). 2) 동의합니다. 대답의 첫 번째 부분은 플랫폼 txt를 수정하여 Arduino IDE에서 작동하도록 수정하는 방법입니다. 귀하의 답변은이 문제를 해결하는 방법에 대해 자세히 설명합니다. 이클립스 또는 더 나은 IDE가 필요하지 않습니다. Arduino IDE가 boards.txt를 구문 분석해야하기 때문에 아마도이 정보가 어딘가에 있고 platform.txt를 수정할 필요없이 작동 할 수 있기 때문에 더 나은 IDE 솔루션이 언급되었습니다. arduino eclipse 플러그인을 매우 잘 알고 있으므로이 도구 로이 작업을 수행하는 방법에 대한 예를 제공합니다. 3) 내 편집 내용보기
jantje

Eclise는 Teensy 와도 작동합니까? Exclipse의 다른 장점은 무엇입니까?
Elmue

예 teensy는 arduino eclipse 플러그인에서 지원되지만 platform.txt를 수정해야합니다 (teensyduino 1.28에서 수정되어야 함)
jantje

0

메뉴의 정확한 이름은 Arduino IDE의 boards.txt 파일 (Arduino \ hardware \ arduino \ avr \ boards.txt)에 있습니다. 파일을 직접 파싱하고 감지 된 보드를 찾아야한다고 생각합니다.


파일 파싱 ?? 메뉴에서 어느 것을 선택했는지 어떻게 알 수 있습니까?
Elmue

0

나는 물었다 관련 질문을 얼마 전에.

IDE에 의해 작성된 내부 * .h 파일이 존재하며 선택된 보드 유형을 보유합니다. 가능한 옵션 목록은 링크 된 질문에 나와 있지만 AVR 보드에만 해당됩니다. AVR이 아닌 목록이 훨씬 짧습니다.

PC에 정확한 정보를 보내기 위해 조건문을 추가하는 것입니다. 간단한 예 :

//...within your code, perhaps during setup()...
#ifdef ARDUINO_AVR_UNO
    serial.println("UNO");
#endif
#ifdef ARDUINO_AVR_LEONARDO
    serial.println("LEONARDO");
#endif
// etc...

스케치에서 보드 유형을 두 번 이상 참조해야하는 경우 다음 형식을 사용하십시오.

//...BEFORE setup(), or otherwise in the global namespace...
#ifdef ARDUINO_AVR_UNO
    #define __BOARD_TYPE "UNO"
#endif
#ifdef ARDUINO_AVR_LEONARDO
    #define __BOARD_TYPE "LEONARDO"
#endif
// etc...

// within your code, wherever necessary:
serial.println(__BOARD_TYPE);

후자는 함수에서 __BOARD_TYPE번거로운 #ifdef덩어리를 제거 하므로 한 번만 필요하더라도 훨씬 더 깔끔 합니다.

물론 최종 사용자가 가질 것으로 예상되는 각 보드에 대해 보드를 하나씩 작성해야하며 새 모델이 나타날 때이 목록을 업데이트해야 할 수도 있습니다.


답변 주셔서 감사합니다. 그것은 많은 도움이되었습니다. (내 답변을 here 참조하십시오) 그러나 코드에 오류가 있습니다. AVR_UNO 대신 ARDUINO_AVR_UNO 여야합니다.
Elmue

#defines의 끝에 세미콜론을 제거 할 수도 있습니다. 그것들은 C 문장이 아니며 구분 기호가 필요하지 않습니다. 실제로 분리 기호는 매크로가 사용되는 곳에 삽입되며 println () 함수의 parens 안에 링크됩니다. 세미콜론이 제거되면이 주석은 이후 독자에게는 의미가 없습니다.
Zeph

0

새 게시판이 추가되어 원래 답변이 오래되었습니다. 기본 테스트는 정확하지만 보드 목록의 출처는 확실하지 않습니다.

boards.txt파일 을 찾아서 살펴보면 (예 : ~\Library\Arduino\hardware\arduino\avr\boards.txtMac에서) 각 보드는의 행을 따라 항목을 가지 <BOARD>.build.board=<NAME>므로 예를 들어 MKR1000은 다음과 같은 행을 갖습니다.

mkr1000.build.board=SAMD_MKR1000

해당 #DEFINE는 접두사를 생성 할 수 <NAME>ARDUINO_따라서이 예에서는 다음과 같은 코드가 MKR1000 보드 에러 것이다 ..

#if defined(ARDUINO_SAMD_MKR1000) #error


이 답변은 단지 bla bla입니다. 왜 모든 정의와 함께 모든 새로운 보드의 전체 목록을 게시하지 않습니까?
Elmue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.