¿Cuál es la forma correcta de configurar las asignaciones de pines de la biblioteca?


8

Estoy trabajando con algunas bibliotecas que proporcionan API para interactuar con chips de hardware específicos (¿qué hacen estos controladores?). Sin embargo, diferentes tableros o escudos personalizados tendrán el chip asignado a diferentes pines, lo que significa que la biblioteca debe modificarse para cada caso. La necesidad de modificar la biblioteca no funciona bien con Arduino IDE Library Manager.

¿Existen patrones preferidos / recomendados para exponer esta configuración para que la biblioteca en sí no necesite ser modificada cada vez?

Aquí hay un ejemplo en el que se documenta qué parte debe cambiarse para que coincida con el diseño del pin de su placa.


Muchas de las bibliotecas normales de Arduino ya hacen esto: comience por familiarizarse con ese método, incluso desde la perspectiva del usuario.
Chris Stratton

Respuestas:


6

El método que uso es proporcionar los pines como parámetros para el constructor. Esos números de pin se almacenan en variables para usar más adelante en la .begin()función y en otros lugares.

La mayoría de las veces uso listas de inicialización para simplificar las cosas. Por ejemplo:

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

6

Usaría cualquiera de las dos posibilidades siguientes:

Use variables (clase) y configúrelas dentro del constructor.

Ventajas:

  • Siempre inicializado
  • Fácil de usar (configuración de constructor y pin a la vez)

Utilice un método separado (por ejemplo, Init).

Ventajas:

  • Se puede cambiar dinámicamente

Observaciones

Para la configuración de pines, se utilizan principalmente circuitos estáticos, por lo que el primer enfoque es probablemente mejor.

Para la configuración, principalmente el segundo método es mejor.

Si hay muchos pines involucrados (no es probable), use una estructura o una clase de configuración de pines separada.

Macros

Lo que no recomendaría es macros. Cuando los usuarios necesitan cambiar el código fuente ellos mismos y se instalan nuevas versiones, tienen que fusionar o rehacer los cambios nuevamente. Las ventajas son un poco menos de código (máquina), probablemente un poco más rápido y un poco menos de uso de memoria, pero los tres aspectos son mínimos.


2

Dependiendo de su enfoque.

1) si solo proporciona los archivos binarios + encabezado, tendrá que hacer que los pines sean variables.

2) si proporciona el código fuente y espera que el usuario vuelva a compilar el código fuente, use macros.


2

En caso de que evite las cosas del constructor de C ++ que comúnmente son una exageración en Arduino, podría usar #define's (macros similares a objetos).

Al igual que:

#define PIN_ONE 1
#define PIN_TWO 2

El preprocesador se reemplazará sin problemas PIN_ONEcon el número 1 y PIN_TWOcon 2, suponiendo que esas definiciones estén en el .harchivo de encabezado de la biblioteca . Esto probablemente requerirá la menor cantidad de recursos en comparación con las otras posibles soluciones.


El problema es que necesitan estar en un lugar donde el archivo .ino y la fuente de la biblioteca puedan acceder a ellos. Esto generalmente significa un archivo de encabezado separado con todo lo que requiere.
Ignacio Vazquez-Abrams

¿Estás seguro? Estoy bastante seguro de que puedo hacer cambios #define en .ino's y se usan en bibliotecas, pero podría estar equivocado.
Avamander

1
Puede funcionar si el código de la biblioteca está estrictamente en el encabezado, pero no si está en una unidad de compilación completamente diferente.
Ignacio Vazquez-Abrams

Sí, eso tiene sentido, no sabía las limitaciones exactas, agregó ese descargo de responsabilidad.
Avamander
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.