Время выполнения
Насколько мне известно, вы не можете определить тип платы, но вы можете прочитать идентификатор устройства ATmega. Проверьте этот вопрос, как это можно сделать: можно ли прочитать подпись устройства 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. Проверьте этот код на предмет некоторых хитростей, специфичных для конкретного устройства.
В зависимости от операционной системы вашего хоста поддерживаемые типы контроллеров можно найти в следующем файле:
- Linux:
/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/'
Tools > Get Board Info
) Я надеялся выполнить проверку строки при последовательном соединении, чтобы при запуске моего приложения автоматически выбирался правильный COM-порт. Потому что, очевидно, IDE может сделать это, есть идеи, если они используют методы, описанные выше?Как указано в спецификации оборудования Arduino, среда IDE Arduino теперь определяет макрос для каждой платы, как определено в
build.board
свойстве Board.txt . К этому значению добавляетсяARDUINO_
, например, макросы для интересующих плат:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Пример того, как вы можете использовать эти макросы в вашем коде:
источник
Простой способ сделать анализ кода - использовать такую библиотеку, как ArduinoManager. При этом вы можете очень легко получить название доски и функции https://github.com/backupbrain/ArduinoBoardManager
Он использует описанную выше технику для раскрытия большого количества информации почти о каждой плате Arduino, поэтому он отлично подходит для создания проектов, которые могут быть развернуты в самых разных средах.
Просто скачайте и включите в свой проект Arduino.
Результирующий вывод на Arduino Uno:
Процесс создания этой библиотеки (включая пример кода) для определения модели и версии платы Arduino подробно описан в моем блоге.
источник
Для всех плат, совместимых с Arduio Due
(См. Файл sam3.h для получения дополнительной информации.)
Если вы просто хотите использовать Arduino Due (не используя совместимые платы), вы можете использовать
(Это определено в файле Arduino Due's edition.h .)
Благодарим Адама Ф. /programming//a/21058963/354144
источник
Поскольку Arduino Due - это семейство процессоров (ARM), отличное от AVR, вы не сможете использовать один и тот же исполняемый файл для всех трех. Но у вас может быть один и тот же исходный код (при условии, что синтаксис для чтения порта одинаков как для частей AVR, так и для частей ARM) и только два исполняемых файла (поскольку один и тот же код будет работать на Uno и Mega без перекомпиляции).
Вы можете определить тип платы во время выполнения без перекомпиляции, выбрав два цифровых вывода, которые еще не используются вашей программой на любой из плат, и привязать их к верхнему или нижнему значению в качестве идентификатора платы. Например, если вы выбрали контакты PC1 и PC3:
Затем просто прочитайте порт при включении и установите переменную в вашей программе.
Другая схема, которая может использоваться, которая связывает только один контакт, состоит в том, чтобы использовать аналоговый входной контакт и использовать резисторный делитель, выбирая резисторы таким образом, чтобы вы получали разные напряжения, скажем, с шагом 0,25 В. Я использовал эту технику, чтобы указать не только тип платы, но и ревизию платы для той же платы (которая в некотором смысле является новым типом платы).
источник