我有一个项目,我想在 Uno 或 Mega(甚至是 Due)上工作,如果我不需要两个版本的软件,那就太好了。例如,在 Mega 上,要使用 SoftwareSerial,您必须使用与 Uno 上不同的引脚。请参阅Software Serial 上的文档。无论如何,很高兴检测到我正在使用 Uno,因此我可以将引脚 4 和 5 用于 TX/RX,如果我使用的是 Mega,软件将检测并仅使用引脚 10 和 11(以及当然,我必须以不同的方式连接它,但至少软件是相同的)。
如何检测软件中的哪个 arduino 板(或哪个控制器)?
运行
据我所知,您无法检测到板类型,但您可以读取 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文件中定义的。)