Bonjour,
J'ai un système pantilt avec deux servomoteurs branchés sur une carte Arduino Uno (ils sont actionnés par un joystick) et j'aimerais contrôler la vitesse de rotation de chacun des 2 moteurs avec deux potentiometres. Pouvez-vous m'aider pour modifier mon code ? Les potars seront branchés sur A0 et A1.
Merci pour votre aide !
Code:#include <Servo.h> // librairie pour servomoteur // --- Déclaration des constantes utiles --- const int APPUI=LOW; // constante pour tester état BP //--- Constantes utilisées avec le servomoteur const int ANGLE_MIN=0; // angle position MIN en degrés const int POS_MIN=550; // largeur impulsion pour position ANGLE_MIN degrés du servomoteur // par exemple POS_MIN=600 pour ANGLE_MIN=10° avec un futaba S3003 // ou POS_MIN=550 pour ANGLE_MIN=0 avec un futaba S3003 const int ANGLE_MAX=172; // angle position MAX en degrés int POS_MAX=2400; // largeur impulsion pour position ANGLE_MAX degrés du servomoteur // POS_MAS=2300 pour ANGLE_MIN=170° pour futaba s3003 // ou POS_MAX=2400 pour ANGLE_MAX=172 pour futaba S3003 const int broche_servoPan=6; // Constante pour la broche 8 const int broche_servoTilt=7; // Constante pour la broche 8 // --- Déclaration des constantes des broches analogiques --- const int axe1Joystick=A2; // Constante pour la broche analogique 0 const int axe2Joystick=A3; // Constante pour la broche analogique 1 int potpin = A0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin // --- Déclaration des variables globales --- int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique int positionAxe1=0; // Variable pour acquisition résultat brut de conversion analogique numérique axe 1 Joystick int positionAxe2=0; // Variable pour acquisition résultat brut de conversion analogique numérique axe 2 Joystick int angleServoPan=90; // variable de position du servo Pan en degrés int angleServoTilt=90; // variable de position du servo Tilt en degrés int angleServoPan0=90; // variable de la dernière position du servo Pan en degrés int angleServoTilt0=90; // variable de la dernière position du servo Tilt en degrés // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- //--- Création objet servomoteur Servo mon_servoPan; // crée un objet servo pour contrôler le servomoteur 1 Servo mon_servoTilt; // crée un objet servo pour contrôler le servomoteur 2 // ////////////////////////// 2. FONCTION SETUP = Code d'initialisation ////////////////////////// // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter 1 seule fois au démarrage du programme --- // ------- Initialisation fonctionnalités utilisées ------- //--- Initialisation Servomoteur mon_servoPan.attach(broche_servoPan); // attache l'objet servo à la broche de commande du servomoteur Pan mon_servoTilt.attach(broche_servoTilt); // attache l'objet servo à la broche de commande du servomoteur Tilt // ------- Broches en sorties numériques ------- pinMode (broche_servoPan,OUTPUT); // Broche broche_servoPan configurée en sortie pinMode (broche_servoTilt,OUTPUT); // Broche broche_servoPan configurée en sortie // ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- // Les BP du shield Joystick + BPx2 dispose d'un rappel au plus sur le shield // ------- Initialisation des variables utilisées ------- // ------- Codes d'initialisation utile ------- mon_servoPan.writeMicroseconds(angle(angleServoPan)); // crée impulsion à partir valeur angle - plus précis que write() mon_servoTilt.writeMicroseconds(angle(angleServoTilt)); // crée impulsion à partir valeur angle - plus précis que write() delay(200); } // fin de la fonction setup() // ******************************************************************************** ////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme ////////////////// // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() //----- lecture position Joytstick positionAxe1=analogRead(axe1Joystick); // acquisition conversion analogique numérique sur broche analogique axe 1 positionAxe2=analogRead(axe2Joystick); // acquisition conversion analogique numérique sur broche analogique axe 2 if (positionAxe1>700) { angleServoPan=angleServoPan+1; constrain(angleServoPan,ANGLE_MIN,ANGLE_MAX); } if (positionAxe1<300) { angleServoPan=angleServoPan-1; constrain(angleServoPan,ANGLE_MIN,ANGLE_MAX); } if (positionAxe2>700) { angleServoTilt=angleServoTilt+1; constrain(angleServoTilt,ANGLE_MIN,ANGLE_MAX); } if (positionAxe2<300) { angleServoTilt=angleServoTilt-1; constrain(angleServoTilt,ANGLE_MIN,ANGLE_MAX); } //------------- mise à jour de la position du servomoteur --- if (angleServoPan!=angleServoPan0) { mon_servoPan.writeMicroseconds(angle(angleServoPan)); // crée impulsion à partir valeur angle - plus précis que write() angleServoPan0=angleServoPan; // mémorise dernière valeur angle prise en compte } if (angleServoTilt!=angleServoTilt0) { // si angleServoTilt a changé mon_servoTilt.writeMicroseconds(angle(angleServoTilt)); // crée impulsion à partir valeur angle - plus précis que write() angleServoTilt0=angleServoTilt; // mémorise dernière valeur angle prise en compte } delay(6); // fixe la vitesse de mouvement du servo - entre 2 lecture analogique //while(1); // stop loop } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** // ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS //////////////////// // ////////////////////////// AUTRES FONCTIONS DU PROGRAMME //////////////////// //------------- fonction calibrage impulsion servomoteur à partir valeur angle en degrés int angle(int valeur_angle) { int impuls=0; impuls=map(valeur_angle,ANGLE_MIN,ANGLE_MAX,POS_MIN, POS_MAX); return impuls; } // fin fonction impulsion servomoteur // ////////////////////////// Fin du programme ////////////////////
-----