Xbee + Servo + Dual Shock 2 = HELP !

Hello all, i'm new to the forum and this is my first post ever :slight_smile:

i really need helps from experts here...

i'm setting up a simple (but hard for me) project ...

i want to control a servo using a dual shock 2 controller through xbees

so basically these are my setup :
{Transmitter side}

  • 1x Uno
  • 1x Xbee S1
  • 1x DFRobot Xbee Shield
  • 1x PS2 DualShock 2 controller
    (schematic on attachment below)

{Receiver side}

  • 1x Uno
  • 1x Xbee S1
  • 1x DFRobot Xbee Shield

i used GPSX Library which is :

/*
This example demonstrates all features of the library.

- The controller starts up in ANALOG mode, and is locked
  (user cannot switch modes using the ANALOG button)
  
- SQUARE and CROSS buttons toggle between ANALOG and DIGITAL modes.
  also, at this point the lock is released.
  
- CIRCLE button rotates the motor1 while pressed. This motor has
  a fixed rotation speed and its state is limited to on or off

- While pressing TRIANGLE, motor2 rotates. Its rotation speed is
  controlled by the X-axis of the left analog stick.

Pin layouts are hardcoded in GPSX.c.
For function details, refer to documents attached to this library.
*/

#include <GPSXClass.h>


void setup()
{
  Serial.begin(38400);
  PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_LOCK);
  
  PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);
  
  // Poll current state once.
  PSX.updateState(PSX_PAD1);
}

void loop()
{
  PSX.updateState(PSX_PAD1);

  if (PRESSED_CIRCLE(PSX_PAD1)) {
    Serial.println("Pressed circle");
    PSX.motor(PSX_PAD1, MOTOR1_ON, 0x00);
  }

  if (RELEASED_CIRCLE(PSX_PAD1)) {
    Serial.println("Released circle");
    PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00);
  }    

  if (PRESSED_SQUARE(PSX_PAD1)) {
    Serial.println("Pressed square");
    PSX.mode(PSX_PAD1, MODE_DIGITAL, MODE_UNLOCK);
  }

  if (RELEASED_SQUARE(PSX_PAD1)) {
    Serial.println("Released square");
  }

  if (PRESSED_CROSS(PSX_PAD1)) {
    Serial.println("Pressed cross");
    PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_UNLOCK);
    PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);
  }

  if (RELEASED_CROSS(PSX_PAD1)) {
    Serial.println("Released cross");
  }

  if (IS_DOWN_TRIANGLE(PSX_PAD1)) {
    PSX.motor(PSX_PAD1, MOTOR1_OFF, ANALOG_LEFT_X(PSX_PAD1));
  }

  if (PRESSED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Pressed triangle");
  }

  if (RELEASED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Released triangle");
    PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00);
  }
}

and this is my code for {transmitter side} :

#include <SoftwareSerial.h>
#include <GPSXClass.h>

#define xbeeDI 3
#define xbeeDO 2
#define ctrlGoFront 'f'
#define ctrlGoRight 'r'
#define ctrlGoBack 'b'
#define ctrlGoLeft 'l'
#define btO 'o'
#define btTriangle 't'
#define btSquare 's'
#define btX 'x'

#define ctrlGoFrontEnd 'F'
#define ctrlGoRightEnd 'R'
#define ctrlGoBackEnd 'B'
#define ctrlGoLeftEnd 'L'
#define btOEnd 'O'
#define btTriangleEnd 'T'
#define btSquareEnd 'S'
#define btXEnd 'X'
//***************************************************************//
SoftwareSerial xbeeSerial(xbeeDO,xbeeDI);
//***************************************************************//
void setup()
{
Serial.begin(9600);
xbeeSerial.begin(9600);
PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_LOCK);

PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);

// Poll current state once.
PSX.updateState(PSX_PAD1);
}

void loop()
{
// xbeeSerial.print('3');
PSX.updateState(PSX_PAD1);

if (PRESSED_CIRCLE(PSX_PAD1)) {
Serial.println("Pressed circle");
xbeeSerial.print(btO);
}

if (RELEASED_CIRCLE(PSX_PAD1)) {
Serial.println("Released circle"); 
xbeeSerial.print(btOEnd);
} 

if (PRESSED_SQUARE(PSX_PAD1)) {
Serial.println("Pressed square");
xbeeSerial.print(btSquare);
}

if (RELEASED_SQUARE(PSX_PAD1)) {
xbeeSerial.print(btSquareEnd);
Serial.println("Released square");
}

if (PRESSED_CROSS(PSX_PAD1)) {
Serial.println("Pressed cross");
xbeeSerial.print(btX);
}

if (RELEASED_CROSS(PSX_PAD1)) {
xbeeSerial.print(btXEnd);
Serial.println("Released cross");
}

if (PRESSED_TRIANGLE(PSX_PAD1)) {
xbeeSerial.print(btTriangle);
Serial.println("Pressed triangle");
}

if (RELEASED_TRIANGLE(PSX_PAD1)) {
xbeeSerial.print(btTriangleEnd);
Serial.println("Released triangle");
PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00);
}

if (PRESSED_UP(PSX_PAD1)){
xbeeSerial.print(ctrlGoFront);
Serial.println("Pressed up");
}
if (RELEASED_UP(PSX_PAD1)){
xbeeSerial.print(ctrlGoFrontEnd);
Serial.println("Released up");
}
if (PRESSED_RIGHT(PSX_PAD1)){
xbeeSerial.print(ctrlGoRight);
Serial.println("Pressed right");
}
if (RELEASED_RIGHT(PSX_PAD1)){
xbeeSerial.print(ctrlGoRightEnd);
Serial.println("Released right");
}
if (PRESSED_DOWN(PSX_PAD1)){
xbeeSerial.print(ctrlGoBack);
Serial.println("Pressed down");
}
if (RELEASED_DOWN(PSX_PAD1)){
xbeeSerial.print(ctrlGoBackEnd);
Serial.println("Released down");
}
if (PRESSED_LEFT(PSX_PAD1)){
xbeeSerial.print(ctrlGoLeft);
Serial.println("Pressed left");
}
if (RELEASED_LEFT(PSX_PAD1)){
xbeeSerial.print(ctrlGoLeftEnd);
Serial.println("Released left");
} 
}

and this is for {receiver side} :

#include <SoftwareSerial.h>
#include <Servo.h> 

#define xbeeDI 3
#define xbeeDO 2


SoftwareSerial xbeeSerial(xbeeDO,xbeeDI);

Servo servo;

void setup(){
Serial.begin(9600);
xbeeSerial.begin(9600);
servo.attach(2);
servo.write(180);
Serial.println("Start");
}

void loop(){
if(xbeeSerial.available()){
char ch = xbeeSerial.read();
Serial.println(ch);
int ang = servo.read();
switch(ch){

case 'r':
ang -= 5;
if(ang <0){
ang = 0;
}
servo.write(ang);
break;  
case 'l':
ang += 5;
if(ang >180){
ang = 180;
}
servo.write(ang);
break;
}
}

}

after i connected everything, Dual Shock 2 seems to turned ON fine (i pressed Analog button and it lights up, i dunno it's ready to work or it's actually pretty common like that), but when i press any button, or toggle the joystick, my servo won't move :frowning:
tried both on my microservo and Cytron C40R servo, no luck :frowning:

help, what i do wrong ?

schematic.bmp (31.3 KB)

  • 1x Xbee S1

Configured how? Do you KNOW that the XBees talk to each other?

  • 1x DFRobot Xbee Shield

Your "link" didn't work.

What does your Serial output look like?

this is my setup look like...basically i use two XBees, 1 for controller side, and 1 for servo side

sorry bump but,

anyone knows how can i let my controller side XBEE communicate the servo side XBEE to move the servo ?

i can't figure it out :frowning:

anyone knows how can i let my controller side XBEE communicate the servo side XBEE to move the servo ?

Yes.

i can't figure it out

You can't seem to answer all the questions, either.

SoftwareSerial xbeeSerial(xbeeDO,xbeeDI);

Servo servo;

Probably unrelated to your current issue but SoftwareSerial and the Servo library tend to not work well with each other. Unless something has changed recently. Solution to Servo Jitters due to conflict between Servo.h and SoftwareSerial.h - Programming Questions - Arduino Forum