2 Servomoteurs + joystick + 2 potentiometres

Salut Jeffrey,

Je viens vers toi car j’ai élaboré un code pour faire fonctionner 2 servomoteurs dirigés par un joystick. Je souhaiterais pouvoir controler la vitesse de rotation des servos à partir de deux potentiomètres mais je n’arrive pas à l’adapter à mon code. J’ai pu voir que cela était possible comme sur cette vidéo youtube.com/watch?v=qWAcJ2ZDcfk où il indique son code mais je n’arrive à l’adapter à mon code.

Merci de ton 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

// — 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 //////////////////// [/code]

Je recommanderais de changer tes lignes +1 et -1 pour utiliser des valeurs proportionnels à l’amplitude du joystick. Dans ce cas, quelque chose comme ceci:

if (positionAxe1>700) {
   int diff = (positionAxe1 - 700) / 20 + 1; // cette valeur va varié entre 1 et 17
   angleServoPan=angleServoPan + diff;
}

Si c’est rendu trop sensible, tu peux changer ta ligne de délai globale pour une valeur plus grande, ex:

   delay(100); // fixe la vitesse de mouvement du servo - entre 2 lecture analogique

Aussi, NB que pour utiliser la fonction “constrain” il faut enregistrer la valeur de retour de la fonction, ex:

   angleServoPan = constrain(angleServoPan,ANGLE_MIN,ANGLE_MAX);

Merci Jeffrey pour ta réponse

Par contre je ne vois comment est intégré le potentiomètre dans ta réponse

Merci

Est-ce que tu veux que la vistesse soit contrôlé par le potentiometer dans le joystick qui est déjà utilisé pour faire bouger les moteurs? Ou est-ce que tu veux utiliser deux autres potentiometres séparés des joysticks pour régler la vitesse?

La réponse que j’ai fourni est pour le premier cas : la vistesse (dans ce cas diff) est calculé en fonction de comment loin l’axe 1 dépasse le seuil de 700…