Go Down

Topic: comment il faut faire pur ralentir et bloque un mini servo dans son mouvement  (Read 2010 times) previous topic - next topic

J-M-L

LOL...

pour l'instant vous n'avez rien fait vous même... vous ne méritez pas la récompense...

essayez ce code modifié (sans la fonction des boutons - on vous laisse explorer ça)

Code: [Select]
#include <Servo.h>

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

const byte rotationPin = 7;
const byte alongeurPin = 8;
const byte pincePin = 9;
const byte longueurPin = 10;

const byte axeY1joy = A1;
const byte axeX1joy = A2;
const byte axeX2joy = A3;
const byte axeY2joy = A4;

const int angleMin = 10, angleMax = 170;

const unsigned int dureeMouvement = 10; // ms

enum : byte  {Rotation, Alongeur, Pince, Longueur};
int positionDuServo[4] = {90, 90, 90, 90}; // degrés. Position au démarrage de chacun des servo
int vitesse[4] = {0, 0, 0, 0}; // moteurs immobiles


int vitesseAssociee(int valJoystick)
{
  if (valJoystick < 200) return -2;
  if (valJoystick < 450) return -1;
  if (valJoystick > 750) return +2;
  if (valJoystick > 550) return +1;
  return 0; // entre 450 et 550
}

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

void setup()
{
  rotation.attach(rotationPin);
  alongeur.attach(alongeurPin);
  pince.attach(pincePin);
  longueur.attach(longueurPin);

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

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

void loop()
{
  static unsigned long chrono = 0;

  if (millis() - chrono >= dureeMouvement) { // est-ce le moment de lire les joystick et de faire bouger les moteurs?

    readJoysticks ();

    for (byte i = 0; i < 4; i++) {
      positionDuServo[i] += vitesse[i];
      positionDuServo[i] = constrain(positionDuServo[i], angleMin, angleMax);
    }

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

    chrono += dureeMouvement;
  }

  // on peut faire autre chose ici

}
(c'est tapé ici donc il se peut qu'il y ait des fautes)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

J-M-L, j'étais arrivé aux mêmes conclusions, voici ce que je propose :

Code: [Select]
#include <Servo.h>

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

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

// les variables
const int minServo = 1100;
const int maxServo = 1900;
const int seuilServo = 15;
const int seuilMin = 511 - seuilServo; // en dessous de cette valeur on bouge
const int seuilMax = 511 + seuilServo; // au dessus de cette valeur on bouge
enum listeServos {Rotation, Alongeur, Pince, Longueur};
unsigned int positionDuServo[4] = {0}; // ms
unsigned int directionServo[4] = {0};
unsigned int amplitude = 20; // us
bool detached = true;

// fonction de lecture des positions des joysticks
void readJoysticks () {
  int lectureJoy[4] = {0};
  lectureJoy[Rotation] = analogRead(axeY1joy);
  lectureJoy[Alongeur] = analogRead(axeX2joy);
  lectureJoy[Pince]    = analogRead(axeY2joy);
  lectureJoy[Longueur] = analogRead(axeX1joy);
  for (byte i = 0; i < 4; i++) {
    if (lectureJoy[i] < seuilMin) directionServo[i] = -1;
    else if (lectureJoy[i] > seuilMax) directionServo[i] = 1;
    else directionServo[i] = 0;
  }
}

// fonction pour attacher les servos
void attachServos () {
  rotation.attach(ServoMoteur1);
  alongeur.attach(ServoMoteur2);
  pince.attach(ServoMoteur3);
  longueur.attach(ServoMoteur4);
}

void setup()
{
  attachServos ();
  detached = false;
  for (byte i = 0; i < 4; i++) positionDuServo[i] = (minServo + maxServo) / 2;

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

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

void loop()
{
  // lecture des directions des joysticks
  readJoysticks ();

  // calcul des positions des servos
  for (byte i = 0; i < 4; i++) {
    positionDuServo[i] += directionServo[i] * amplitude;
    positionDuServo[i] = constrain (positionDuServo[i], minServo, maxServo);
  }

  // déplacement des servos
  rotation.writeMicroseconds(positionDuServo[Rotation]);
  alongeur.writeMicroseconds(positionDuServo[Alongeur]);
  pince.writeMicroseconds(positionDuServo[Pince]);
  longueur.writeMicroseconds(positionDuServo[Longueur]);
  delay (20);
}


Les joysticks ne servent ici qu'à définir une direction pour chaque servo. J'ai fait au plus simple. Par exemple, joystick 1 vers la gauche --> déplacement d'un servo dans un sens (disons servo longueur vers la gauche) et joystick 1 vers la droite --> déplacement de ce servo dans l'autre sens. Joystick 1 vers le haut ou vers le bas, déplacement d'un autre servo vers la droite ou vers la gauche.

Je ne sais as dire quel servo correspond à quel axe de quel joystick, tu verras en essayant.

Si le joystick est relâché, le servo s'arrête et reste en position. S'il arrive en position extrême, il ne va pas au delà.

Les boutons ne servent plus, tu peux les déconnecter.

Je ne sais pas si ça va réellement marcher comme ça, car je ne peux pas le tester chez moi. Teste et dis moi ce qu'il se passe. Si ça va trop lentement, augmente la valeur de amplitude ici
Code: [Select]
unsigned int amplitude = 20; // us

EDIT : deux pour le prix d'un !! :)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

florentw

j ai une idee mais je comprend rien a ton code lesept

si on bloque seulement la rotation et l alongeur et l autre bouton serai pour bloquer la pince c est possible tu peux me faire ca car je comprend pas ton code :o  :o  :o

florentw

ok c est super mais la longueur et la pince ne marche pas

je vous remerci infiniment vous etes de ange vous faite des miracle

lesept

Teste d'abord les codes fournis par J-M-L ou par moi. L'idée est la même : au lieu de dire que les joysticks donnent une position à chaque servo, ils indiquent une direction. Donc lorsque le joystick est en position milieu (relâché) la direction est "nulle" et le servo ne bouge plus. Les servos sont donc bloqués lorsque les joysticks sont relâchés.

Le principale différence entre le code de J-M-L et le mien et que je donne un vitesse de déplacement constante alors que pour lui la vitesse varie si tu pousses le joystick à fond ou pas.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

Si tu as des servos qui ne marchent pas, ça vient sûrement des branchements. Vérifie les câbles.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

florentw

le lien dune nouvelle video:
https://www.youtube.com/watch?v=rG327IYGayQ&t=2s

florentw

si je change les position de cable sur l arduino il faut que je change quoi dans le code


lesept

J'ai vu ta vidéo.
Pas de problème, tu peux me tutoyer :)

Vérifie bien les branchements : ce sont ces lignes
Code: [Select]
// les branchements
const byte ServoMoteur1 = 7;
const byte ServoMoteur2 = 8;
const byte ServoMoteur3 = 9;
const byte ServoMoteur4 = 10;
const byte axeY1joy = A1;
const byte axeX1joy = A2;
const byte axeX2joy = A3;
const byte axeY2joy = A4;


Les servos doivent être sur des pins digitales, les joysticks sur des pins analogiques.

Essaye de changer les pins des servos comme ceci :
Code: [Select]
const byte ServoMoteur1 = 3;
const byte ServoMoteur2 = 5;
const byte ServoMoteur3 = 6;
const byte ServoMoteur4 = 11;
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

Tu n'as pas répondu à la question de J-M-L : comment sont alimentés tes servos ? Où sont connectés les câbles 5V et GND des servos ?
L'Arduino n'est peut-être pas assez fort pour fournir l'énergie aux 4 servos.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

florentw

alimente par mon pc sorry J-M-L

j ai changer comme ca :
const byte ServoMoteur1 = 7;
const byte ServoMoteur2 = 8;
const byte ServoMoteur3 = 6;
const byte ServoMoteur4 = 5;

c est grave sinon je fais comme ta dit

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).


J-M-L

Alimentés comment par le PC

Expliquez bien d'où vient le courant

PC --> USB --> Arduino --> pin 5V --> Servo ?
PC --> USB --> Arduino --> pin Vin --> Servo ?

Autre chose ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up