Bonjour,
Je ne sais pas si vous êtes comme moi mais lors de la mise au point de programmes un peu plus compliqués que le basique, je reflashe pas mal l'Arduino. Par ailleurs, pour configurer une application, valeurs par défaut de variables, configuration en EEPROM, ... c'est assez pénible.
Il m'est donc venu à l'idée d'utiliser une interface ligne de commande qui tournerait sur l'Arduino. Il y en a qui existent mais pas forcément comme je veux. J'ai donc fait la mienne.
L'idée est d'avoir sur l'Arduino une interface en ligne de commande qui gère la communication sur la ligne série, attend des commandes et les exécute. Les commandes sont à coder sous forme de fonction et peuvent avoir des arguments. La bibliothèque gère également un historique de 8 commandes pour ne pas avoir à les retaper et deux commandes internes : hist qui permet d'afficher l'historique des commandes et help qui affiche l'aide. Le tampon d'entrée est de 20 caractères et la saisie au delà de ce tampon est gérée.
Côté logiciel sur le PC/Mac, il faut un logiciel de terminal plus sérieux que celui inclus dans l'IDE Arduino, j'aime beaucoup CoolTerm qui est multiplateforme :
http://freeware.the-meiers.org mais, Guillaume va râler, il n'est pas libre. Sinon il y a minicom et un tas d'autres.
Les paramètres de connexion sont la vitesse qui dépend du Serial.begin() de votre appli, 8 bits de données, pas de parité, 1 bit de stop, pas de contrôle de flot. Comme ceci :
Il faut également ne pas avoir d'écho local et prendre en charge le backspace
La bibliothèque est ici :
https://git.framasoft.org/Koryphon/CommandInterpreter/repository/archive.zip. Une fois décompressée, on obtient un dossier CommandInterpreter.git. Enlever le .git et placer le dossier dans libraries.
J'ai inclus deux exemples : un interpréteur avec 3 commandes pour lire, écrire et avoir la taille de l'EEPROM, un interpréteur pour changer et afficher l'état de la led 13.
En résumé, il faut :
- Instancier un objet de type CommandInterpreter avec comme argument de constructeur la ligne série utilisée
- Instancier un objet de type Command pour chaque commande avec 3 arguments : le nom de la commande, la fonction à appeler, une chaîne d'aide
- écrire pour chaque commande une fonction à appeler. Ces fonctions prennent 2 arguments : une référence vers un CommandInterpreter (ce qui permet de récupérer la ligne série employée et chaque argument), un byte qui est le nombre d'arguments
- dans setup, ajouter les commandes à l'interpréteur via la méthode addCommand
- dans loop, appeler CommandInterpreter::update() pour que l'interaction avec l'utilisateur se fasse
On a alors un moniteur qui fonctionne en « tâche de fond » pourvu qu'il n'y ait aucun appel à des delay longs dans le programme.
Avec les flèches haut / bas, on peut se balader dans l'historique, une fois une entrée de l'historique sélectionnée elle peut bien entendu être éditée. L'historique ne stocke pas une nouvelle commande si la précédente est identique.