Arduino: Как получить тип платы в коде

Я хочу написать эскиз, который можно скомпилировать на разных досках Arduino. Я хочу показать на ПК, какая плата в данный момент подключена.

Это означает, что пользователь подключает ПК через USB-кабель к плате Arduino /Teensy, в котором работает мой эскиз, и мой эскиз сообщает ПК через Serial, какая плата подключена. На ПК запускается мое приложение 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(.....

Таким образом, этот код дает тот же результат (BOARD = 0x04 = Micro) для Yun 16MHz, Micro, Leonardo y Esplora.

Есть ли способ получить в моем C-коде точно строку, которую пользователь выбрал в меню компилятора Arduino?

c
9 голосов | спросил Elmue 27 FebruaryEurope/MoscowbSat, 27 Feb 2016 01:53:39 +0300000000amSat, 27 Feb 2016 01:53:39 +030016 2016, 01:53:39

4 ответа


10

Благодаря помощи Чарли Хэнсона и Янтье я нашел универсальное решение!

Потому что жаль, что каждый программист 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

Вы даже можете поместить этот код в новый заголовочный файл и # включить его в свой проект.

P.D. Если вы хотите узнать дополнительную информацию о плате и модели CPU, найдите файл avr_cpunames.h

ответил Elmue 1 MaramTue, 01 Mar 2016 08:24:53 +03002016-03-01T08:24:53+03:0008 2016, 08:24:53
2

Заметьте, что это модем Windows, что-то подобное должно существовать в Linux.

Первое быстро и просто. Просто измените файлы platform.txt, которые вы используете, как описано в nelow. Откат этого состоит в том, что вам нужно будет изменить файлы platform.txt с каждой версией.

добавить -DBOARD = \ "$ {build.board} \" в рецепт. Это позволит

   const char boardName[]=BOARD;

Что дает вам строку «ARDUINO_AVR_LEONARDO» (для leonardo) в имени boardName.

Второй способ - перейти к лучшей IDE (как уже было предложено другими). Будучи создателем плагина arduino eclipse, я бы посоветовал использовать плагин arduino eclipse. В плагине arduino eclipse вы делаете это следующим образом: Щелкните правой кнопкой мыши по параметрам project-> properties-> arduino-> tab «Параметры компиляции», поместите

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

в добавлении к полям C и C ++.

Это сделает код выше для компиляции

Adendum

Я не знал, что вам нужно «хорошее имя». Я не уверен, что это можно зафиксировать в файле platform.txt в среде arduino. В плагине arduino eclipse измените исправление выше в

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

, чтобы получить красивое имя (для леонардо «Ардуино Леонардо») в определении Совета.

ответил jantje 27 FebruaryEurope/MoscowbSat, 27 Feb 2016 15:42:47 +0300000000pmSat, 27 Feb 2016 15:42:47 +030016 2016, 15:42:47
0

Точные имена в меню поступают из файла boards.txt в вашей Arduino IDE (Arduino \ hardware \ arduino \ avr \ boards.txt). Я думаю, вам придется разобрать файл самостоятельно и найти там обнаруженную панель.

ответил P.W. 27 FebruaryEurope/MoscowbSat, 27 Feb 2016 02:40:43 +0300000000amSat, 27 Feb 2016 02:40:43 +030016 2016, 02:40:43
0

Я спросил связанный вопрос некоторое время назад.

Существует внутренний файл * .h, который создается средой IDE и содержит в нем тип платы, которая была выбрана. Список возможных вариантов приведен в связанном вопросе, но только для плат AVR. Я считаю, что список без AVR намного короче.

Это просто вопрос добавления некоторых условных операторов для отправки ПК правильной информации. Простой пример:

//...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 из ваших функций.

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

ответил CharlieHanson 29 FebruaryEurope/MoscowbMon, 29 Feb 2016 23:25:40 +0300000000pmMon, 29 Feb 2016 23:25:40 +030016 2016, 23:25:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132