/* Programme qui permet de piloter un servo à partir d'une commande reçue sur le port Série. Le servo est branché sur la PIN 9. On utilise une librairie de fonctions "Servo" qui permet de simplifier le pilotage d'un servo. Les commandes que l'on peut recevoir du port Série (moniteur série) sont les suivantes : - "R" ou "r" : initialisation (reset) de la position. - "P" ou "p" + position : mise en position (pourcentage) du servo. Auteur : Simon CHOLLET Date : 04/02/2023 */ // Utilisation de la librairie Servo #include // Création de l'objet servo qui sera piloté Servo monServo; // PIN sur laquelle le servo (broche de pilotage) est branché int pinmonServo = 9; // Angle actuel, en degrés, du servo int angle = 0; // Consigne à prendre en compte pour positionner le servo int consigne = 0; // Chaine de caractères reçue sur le port série String receiv = ""; // Fonction d'initialisation (exécutée une seule fois) void setup() { // Indique au servo sur quelle PIN il est piloté monServo.attach(pinmonServo); // Initialisation de la communication série (moniteur série) Serial.begin(9600); } // Fonction exécutée en boucle void loop() { // Reçoit une commande de la part du port série : // => On lit la trame jusqu'à rencontrer la fin de trame, ici // le caractère ASCII 13 = fin de ligne. receiv = Serial.readStringUntil(13); // Nettoyage de la commande reçue : // => On supprime les caractères non significatifs en début et // fin de chaîne (espace, tabulation, retour à la ligne, etc.) receiv.trim(); // Mise en majuscule de la commande : // => ON peut ainsi envoyer des commandes en minuscules ou majuscules // l'analyse de la commande en majuscules sera alors simplifiée receiv.toUpperCase(); // Analyse de la commande reçue : par qupoi elle commence ? if (receiv.startsWith("P")) { // Elle commence par "P" => Extraction de l'argument de la commande. // Exemple : P 90, la chaine de caractères reçue est de la forme : // // Index : 0 | 1 | 2 | 3 | ... // ---------------------------- // Trame : P | | 9 | 0 | // // La procédure d'extraction est donc : // 1- On prend la sous-chaine à partir de l'index 2, jusqu'à la fin de chaine. // 2- On transforme la chaine obtenue en entier. consigne = receiv.substring(2, receiv.length()).toInt(); } else if (receiv.startsWith("R")) { // Elle commence par "R" => Reset de la position du servo consigne = 0; } // Calcul de l'angle du servo, on utilise la fonction "map()" qui permet de // mettre à l'échelle une valeur par rapport à une autre en utilisant des // domaines de variation. // Ici, on a : // consigne : varie de 0 (%) à 100 (%) // angle : varie de 0 (°) à 180 (°) angle = map(consigne, 0, 100, 0, 180); // Positionnement du servo à l'angle demandé monServo.write(angle); }