Определить тип платы Arduino

Как определить тип платы (например, Uno vs Nano) Arduino во время компиляции? Не путать с определением типа процессора. Как я вижу примеры этого, например, #if определено (__ AVR_ATmega32U4__)...

Мне хотелось бы, аналогично, определить между ароматами Arduino все, используя тот же процессор ATmega328.

IDE знает плату. Таким образом, можно получить доступ к нему из некоторого прекомпилятора #IF

Нано имеет разные прерывания против Uno. Следовательно, знание типа платы при компиляции может автоматизировать назначение контактов для публичных библиотек.

Ответ 1

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

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

C:\Apps\arduino-1.0-windows\arduino-1.0\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata -sections -mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -IC:\Apps\arduino-1.0-windows\arduino-1.0\hardware\arduino\cores\arduino -IC:\Apps\arduino-1.0-windows\arduino -1.0\hardware\arduino\variants\standard C:\Users\Jim\AppData\Local\Temp\build4664216036291565363.tmp\Blink.cpp -oC:\Users\Jim\AppData\Local\Temp\build4664216036291565363.tmp\Blink. cpp.o

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

Выводы IO определяются по-разному: IDE включает одну папку, содержащую файл заголовка конкретной платы.

Этот аргумент -I содержит папку на пути поиска компилятора:

-IC:\Apps\arduino-1.0-windows\arduino-1.0\hardware\arduino\variantants\standard

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

Если вы хотите изменить конфигурацию IDE, вы можете получить то, что вы просите.

Итак, чтобы получить то, что вы хотите, вам просто нужно получить одну директиву #define. Итак, вот как

Шаг 1. Сделайте свой собственный тип платы. Чтобы создать новый тип платы, см. Файл boards.txt, расположенный в этой папке:

...\Arduino-1,0\HARDWARE\Arduino

Строка, подобная этой, определяет папку include (стандартная в этом случае):

uno.build.variant=standard

Скопируйте весь блок, изменив имя и папку

myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard

При этом изменении, когда вы выберете эту цель платы, папка myunoboard будет размещена на пути к компилятору.

Шаг 2. Сделайте заголовок, который включает в себя определение.

В папке

...\Arduino-1.0\HARDWARE\Arduino\варианты\myunoboard

создайте файл pins_arduino.h. В этом файле

#include "..\standard\pins_arduino.h"
#define BOARD MY_UNO
// and/or this form
#define __BOARD_MY_UNO

Шаг 3. Повторите попытку для дополнительных плат.

Это обеспечит возможность создания кода для разных целей платы.

Сказав это, я бы не рекомендовал этот подход. Если вы начинаете думать о создании кода, который работает с несколькими целями, возможно, пришло время перейти от IDE Arduino. Если вы использовали среду, такую ​​как Eclipse, у вас есть один проект с любым количеством конфигураций сборки. Каждая конфигурация сборки может определять разные препроцессоры для целевой платы.

Ответ 2

Я не думаю, что есть такая вещь, встроенная в IDE arduino, но вы всегда можете написать свой собственный make файл и сами определить такую ​​вещь.

http://pragprog.com/magazines/2011-04/advanced-arduino-hacking

Если вы прокрутите список до примера hello world, вы увидите пример makefile с определенной переменной BOARD make и с небольшим количеством дополнительных smash файлов makefile, которые вы можете вызвать, например:

make BOARD=UNO

или

make BOARD=NANO

чтобы создать эскиз для разных плат.

Ответ 3

Простым способом обнюхивания платы является использование библиотеки, такой как 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 подробно описан в моем блоге.