Hello all, i'm new to the forum and this is my first post ever ![]()
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 ![]()
tried both on my microservo and Cytron C40R servo, no luck ![]()
help, what i do wrong ?
schematic.bmp (31.3 KB)

