# stick value to servo angle need help

so im trying to convert my y and x values to be sent as servo angles for my ESC on the other end heres my code i know its wrong if someone could help me i would apreciate it

`````` if (ps2x.Button(PSB_L1)) { //print stick values
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(",");
LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(ps2x.Analog(PSS_LY),0, 1023, 30,130);
Serial.print(LYVALUE);
``````

i know its wrong

How do you know that? Besides the obvious fact that it is incomplete.

int LYVALUE; add this it abviously worked and also fixed this LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(LYVALUE,0, 1023, 30,130);
Serial.print(LYVALUE);

so i made changes to this section and i got working

``````if (ps2x.Button(PSB_L1)) { //print stick values if either is TRUE

LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(LYVALUE,0, 255, 30,130);
Serial.print(LYVALUE, DEC);
Serial.print(",");
LXVALUE = ps2x.Analog(PSS_LX);
LXVALUE = map(LXVALUE,0, 255, 39,130);
Serial.print(LXVALUE, DEC);
Serial.print(",");

mySerial.print("Stick Values:");
mySerial.print(ps2x.Analog(PSS_LY), DEC);
mySerial.print(",");
mySerial.print(ps2x.Analog(PSS_LX), DEC);
mySerial.print(",");
}
``````

next i have my two servos on the rx end one is an ESC the other for steering the angles for steering 95-120 turn right, 76 straight, 70-39 turn left. for ESC 86-88 stop, 89-130 forward, 30-84 backward. was angle changes so does speed with ESC or sharpness with steering. is it possible to use one joy stick to control both?

is it possible to use one joy stick to control both?

A 2D joystick? Yes, you have our permission to do that.

is it possible to use one joy stick to control both?

Of course.

got it to stream but every once in a while i get data like this 7,104,39,71,6110,43,1130,82,730,92, even thoughi set my max angle to 130 how am i getting 6000 or more?

merkzilla:
got it to stream but every once in a while i get data like this 7,104,39,71,6110,43,1130,82,730,92, even thoughi set my max angle to 130 how am i getting 6000 or more?

You have a better chance of getting help if you post the complete code.

...may i have a look at your complete code?

it might help solving this problem.

Sorry thought o posted the full code I'll post when I have access to it again but what I'm looking to do is send the two angles and separate them in the rx side I'm thinking of using index but I'm unsure how to assign an index to a string

heres my code tx first then rx

``````#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); // RX, TX
#include <PS2X_lib.h>  //for v1.6
#define PS2_DAT        9  //14
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        12  //17
//#define pressures   true
#define pressures   false
//#define rumble      true
#define rumble      false

int LYVALUE;
int LXVALUE;

PS2X ps2x;
int error = 0;
byte type = 0;
byte vibrate = 0;

void setup() {

Serial.begin(57600);
mySerial.begin(57600);

delay(300);  //added delay to give wireless ps2 module some time to startup, before configuring it

//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);

if (error == 0) {
Serial.print("Found Controller, configured successful ");
Serial.print("pressures = ");
mySerial.print("Found Controller, configured successful ");
mySerial.print("pressures = ");
if (pressures)
{
Serial.println("true ");
mySerial.println("true ");
}
else
{
Serial.println("false");
Serial.print("rumble = ");
mySerial.println("false");
mySerial.print("rumble = ");
}
if (rumble)
{
Serial.println("true)");
mySerial.println("true)");
}
else
{
Serial.println("false");
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("Note: Go to www.billporter.info for updates and to report bugs.");
mySerial.println("false");
mySerial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
mySerial.println("holding L1 or R1 will print out the analog stick values.");
mySerial.println("Note: 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");
mySerial.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");
mySerial.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. ");
mySerial.println("Controller refusing to enter Pressures mode, may not support it. ");
}
//  Serial.print(ps2x.Analog(1), HEX);

switch (type) {
case 0:
Serial.print("Unknown Controller type found ");
mySerial.print("Unknown Controller type found ");
break;
case 1:
Serial.print("DualShock Controller found ");
mySerial.print("DualShock Controller found ");
break;
case 2:
Serial.print("GuitarHero Controller found ");
mySerial.print("GuitarHero Controller found ");
break;
case 3:
Serial.print("Wireless Sony DualShock Controller found ");
mySerial.print("Wireless Sony DualShock Controller found ");
break;
}
}

void loop() {
/* You must Read Gamepad to get new values and set vibration values
You should call this at least once a second
*/
if (error == 1) //skip loop if no controller found
return;
else { //DualShock Controller

if (ps2x.Button(PSB_START))
{ //will be TRUE as long as button is pressed
Serial.println("Start is being held");
mySerial.println("Start is being held");
}
if (ps2x.Button(PSB_SELECT))
{
Serial.println("Select is being held");
mySerial.println("Select is being held");
}
{ //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
mySerial.print("Up held this hard: ");
}
{
Serial.print("DOWN held this hard: ");
mySerial.print("DOWN held this hard: ");
}

vibrate = ps2x.Analog(PSAB_CROSS);  //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");
mySerial.println("L3 pressed");
}
if (ps2x.Button(PSB_R3))
{
Serial.println("R3 pressed");
mySerial.println("R3 pressed");
}
if (ps2x.Button(PSB_L2))
{
Serial.println("L2 pressed");
mySerial.println("L2 pressed");
}
if (ps2x.Button(PSB_R2))
{
Serial.println("R2 pressed");
Serial.println("R2 pressed");
}
if (ps2x.Button(PSB_TRIANGLE))
{
Serial.println("Triangle pressed");
mySerial.println("Triangle pressed");
}
}

{
Serial.println("LEFT");
mySerial.println("LEFT");
}
{
Serial.println("LEFT released");
mySerial.println("LEFT released");
}
{
Serial.println("Right");
mySerial.println("Right");
}
{
Serial.println("Right released ");
mySerial.println("Right released");
}
// circle button///////////////
if (ps2x.ButtonPressed(PSB_CIRCLE))
{ //will be TRUE if button was JUST pressed
Serial.println("Circle just pressed");
mySerial.println("Circle just pressed");
}
//X button/////////////////////////////////////////
if (ps2x.ButtonPressed(PSB_CROSS))
{ //will be TRUE if button was JUST pressed OR released
Serial.println("X just pressed");
mySerial.println("X just pressed");
}
if (ps2x.ButtonReleased(PSB_CROSS))
{ //will be TRUE if button was JUST pressed OR released
Serial.println("X just released");
mySerial.println("X just released");
}
//Square button///////////////////////////////////
if (ps2x.ButtonReleased(PSB_SQUARE))
{ //will be TRUE if button was JUST released
Serial.println("Square just released");
mySerial.println("Square just released");
}
if (ps2x.ButtonPressed(PSB_SQUARE))
{ //will be TRUE if button was JUST released
Serial.println("Square just pressed");
mySerial.println("Square just pressed");
}
if (ps2x.Button(PSB_L1)) { //print stick values if either is TRUE

LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(LYVALUE,0, 255, 30,130);
Serial.print(LYVALUE, DEC);
Serial.print(",");
LXVALUE = ps2x.Analog(PSS_LX);
LXVALUE = map(LXVALUE,0, 255, 39,120);
Serial.print(LXVALUE, DEC);
Serial.println(",");

mySerial.print(LYVALUE, DEC);

mySerial.print("a,");

mySerial.print(LXVALUE, DEC);

mySerial.println("b,");
}
}
delay(50);
}
``````
``````#include <Servo.h>
Servo Steer, Motor;

void setup()
{
Serial.begin(57600);
Steer.attach(6);
Motor.attach(7);
}
void loop()
{
if (Serial.available())
{
char c = Serial.read();  //gets one byte from serial buffer
if (c == '\n' || c == '\r')
{

Steer.write(c);
}
Motor.write(c);
}
delay(50);    /////////////////////////b/////////////////////
readString = ""; //clears variable for new input
}
else
{
}
}
}
``````

Do I have to assign index of in the tx side or just add a, b like below?

LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(LYVALUE,0, 255, 30,130);

Serial.print("a");
Serial.print(LYVALUE, DEC);
Serial.print(",");
LXVALUE = ps2x.Analog(PSS_LX);
LXVALUE = map(LXVALUE,0, 255, 39,120);
Serial.print("b");
Serial.print(LXVALUE, DEC);
Serial.println(",");

Personally I would do something like this on the Tx side

``````LYVALUE = ps2x.Analog(PSS_LY);
LYVALUE = map(LYVALUE, 0, 255, 30, 130);
LXVALUE = ps2x.Analog(PSS_LX);
LXVALUE = map(LXVALUE, 0, 255, 39, 120);
Serial.println("<");  //start marker
Serial.print("Y");
Serial.print(LYVALUE, DEC);
Serial.print(",");
Serial.print("X");
Serial.print(LXVALUE, DEC);
Serial.println(">");  //end marker
``````

The < and > start and end markers make it much easier to identify the message.

More importantly I would not use Strings on the Rx end and use char arrays (strings) instead.

Look at Serial input basics for some ideas.

i beleave i would need to add these into my rx side or would i need two char sense im reading two servo vallues? like char Str1 and char Str2?

char startMarker = '<';
char endMarker = ',';

char startMarker = ',' + 1;
char endMarker = '>';

I would use one Rx buffer and read the data between the start and end markers into it, including the comma, then parse the data from the buffer using strtok() to split it at the comma and atoi() to turn each value into an integer to send to the servo.

im unfamiliar with this is there somewhere i can read up on this?

i upload this sample to my micro but i get nothing from the serial monitor

``````// simple parse demo
char receivedChars[] = "This is a test, 1234, 45.3" ;

char messageFromPC[32] = {0};
int integerFromPC = 0;
float floatFromPC = 0.0;

char recvChar;
char endMarker = '>';
boolean newData = false;

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

parseData();
showParsedData();
}

void loop() {

}

void parseData() {

// split the data into its parts

char * strtokIndx; // this is used by strtok() as an index

strtokIndx = strtok(receivedChars,",");      // get the first part - the string
strcpy(messageFromPC, strtokIndx); // copy it to messageFromPC

strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
integerFromPC = atoi(strtokIndx);     // convert this part to an integer

strtokIndx = strtok(NULL, ",");
floatFromPC = atof(strtokIndx);     // convert this part to a float

}

void showParsedData() {
Serial.print("Message ");
Serial.println(messageFromPC);
Serial.print("Integer ");
Serial.println(integerFromPC);
Serial.print("Float ");
Serial.println(floatFromPC);
}
``````