How do I make joystick on ps2 to work with vjoy

so after i watch video call How to connect ANY controller but i stuck at analog stick part
because is interferce with game pad here is a code
//EDIT //
I want to know how can i write value to analog that was not low or high (0,1023)

#include "ibus.h"

// //////////////////
// Edit here to customize

// How often to send data?
#define UPDATE_INTERVAL 1 // milliseconds

// 1. Analog channels. Data can be read with the Arduino's 10-bit ADC.
// This gives values from 0 to 1023.
// Specify below the analog pin numbers (as for analogRead) you would like to use.
// Every analog input is sent as a single channel.
//#define NUM_ANALOG_INPUTS 4
byte analogPins[] = {A0, A1,A2,A3}; // element count MUST be == NUM_ANALOG_INPUTS


// 2. Digital channels. Data can be read from Arduino's digital pins.
// They could be either LOW or HIGH.
// Specify below the digital pin numbers (as for digitalRead) you would like to use.
// Every pin is sent as a single channel. LOW is encoded as 0, HIGH - as 1023
#define NUM_DIGITAL_INPUTS 16
byte digitalPins[] = {0,1,2,3,4,5,6,7,8,9,14,15,16,17,18,19}; // element count MUST be == NUM_DIGITAL_INPUTS


// 3. Digital bit-mapped channels. Sending a single binary state as a 16-bit
// channel is pretty wasteful. Instead, we can encode one digital input
// in each of the 16 channel bits.
// Specify below the digital pins (as for digitalRead) you would like to send as
// bitmapped channel data. Data will be automatically organized in channels.
// The first 16 pins will go in one channel (the first pin goes into the LSB of the channel).
// The next 16 pins go in another channel and so on
// LOW pins are encoded as 0 bit, HIGH - as 1.
#define NUM_DIGITAL_BITMAPPED_INPUTS 0
byte digitalBitmappedPins[] = {}; // element count MUST be == NUM_DIGITAL_BITMAPPED_INPUTS


// Define the appropriate analog reference source. See
// https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
#define ANALOG_REFERENCE EXTERNAL //"INTERAL" = 1.1V "DEFAULT" = 5V (ref voltage should be the maxiumum voltage you will use) Example: If I had a 2.5 volt signal that I wanted 
                                  //to be my center I would set my REF voltage at 5 volts ("DEFAULT").

// Define the baud rate
#define BAUD_RATE 115200

// /////////////////

#include <PS2X_lib.h>
PS2X ps2x;  //The PS2 Controller Class


#define NUM_CHANNELS ( (NUM_ANALOG_INPUTS) + (NUM_DIGITAL_INPUTS) + (15 + (NUM_DIGITAL_BITMAPPED_INPUTS))/16)


IBus ibus(NUM_CHANNELS);

void setup()
{
  ps2x.config_gamepad(12,11,10,13, false, false);
  //setup pins and settings: GamePad(clock, command, attention, data, Pressures, Rumble)
  //We have disabled the pressure sensitivity and rumble in this instance.

  analogReference(ANALOG_REFERENCE); // use the defined ADC reference voltage source
  Serial.begin(BAUD_RATE);           // setup serial
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
  pinMode(18, OUTPUT);
  pinMode(19, OUTPUT);
}

void loop()
{
  ps2x.read_gamepad(); // This needs to be called at least once a second
                       // to get data from the controller.
int8_t x1 = 0;
int8_t y1 = 0;
int8_t x2 = 0;
int8_t y2 = 0;

                       
  if(ps2x.ButtonPressed(PSB_TRIANGLE)) 
  {
    digitalWrite(18, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_TRIANGLE)){
    digitalWrite(18, LOW);
  }
 if(ps2x.ButtonPressed(PSB_PAD_LEFT)) 
  {
    digitalWrite(19, HIGH);  
   }
  else if (ps2x.ButtonReleased(PSB_PAD_LEFT)){
    digitalWrite(19, LOW);
  }
   if(ps2x.ButtonPressed(PSB_PAD_RIGHT))  
  {
    digitalWrite(2, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_PAD_RIGHT)){
    digitalWrite(2, LOW);
  }
    if(ps2x.ButtonPressed(PSB_PAD_UP))  
  {
    digitalWrite(3, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_PAD_UP)){
    digitalWrite(3, LOW);
  }
    if(ps2x.ButtonPressed(PSB_PAD_DOWN))  
  {
    digitalWrite(4, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_PAD_DOWN)){
    digitalWrite(4, LOW);
  }
   if(ps2x.ButtonPressed(PSB_CIRCLE)) 
  {
    digitalWrite(5, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_CIRCLE)){
    digitalWrite(5, LOW);
  }
   if(ps2x.ButtonPressed(PSB_CROSS)) 
  {
    digitalWrite(6, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_CROSS)){
    digitalWrite(6, LOW);
  }
   if(ps2x.ButtonPressed(PSB_SQUARE)) 
  {
    digitalWrite(7, HIGH);
   }
  else if (ps2x.ButtonReleased(PSB_SQUARE))
  {
    digitalWrite(7, LOW);
  }
    if(ps2x.Button(PSB_L1)) 
  {
    digitalWrite(8, HIGH);
  }
  else 
  {
    digitalWrite(8, LOW);
  }
    if(ps2x.Button(PSB_L2)) 
  {
    digitalWrite(9, HIGH);
   }
else 
{
    digitalWrite(9, LOW);
  }
    if(ps2x.ButtonPressed(PSB_START))
  {
    digitalWrite(14, HIGH);
  }
  else if(ps2x.ButtonReleased(PSB_START))
  {
    digitalWrite(14, LOW);
  }
    if(ps2x.ButtonPressed(PSB_SELECT))
  {
    digitalWrite(15, HIGH);
   }
else if (ps2x.ButtonReleased(PSB_SELECT))
{
    digitalWrite(15, LOW);
  }
     if(ps2x.Button(PSB_R1)) 
  {
    digitalWrite(16, HIGH);
   }
else 
{
    digitalWrite(16, LOW);
  }
    if(ps2x.Button(PSB_R2)) 
  {
    digitalWrite(17, HIGH);
   }
else 
{
    digitalWrite(17, LOW);
  }
   
  
   analogWrite(A0,ps2x.Analog(PSS_LX));
   analogWrite(A1,ps2x.Analog(PSS_LY));
   analogWrite(A2,ps2x.Analog(PSS_RX));
   analogWrite(A3,ps2x.Analog(PSS_RY));
   
//digitalWrite (0, lJoyX );
//digitalWrite (1, lJoyY); // the analog sticks on the controller. USE DIGITAL PINS FOR ANALOGWRITE. If you run out
//digitalWrite (18, rJoyX); // of digital pins you can use analog pins for DIGITAL SIGNALS ONLY (BUTTONS) to free up more 
//digitalWrite(19, rJoyY);// digital pins to use for analogwrite.

  int i, bm_ch = 0;
  unsigned long time = millis();

  ibus.begin();

   //read analog pins - one per channel
  for(i=0; i < NUM_ANALOG_INPUTS; i++)
    ibus.write(analogRead(analogPins[i]));

  // read digital pins - one per channel
  for(i=0; i < NUM_DIGITAL_INPUTS; i++)
    ibus.write(digitalRead(digitalPins[i]) == HIGH ? 1023 : 0);
 // read digital bit-mapped pins - 16 pins go in one channel
  for(i=0; i < NUM_DIGITAL_BITMAPPED_INPUTS; i++) {
    int bit = i%16;
    if(digitalRead(digitalBitmappedPins[i]) == HIGH)
      bm_ch |= 1 << bit;

    if(bit == 15 || i == NUM_DIGITAL_BITMAPPED_INPUTS-1) {
      // data for one channel ready
      ibus.write(bm_ch);
      bm_ch = 0;
    }
  }

  
  ibus.end();

  time = millis() - time; // time elapsed in reading the inputs
  if(time < UPDATE_INTERVAL)
    // sleep till it is time for the next update
    delay(UPDATE_INTERVAL  - time);
}

Many years ago I used a Playstation controller with Xbee, but I used the SPI port.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.