bras robotique 2

bonjour
j’essaie de faire fonctionner un bras robotique cependant cela ne marche pas voici mon programme
(cf photos)
je me sers d’un joystick munit de potentiomètre la zone entre 400 et 700 est la zone morte
le but est de pouvoir arrêter le bras dans la position ou il est quand je lâche le joystick et que celui ci revient en position zone morte
merci d’avance

ps: actuellement le bras ne s’arrête pas, il monte ou descend sans s’arrêter

voici le programme
int analogPin2 = A2; // potentiomètre joystick
int Potcoude = A0; // potentiomètre bras
int vitesse = 0;
int Z = 0;
int Potvaluecoude=0;
int potValue2 = 0;

void setup() {
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(11, OUTPUT);
pinMode(analogPin2, INPUT);
pinMode (Potcoude, INPUT);
}

void loop()
{
analogRead(analogPin2);
potValue2 = analogRead(analogPin2);

while(700>analogPin2>400)
{
Potvaluecoude = analogRead(Potcoude);
Z = Potvaluecoude;
Potvaluecoude = analogRead(Potcoude);

while(Potvaluecoude-Z<0)
{
// moteur tourne sens horaire
digitalWrite(8, HIGH);
digitalWrite(11, LOW);
vitesse= 255-(0.5potValue2);
analogWrite(9,vitesse);
}
while(Potvaluecoude-Z>0)
{
// moteur tourne sens trigonométrique
digitalWrite(11, HIGH);
digitalWrite(8, LOW);
vitesse= (0.5
potValue2) -255;
analogWrite(9,vitesse);
}
}

// programme pour bouger le bras
if(potValue2>700)
{ // potentiommètre joystick
digitalWrite(8, HIGH);
digitalWrite(11, LOW);
vitesse= 255-(0.5potValue2);
analogWrite(9,vitesse);
}
else if(potValue2<400) // potentiommètre joystick
{
digitalWrite(11, HIGH);
digitalWrite(8, LOW);
vitesse= 0.5
potValue2 -255;
analogWrite(9,vitesse);
}
}

il y a une photo du bras comme image

http://forum.arduino.cc/index.php?topic=315372.0

sa ne m'aide pas

Oui mais nous ça nous aidera à lire ton code qui sera correctement formaté.

Çà ne serte a rien d’ouvrir plusieurs sujet !!!!!!!!!!!!!!!!!

CODE ENTRE BALISE !!!!!!!!!!!!!!!!

Donne plus d'info !!!!!!!!!!!!!!!!!!!!!!!!

bonjour

plusieurs remarques pour commencer un peu plus d'explications sur ton code pourrait être utile. notament remplacer tes noms de variables (genre "z" par quelque chose de plus parlant ==> je n'ai pas compris ce qu'est Z) n'hésite pas a commenter ton code en utilisant // ou /........../ (pour toi même quand tu te relira dans quelques années mais aussi pour les autres qui ne connaissent pas ton projet ou qui le découvrent.

ensuite, je ne comprends pas trop le but recherché, mais il me semble que tu es mal partit, pour ce genre de projet, un peu de cinématique inverse serait vraiment bien.

regarde ici https://www.circuitsathome.com/mcu/programming/robotic-arm-inverse-kinematics-on-arduino

et la http://blog.oscarliang.net/inverse-kinematics-and-trigonometry-basics/

int analogPin2 = A2; // potentiomètre joystick, ce que me donne le potentiomètre du joystick
int Potcoude = A0; // potentiomètre bras, ce que me donne le potentiomètre du bras
int vitesse = 0;
int Z = 0;
int Potvaluecoude=0;
int potValue2 = 0;

void setup() {
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(11, OUTPUT);
pinMode(analogPin2, INPUT);
pinMode (Potcoude, INPUT);
}

void loop()
{
analogRead(analogPin2);
potValue2 = analogRead(analogPin2); // je donne un nom pour avoir des valeurs mais je
pourrais m’en passer

while(700>analogPin2>400) // correspond au point mort de mon joystick
{
Potvaluecoude = analogRead(Potcoude); // je lis ce que me donne le
potentiomètre du bras
Z = Potvaluecoude; // je la mémorise sous une lettre
Potvaluecoude = analogRead(Potcoude); // je relis la valeur du potentiomètre du
bras

while(Potvaluecoude-Z<0) // je veux que le bras reste immobile donc
si la valeur est inférieur a 0 alors il fait sa
{
// moteur tourne sens horaire
digitalWrite(8, HIGH);
digitalWrite(11, LOW);
vitesse= 255-(0.5potValue2);
analogWrite(9,vitesse);
}
while(Potvaluecoude-Z>0) // même chose mais s’il est supérieur a 0
{
// moteur tourne sens trigonométrique
digitalWrite(11, HIGH);
digitalWrite(8, LOW);
vitesse= (0.5
potValue2) -255;
analogWrite(9,vitesse);
}
}

// programme pour bouger le bras
if(potValue2>700)
{ // potentiomètre joystick
digitalWrite(8, HIGH);
digitalWrite(11, LOW);
vitesse= 255-(0.5potValue2);
analogWrite(9,vitesse);
}
else if(potValue2<400) // potentiomètre joystick
{
digitalWrite(11, HIGH);
digitalWrite(8, LOW);
vitesse= 0.5
potValue2 -255;
analogWrite(9,vitesse);
}
}

CODE ENTRE BALISE !!!!!!!!!!

hello
d’après ta description, je suppose que ton moteur se déplace bien dans le bon sens selon ta manip sur le potentiomètre du joystick . et qu’à l’arrêt ton moteur “dérive”.
est ce bien cela ? si oui :

tu surveilles cette dérive en lisant le potar_coude deux fois puis en comparant les deux valeurs (via une mémorisation en Z).
le problème que tu rencontre pourrais etre du au fait que tu lis trop vite les deux valeurs . si bien qu’elles n’ont pas le temps d’etre différentes.
j’ai commencé à revoir ton code et tes commentaires. fais déjà un test avec le “delay(100)” que j’ai ajouté dans ta surveillance. sans hésiter à changer la valeur, en fonction de la vitesse de la dérive.

pour le reste du code ( calcul de la consigne…c’est à voir)
la moitié du potar joystick + ou - 255 tu obtiens une valeur positive ou négative ( en analogwrite ?)
de plus le potar joystick peut avoir de 400 à 700 ???

j’en arrive à me demander si ton bras t’obéis bien en déplacement ou s’il dérive dès la mise sous tension
le code revu pour la surveillance de la dérive

int potar_joystick = A2; // potentiomètre joystick, ce que me donne le potentiomètre du joystick
int potar_coude = A0; // potentiomètre bras, ce que me donne le potentiomètre du bras
int vitesse = 0;
int memo_position_coude = 0;
int valeur_potar_coude = 0;
int valeur_potar_joystick = 0;


void setup() 
{
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(potar_joystick, INPUT);
  pinMode (potar_coude, INPUT);
}

void loop()
{
  analogRead(potar_joystick);
  valeur_potar_joystick = analogRead(potar_joystick);      // lecture du potar joystick
 
 
 /*
 si la consigne du potar joystick est nulle ( entre 400 et 700):
 on surveille le bras ( par son potar coude) pour constater une derive eventuelle.
 on lit deux fois de suite à xxx millisecondes d'interval pour voir s'il y a une difference 
 entre les deux mesures.
 */
  while(700>potar_joystick>400)                           // correspond au point mort du potar joystick
  {
  valeur_potar_coude = analogRead(potar_coude);           // je lis ce que me donne lepotentiomètre du bras
  memo_position_coude = valeur_potar_coude;                                 // je la mémorise sous une lettre
  delay(100);                                             // delai pour qu'une dérive eventuelle soit significative
  valeur_potar_coude = analogRead(potar_coude);           // je relis la valeur du potentiomètre dubras

/*
si la valeur est inférieure a 0 alors il y à une dérive en sens trigonometrique
on compense entre demandant une rotation horaire
*/
  while(valeur_potar_coude-memo_position_coude<0)         
  {
  digitalWrite(8, HIGH);                                  // moteur tourne sens horaire
  digitalWrite(11, LOW);                                  // moteur tourne sens horaire
  vitesse= 255-(0.5*valeur_potar_joystick);
  analogWrite(9,vitesse);
}
/*
si la valeur est supérieure a 0 alors il y à une dérive en sens horaire
on compense entre demandant une rotation trigonometrique
*/
  while(valeur_potar_coude-memo_position_coude>0)                       // même chose mais s'il est supérieur a 0
  {
    // moteur tourne sens trigonométrique
    digitalWrite(11, HIGH);
    digitalWrite(8, LOW);
    vitesse = (0.5 * valeur_potar_joystick) - 255;
    analogWrite(9, vitesse);
  }
}

// programme pour bouger le bras
if (valeur_potar_joystick > 700)
{ // potentiomètre joystick
  digitalWrite(8, HIGH);
  digitalWrite(11, LOW);
  vitesse = 255 - (0.5 * valeur_potar_joystick);
  analogWrite(9, vitesse);
}
else if (valeur_potar_joystick < 400) // potentiomètre joystick
{
  digitalWrite(11, HIGH);
  digitalWrite(8, LOW);
  vitesse = 0.5 * valeur_potar_joystick - 255;
  analogWrite(9, vitesse);
}
}

premièrement c'est normal que les valeur soit identique car si le bras tombe cela signifie que ce n'est plus égale a 0 et donc le moteur se met en route et il s'arrête dès que l'opération est de nouveau égale a 0 je vais essayer ce programme

fred1456: regarde ici https://www.circuitsathome.com/mcu/programming/robotic-arm-inverse-kinematics-on-arduino

et la http://blog.oscarliang.net/inverse-kinematics-and-trigonometry-basics/

les deux sites sont bien mais trop complexe vu le temps qu'il me reste. la cinématique appliquer était une bonne idée mais trop long a appliquer merci

tu ne m'as pas répondu sur le fonctionnement de ton programme à l'irigine. le robot fait ce que tu lui demandes ou pas ?

je viens d'essayer le programme le problème n'est pas régler d'une part et d'autre part j'actionne mon joystick et quand je lache le joystick (il vient au point mort) le bras continu l'action qu'il vient de faire. c'est à dire s'il montait, il continu de monter et vice versa

dfgh: tu ne m'as pas répondu sur le fonctionnement de ton programme à l'irigine. le robot fait ce que tu lui demandes ou pas ?

oui sans le point mort oui il fait ce que je lui ordonne

es tu sur du sens de correction de la dérive ?
de plus dans ta correction de la dérive, tu ne réactualises pas la lecture du potar_coude.
donc tu compares toujours les deux valeurs de départ…
corriges avec ça, fais la meme modif pour la correction sens trigo
et regarde ce que ça donne
while(valeur_potar_coude-memo_position_coude<0)
{
digitalWrite(8, HIGH); // moteur tourne sens horaire
digitalWrite(11, LOW); // moteur tourne sens horaire
vitesse= 255-(0.5*valeur_potar_joystick);
analogWrite(9,vitesse);
valeur_potar_coude = analogRead(potar_coude); // je lis ce que me donne lepotentiomètre du bras
}

ou je suis sur du sens de ma dérive et le programme ne fonctionne pas encore lorsque j'actionne le joystick et que je le lache le bras continu le mouvement amorcé

testes ça ( il faut passer sur le moniteur en 57600) on contrôle simplement les valeurs lorsque le joystick est au repos si ca defile trop vite sur l'écran, mets carrément 3000 en delai

int potar_joystick = A2; // potentiomètre joystick, ce que me donne le potentiomètre du joystick
int potar_coude = A0; // potentiomètre bras, ce que me donne le potentiomètre du bras
int vitesse = 0;
int memo_position_coude = 0;
int valeur_potar_coude = 0;
int valeur_potar_joystick = 0;


void setup()
{
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(potar_joystick, INPUT);
  pinMode (potar_coude, INPUT);
  Serial.begin(57600); // vitesse de communication
}

void loop()
{
  analogRead(potar_joystick);
  valeur_potar_joystick = analogRead(potar_joystick);      // lecture du potar joystick

    Serial.print("valeur du joystick  au depart de la boucle loop ");
    Serial.println(valeur_potar_joystick);
  /*
  si la consigne du potar joystick est nulle ( entre 400 et 700):
  on surveille le bras ( par son potar coude) pour constater une derive eventuelle.
  on lit deux fois de suite à xxx millisecondes d'interval pour voir s'il y a une difference
  entre les deux mesures.
  */
  while (700 > potar_joystick > 400)                      // correspond au point mort du potar joystick
  {
    Serial.println("joystick au point mort");
    Serial.print("valeur du joystick ");
    Serial.println(valeur_potar_joystick);
    valeur_potar_coude = analogRead(potar_coude);           // je lis ce que me donne lepotentiomètre du bras
    memo_position_coude = valeur_potar_coude;                                 // je la mémorise sous une lettre
    delay(100);                                             // delai pour qu'une dérive eventuelle soit significative
    valeur_potar_coude = analogRead(potar_coude);           // je relis la valeur du potentiomètre dubras
    Serial.print("memo_position_coude = ");
    Serial.println(memo_position_coude);
    Serial.print("valeur_potar_coude =  ");
    Serial.println(valeur_potar_coude );
   }
  }

j’ai mis des serial print dans toutes les boucles. avec ça, tu peux voir sur le moniteur ce qui se passe et surtout vérifier les valeurs des potars et des consignes.
cela va t’aider à comprendre ce qui plante
nota: je ne comprends toujours pas comment tu calcules cette consigne de vitesse dans la compensation de la dérive avec une valeur de potard de joystick qui peux varier de 400 à 700

int potar_joystick = A2; // potentiomètre joystick, ce que me donne le potentiomètre du joystick
int potar_coude = A0; // potentiomètre bras, ce que me donne le potentiomètre du bras
int vitesse = 0;
int memo_position_coude = 0;
int valeur_potar_coude = 0;
int valeur_potar_joystick = 0;


void setup()
{
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(potar_joystick, INPUT);
  pinMode (potar_coude, INPUT);
  Serial.begin(57600); // vitesse de communication
}

void loop()
{
  analogRead(potar_joystick);
  valeur_potar_joystick = analogRead(potar_joystick);      // lecture du potar joystick

      Serial.print("valeur du potar joystick  au depart de la boucle loop ");
      Serial.println(valeur_potar_joystick);
  /*
  si la consigne du potar joystick est nulle ( entre 400 et 700):
  on surveille le bras ( par son potar coude) pour constater une derive eventuelle.
  on lit deux fois de suite à xxx millisecondes d'interval pour voir s'il y a une difference
  entre les deux mesures.
  */
  while (700 > potar_joystick > 400)                      // correspond au point mort du potar joystick
  {
      Serial.println("joystick au point mort");
      Serial.print("valeur du potar joystick ");
      Serial.println(valeur_potar_joystick);
    valeur_potar_coude = analogRead(potar_coude);           // je lis ce que me donne lepotentiomètre du bras
    memo_position_coude = valeur_potar_coude;                                 // je la mémorise sous une lettre
    delay(100);                                             // delai pour qu'une dérive eventuelle soit significative
    valeur_potar_coude = analogRead(potar_coude);           // je relis la valeur du potentiomètre dubras
      Serial.print("memo_position_coude = ");
      Serial.println(memo_position_coude);
      Serial.print("valeur_potar_coude =  ");
      Serial.println(valeur_potar_coude);
  
   /*
    si la valeur est inférieure a 0 alors il y à une dérive en sens trigonometrique
    on compense entre demandant une rotation horaire
    */
    if (valeur_potar_coude - memo_position_coude < 0)
    {
        Serial.println("derive sens trigo");
        Serial.print("memo_position_coude = ");
        Serial.println(memo_position_coude);
        Serial.print("valeur_potar_coude =  ");
        Serial.println(valeur_potar_coude);
      digitalWrite(8, HIGH);                                  // moteur tourne sens horaire
      digitalWrite(11, LOW);                                  // moteur tourne sens horaire
      vitesse = 255 - (0.5 * valeur_potar_joystick);
      analogWrite(9, vitesse);
        Serial.print("vitesse sens horaire = ");
        Serial.println(memo_position_coude);
      valeur_potar_coude = analogRead(potar_coude);           // je lis ce que me donne lepotentiomètre du bras
    }
    /*
    si la valeur est supérieure a 0 alors il y à une dérive en sens horaire
    on compense entre demandant une rotation trigonometrique
    */
    if (valeur_potar_coude - memo_position_coude > 0)     // même chose mais s'il est supérieur a 0
    {
        Serial.println("derive sens horaire");
        Serial.print("memo_position_coude = ");
        Serial.println(memo_position_coude);
        Serial.print("valeur_potar_coude =  ");
        Serial.println(valeur_potar_coude);
      digitalWrite(11, HIGH);                                // moteur tourne sens trigonométrique
      digitalWrite(8, LOW);                                  // moteur tourne sens trigonométrique
      vitesse = (0.5 * valeur_potar_joystick) - 255;
      analogWrite(9, vitesse);
        Serial.print("vitesse sens trigonometrique = ");
        Serial.println(memo_position_coude);
      valeur_potar_coude = analogRead(potar_coude);          // je lis ce que me donne lepotentiomètre du bras
    }
  }

//le joystick, n'est pas au point mort

  // programme pour bouger le bras
  if (valeur_potar_joystick > 700)
  {
      Serial.println("rotation demandee au joystick en sens horaire");
      Serial.print("valeur du potar joystick ");
      Serial.println(valeur_potar_joystick);
      Serial.print("valeur_potar_coude =  ");
      Serial.println(valeur_potar_coude);
    digitalWrite(8, HIGH);
    digitalWrite(11, LOW);
    vitesse = 255 - (0.5 * valeur_potar_joystick);
    analogWrite(9, vitesse);
      Serial.print("vitesse sens horaire = ");
      Serial.println(memo_position_coude);
  }
  else if (valeur_potar_joystick < 400)
  {
      Serial.println("rotation demandee au joystick en sens trigonometrique");
      Serial.print("valeur du potar joystick ");
      Serial.println(valeur_potar_joystick);
      Serial.print("valeur_potar_coude =  ");
      Serial.println(valeur_potar_coude);
    digitalWrite(11, HIGH);
    digitalWrite(8, LOW);
    vitesse = 0.5 * valeur_potar_joystick - 255;
    analogWrite(9, vitesse);
      Serial.print("vitesse sens trigonometrique = ");
      Serial.println(memo_position_coude);
  }
}

Il me semble que while (700 > potar_joystick > 400) Correspond à : while ((700 > potar_joystick) > 400) Soit : while (0)

Ça devrait fonctionner avec while ((700 > potar_joystick) && (potar_joystick > 400)

he oui, bien vu. l'avoir sous les yeux et ne pas le voir...