Как правильно настроить сопоставления пинов библиотеки?

Я работаю с некоторыми библиотеками, которые предоставляют API для взаимодействия с определенными аппаратными чипами (что делает эти драйверы?). Однако на разных пользовательских платах или экранах микросхема будет привязана к разным выводам, что означает, что библиотеку необходимо модифицировать для каждого конкретного случая. Необходимость изменения библиотеки плохо работает с Arduino IDE Library Manager.

Существуют ли предпочтительные / рекомендуемые шаблоны для предоставления этой конфигурации, чтобы саму библиотеку не нужно было изменять каждый раз?

Вот пример, в котором задокументировано, какую деталь необходимо изменить, чтобы она соответствовала расположению контактов на вашей плате.

, 👍10

Обсуждение

Многие из обычных библиотек Arduino уже делают это - начните с ознакомления с этим методом, даже с точки зрения пользователя., @Chris Stratton


4 ответа


Лучший ответ:

6

Метод, который я использую, заключается в предоставлении выводов в качестве параметров конструктору. Эти пины хранятся в переменных для последующего использования в функции .begin() и в других местах.

Большую часть времени я использую списки инициализации, чтобы все было просто. Например:

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);
,

2

в зависимости от вашего подхода.

1) если вы просто предоставляете двоичные файлы + заголовочные файлы, вам нужно будет создать переменные pins.

2) если вы предоставляете исходный код и ожидаете, что пользователь перекомпилирует исходный код, используйте макросы.

,

6

Я бы использовал любую из следующих двух возможностей:

Используйте переменные (класса) и устанавливайте их в конструкторе.

Преимущества:

  • Всегда инициализируется
  • Простота в использовании (одновременная настройка конструктора и PIN)

Используйте отдельный метод (например, Init).

Преимущества:

  • Может быть динамически изменен

Замечания

Для настройки контактов используются в основном статические схемы, поэтому первый подход, вероятно, лучше.

Что касается настроек, то в основном второй способ лучше.

Если задействовано много контактов (маловероятно), используйте структуру или отдельный класс настроек контактов.

Макросы

Чего бы я не советовал, так это макросов. Когда пользователям необходимо самим изменить исходный код и устанавливаются новые версии, им приходится либо объединять, либо заново вносить изменения. Преимущества - это немного меньше (машинного) кода, возможно, немного быстрее и немного меньше использования памяти, но все три аспекта минимальны.

,

3

В случае, если вы хотите избежать конструктора C ++, который довольно часто является излишним в Arduino, вы можете использовать #define(объектно-подобные макросы).

Вот так:

#define PIN_ONE 1
#define PIN_TWO 2

Препроцессор легко заменит PIN_ONE на число 1, а PIN_TWO на 2, предполагая, что эти определения находятся в файле library header .h . Это, скорее всего, потребует наименьшего количества ресурсов по сравнению с другими возможными решениями.

Альтернатива 1

Если у вас есть возможность использовать современный C ++, вы можете использовать constexpr для определения переменных. По сравнению с макросами вы получите проверку типов, и она должна быть столь же эффективной.

,

Проблема в том, что они должны находиться в таком месте, где к ним могут попасть как файл .ino, так и источник библиотеки. Обычно это означает отдельный заголовочный файл со всем, что требуется., @Ignacio Vazquez-Abrams

Вы уверены? Почти уверен, что я могу использовать переключатели #define в .ino, и они используются в библиотеках, но я могу ошибаться., @Avamander

Это может сработать, если код библиотеки находится строго в заголовке, но не в том случае, если он находится совсем в другом блоке компиляции., @Ignacio Vazquez-Abrams

Да, это имеет смысл, не знал точных ограничений, добавил это заявление об отказе от ответственности., @Avamander