PS2 controller wireless

Hello out there, i have a project where i need to make a robot work whit the PS2 controller i have tried doing it whit the nrf24l01 but that did not work at all =( so after some head scratching I came op whit the idea that i just could make a wireless PS2 controller but then i watched the interweb and did not find any tutorials so do any of you know how I could make it wireless?? :slight_smile:

I made my robot work from a wireless PS2 control. It's actually very simple. I'll try to post some pictures and maybe a video.

Here is the connector and wiring configuration. Sorry they are so big.
I used the PS2X Library here PlayStation 2 Controller Arduino Library v1.0 « The Mind of Bill Porter
Follow it step by step. If you want, I will send you my .h and .cpp files along with an example program. But go to that site and try it. Make sure you put the files in the correct place, otherwise you will get errors.

photo 4.JPG

HazardsMind:
Here is the connector and wiring configuration. Sorry they are so big.
I used the PS2X Library here PlayStation 2 Controller Arduino Library v1.0 « The Mind of Bill Porter
Follow it step by step. If you want, I will send you my .h and .cpp files along with an example program. But go to that site and try it. Make sure you put the files in the correct place, otherwise you will get errors.

looks cool but do you know the range of it and can i increase it?? I have already made made most of my code and i am pretty sure on it will work the only thing where i have a problem is when I try to use PWM whit my four motors. Have you tried it??

Are you using a UNO or Mega? I've done it with 2 PWM motors and 1 regular on/off motor. The range is however far the controller can go, that's it.

HazardsMind:
Are you using a UNO or Mega? I've done it with 2 PWM motors and 1 regular on/off motor. The range is however far the controller can go, that's it.

I am using the UNO and my four motors are connected so the arduino only thinks there is two but if you don't have problem whit sending me the code and the schematics then I would like to have it. :wink:

The schematics you can find online, in fact that site shows you how to wire it . As for the code, I can give you a sample, that works for the ps2x library that I have. It will only work if you and I have the same library, otherwise your going to have errors.

HazardsMind:
The schematics you can find online, in fact that site shows you how to wire it . As for the code, I can give you a sample, that works for the ps2x library that I have. It will only work if you and I have the same library, otherwise your going to have errors.

i have the PS2X library from bill porter :wink:

Ok, we'll I'm not home right now, but I send it to you later.

HazardsMind:
Ok, we'll I'm not home right now, but I send it to you later.

alright thanks :wink:

Here is my sample.

#include <PS2X_lib.h>  //for v1.6

PS2X ps2x; // create PS2 Controller Class
//CONTROLLER VOLTAGE MUST BE SET TO 3.3V, NOT 5V

//right now, the library does NOT support hot pluggable controllers, meaning 
//you must always either restart your Arduino after you conect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int error = 0; 
byte type = 0;
int temp = 0;
byte vibrate = 0;

byte led1 = 8;
byte Mopen = 6;
byte Mclosed = 5;

void setup(){
  Serial.begin(57600);

  //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  pinMode(Mopen, OUTPUT);                                // Establishes LEDPin as an output so the LED can be seen
  pinMode(Mclosed, OUTPUT); 
  pinMode(led1, OUTPUT); 
  error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

  if(error == 0){
    Serial.println("Found Controller, configured successful");
    Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
    Serial.println("holding L1 or R1 will print out the analog stick values.");
    Serial.println("Go to www.billporter.info for updates and to report bugs.");
  }

  else if(error == 1)
    Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

  else if(error == 2)
    Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

  else if(error == 3)
    Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

  //Serial.print(ps2x.Analog(1), HEX);

  type = ps2x.readType(); 
  switch(type) {
  case 0:
    Serial.println("Unknown Controller type");
    break;
  case 1:
    Serial.println("DualShock Controller Found");
    break;
  case 2:
    Serial.println("GuitarHero Controller Found");
    break;
  }

}

void loop(){
  /* You must Read Gamepad to get new values
   Read GamePad and set vibration values
   ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
   if you don't enable the rumble, use ps2x.read_gamepad(); with no values
   
   you should call this at least once a second
   */

  if(error == 1) //skip loop if no controller found
    return; 

  if(type == 2){ //Guitar Hero Controller    
  }

  else { //DualShock Controller

    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

    if(ps2x.Button(PSB_START))    
      digitalWrite(led1, HIGH);
    else if(ps2x.Button(PSB_SELECT)) 
      digitalWrite(led1, LOW);
    else {
    }

    //will be TRUE as long as button is pressed
    Serial.println("Start is being held");
    // if(ps2x.Button(PSB_SELECT))
    //    Serial.println("Select is being held");

    if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
      Serial.print("Up held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
    }
    if(ps2x.Button(PSB_PAD_RIGHT)){
      Serial.print("Right held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
    }
    if(ps2x.Button(PSB_PAD_LEFT)){
      Serial.print("LEFT held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
    }
    if(ps2x.Button(PSB_PAD_DOWN)){
      Serial.print("DOWN held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
    }   


    vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on 
    //how hard you press the blue (X) button    

    if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)
    {
      if(ps2x.Button(PSB_L3))
        Serial.println("L3 pressed");
      if(ps2x.Button(PSB_R3))
        Serial.println("R3 pressed");
      if(ps2x.Button(PSB_L2))
        Serial.println("L2 pressed");
      if(ps2x.Button(PSB_R2))
        Serial.println("R2 pressed");
      if(ps2x.Button(PSB_GREEN))
        Serial.println("Triangle pressed");
    }   

    if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
      Serial.println("Circle just pressed");

    if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
      Serial.println("Square just released");     

    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
      Serial.println("X just changed");    


    if(ps2x.Button(PSB_L1)){
      digitalWrite(Mopen, HIGH);
      digitalWrite(Mclosed, LOW);
    }

    else if(ps2x.Button(PSB_R1)){ // print stick values if either is TRUE
      digitalWrite(Mopen, LOW);
      digitalWrite(Mclosed, HIGH);
    }
    else {
      digitalWrite(Mopen, LOW);
      digitalWrite(Mclosed, LOW);
    }

    if(ps2x.Analog(PSS_LY) > 139 && ps2x.Analog(PSS_LY) <= 255){
      int speed1 =map(ps2x.Analog(PSS_LY), 140 , 255, 0 , 255);
      analogWrite(Mopen, speed1);
      digitalWrite(Mclosed, LOW);
    }

    else if(ps2x.Analog(PSS_LY) >= 0 && ps2x.Analog(PSS_LY) <= 120){
      int speed1 =map(ps2x.Analog(PSS_LY),0 , 120, 255 , 0);
      digitalWrite(Mopen, LOW);
      analogWrite(Mclosed, speed1);
    }

    else {
      digitalWrite(Mopen, LOW);
      digitalWrite(Mclosed, LOW);
    } 
    Serial.print("Stick Values:");
    Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
    Serial.print(",");
    Serial.print(ps2x.Analog(PSS_LX), DEC); 
    Serial.print(",");
    Serial.print(ps2x.Analog(PSS_RY), DEC); 
    Serial.print(",");
    Serial.println(ps2x.Analog(PSS_RX), DEC); 
  }
  delay(50);
}

keywords.txt (1.57 KB)

PS2X_lib.cpp (10.2 KB)

PS2X_lib.h (5.91 KB)