La liaison a d'abord été mise en cause avant de découvrir que le problème provenait du blocage d'une fonction de gestion du bus I2C dans le code, fonction appelée durant la séquence d'initialisation. Aucune communication ne pouvait en conséquence avoir lieu.
Après investigation du code source de la librairie 'Wire' fournie avec l'IDE Arduino, il apparaît que celle-ci comporte plusieurs boucles de test de l'état de flags dans les registres de gestion du bus I2C, boucles n'intégrant aucune condition de sortie autre que le changement d'état du flag. Il s'avère qu'un défaut apparu dans mes capteurs I2C conduit à un état dans lequel le drapeau ne sera modifié et donc à une boucle infinie. Encore un code écrit avec l'idée que tout fonction toujours bien. Ce problème a d'ailleurs été relevé il y a quelques années sans que rien n'ait été fait pour le résoudre ce qui est plutôt gênant au regard de l'usage grandissant de l'environnement Arduino dans des plateformes embarquées et/ou mobile...
J'ai repris mon code pour 1-transmettre le message d'information au plus tôt dès l'initialisation de la liaison série, 2-intégrer une copie modifiée de la librairie 'Wire' dans laquelle un time-out est intégré dans chaque boucle et un code d'erreur ad'hoc transmis en cas de problème, 3-afficher l'état du bus I2C au plus tôt.
La modification du code de la librairie 'Wire' a bien permis de résoudre le problème de verrouillage dans une boucle mais l'inspection du reste de son code m'a conduit à devoir rechercher une alternative plus fiable.
La librairie 'Arduino I2C Master' est en cours de test et semble donner toute satisfaction en imposant que très peu de modification dans le code, fournissant même une fonction de recherche de tous les dispositifs I2C présents sur bus.
J'ai ainsi pu programmer rapidement un Arduino Nano comme plateforme de test de mes capteurs I2C confirmant l'existence d'un réel problème de communication avec eux. J'ai rapidement soupçonné que celui pouvait avoir pour origine l'encapsulation du capteur dans de l'araldite, me souvenant à cette occasion avoir déjà rencontré tel problème lié aux contraintes physiques imposées par un constituant trop rigide.
Pour en avoir le cœur net, je me suis attaqué à la désencapsulation des capteurs en tentant d'assouplir l'Araldite voir de la dissoudre sans détruire les deux composants constituant le capteur. Un chauffage dans un bain d'eau bouillante et durant plusieurs minutes permet d'assouplir l'époxy sans toutefois permettre de l'enlever.
Le trempage dans un gel de décapant bois pendant une journée permet de finir le travail en gélifiant l'époxy. J'ai ainsi pu découvrir que certaines des soudures du convertisseur AD7992 avaient lâchées. Ce même composant remonté sur une nouvelle platine fonctionne parfaitement.
J'ai ainsi pu récupérer les deux convertisseurs mais hélas pas les références de tension ADJ160 dont les pattes de fixation étaient trop fragilisées.
Les deux nouvelles platines ont été protégées par plusieurs de couches de vernis de tropicalisation ('conformal coating'), plus souple mais plus facile à enlever en cas de nouveau problème. Les capteurs ont été remontés dans le positionneur lequel va être remis en situation ce week-end avec un code embarqué bien plus robuste.
Aucun commentaire:
Enregistrer un commentaire