Auteur Sujet: Bibliothèque Accessories et Expander SX1509  (Lu 518 fois)

golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Bibliothèque Accessories et Expander SX1509
« le: janvier 10, 2019, 01:25:52 pm »
Bonjour,
Pour mon réseau analogique, j'utilise un arduino mega avec la bibliothèque Accessories.
J'ai besoin d'ajouter un expander SX1509. Il faut donc apporter des modifications à Accessories pour pouvoir prendre en compte ce type d'expander.
Je voudrais avoir votre avis.
Je comptais rajouter une classe PortExpander qui gérerais les instances vers la bibliothèque fournit par SparkFun pour cet expander et qui permettrai aussi d'intégrer d'autres expanders.
Des modifications sont aussi nécessaires dans la classe Port rediriger vers l'expander si besoin.
Pour éviter de modifier toutes les classes héritant de Port, je comptais rajouter un beginExpander dansla classe Port à appeler avant le begin du port pour préciser si l'accessoire est connecté via l'expander.
Quand pensez-vous ?

Thierry

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 473
    • Voir le profil
Re : Biblioth�que Accessories et Expander SX1509
« Réponse #1 le: janvier 11, 2019, 09:40:45 pm »
Oui, c'est une bonne idée. Elle trottait déjà  dans ma tête depuis un certain temps.
Mon idée initiale était de changer le nommage des pins pour y inclure un numéro d'expandeur. Ainsi il y aurait une classe Expander, dérivée en ExpanderInput, ExpanderOutput et ExpanderPWM, ou avec seulement un type. Chaque expander aurait un numéro entre 1 et 99 (ça devrait suffire, sinon il faut pousser à un peu plus...) et au moment de déclarer un port avec une broche, fusionner le numéro d'expander et celui de sa broche. En gros au lieu de dire pushButton.begin(10) pour la broche 10, on dirait pushButton.begin(1208) pour la broche 8 de l'expander 12... La classe expander permettrait aussi de typer la communication avec lui selon son mode propre : un expandeur 74HC595 n'a pas le même mode de fonctionnement qu'un PCA9685 qui tourne en I²C . Il faudrait que chaque expander ait ses propres fonctions digitalRead et digitalWrite, analogRead/analogWrite et peut être aussi PWMWrite... Bref, c'est du boulot, mais c'est une proposition à creuser.
« Modifié: janvier 30, 2019, 08:52:01 am par Thierry »

golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #2 le: janvier 12, 2019, 10:33:31 am »
Bonjour,
Je vais essayer d'implémenter ces modifications durant ce mois et je posterai mes propositions.
J'hésite sur la numérotation (soit inclure l'expander dans la numérotation ou raoujter un flag précisant qu'il faut passer par la classe Expander).

Thierry

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 473
    • Voir le profil
Re : Biblioth�que Accessories et Expander SX1509
« Réponse #3 le: janvier 12, 2019, 10:45:01 am »
L'avantage de cette méthode de 'multiplexage' des numéros c'est qu'il n'est pas besoin de modifier toutes les fonctions qui acceptent une broche, en tout cas pas l'interface de la fonction, et les vieux .ino des utilisateurs continuent de fonctionner sans changement. Ajouter un argument pour chaque broche, c'est tout changer... C'est vrai que l'on peut ajouter aussi des variantes de begin avec plus d'arguments. A toi de voir.
Extraire les valeurs, c'est facile : pin/100 donne le numéro de l'expander, pin%100 donne celui de la broche. Le port doit en interne stocker le numéro d'expander sur un octet à côté du numéro de broche. Ce numéro a besoin d'un entier vu qu'il peut contenir un GPIO_pin_t à cause de l'utilisation de la bibliothèque Dio2.
« Modifié: janvier 30, 2019, 08:53:04 am par Thierry »

golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #4 le: février 10, 2019, 09:59:02 am »
Bonjour Thierry,
J'ai avancé avec une première version fonctionnelle.
J'ai donc créé une classe PortExpander.
Cette classe est uniquement appelé depuis la classe Port.
Comme échangé ensemble, j'ai intégré le multiplexage. De cette façon, c'est entièrement transparent pour les sketchs n'utilisant pas d'expander.
Les sketchs utilisant des expanders ont uniquement besoin de rajouter dans le setup.
  PortExpander::begin(1, SX1509_ADDRESS , EXPANDER_TYPE::SX1509_IO);
Pour le moment, j'ai uniquement intégré l'expander sx1509 avec la lib fournit par sparkfun.
Je t'ai mis en pièce jointe les fichiers.
Je n'ai pas intégré les #define pour activer ou non l'expander et les types d'expander, les commentaires pour la doc aussi.
Qu'en penses-tu?

Thierry

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 473
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #5 le: février 11, 2019, 09:07:19 pm »
C'est pas mal du tout, et ça a le (grand) mérite de fonctionner.
Mais, parce qu'il y a toujours un mais, ça gagnerai à être mis à la mode objet. Je n'aime pas les switch, ils dénotent un manque de structure. Alors plutôt que de mettre tout le code d'un expander particulier dans ton source, qu'il faudra modifier à chaque nouvel expander, il faudrait laisser une classe de base PortExpander, peut être même abstraite (virtuelle pure) et la dériver en PortExpanderSX1509 avec son fonctionnement à lui. Il faudrait faire pareil dans le Port : lui demander de lancer le digitalWrite() de l'expander, et lui saura ce qu'il doit faire...

J'ai déjà commencer à coder quelque chose, mais je vais m'inspirer de ce que tu as fait et voir comment améliorer, à moins que tu ne te sentes d'attaque pour affiner le code...

En tout cas, c'est du bon boulot.

golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #6 le: février 13, 2019, 10:30:50 am »
Merci !
Je peux faire l'héritage, effectivement, c'est plus logique et plus simple à l'avenir.
Normalement, dans la classe Port, cela devrait être transparent, elle appelle déjà les fonctions génériques statiques digitalWrite et analog de la classe Expander.
Par contre, je sèche pour l'émulateur qui redéfinit les méthodes digital et analog.
Je regarde ça ce weekend.

golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #7 le: février 21, 2019, 11:00:26 pm »
Bonjour Thierry,

J'ai fait les modifications avec l'héritage.
J'ai découvert un bogue lié à la façon dont j'ai intégré l'expander.
Pour ne pas avoir d'impact dans les classes héritant de Port, je démultiplexe à chaque appel de la fonction MovePin().
Mais à la différence de la fonction beginPin(), le pin a pu être modifié si c'est un digital pour utiliser la valeur GPIO.
Pour corriger cela, j'ai ajouté un test supplémentaire dans MovePin():
unsigned long inExpander = 0;
if (GPIO_to_Arduino_pin((GPIO_pin_t)inPin) == -1)
inExpander = inPin / 100;
La question que je me pose:
Est-ce que la valeur multiplexée peut être en conflit avec le pin GPIO (ex: 103 ou 515 peut-il être une pin GPIO) ?
Si non, la correction est suffisante.
Si oui, il faut alors modifier les classes héritant de port pour sauvegarder l'expander id et le passer en paramètre de MovePin().
J'ai testé ma mdif sur arduino uno avec des appels à l'expander et aux I/O de la carte.



golgoth1009

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re : Bibliothèque Accessories et Expander SX1509
« Réponse #8 le: février 23, 2019, 12:56:59 pm »
Bonjour,

Une version revisitée où j'ai retiré l'enum ExpanderType.
Il faut faire le begin en static directement sur la classe de l'expander voulue. Pour calquer au mieux à ce que tu fais pour les autres classes
De cette manière, l'ajout d'un nouveau type d'epxander ne devrait pas demander de modif à la classe de base ni à l'enum.
  int error = 0;
  error = PortExpanderSX1509::begin(1, SX1509_ADDRESS );
  if (error == 0)
    Serial.println(F("Expander issue"));