Làm thế nào tôi có thể phát hiện bảng arduino (hoặc bộ điều khiển nào) trong phần mềm?


14

Tôi có một dự án mà tôi muốn làm việc trên Uno hoặc Mega (hoặc thậm chí là đáo hạn) và thật tuyệt nếu tôi không cần hai phiên bản phần mềm. Ví dụ: trên Mega, để sử dụng SoftwareSerial, bạn phải sử dụng các chân khác với các chân trên Uno. Xem các tài liệu trên Phần mềm nối tiếp . Dù sao, thật tuyệt khi phát hiện ra rằng tôi đang sử dụng Uno vì vậy tôi chỉ có thể sử dụng chân 4 và 5 cho TX / RX và nếu tôi đang sử dụng Mega, phần mềm sẽ phát hiện và chỉ sử dụng chân 10 và 11 (và của Tất nhiên, tôi sẽ phải kết nối nó một cách khác nhau nhưng ít nhất phần mềm sẽ giống nhau).

Câu trả lời:


16

Thời gian chạy

Theo hiểu biết của tôi, bạn không thể phát hiện loại bảng, nhưng bạn có thể đọc ID thiết bị ATmega. Kiểm tra câu hỏi này làm thế nào nó có thể được thực hiện: Chữ ký của thiết bị ATmega hoặc ATtiny có thể được đọc trong khi chạy không? Lưu ý rằng khi sử dụng phương thức này, một số bài tập đăng ký sẽ thay đổi, không chỉ là sơ đồ chân. Do đó mã của bạn có thể trở nên phức tạp hơn đáng kể. Ưu điểm là nếu bạn quản lý để giải quyết tất cả các bài tập thay đổi đăng ký và các phụ thuộc phần cứng khác, bạn có thể sử dụng một tệp .hex duy nhất để lập trình trực tiếp các thiết bị của mình avrdude.

Thời gian biên dịch

Một cách khác để tìm ra loại bảng / bộ điều khiển là vào thời gian biên dịch. Về cơ bản, bạn biên dịch các phần của mã hoặc đặt macro tùy thuộc vào loại thiết bị được cấu hình trong Arduino IDE. Kiểm tra sniplet mã này cho một ví dụ:

#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

Đoạn mã được sao chép một cách đáng xấu hổ từ https://github.com/gillham/logic_analyzer/wiki Kiểm tra mã đó để biết một số mánh khóe cụ thể hơn về thiết bị.

Tùy thuộc vào hệ điều hành của máy chủ lưu trữ của bạn, các loại bộ điều khiển được hỗ trợ có thể được tìm thấy trong tệp sau:

  • Linux: /usr/lib/avr/include/avr/io.h
  • Các cửa sổ: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

Việc sử dụng bộ tiền xử lý C (theo đó đoạn mã trên được xử lý) có thể nằm ngoài phạm vi của trang web này. http://stackoverflow.com sẽ là nơi tốt hơn cho các câu hỏi chi tiết.

Nếu bạn đang dùng Linux, bạn có thể dễ dàng tìm thấy tất cả các loại trình điều khiển được hỗ trợ bằng cách nhập:

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'

.. \ Arduino \ phần cứng \ công cụ \ avr \ avr \ bao gồm \ avr \ io.h cho các cửa sổ
mpflaga

@mpflaga Mình cập nhật câu trả lời. Thnx cho đầu vào của bạn.
jippie

Tất cả các macro được xác định trước dành riêng cho AVR được liệt kê trong tài liệu avr-libc .
Ignacio Vazquez-Abrams

Vậy làm thế nào để Arduino IDE có được thông tin bảng? ( Tools > Get Board Info) Tôi đã hy vọng kiểm tra chuỗi từ một kết nối nối tiếp, để cổng COM chính xác có thể được chọn tự động khi ứng dụng của tôi khởi động. Bởi vì rõ ràng, IDE có thể làm điều này, bất kỳ ý tưởng nào nếu họ sử dụng các phương pháp trên?
n00

@ n00dles Các phương pháp được mô tả ở trên khác với những gì bạn muốn. Nó có lẽ là giá trị câu hỏi riêng của mình trên Arduino.SE. Tôi không thể kiểm tra Get Board Info, nó không có trong phiên bản Arduino tôi có sẵn.
jippie

6

Như đã nêu trong đặc tả phần cứng Arduino , Arduino IDE hiện định nghĩa một macro cho mỗi bảng, như được định nghĩa trong thuộc tính bảng.txt build.board. Giá trị đó được thêm vào ARDUINO_, ví dụ, các macro cho các bảng bạn quan tâm là:

  • Đoàn kết ARDUINO_AVR_UNO
  • Số tiền lớn 2560: ARDUINO_AVR_MEGA2560
  • Do: ARDUINO_SAM_DUE

Ví dụ về cách bạn có thể sử dụng các macro này trong mã của mình:

#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

Tôi muốn nói rằng đây là câu trả lời đơn giản và dễ hiểu nhất cho câu hỏi. Ước gì nó được chấp nhận.
Erutan409

4

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

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

Chỉ cần tải về và bao gồm trong 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() {
}

Đầu ra kết quả trên Arduino Uno là:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Quá trình tạo thư viện này (bao gồm mã ví dụ) để xác định mô hình và phiên bản bảng Arduino được mô tả chi tiết trên blog của tôi.


Nhận dạng Arduino của bạn trong ArduinoBoardManager.h có thể không chính xác, xem bài viết này .
Ulrich Stern

Vui lòng cho biết giấy phép trong dự án của bạn ..
arun

2

Đối với tất cả các bảng tương thích với Arduio Do

#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due compatible
// your Arduino Due compatible code here
#endif

(Xem tệp sam3.h để biết thêm thông tin.)

Nếu bạn chỉ muốn nhắm mục tiêu Arduino Do (bỏ các bảng tương thích), bạn có thể sử dụng

#if defined (_VARIANT_ARDUINO_DUE_X_)
// your Arduino Due code here
#endif

(Điều này được định nghĩa trong tệp biến thể của Arduino Do. )

Tín dụng cho Adam F https://stackoverflow.com/a/21058963/354144


1

Vì Arduino Do là một họ bộ xử lý (ARM) khác với các bộ vi xử lý của AVR, nên bạn sẽ không thể sử dụng cùng một tệp thực thi cho cả ba. Nhưng bạn có thể có cùng một mã nguồn (giả sử cú pháp để đọc một cổng giống nhau trên cả hai phần AVR và ARM) và chỉ có hai tệp thực thi (vì cùng một mã sẽ chạy trên cả Uno và Mega mà không cần biên dịch lại).

Bạn có thể xác định loại bảng khi chạy mà không cần phải biên dịch lại, bằng cách chọn hai chân kỹ thuật số chưa được chương trình của bạn sử dụng trên bất kỳ bảng nào và buộc chúng cao hoặc thấp làm ID bảng. Ví dụ: nếu các chân bạn chọn là PC1 và PC3:

 PC1   PC3   Board ID
  0     0      Uno
  0     1      Mega
  1     0      Due
  1     1      spare

Sau đó, chỉ cần đọc cổng bật nguồn và đặt một biến trong chương trình của bạn.

Một sơ đồ khác có thể được sử dụng, chỉ liên kết với một chân, là sử dụng chân đầu vào tương tự và sử dụng bộ chia điện trở, chọn các điện trở sao cho bạn có các điện áp khác nhau, tăng 0,25V. Tôi đã sử dụng kỹ thuật đó để chỉ định không chỉ một loại bảng, mà còn sửa đổi bảng cho cùng một bảng (theo nghĩa là một loại bảng mới).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.