Bagaimana saya bisa mendeteksi board Arduino (atau controller mana) dalam perangkat lunak?

14

Saya memiliki proyek yang ingin saya kerjakan pada Uno atau Mega (atau bahkan sebuah Jatuh Tempo) dan akan menyenangkan jika saya tidak memerlukan dua versi perangkat lunak. Misalnya, pada Mega, untuk menggunakan SoftwareSerial, Anda harus menggunakan pin berbeda dari yang ada di Uno. Lihat dokumen pada Serial Perangkat Lunak . Bagaimanapun, akan lebih baik untuk mendeteksi bahwa saya menggunakan Uno jadi saya hanya bisa menggunakan pin 4 dan 5 untuk TX / RX dan jika saya menggunakan Mega perangkat lunak akan mendeteksi dan hanya menggunakan pin 10 dan 11 (dan dari tentu saja, saya harus menghubungkannya secara berbeda tetapi setidaknya perangkat lunaknya akan sama).

tooshel
sumber

Jawaban:

16

Jalankan waktu

Sepengetahuan saya Anda tidak dapat mendeteksi jenis papan, tetapi Anda dapat membaca ID perangkat ATmega. Periksa pertanyaan ini bagaimana hal itu dapat dilakukan: Dapatkah tanda tangan ATmega atau ATtiny perangkat dibaca saat berjalan? Perhatikan bahwa ketika menggunakan metode ini, beberapa tugas register akan berubah, bukan hanya pinout. Karenanya kode Anda mungkin menjadi jauh lebih kompleks. Keuntungannya adalah jika Anda berhasil mengatasi semua perubahan tugas register dan dependensi perangkat keras lainnya, Anda dapat menggunakan file .hex tunggal untuk memprogram langsung dari perangkat Anda avrdude.

Waktu kompilasi

Cara lain untuk mengetahui tipe papan / pengontrol adalah pada waktu kompilasi. Pada dasarnya Anda mengkompilasi bagian dari kode atau mengatur makro tergantung pada jenis perangkat yang dikonfigurasi dalam Arduino IDE. Lihat sniplet kode ini untuk contoh:

#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

Cuplikan kode disalin tanpa malu dari https://github.com/gillham/logic_analyzer/wiki Periksa kode itu untuk mengetahui beberapa tipu daya khusus perangkat lainnya.

Bergantung pada sistem operasi host Anda, jenis pengontrol yang didukung dapat ditemukan di file berikut:

  • Linux: /usr/lib/avr/include/avr/io.h
  • Windows: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

Penggunaan C-preprocessor (yang menangani kode di atas) mungkin di luar ruang lingkup untuk situs ini. http://stackoverflow.com akan menjadi tempat yang lebih baik untuk pertanyaan terperinci.

Jika Anda menggunakan Linux, Anda dapat dengan mudah menemukan semua jenis pengontrol yang didukung dengan mengetik:

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
jippie
sumber
.. \ Arduino \ hardware \ tools \ avr \ avr \ termasuk \ avr \ io.h untuk windows
mpflaga
@mpflaga Saya memperbarui jawabannya. Thnx untuk input Anda.
jippie
Semua makro yang telah ditentukan AVR spesifik tercantum dalam dokumentasi avr-libc .
Ignacio Vazquez-Abrams
Jadi, bagaimana Arduino IDE mendapatkan info papan? ( Tools > Get Board Info) Saya berharap dapat melakukan cek string dari koneksi serial, sehingga port COM yang benar dapat secara otomatis dipilih ketika aplikasi saya mulai. Karena jelas, IDE dapat melakukan ini, ada ide jika mereka menggunakan metode di atas?
n00dles
@ n00dles Metode yang dijelaskan di atas berbeda dari yang Anda inginkan. Mungkin bernilai pertanyaan tersendiri tentang Arduino.SE. Saya tidak dapat memeriksa Get Board Info, itu bukan dalam versi Arduino yang saya miliki.
jippie
6

Sebagaimana dinyatakan dalam spesifikasi perangkat keras Arduino , Arduino IDE sekarang mendefinisikan makro untuk setiap papan, sebagaimana didefinisikan dalam build.boardproperti boards.txt . Nilai itu ditambahkan ARDUINO_sehingga, misalnya, makro untuk papan yang Anda minati adalah:

  • Uno: ARDUINO_AVR_UNO
  • Mega 2560: ARDUINO_AVR_MEGA2560
  • Jatuh tempo: ARDUINO_SAM_DUE

Contoh bagaimana Anda dapat menggunakan makro ini dalam kode Anda:

#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
per1234
sumber
Saya akan mengatakan ini adalah jawaban yang paling sederhana dan langsung ke pertanyaan. Berharap itu yang diterima.
Erutan409
4

Cara mudah untuk melakukan sniffing papan adalah dengan menggunakan perpustakaan seperti ArduinoManager. Dengan ini, Anda dapat dengan mudah mendapatkan nama dan fitur papan https://github.com/backupbrain/ArduinoBoardManager

Ini menggunakan teknik yang dijelaskan di atas untuk mengungkapkan banyak informasi tentang hampir setiap papan Arduino, sehingga sangat bagus untuk membuat proyek yang dapat digunakan pada banyak lingkungan yang berbeda.

Cukup unduh dan sertakan dalam proyek Arduino Anda.

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

Output yang dihasilkan di Arduino Uno adalah:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Proses pembuatan perpustakaan ini (termasuk kode contoh) untuk menentukan model dan versi papan Arduino dijelaskan secara rinci di blog saya.

Adonis Gaitatzis
sumber
Arduino Anda Karena pengakuan Anda di ArduinoBoardManager.h mungkin salah, lihat posting ini .
Ulrich Stern
Harap tunjukkan lisensi dalam proyek Anda ..
arun
2

Untuk semua papan yang kompatibel dengan Arduio Due

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

(Lihat file sam3.h untuk info lebih lanjut.)

Jika Anda hanya ingin menargetkan Due Arduino (meninggalkan papan yang kompatibel), Anda dapat menggunakan

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

(Ini didefinisikan dalam file variant.h Arduino Due .)

Kredit untuk Adam F /programming//a/21058963/354144

nialsh
sumber
1

Karena Arduino Due adalah keluarga prosesor (ARM) yang berbeda dari AVR, Anda tidak akan dapat menggunakan executable yang sama untuk ketiganya. Tetapi Anda dapat memiliki kode sumber yang sama (dengan asumsi sintaks untuk membaca port sama di seluruh bagian AVR dan ARM), dan hanya dua yang dapat dieksekusi (karena yang sama akan berjalan pada Uno dan Mega tanpa kompilasi ulang).

Anda dapat menentukan jenis papan saat runtime tanpa harus mengkompilasi ulang, dengan memilih dua pin digital yang belum digunakan oleh program Anda di papan mana pun dan mengikatnya tinggi atau rendah sebagai ID papan. Misalnya, jika pin yang Anda pilih adalah PC1 dan PC3:

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

Kemudian baca port pada power up dan atur variabel di program Anda.

Skema lain yang dapat digunakan, yang hanya mengikat satu pin, adalah dengan menggunakan pin input analog dan menggunakan pembagi resistor, memilih resistor sehingga Anda mendapatkan voltase yang berbeda, katakanlah, kenaikan 0,25V. Saya telah menggunakan teknik itu untuk menentukan tidak hanya tipe papan, tetapi juga revisi papan untuk papan yang sama (yang dalam arti adalah jenis papan baru).

tcrosley
sumber