mercredi 26 novembre 2014

Difficultés avec arduino

Cet été, au moment de faire les tests sur la plage, plus rien ne marchait à un moment du test : impossible de faire fonctionner le programme arduino envoyant les ordres aux moteurs, alors que le code était inchangé et avait marché même au début du test.

Ayant eu un problème, je l'avais simplement rechargé sur la carte arduino et plus rien ne marchait.
Au dernier moment, juste avant d'abandonner, j'avais eu la bonne idée de tester avec la version 1.03 d'arduino que j'utilisais avant au lieu de la 1.05 que j'utilisais depuis quelques jours sur d'autres développements.

Et là, comme par miracle tout s'était mis à remarcher.

Suite à la confrontation à différents bugs sur les versions précédentes, je suis maintenant sur la version 1.6.0.

Et j'essaie simplement de reprendre un code qui a déjà marché... mais là de même plus rien ne marche.

Il est vrai que maintenant un message d'erreur s'affiche pour me signaler que la mémoire dynamique restante est faible et que je pourrais avoir des problèmes de stabilité...

J'ai d'abord ajouté des traces pour identifier l'origine du bug. Assez vite j'ai trouvé qu'il y a avait un problème dans la lecture des String reçus via la communication série. Un peu comme si la mémoire n'était pas allouée/modifiée.
Au fur et à mesure, j'ai essayé d'enlever du code pour arriver à la portion de code minimale levant l'erreur.
J'ai bien trouvé une erreur potentielle avec les dimensions d'un tableau qui était en dur. Mais même après la correction de ce bug potentiel, une erreur restait et qui ne semblait pas déterministe. En enlevant des lignes sans aucun rapport à différents endroits, cela corrige parfois le problème.

J'ai finalement testé sur une carte arduino mega, et là, plus de problème, ce qui montre bien que le problème ne vient pas vraiment du code, ou alors d'une fuite mémoire.

J'ai donc essayé de refaire le code à zéro, pour enlever éventuellement des fonctionnalités, et avoir un code plus léger, mais fonctionnel.

J'ai finalement réussi à trouver que le problème survenait lors de l'ouverture d'une communication avec Software serial.
 SWSerial.begin(9600);

Le problème arrive en rajoutant cette simple ligne dans l'exemple serialEvent. Si les bauds rate sont identiques, rien ne passe, s'ils sont différents, seulement quelques caractères.

Le software serial que j'utilise n'est cependant pas générique "mysoftwareserial" et le problème pourrait venir de là.

Pour rappel, j'ai du utiliser cette version de la bibliothèque modifiée à cause de problème de compatibilité avec les interrupts venant du codeur linéaire, comme expliqué ici.

Je vais essayer de voir s'il est possible de régler le problème. Dans l'immédiat, je devrais de toute manière être capable de faire une démo demain, juste en joystick, ou tout au moins sans boucle fermée sur le border-choquer.

Au passage, cela me permet de noter un problème de gestion de configuration, le code modifié n'étant pas commité. Mais aussi de m'autoféliciter d'avoir aussi bien documenté par ailleurs ;-).

Edit:
Le problème a fini par apparaître avec la librairie Software serial basique également.
En fait le problème vient du fait que la variable NOT_A_PIN était utilisée pour désigner la pin en réception, en mettant par exemple le port 10, plus de problème. Mais ça reste toujours mystérieux pour moi...

Aucun commentaire:

Enregistrer un commentaire