2012-12-13 124 views
11

在編譯時如何確定Arduino的板類型(例如Uno vs Nano)? 不要與確定處理器類型混淆。正如我看到的例子,例如#if defined(__ AVR_ATmega32U4__)...確定Arduino的板類型

我想用一種方法來確定Arduino所有使用ATmega328相同處理器的風格。

IDE知道董事會。那麼是否有可能從一些預編譯器訪問它#IF

Nano與Uno有不同的中斷。因此,在編譯時瞭解板類型可以自動執行公共庫的引腳分配。

回答

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窗口\ Arduino的1.0 \硬件\ Arduino的\變體\標準

在該文件夾中是一個pins_arduino.h文件,它適用於您選擇的電路板。 如果您選擇其他電路板,您將看到此參數更改。

如果你願意修改你的IDE配置,你可以得到你要求的。

所以要得到你想要的,你只需要得到一個#define指令。 所以這裏是如何去做

第1步。做你自己的板子類型。爲了使新的板型,看到此文件夾中的文件boards.txt:

... \ Arduino的1.0 \五金\ Arduino的

類似的行定義這種情況下,包括文件夾(標準):

uno.build.variant=standard 

複製整個塊,更改名稱和文件夾

myuno.name=My Arduino Uno 
... 
myuno.build.variant=myunoboard 

隨着這一變化,當您選擇這款主板的目標,該myunoboard文件夾將被放置在補償iler路徑。

第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等環境,則可以使用任意數量的構建配置構建一個項目。每個構建配置可以爲板子目標指定不同的預處理器定義。

+0

我剛剛嘗試過。它主要用於INO文件。但是,它似乎是庫文件,無法看到變體/ pin_arduino.h中定義的定義。因爲我需要在自定義庫的.h中出現差異。 – mpflaga

+0

看來我可能是錯的。看起來像我不能使用另一個庫的文件名的#define。所以它現在似乎工作。 – mpflaga

+0

以上是現在IDE 1.5的情況,請參閱https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification以及參數uno.build.board = AVR_UNO,該提供用於設置編譯時變量ARDUINO_ {build.board}以允許在#ifdefs之間使用條件代碼 – mpflaga

3

我不認爲有這樣的東西內置到arduino IDE,但你可以隨時編寫自己的makefile並自己定義這樣的事情。

http://pragprog.com/magazines/2011-04/advanced-arduino-hacking

如果向下滾動到Hello World示例,你會看到一個例子生成文件,用牌局提出變量定義,並一點點額外的makefile文件的智慧,你可以調用做出這樣的:

make BOARD=UNO 

make BOARD=NANO 

以建立不同的板上的草圖。

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的烏諾產生的輸出是:

Board is compatible with Arduino UNO 

Speed/SRAM/Flash: 
16000000 
2048 
33554432 

用於製備該文庫(包括例如代碼)determine an Arduino board model and version的處理的詳細內容在我的博客說明。