Apa cara yang tepat untuk membuat pemetaan pin perpustakaan dapat dikonfigurasi?

8

Saya bekerja dengan beberapa perpustakaan yang menyediakan API untuk berinteraksi dengan chip perangkat keras tertentu (yang membuat driver ini?). Namun, papan atau pelindung khusus yang berbeda akan memetakan chip ke pin yang berbeda yang berarti perpustakaan perlu dimodifikasi untuk setiap kasus. Perlu memodifikasi perpustakaan tidak berfungsi dengan baik dengan Arduino IDE Library Manager.

Apakah ada pola yang disukai / direkomendasikan untuk mengekspos konfigurasi ini sehingga perpustakaan itu sendiri tidak perlu diubah setiap waktu?

Berikut adalah contoh di mana bagian tersebut didokumentasikan bagian mana yang perlu diubah agar sesuai dengan tata letak pin papan Anda.

vossad01
sumber
Banyak perpustakaan Arduino normal sudah melakukan ini - mulailah dengan membiasakan diri dengan metode itu, bahkan dari perspektif pengguna.
Chris Stratton

Jawaban:

6

Metode yang saya gunakan adalah menyediakan pin sebagai parameter untuk konstruktor. Nomor pin tersebut disimpan dalam variabel untuk digunakan nanti dalam .begin()fungsi dan di tempat lain.

Sebagian besar waktu saya menggunakan daftar inisialisasi untuk menjaga hal-hal sederhana. Sebagai contoh:

class Something {
    uint8_t _cs;
    uint8_t _dc;

    Something(uint8_t cs, uint8_t dc) : _cs(cs), _dc(dc) {}
    void begin();
};

void Something::begin() {
    pinMode(_cs, OUTPUT);
    pinMode(_dc, OUTPUT);
}

Something mySomething(10, 8);
Majenko
sumber
6

Saya akan menggunakan salah satu dari dua kemungkinan berikut:

Gunakan variabel (kelas) dan atur di dalam konstruktor.

Keuntungan:

  • Selalu diinisialisasi
  • Mudah digunakan (pengaturan dan pemasangan pin sekaligus)

Gunakan metode terpisah (misalnya Init).

Keuntungan:

  • Dapat diubah secara dinamis

Catatan

Untuk pengaturan pin, sebagian besar sirkuit statis digunakan sehingga pendekatan pertama mungkin lebih baik.

Untuk pengaturan, sebagian besar metode kedua lebih baik.

Jika banyak pin terlibat (tidak mungkin), gunakan struktur atau kelas pengaturan pin terpisah.

Makro

Yang tidak akan saya sarankan adalah makro. Ketika pengguna perlu mengubah kode sumber sendiri, dan versi baru diinstal, mereka harus menggabungkan atau mengulangi perubahan lagi. Keuntungannya adalah kode (mesin) sedikit lebih sedikit, mungkin sedikit lebih cepat dan penggunaan memori sedikit, tetapi ketiga aspek minimal.

Michel Keijzers
sumber
2

tergantung pada pendekatan Anda.

1) jika Anda hanya menyediakan file biner + header, Anda harus membuat variabel pin.

2) jika Anda memberikan kode sumber dan mengharapkan pengguna untuk mengkompilasi ulang kode sumber, gunakan makro.

dannyf
sumber
2

Jika Anda akan menghindari hal-hal konstruktor C ++ yang cukup umum merupakan pembunuhan berlebihan pada Arduino, Anda dapat menggunakan #define(makro seperti objek).

Seperti itu:

#define PIN_ONE 1
#define PIN_TWO 2

Preprocessor akan diganti PIN_ONEdengan mulus dengan angka 1 dan PIN_TWO2 dengan asumsi definisi tersebut ada dalam .hfile header perpustakaan . Ini kemungkinan besar akan membutuhkan sumber daya paling sedikit dibandingkan dengan solusi lain yang mungkin.

Avamander
sumber
Masalahnya adalah bahwa mereka harus berada di tempat di mana file .ino dan sumber pustaka bisa sampai kepada mereka. Ini biasanya berarti file header terpisah dengan semua yang diperlukan.
Ignacio Vazquez-Abrams
Apakah kamu yakin Cukup yakin saya bisa melakukan #define switch di .ino dan mereka digunakan di perpustakaan, tapi saya mungkin salah.
Avamander
1
Ini dapat berfungsi jika kode untuk pustaka secara ketat di header, tetapi tidak jika itu di unit kompilasi yang berbeda sama sekali.
Ignacio Vazquez-Abrams
Ya, itu masuk akal, tidak tahu batasan pastinya, tambah disclaimer itu.
Avamander