Как я могу определить, какая плата Arduino (или какой контроллер) в программном обеспечении?

14

У меня есть проект, который я хочу работать на Uno или Mega (или даже на Due), и было бы неплохо, если бы мне не понадобились две версии программного обеспечения. Например, на Mega, чтобы использовать SoftwareSerial, вы должны использовать другие контакты, чем на Uno. Смотрите документацию по Software Serial . В любом случае, было бы неплохо обнаружить, что я использую Uno, поэтому я могу просто использовать контакты 4 и 5 для TX / RX, и если я использую Mega, программа обнаружит и просто использует контакты 10 и 11 (и Конечно, мне придется подключить его по-другому, но, по крайней мере, программное обеспечение будет таким же).

tooshel
источник

Ответы:

16

Время выполнения

Насколько мне известно, вы не можете определить тип платы, но вы можете прочитать идентификатор устройства 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/'
jippie
источник
.. \ Arduino \ аппаратные средства \ инструменты \ avr \ avr \ include \ avr \ io.h для windows
mpflaga
@mpflaga Я обновил ответ. Спасибо за ваш вклад.
Джиппи
Все специфичные для AVR макросы перечислены в документации по avr-libc .
Игнасио Васкес-Абрамс
Так как же Arduino IDE получает информацию о плате? ( Tools > Get Board Info) Я надеялся выполнить проверку строки при последовательном соединении, чтобы при запуске моего приложения автоматически выбирался правильный COM-порт. Потому что, очевидно, IDE может сделать это, есть идеи, если они используют методы, описанные выше?
n00dles
@ n00dles Выше описанные методы отличаются от того, что вы хотите. Это, вероятно, стоит своего собственного вопроса на Arduino.SE. Я не могу проверить информацию о плате, ее нет в версии Arduino, которая у меня есть.
Джиппи
6

Как указано в спецификации оборудования Arduino, среда IDE Arduino теперь определяет макрос для каждой платы, как определено в build.boardсвойстве Board.txt . К этому значению добавляется ARDUINO_, например, макросы для интересующих плат:

  • Uno: 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
per1234
источник
Я бы сказал, что это самый простой и прямой ответ на вопрос. Жаль, что это был принятый.
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 подробно описан в моем блоге.

Адонис Гайтацис
источник
Ваше Arduino Из- за неправильного распознавания в ArduinoBoardManager.h см. Этот пост .
Ульрих Стерн
Пожалуйста, укажите лицензию в вашем проекте ..
Арун
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 edition.h .)

Благодарим Адама Ф. /programming//a/21058963/354144

nialsh
источник
1

Поскольку Arduino Due - это семейство процессоров (ARM), отличное от AVR, вы не сможете использовать один и тот же исполняемый файл для всех трех. Но у вас может быть один и тот же исходный код (при условии, что синтаксис для чтения порта одинаков как для частей AVR, так и для частей ARM) и только два исполняемых файла (поскольку один и тот же код будет работать на Uno и Mega без перекомпиляции).

Вы можете определить тип платы во время выполнения без перекомпиляции, выбрав два цифровых вывода, которые еще не используются вашей программой на любой из плат, и привязать их к верхнему или нижнему значению в качестве идентификатора платы. Например, если вы выбрали контакты PC1 и PC3:

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

Затем просто прочитайте порт при включении и установите переменную в вашей программе.

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

tcrosley
источник