Bonsoir,
J'ai un petit problème sur le robot du boulot : on a un micro-ordinateur muni d'un GPIO (Jetson Xavier AGX, c'est un peu comme une raspberry pi en beaucoup plus puissant), qui communique en I2C avec un arduino et (sur un autre bus I2C) avec un joystick.
Le problème est que les esclaves (arduino et joystick) sont assez loin du maitre (jetson), respectivement 1.5 et 2m. De surcroit, l'environnement est assez bruité (on a de gros moteurs DC dans le robot). Du coup, la communication I2C n'est pas très fiable :
1) Pour la communication avec le joystick, j'ai coté jetson des "crash" de l'I2C ("Resource temporarily unavailable"), mais si je redémarre le programme coté Jetson, il redémarre normalement. Je n'ai pas fais de tests plus en détail, pour l'instant j'ai juste fait un workarround qui fait que le temps de redémarrage ne pose pas de problème
2) Pour la communication entre la Jetson et l'arduino :
2.1) Initialement, aucune communication possible dès qu'on allumait les phares (bruit de 1V sur SDA et SCK) : résolu en rajoutant des condensateurs entre ground et +12V. Impossible de relancer le programme coté Jetson après un crash (crash immédiat).
2.2) Parfois l'Arduino tire SDA à 0V et ne relâche pas le bus : ça vient probablement d'un "bruit" dans le signal I2C qui fait qu'il ne respecte plus le standard. La librairie Wire de l'Arduino gérant très mal les erreurs se retrouve bloquée. Impossible de relancer le programme coté Jetson après un crash (crash immédiat). Un reset de l'Arduinopermet ensuite de relancer le programme coté Jetson
En implémentant un double whatchdog logiciel (basé sur timers) sur l'arduino (reset 10s après le boot si pas de signal I2C, reset 250ms après le dernier signal I2C reçu en l'abscence d'un nouveau signal), on arrive a récupérer d'une partie des erreurs, mais pas toujours.
2.3 Dans l'état actuel des choses, il arrives encore que la communication crash (plus rarement, peut être en moyenne après 10 minutes) lorsque le robot roule : redémarage coté Jeton toujours impossible("Resource temporarily unavailable"). La Jetson reçoit parfois des valeurs erronées (flip d'un bit (nb : vu que la valeur par défaut est 0, j'ai observé que des flip 0->1)).
Donc la communication n'est toujours pas stable, et il arrive encore que l'Arduino (je pense) bloque le bus et ne le libère pas (malgré le reset via jmp 0). Les valeurs éronnées ne sont pas trop graves en soit (il suffit d'ajouter une checksum).
Donc est-ce que vous avez une idée comment on peut facilement communiquer la Jetson avec l'Arduino (via I2C ou autrement) avec une distance de 1.5m en environnement plutôt bruité?
Pour le Joystick (lui même en I2C), vous avez une idée?
Merci d'avance
Sandro
PS : il y aurait bien la possibilité de connecter l'arduino en USB, mais d'après ce que m'a dit un ancien stagière (partit il y a 2 mois), on ne peut pas mettre 2 arduinos de même type sur le même hub USB (et on en a déjà un, et pas d'autre port USB disponible)