Arduino PS2

Bonjour,

Je souhaite fabriquer un Bras AL5A de chez lynxmotion contrôlé par une manette de ps2 grâce à un arduino UNO, et j'ai quelques doutes sur le code que je dois utiliser.

Je me suis rendu sur le site de lynxmotion afin d'obtenir un code (AL5 Programming Tutorial - PS2 & BotBoarduino). Cependant n'utilisant pas Botboarduino ainsi que l'option rotation du poignet, j'ai du supprimer et modifier plusieurs élément du code original.

J'ai du notamment assigner de nouvelles broches à chaque servos ainsi qu'a la carte reliant l'arduino a ma manette de ps2. Je ne sais pas si les modifications apportées auront des conséquences plus ou moins lourdes sur le fonctionnement du bras.

Pouvez vous m'aider ?

Merci d'avance

voici le code modifié

#include <Servo.h>
#include <PS2X_lib.h>

//#define DEBUG

//comment to disable the Force Sensitive Resister on the gripper
//#define FSRG

//FSRG pin Must be analog!!
#define FSRG_pin A1

//Select which arm by uncommenting the corresponding line
//#define AL5A
//#define AL5B
#define AL5A

//uncomment for digital servos in the Shoulder and Elbow
//that use a range of 900ms to 2100ms
//#define DIGITAL_RANGE

#ifdef AL5A
const float A = 3.75;
const float B = 4.25;
#elif defined AL5B
const float A = 4.75;
const float B = 5.00;
#elif defined AL5D
const float A = 5.75;
const float B = 7.375;
#endif

//PS2 pins
#define DAT 12
#define CMD 11
#define ATT 10
#define CLK 13

//PS2 analog joystick Deadzone
#define Deadzone 4

//Arm Servo pins
#define Base_pin 3
#define Shoulder_pin 5
#define Elbow_pin 6
#define Wrist_pin 9
#define Gripper_pin 2


//Radians to Degrees constant
const float rtod = 57.295779;

//Arm Speed Variables
float Speed = 1.0;
int sps = 3;

//Servo Objects
Servo Elb;
Servo Shldr;
Servo Wrist;
Servo Base;
Servo Gripper;

//Arm Current Pos
float X = 4;
float Y = 4;
int Z = 90;
int G = 90;
int WR = 90;
float WA = 0;

//Arm temp pos
float tmpx = 4;
float tmpy = 4;
int tmpz = 90;
int tmpg = 90;
int tmpwr = 90;
float tmpwa = 0;

//PS2X Variables
PS2X ps2x;
int error = 0; 
byte type = 0;

boolean mode = true;

void setup()
{
#ifdef DEBUG
  Serial.begin(115200);
#endif

  error = ps2x.config_gamepad(CLK,CMD,ATT,DAT, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  
#ifdef DEBUG
  if(error == 0)
    Serial.println("Found Controller, configured successful");
   
  else if(error == 1)
    Serial.println("No controller found");
   
  else if(error == 2)
    Serial.println("not accepting commands");
   
  else if(error == 3)
    Serial.println("refusing Pressures mode");
   
  type = ps2x.readType(); 
    switch(type) 
    {
      case 0:
       Serial.println("Unknown");
       break;
      case 1:
       Serial.println("DualShock");
       break;
      case 2:
       Serial.println("GuitarHero");
       break;
    }
#endif

Base.attach(Base_pin);
Shldr.attach(Shoulder_pin);
Elb.attach(Elbow_pin);
Wrist.attach(Wrist_pin);
Gripper.attach(Gripper_pin);

}

int Arm(float x, float y, float z, int g, float wa, int wr) //Here's all the Inverse Kinematics to control the arm
{
  float M = sqrt((y*y)+(x*x));
  if(M <= 0)
    return 1;
  float A1 = atan(y/x);
  if(x <= 0)
    return 1;
  float A2 = acos((A*A-B*B+M*M)/((A*2)*M));
  float Elbow = acos((A*A+B*B-M*M)/((A*2)*B));
  float Shoulder = A1 + A2;
  Elbow = Elbow * rtod;
  Shoulder = Shoulder * rtod;
  if((int)Elbow <= 0 || (int)Shoulder <= 0)
    return 1;
  float Wris = abs(wa - Elbow - Shoulder) - 90;
#ifdef DIGITAL_RANGE
  Elb.writeMicroseconds(map(180 - Elbow, 0, 180, 900, 2100  ));
  Shldr.writeMicroseconds(map(Shoulder, 0, 180, 900, 2100));
#else
  Elb.write(180 - Elbow);
  Shldr.write(Shoulder);
#endif
  Wrist.write(180 - Wris);
  Base.write(z);
  #ifndef FSRG
  Gripper.write(g);
  #endif
  Y = tmpy;
  X = tmpx;
  Z = tmpz;
  WA = tmpwa;
  #ifndef FSRG
  G = tmpg;
  #endif
  WR = tmpwr;
  return 0; 
}


void loop()
{
  ps2x.read_gamepad(); //update the ps2 controller
  
  int LSY = 128 - ps2x.Analog(PSS_LY);
  int LSX = ps2x.Analog(PSS_LX) - 128;
  int RSY = 128 - ps2x.Analog(PSS_RY);
  int RSX = ps2x.Analog(PSS_RX) - 128;

  if(RSY > Deadzone || RSY < -Deadzone)
    tmpy = max(Y + RSY/1000.0*Speed, -1);
  
  if(RSX > Deadzone || RSX < -Deadzone)
    tmpx = max(X + RSX/1000.0*Speed, -0.5);
    
  if(LSY > Deadzone || LSY < -Deadzone)
    tmpwa = constrain(WA + LSY/100.0*Speed, 0, 180);

  if(LSX > Deadzone || LSX < -Deadzone)
    tmpz = constrain(Z + LSX/100.0*Speed, 0, 180);
 
  if(ps2x.Button(PSB_R1))
  {
    #ifdef FSRG
    while(analogRead(FSRG_pin) < 400)
    {
      Gripper.write(min(Gripper.read() + 2, 170));
      if(Gripper.read() == 170)
        break;
      #ifdef DEBUG
      Serial.print(analogRead(FSRG_pin));
      Serial.print(" ");
      Serial.println(Gripper.read());
      #endif
      delay(10);
    }
    #else
    tmpg = min(G + 5*Speed, 170);
    #endif
  }
  if(ps2x.Button(PSB_R2))
  {
    #ifdef FSRG
    while(Gripper.read() > 90)
    {
      
      Gripper.write(max(Gripper.read() - 2, 90));
      #ifdef DEBUG
      Serial.println(Gripper.read());
      #endif
      delay(10);
    }
    #else
    tmpg = max(G - 5*Speed, 10);
    #endif
  }
  
  if(ps2x.ButtonPressed(PSB_BLUE))
  {
    int pos = Gripper.readMicroseconds();
    pos -= pos % 10;
    while(pos != 1500)
    {
      pos += ((pos - 1500 > 0)? -10 : 10);
      Gripper.writeMicroseconds(pos);
      delay(25);
    }
    tmpg = 90;
    G = 90;
  }
  
 
  if(ps2x.Button(PSB_L1))
    tmpwr = max(WR + 2*Speed, 0);
  else if(ps2x.Button(PSB_L2))
    tmpwr = min(WR - 2*Speed, 180);
 
 
  Speed = sps*0.20 + 0.60;
      
 if(Arm(tmpx, tmpy, tmpz, tmpg, tmpwa, tmpwr))
   {
     #ifdef DEBUG
     Serial.print("NONREAL Answer");
     #endif
   }

 if(tmpx < 2 && tmpy < 2 && RSX < 0)
   {
     tmpy = tmpy + 0.05;
     Arm(tmpx, tmpy, tmpz, tmpg, tmpwa, tmpwr);
   }
 else if(tmpx < 1 && tmpy < 2 && RSY < 0)
   {
     tmpx = tmpx + 0.05;
     Arm(tmpx, tmpy, tmpz, tmpg, tmpwa, tmpwr);
   }
 delay(30);
}