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/'
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?Sebagaimana dinyatakan dalam spesifikasi perangkat keras Arduino , Arduino IDE sekarang mendefinisikan makro untuk setiap papan, sebagaimana didefinisikan dalam
build.board
properti boards.txt . Nilai itu ditambahkanARDUINO_
sehingga, misalnya, makro untuk papan yang Anda minati adalah:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Contoh bagaimana Anda dapat menggunakan makro ini dalam kode Anda:
sumber
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.
Output yang dihasilkan di Arduino Uno adalah:
Proses pembuatan perpustakaan ini (termasuk kode contoh) untuk menentukan model dan versi papan Arduino dijelaskan secara rinci di blog saya.
sumber
Untuk semua papan yang kompatibel dengan Arduio Due
(Lihat file sam3.h untuk info lebih lanjut.)
Jika Anda hanya ingin menargetkan Due Arduino (meninggalkan papan yang kompatibel), Anda dapat menggunakan
(Ini didefinisikan dalam file variant.h Arduino Due .)
Kredit untuk Adam F /programming//a/21058963/354144
sumber
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:
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).
sumber