如何在编译时确定Arduino的板类型(例如Uno vs Nano)? 不要与确定处理器类型相混淆。我看到这样的例子,例如#if defined(__ AVR_ATmega32U4__)...
我想要一种方法,类似地,确定Arduino的风味之间使用相同的ATmega328处理器。
IDE知道董事会。因此可以从一些预编译器#IF
访问它Nano与Uno有不同的中断。因此,在编译时知道板类型可以自动化公共库的引脚分配。
答案 0 :(得分:4)
如您所述,您在开发环境中检查了一个电路板目标,以便编译器可能知道电路板。不幸的是,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环境如何将定义传递给预处理器。您会看到只有CPU速度和arduino版本以这种方式传递。
IO引脚的定义方式不同:IDE包含一个包含特定于板的头文件的文件夹。
这个-I参数在编译器的搜索路径中包含一个文件夹:
-IC:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ variants \ standard
在该文件夹中有一个pins_arduino.h文件,适用于您选择的电路板。 如果您选择其他电路板,您将看到此参数更改。
如果您愿意修改IDE配置,则可以获得所要求的内容。
为了得到你想要的东西,你只需要得到一个#define指令。 所以这里是如何
步骤1.制作自己的电路板类型。要创建新的板类型,请参阅此文件夹中的boards.txt文件:
... \ Arduino的1.0 \硬件\ Arduino的
这样的行定义了include文件夹(在本例中为标准):
uno.build.variant=standard
复制整个块,更改名称和文件夹
myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard
通过此更改,当您选择此电路板目标时,myunoboard文件夹将被放置在编译器路径上。
步骤2.制作包含您的定义的标题。
在文件夹
中... \ Arduino的1.0 \硬件\ Arduino的\变体\ myunoboard
制作文件 pins_arduino.h 。在那个文件中
#include "..\standard\pins_arduino.h"
#define BOARD MY_UNO
// and/or this form
#define __BOARD_MY_UNO
步骤3.重复更多电路板。
这将为不同的主板目标构建代码。
话虽如此,我不会真的推荐这种方法。如果您开始考虑创建跨多个目标运行的代码,那么可能是时候从Arduino IDE继续了。如果您使用的是Eclipse等环境,那么您将拥有一个包含任意数量的构建配置的项目。每个构建配置都可以为板目标指定不同的预处理器定义。
答案 1 :(得分:3)
我认为arduino IDE中没有内置这样的东西,但你总是可以编写自己的makefile并自己定义这样的东西。
http://pragprog.com/magazines/2011-04/advanced-arduino-hacking
如果向下滚动到hello world示例,您将看到一个示例makefile,其中定义了一个BOARD make变量,并且只需要一些额外的makefile smarts就可以调用make:
make BOARD=UNO
或
make BOARD=NANO
为不同的电路板构建草图。
答案 2 :(得分:0)
进行电路板嗅探的一种简单方法是使用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
我的博客详细介绍了将此库(包括示例代码)设置为determine an Arduino board model and version的过程。