如何检测软件中的哪个 arduino 板(或哪个控制器)?

电器工程 Arduino
2022-01-24 16:07:33

我有一个项目,我想在 Uno 或 Mega(甚至是 Due)上工作,如果我不需要两个版本的软件,那就太好了。例如,在 Mega 上,要使用 SoftwareSerial,您必须使用与 Uno 上不同的引脚。请参阅Software Serial 上的文档无论如何,很高兴检测到我正在使用 Uno,因此我可以将引脚 4 和 5 用于 TX/RX,如果我使用的是 Mega,软件将检测并仅使用引脚 10 和 11(以及当然,我必须以不同的方式连接它,但至少软件是相同的)。

4个回答

运行

据我所知,您无法检测到板类型,但您可以读取 ATmega 设备 ID。检查这个问题如何完成:可以在运行时读取 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/'

Arduino 硬件规范中所述,Arduino IDE 现在为每个板定义了一个宏,如boards.txtbuild.board属性中所定义。例如,该值附加到ARDUINO_您感兴趣的板的宏是:

  • 一诺: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

进行电路板嗅探的一种简单方法是使用 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 板模型和版本 的过程在我的博客中有详细描述。

适用于与 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 的variant.h文件中定义的。)

感谢亚当 F https://stackoverflow.com/a/21058963/354144