comment il faut faire pur ralentir et bloque un mini servo dans son mouvement

bonjour, :slight_smile:

je n arrive pas bloquer et a ralentir mes mini cerveau
j ai construit et coder un bras robot mais je voudrais a l aide du bouton que l on retrouve dans le joysticke bloquer le mini cerveau pendant son mouvement

j ai super bien chercher mais pas trouver de reponse voici mon code

#include <Servo.h>

Servo rotation;
Servo alongeur;
Servo pince;
Servo longueur;

const char AN_POTENTIOMETRE = 0;
const char ServoMoteur1 = 7;
const char ServoMoteur2 = 8;
const char ServoMoteur3 = 9;
const char ServoMoteur4 = 10;
const char axeY1joy = A1;
const char axeX1joy = A2;
const char axeX2joy = A3;
const char axeY2joy = A4;


unsigned int positionDuServo = 0;
unsigned int valeurX1joy = 0;
unsigned int valeurY1joy = 0;
unsigned int valeurX2joy = 0;
unsigned int valeurY2joy = 0;

void setup()
{
rotation.attach(7);
alongeur.attach(8);
pince.attach(9);
longueur.attach(10);
rotation.write(axeY1joy);
longueur.write(axeX1joy);
alongeur.write(axeX2joy);
pince.write(axeY2joy);
}

void loop()
{

valeurY1joy = analogRead(axeY1joy);
positionDuServo = analogRead(AN_POTENTIOMETRE);
positionDuServo = map(positionDuServo, 0, 1023, 0, 180);
rotation.write(positionDuServo);
{
  valeurX2joy = analogRead(axeX2joy);
  positionDuServo = analogRead(AN_POTENTIOMETRE);
  positionDuServo = map(positionDuServo, 0, 1023, 0, 180);
  alongeur.write(positionDuServo);
  {
    valeurY2joy = analogRead(axeY2joy);
    positionDuServo = analogRead(AN_POTENTIOMETRE);
    positionDuServo = map(positionDuServo, 0, 1023, 0, 180);
    pince.write(positionDuServo);
    {
    valeurX1joy = analogRead(axeX1joy);
    positionDuServo = analogRead(AN_POTENTIOMETRE);
    positionDuServo = map(positionDuServo, 0, 1023, 0, 180);
    longueur.write(positionDuServo);
    }
  }
  }
}

ps : si vous avez deja vus ce message c est volontaire car je ne c est comment retrouver mes post sur le forum si vous pouvez m aider sur ce poins se serai super :slight_smile: :slight_smile:

un super gros merci d avance pour votre aide

un débutant en la matiere ( excuser moi aussi pour les fautes d orthographe)

Edit de jfs : mise en forme du code entre les balises code...

Florent : c'est ta photo qu'on voit pour ton avatar ? Si oui, bravo, c'est bien de s'intéresser à la programmation et aux microcontrôleurs si jeune !

En attendant, tu auras plus de chance d'avoir des réponses si :

  • tu postes tes messages dans la bonne section
  • tu les Ă©crits en respectant la charte : tu la trouveras dans les messages Ă©pinglĂ©s en haut du forum français

Demande au modérateur de déplacer ton message (en cliquant sur le bouton "Report to moderator" en dessous du message). Merci

merci de m encourager

mais dans que section faux t il le mettre

Clique sur le lien de mon message, tu verras.
Le plus propre serait de faire déplacer le message par le modo...

va voir t a messagerie je t ai envoyer un message

Message déplacé dans la bonne rubrique

le message a ete deplacer ou ?

bonsoir....
le message a été déplacé vers .....l'endroit indiqué dans la règle n°1 d'utilisation du forum .
pour ce qui est du code , la bonne balise peut être insérée en utilisant l'icône </> à gauche dans le menu de l'éditeur
le bloc qui est créé facilite la lecture du code et sa copie éventuelle dans l'éditeur d'Arduino..... en conséquences plus de réponses....

içi un exemple de bloc de code...

Prends le temps de bien te renseigner sur le fonctionnement de ce forum.

Florent, pour qu'on puisse t'aider, il faut que tu nous donnes plus de détails.
Ton joystick ressemble à quoi ? As tu une référence, un lien internet ou une photo, pour qu'on voie à quoi il ressemble ?

Les quatre instructions write dans ton setup me semblent bizarres. Les axes comme 'axeY1joy' semblent se référer à des pins analogiques, mais ces commandes write devraient lire ces pins analogiques.

Tu définis des blocs entre accolades {} mais ce n'est pas nécessaire, tu peux les ôter. Les accolades servent surtout à définir des blocs d'instructions pour des fonctions, des if ou des while.

Pour ta question sur le blocage des servos, je ne my connais pas suffisamment pour te répondre, il faut que tu cherches des tutos ou que tu regardes dans les exemples de la bibliothèque que tu utilises.

bonjour,

je ne sais comment modifier le commentaire le lien du une une photo: https://www.amazon.com/Joystick-Module-Arduino-Atomic-Market/dp/B00WH89RTS ( c est sur amazone )

pour les commande write c est des référence que j ai crée c est des commande que je retiens facilement ca veut dire comme j ai 2 joysticke axe Y sur le Joystick 1 diminutif de 1joy

voila merci encore pour t on aide tres presieuse j ai beaucoup avancer grâce vous ,vous un ange

bonsoir

même si c'est en anglais , il y a un schémas de câblage qui tien compte du pull up

http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-ps2-joystick-tutorial-keyes-ky-023-deek-robot/

si tu a un multimètre tu peu vérifier a vide (pas alimenté) la continuité (mode diode) , en appuyant
si la liaison se fait avec le + ou le moins ( pull up ou pull down )

en effet il y a de forte chances que ce soit le mĂŞme module.

je suis peut ĂŞtre bĂŞte mais je ne comprend pas en quoi cela peut m aider si ce site et bien vous pouvez m expliquer s'il vous plait

sinon un super grand merci pou tous l aide que vous me fournissais je suis stupéfait

merci:)

Non, tu n'es pas bête, tu débutes : c'est normal on y est tous passé !
La différence, c'est qu'étant plus âgés, on a eu des cours d'électronique ou de physique et de maths qui nous aident maintenant.
Tu apprendras, prends le temps qu'il faut : tu trouveras toujours quelqu'un pour t'aider sur le forum. La première chose à apprendre c'est à bien décrire tes problèmes, c'est pourquoi on t'a demandé de lire certains messages (voir les réponses #1 et #7 de ce fil de discussion). Lis les bien, ça t'aidera et nous aussi...

Pour ton joystick et son bouton : j'ai utilisé ce genre de joystick pour un jeu que j'ai posté ici. Tu peux télécharger le programme qui s'appelle Snake2j.ino, et le regarder. Je ne sais pas si ça t'aidera car il y a beaucoup de choses qui ne concernent pas les joysticks...

J'ai commencé par déclarer les joysticks (il y en a 2, je n'en mets qu'un seul ici):

// Joysticks
// Joueur 1
byte xJoy = A1;
byte yJoy = A0;
const byte Bouton_1 = 2;

Les fils du joystick sont connectés aux entrées analogiques A0 et A1, et le bouton sur l'entrée digitale 2.

Dans le setup, je déclare les entrées des joysticks, du bouton et une fonction (appelée interruption) qui est lancée lors de l'appui sur le bouton :

  // Déclaration des joysticks
  pinMode (xJoy, INPUT);
  pinMode (yJoy, INPUT);

  // Déclaration des boutons & interruptions
  pinMode(Bouton_1, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(Bouton_1), Tir1, FALLING);

Je ne sais pas si tu devras faire ça, moi c'était pour déclencher un tir donc ça devait être rapide c'est pourquoi j'ai fait comme ça.

Si tu ne veux pas faire comme ça, il faut que tu t'inspires de ce tutoriel. Bonne lecture et bon courage !

merci ça ma beaucoup aider ,

mais quelque' un aurait un code pou ralentire mini cerveau car mon pere me dit que ca va trop vite sans rien comprendre au montage et codage

merci

Je m'y connais peu en servo, j'en ai très peu utilisé.

Il n'y a pas de code magique pour faire ça, il faut que tu adaptes le tien.

Tu trouveras de la documentation ici : il indique

Pour obtenir un mouvement lent, il faut faire varier l’angle du servo progressivement. Pour cela, il faut changer l’angle très très peu et le faire plus souvent. Fixons par exemple un changement d’angle de 1°. Si l’on veut que le mouvement, passer de 70° à 110° soit accompli en 1s, il faut augmenter l’angle de 1° toutes les 1000ms / (110 - 70). soit une pause de 25ms.

Il y a un exemple de code pour faire varier l'angle de 70° à 110° en une seconde : ça donne un mouvement saccadé. Il dit ensuite :

Le mouvement est bien lent comme on le désire mais avec une variation de l’angle par degré, le mouvement est un peu saccadé. Une autre méthode permet un positionnement plus précis. Il s’agit de la méthode writeMicroseconds(...). L’argument de cette méthode n’est plus un angle mais la durée de l’impulsion de commande du servo-moteur en micro-secondes. En effet, le signal de commande du servo-moteur est une impulsion dont la largeur détermine la position du servo.

Florent, j'ai essayé de travailler un peu sur ton projet. Ce n'est pas forcément simple et je ne sais pas si la solution que j'ai prise va fonctionner comme tu le souhaites.

J'ai d'abord essayé de définir des tableaux pour ne pas faire toujours 4 fois les mêmes choses.
Ensuite, j'ai utilisé la fonction enum pour attribuer des numéros de 0 à 3 aux 4 servos, afin que ce soit plus facile à lire dans le code.
Enfin, je me suis inspiré de l'exemple dont je t'ai parlé dans le message précédent pour faire ralentir les servos.

Voici ce que j'obtiens : ça compile mais je ne peux pas le tester car je n'ai pas le matériel, donc je ne sais pas si ça fonctionnera comme tu veux.

#include <Servo.h>

Servo rotation;
Servo alongeur;
Servo pince;
Servo longueur;

const byte ServoMoteur1 = 7;
const byte ServoMoteur2 = 8;
const byte ServoMoteur3 = 9;
const byte ServoMoteur4 = 10;
#define axeY1joy A1
#define axeX1joy A2
#define axeX2joy A3
#define axeY2joy A4

enum listeServos {Rotation, Alongeur, Pince, Longueur};
unsigned int positionDuServo[4] = {0}; // degrés
unsigned int positionDuServoOld[4] = {0};
unsigned int valeursJoy[4] = {0};
int vitesse[4] = {0}; // -1, 0 ou 1
unsigned int dureeMouvement = 20; // ms


void readJoysticks () {
  valeursJoy[Rotation] = analogRead(axeY1joy);
  valeursJoy[Alongeur] = analogRead(axeX2joy);
  valeursJoy[Pince]    = analogRead(axeY2joy);
  valeursJoy[Longueur] = analogRead(axeX1joy);
}

void setup()
{
  rotation.attach(ServoMoteur1);
  alongeur.attach(ServoMoteur2);
  pince.attach(ServoMoteur3);
  longueur.attach(ServoMoteur4);

  readJoysticks ();
  for (byte i = 0; i < 4; i++) positionDuServoOld[i] = map(valeursJoy[i], 0, 1023, 0, 180);

  rotation.write(positionDuServoOld[Rotation]);
  longueur.write(positionDuServoOld[Longueur]);
  alongeur.write(positionDuServoOld[Alongeur]);
  pince.write(positionDuServoOld[Pince]);

  delay(3000); // pour laisser les servos atteindre leurs positions
}

void loop()
{

  readJoysticks ();

  for (byte i = 0; i < 4; i++) {
    positionDuServo[i] = map(valeursJoy[i], 0, 1023, 0, 180);
    if (positionDuServo[i] > positionDuServoOld[i]) vitesse[i] = 1;
    else if (positionDuServo[i] < positionDuServoOld[i]) vitesse[i] = -1;
    else vitesse[i] = 0;
    positionDuServoOld[i] += vitesse[i];
  }

  rotation.writeMicroseconds(positionDuServoOld[Rotation]);
  alongeur.writeMicroseconds(positionDuServoOld[Alongeur]);
  pince.writeMicroseconds(positionDuServoOld[Pince]);
  longueur.writeMicroseconds(positionDuServoOld[Longueur]);
  delay (dureeMouvement);

}

Il y a des paramètres :

  • Pour ralentir le mouvement tu augmentes la valeur de dureeMouvement et tu la diminues pour accĂ©lĂ©rer
  • La correspondance entre les axes de tes joysticks et les servos se fait dans le fonction readJoysticks : si elle n'est pas bonne, tu peux la modifier.

Le programme commence par positionner les servos à leurs positions initiales, définies par les joysticks (a priori les positions milieu, ça peut se changer si tu veux définir toi-même des positions initiales) : il attend 3 secondes avant de lire les joysticks, pour laisser le temps aux servos d'aller à ces positions. Il ne se passera rien si tu bouges les joysticks pendant ces 3 secondes.

Teste et dis-moi si ça convient...

Normalement, un servo ne cesse pas de "vibrer" lorsqu'il est Ă  une position fixe. Si tu ne veux pas que cela arrive, tu peux essayer de remplacer les lignes

  rotation.writeMicroseconds(positionDuServoOld[Rotation]);
  alongeur.writeMicroseconds(positionDuServoOld[Alongeur]);
  pince.writeMicroseconds(positionDuServoOld[Pince]);
  longueur.writeMicroseconds(positionDuServoOld[Longueur]);

par

  if (vitesse[Rotation] != 0) rotation.writeMicroseconds(positionDuServoOld[Rotation]);
  if (vitesse[Alongeur] != 0) alongeur.writeMicroseconds(positionDuServoOld[Alongeur]);
  if (vitesse[Pince]    != 0) pince.writeMicroseconds(positionDuServoOld[Pince]);
  if (vitesse[Longueur] != 0) longueur.writeMicroseconds(positionDuServoOld[Longueur]);

Si ça ne marche pas, il faudra ajouter des detach() dans le code

ok c est ce que mon pere a trouver mais ce n ai pas avec les joysticks merci quand meme :slight_smile:

j a trouver ca mais je comprent rien quelqu un peut m aider controle vitesse servomoteur

Teste déjà le code que je t'ai proposé dans le dernier message

bonjours

je toujours pas commet faire a l aide :wink: :slight_smile: :slight_smile: :slight_smile:

hello

ça sert à quoi que le sept se décarcasse!

voir sa réponse en #17

vu le temps qu'il te consacre, tu pourrais au moins faire ce qu'il te demande et lui apporter des réponses.