Vous voudriez piloter votre Arduino en tapant des commandes depuis le Moniteur Série ? Pour cela, au lieu de réinventer la roue, utilisez plutôt une bibliothèque comme SerialCommands, simple de fonctionnement et avec une faible empreinte mémoire. Il est en effet assez fréquent d'avoir besoin d'ajuster un ou plusieurs paramètres en fonction d'événements sur votre système embarqué en cours de fonctionnement. Plutôt que de modifier la valeur d'un paramètre codée en dur dans le programme (un seuil, un coefficient P, I ou D de votre régulateur, la vitesse d'un moteur, etc.), compiler et téléverser à nouveau le programme, et recommencer la procédure si nécessaire, modifiez vos paramètres en direct et de façon interactive depuis le Moniteur Série.
Comme démonstration, je prendrais le petit programme de clignotement de LED RGB (pour faire original) ci-dessous. Ma LED RGB (à cathode commune) se mettra simplement à clignoter (fréquence 1 Hz), et quand elle sera allumée, elle sera de couleur magenta (parce que c'est plus joli !)
Supposons que je veuille régler la couleur de ma LED qui clignote, ainsi que sa luminosité. Ces deux paramètres sont dans des variables globales du fichier principal avec des valeurs initiales non satisfaisantes, et qu'il faudra ajuster en cours de fonctionnement :
byte colorOn = Color::magenta; // équivalent à colorOn = Color::red | Color::blueint brightness = 100 ; // luminosité en %
Par exemple avec la commande rgb suivante à saisir dans le Moniteur Série, suivie de 3 ou 4 paramètres : rgb 0 0 0 ==> LED éteinte rgb 1 0 0 ==> rouge rgb 0 1 0 ==> vert rgb 0 0 1 ==> bleu rgb 1 1 0 ==> rouge + vert = jaune rgb 0 1 1 ==> vert + bleu = cyan rgb 1 0 1 ==> rouge + bleu = magenta rgb 1 1 1 ==> rouge + vert + bleu = magenta rgb 1 1 0 50 ==> rouge + vert = jaune, brillance = 50%
Et si vous avez oublié la syntaxe des commandes ou comment fonctionne la synthèse additive des couleurs primaires, la commande help vous fera un rappel.
Tant qu'à faire, l'implémentation de ces commandes série ne doit pas remettre en cause le programme principal, en le modifiant le moins possible.
Le programme principal modifié devient (modifications en rouge) :
En paramètre de chaque commande déclarée, la commande telle qu'elle doit être saisie dans le Moniteur Série et la fonction de rappel associée.
Lorsque le troisième paramètre est à true, on déclare une commande sur une touche (one key). Ici les commandes + et - permettent d'augmenter ou diminuer la luminosité.
Pour ajouter les commandes au gestionnaire, appel depuis le setup() :
#include "ledSerialCommands.h"#include "ledRGB.h"externbyte colorOn;
externint brightness;
char serial_command_buffer_[17];
/* Gestionnaire général pour les commandes série Pour la communication série, l'adresse de l'objet Serial est passée en paramètre Terminaison des commandes \r\n, NewLine et Carriage Return Séparateur entre les paramètres, caractère espace " " */
SerialCommands serial_commands_(&Serial, serial_command_buffer_, sizeof(serial_command_buffer_), "\r\n", " ");
SerialCommand cmd_rgb_("rgb", cmd_rgb);
SerialCommand cmd_brightness_down_("-", cmd_brightness_down, true); // commande "one key"
SerialCommand cmd_brightness_up_("+", cmd_brightness_up, true); // commande "one key"
SerialCommand cmd_help_("help", cmd_help);
// -----------------------------------------------------------------------------void cmd_rgb(SerialCommands* sender){int tab[3], i = 0;
bool error = false;
while(i < 3 && !error){char* parameter_str = sender->Next(); // paramètre suivantif(strcmp(parameter_str, "0") == 0 || strcmp(parameter_str, "1") == 0){
tab[i] = atoi(parameter_str);
i++;
}else{
error = true;
}}if(!error){
colorOn = ((tab[0] == 1) ? Color::red : 0) |
((tab[1] == 1) ? Color::green : 0) |
((tab[2] == 1) ? Color::blue : 0);
char* parameter_str = sender->Next(); // si paramètre supplémentaire, c'est le paramètre de brillanceif(parameter_str != NULL){
brightness = atoi(parameter_str);
}}else{// Si erreur
sender->GetSerial()->println(F("Erreur de syntaxe"));
sender->GetSerial()->println(F("Voir l'aide en tapant la commande [help]"));
}}void cmd_brightness_down(SerialCommands* sender){
brightness -= 5;
if(brightness < 0) brightness = 0;
sender->GetSerial()->print(F("brightness = "));
sender->GetSerial()->println(brightness);
}void cmd_brightness_up(SerialCommands* sender){
brightness += 5;
if(brightness > 100) brightness = 100;
sender->GetSerial()->print(F("brightness = "));
sender->GetSerial()->println(brightness);
}void cmd_help(SerialCommands* sender){
sender->GetSerial()->println(F("Exemples de commandes :"));
sender->GetSerial()->println(F("[rgb 1 0 1] --> rouge + bleu = magenta"));
sender->GetSerial()->println(F("[rgb 1 1 0] --> rouge + vert = jaune"));
sender->GetSerial()->println(F("[rgb 1 1 0 50] --> rouge + vert = jaune, brillance = 50%"));
}void cmd_unrecognized(SerialCommands* sender, constchar* cmd){
sender->GetSerial()->print(F("Commande inconnue ["));
sender->GetSerial()->print(cmd);
sender->GetSerial()->println(F("]"));
}void init_serial_commands(void){/* Ajout des commandes au gestionnaire principal */
serial_commands_.AddCommand(&cmd_rgb_);
serial_commands_.AddCommand(&cmd_brightness_down_);
serial_commands_.AddCommand(&cmd_brightness_up_);
serial_commands_.AddCommand(&cmd_help_);
serial_commands_.SetDefaultHandler(cmd_unrecognized);
}void update_serial_commands(void){
serial_commands_.ReadSerial(); // Appel au gestionnaire de commandes série}
Vous avez lu gratuitement 6 articles depuis plus d'un an. Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Une erreur dans cette actualité ? Signalez-nous-la !