2012-12-13 60 views
11

Làm cách nào để xác định loại bảng (ví dụ: Uno vs Nano) của Arduino tại thời điểm biên dịch? Không được nhầm lẫn với việc xác định loại bộ xử lý. Như tôi thấy ví dụ về điều này, ví dụ: #if được xác định (__ AVR_ATmega32U4__) ...xác định loại bảng của Arduino

Tôi muốn một cách tương tự, để xác định giữa các hương vị của Arduino đều sử dụng cùng bộ xử lý ATmega328.

IDE biết bảng. Vì vậy, có thể truy cập nó từ một số trình biên dịch trướC#IF

Nano có các ngắt khác nhau so với Uno. Do đó biết loại bảng tại biên dịch có thể tự động hóa các bài tập pin cho các thư viện công cộng.

Trả lời

4

Như bạn đã lưu ý, bạn kiểm tra mục tiêu của bảng trong môi trường phát triển để trình biên dịch có thể biết bảng. Thật không may, IDE không cho trình biên dịch thông tin này trực tiếp. Chỉ loại bộ xử lý và tần số được truyền xuống.

Bạn có thể xem IDE làm gì để biên dịch chương trình. Trong menu tùy chọn, hãy bật đầu ra chi tiết để biên dịch. Biên soạn bản phác thảo và bạn sẽ thấy một cái gì đó như thế này:

C: \ Ứng dụng \ arduino-1.0-windows \ arduino-1.0 \ phần cứng \ công cụ \ avr \ bin \ avr-g ++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections-mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -IC: \ Ứng dụng \ arduino-1.0-windows \ arduino-1.0 \ phần cứng \ arduino \ lõi \ arduino -IC: \ Ứng dụng \ arduino-1.0-windows \ arduino-1.0 \ phần cứng \ arduino \ biến thể \ tiêu chuẩn C: \ Users \ Jim \ AppData \ Local \ Temp \ build4664216036291565363.tmp \ Blink.cpp -oC: \ Users \ Jim \ AppData \ Local \ Temp \ build4664216036291565363.tmp \ Blink.cpp.o

-D là cách môi trường Arduino chuyển định nghĩa cho bộ tiền xử lý. Bạn thấy rằng chỉ có tốc độ CPU và phiên bản Arduino được truyền theo cách này.

Các chân IO được định nghĩa theo cách khác: IDE bao gồm một thư mục chứa tệp tiêu đề cụ thể của bảng.

luận -Tôi này bao gồm một thư mục trên con đường tìm kiếm của trình biên dịch:

ic: \ Apps \ Arduino-1,0-windows \ Arduino-1.0 \ phần cứng \ Arduino \ biến thể \ chuẩn

Trong thư mục đó là tệp pins_arduino.h phù hợp với bảng bạn đã chọn. Nếu bạn chọn một bảng khác, bạn sẽ thấy thay đổi tham số này.

Nếu bạn sẵn sàng sửa đổi cấu hình IDE, bạn có thể nhận được những gì bạn yêu cầu.

Vì vậy, để có được những gì bạn muốn, bạn chỉ cần nhận được một chỉ thị #define. Vì vậy, đây là cách để

Bước 1. Tạo loại bảng của riêng bạn. Để thực hiện một loại tàu mới, xem các tập tin boards.txt nằm trong thư mục này:

... \ Arduino-1.0 \ phần cứng \ Arduino

Dòng như thế này xác định bao gồm thư mục (tiêu chuẩn trong trường hợp này):

uno.build.variant=standard 

Sao chép toàn bộ khối, thay đổi tên và thư mục

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

với thay đổi này, khi bạn chọn mục tiêu ban này, thư mục myunoboard sẽ được đặt trên comp đường dẫn iler.

Bước 2. Đặt tiêu đề bao gồm xác định của bạn.

Trong thư mục

... \ Arduino-1.0 \ phần cứng \ Arduino \ biến thể \ myunoboard

tạo một tập tin pins_arduino.h. Trong tệp đó

#include "..\standard\pins_arduino.h" 
#define BOARD MY_UNO 
// and/or this form 
#define __BOARD_MY_UNO 

Bước 3. Lặp lại các bảng khác.

Điều này sẽ cung cấp khả năng tạo mã của bạn cho các mục tiêu bảng khác nhau.

Có nói điều này, tôi sẽ không thực sự đề nghị phương pháp này. Nếu bạn đang bắt đầu nghĩ về việc tạo mã chạy trên nhiều mục tiêu, có thể là thời gian để chuyển từ IDE Arduino. Nếu bạn đang sử dụng một môi trường như Eclipse, bạn có một dự án với bất kỳ số lượng cấu hình xây dựng nào. Mỗi cấu hình xây dựng có thể chỉ định tiền xử lý khác nhau xác định cho mục tiêu của bảng.

+0

Tôi vừa mới thử cách này. Nơi nó hoạt động cho tệp INO chính. Tuy nhiên, nó xuất hiện tập tin thư viện, không thể nhìn thấy xác định có nguồn gốc trong các biến thể/pin_arduino.h. Khi tôi cần sự khác biệt xảy ra trong thư mục .h của thư viện tùy chỉnh. – mpflaga

+0

có vẻ như tôi có thể sai. có vẻ như tôi không thể sử dụng #define tên tệp của thư viện khác. vì vậy nó hiện đang hoạt động. – mpflaga

+0

Ở trên bây giờ là đúng với IDE 1.5 xem https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification và tham số uno.build.board = AVR_UNO, cung cấp được sử dụng để đặt biến biên dịch ARDUINO_ {build.board} để cho phép sử dụng mã có điều kiện giữa #ifdefs – mpflaga

3

Tôi không nghĩ rằng có một điều như vậy được xây dựng trong IDE Arduino, nhưng bạn luôn có thể viết makefile của riêng bạn và tự xác định một thứ như vậy.

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

Nếu bạn cuộn xuống ví dụ hello world, bạn sẽ thấy một ví dụ makefile, với một BAN làm biến được định nghĩa và chỉ với một chút thêm makefile sự thông minh bạn có thể gọi thực hiện như thế này:

make BOARD=UNO 

hoặc

make BOARD=NANO 

để xây dựng phác thảo cho bảng khác nhau.

0

Cách dễ dàng để làm ngửi bảng là sử dụng thư viện như ArduinoManager. Với điều này, bạn có thể dễ dàng lấy tên và các tính năng của bảng và https://github.com/backupbrain/ArduinoBoardManager

Nó sử dụng kỹ thuật được mô tả ở trên để tiết lộ rất nhiều thông tin về hầu hết mọi bảng Arduino, vì vậy rất tuyệt vời cho các dự án có thể triển khai trên nhiều môi trường khác nhau.

Chỉ cần tải xuống và đưa vào dự án Arduino của bạn.

#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() { 
} 

Các kết quả đầu ra trên Arduino Uno là:

Board is compatible with Arduino UNO 

Speed/SRAM/Flash: 
16000000 
2048 
33554432 

Quá trình để làm thư viện này (bao gồm cả ví dụ code) để determine an Arduino board model and version được mô tả một cách chi tiết trên blog của tôi.

Các vấn đề liên quan