Wireless control system problem

No. I put it there to flash the LED. That's all. I did that to show how fast the data is coming in. That's all.

If I had thought it necessary to put it in, I would have in the code I pasted on the previous page.

You seem to have incorporated the servo controls into the code. Well, does it work or not? If not, what does it do?

[quote author=Nick Gammon link=topic=89212.msg682056#msg682056 date=1328649563] No. I put it there to flash the LED. That's all. I did that to show how fast the data is coming in. That's all.

If I had thought it necessary to put it in, I would have in the code I pasted on the previous page.

You seem to have incorporated the servo controls into the code. Well, does it work or not? If not, what does it do? [/quote] No servos move or anything but the receiving light does turn on. So its receiving something but i dont know what.

Here is my sending code:

int pwm_a = 3;  //PWM control for motor outputs 1 and 2 is on digital pin 3
int dir_a = 12;  //direction control for motor outputs 1 and 2 is on digital pin 12

int Finger1 = 2;
int Finger2 = 3;
int Finger3 = 4;
int Finger4 = 5;
int Rotation =  0;


void setup()
{
   Serial.begin(9600);
  pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
  pinMode(dir_a, OUTPUT);
  digitalWrite(dir_a, LOW);
  
}

void loop()
{  

   int FingerV1 = analogRead(Finger1);
   int FingerV2 = analogRead(Finger2);
   int FingerV3 = analogRead(Finger3);
   int FingerV4 = analogRead(Finger4);
   int RotationV1 = analogRead(Rotation);
   
   if (FingerV1 < 30) FingerV1 = 30;
   else if (FingerV1 > 80) FingerV1 = 80;
   
   if (FingerV2 < 45) FingerV2 = 45;
   else if (FingerV2 > 69) FingerV2 = 69;
   
   if (FingerV3 < 22) FingerV3 = 22;
   else if (FingerV3 > 87) FingerV3 = 87;
   
   if (FingerV4 < 12) FingerV4 = 12;
   else if (FingerV4 > 62) FingerV4 = 62;
   
   if (RotationV1 < 300) RotationV1 = 300;
   else if (RotationV1 > 600) RotationV1 = 600;
  
   byte servoVal1 = map(FingerV1,30, 80, 0, 255);//middle
   byte servoVal2 = map(FingerV2,69, 45, 0, 100);//thumb
   byte servoVal3 = map(FingerV3,87, 22, 0, 255);//ring
   byte servoVal4 = map(FingerV4,12, 62, 0, 255);//pointer
   byte servoVal5 = map(RotationV1,300, 600, 0, 255);//Rotation
   
   Serial.print(".");
   Serial.print(servoVal1);
   Serial.print(",");
   Serial.print(servoVal2);
   Serial.print(",");
   Serial.print(servoVal3);
   Serial.print(",");
   Serial.print(servoVal4);
   Serial.print(",");
   Serial.print(RotationV1);
   Serial.print("/");
   
   delay(10);
}

On the receiving end, what do the serial prints show?

[quote author=Nick Gammon link=topic=89212.msg682093#msg682093 date=1328651249] On the receiving end, what do the serial prints show? [/quote] This is a small bit of what i get.

middle = 163
thumb = 4
ring = 23
pointer = 255
rotation = 5883
middle = 1555
thumb = 441
ring = 0
pointer = 0
rotation = 0
middle = 435
thumb = 0

Those values are way way way off. My sending code keeps all of them between 0 and 100 and the rotation is between 300 and 600.

Can you post your current sending code please?

[quote author=Nick Gammon link=topic=89212.msg682113#msg682113 date=1328652389] Can you post your current sending code please? [/quote] Sending:

int pwm_a = 3;  //PWM control for motor outputs 1 and 2 is on digital pin 3
int dir_a = 12;  //direction control for motor outputs 1 and 2 is on digital pin 12

int Finger1 = 2;
int Finger2 = 3;
int Finger3 = 4;
int Finger4 = 5;
int Rotation =  0;


void setup()
{
   Serial.begin(9600);
  pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
  pinMode(dir_a, OUTPUT);
  digitalWrite(dir_a, LOW);
  
}

void loop()
{  

   int FingerV1 = analogRead(Finger1);
   int FingerV2 = analogRead(Finger2);
   int FingerV3 = analogRead(Finger3);
   int FingerV4 = analogRead(Finger4);
   int RotationV1 = analogRead(Rotation);
   
   if (FingerV1 < 30) FingerV1 = 30;
   else if (FingerV1 > 80) FingerV1 = 80;
   
   if (FingerV2 < 45) FingerV2 = 45;
   else if (FingerV2 > 69) FingerV2 = 69;
   
   if (FingerV3 < 22) FingerV3 = 22;
   else if (FingerV3 > 87) FingerV3 = 87;
   
   if (FingerV4 < 12) FingerV4 = 12;
   else if (FingerV4 > 62) FingerV4 = 62;
   
   if (RotationV1 < 300) RotationV1 = 300;
   else if (RotationV1 > 600) RotationV1 = 600;
  
   byte servoVal1 = map(FingerV1,30, 80, 0, 255);//middle
   byte servoVal2 = map(FingerV2,69, 45, 0, 100);//thumb
   byte servoVal3 = map(FingerV3,87, 22, 0, 255);//ring
   byte servoVal4 = map(FingerV4,12, 62, 0, 255);//pointer
   byte servoVal5 = map(RotationV1,300, 600, 0, 255);//Rotation
   
   Serial.print(".");
   Serial.print(servoVal1);
   Serial.print(",");
   Serial.print(servoVal2);
   Serial.print(",");
   Serial.print(servoVal3);
   Serial.print(",");
   Serial.print(servoVal4);
   Serial.print(",");
   Serial.print(RotationV1);
   Serial.print("/");
   
   delay(10);
}

Did you think to open the serial monitor on the sending side and check what was actually being sent? I did and saw this:

,350/35/

Hardly the numbers you expect, eh?

Now if we change the sending code to send "decimal" numbers like this:

  Serial.print(".");
   Serial.print(servoVal1, DEC);
   Serial.print(",");
   Serial.print(servoVal2, DEC);
   Serial.print(",");
   Serial.print(servoVal3, DEC);
   Serial.print(",");
   Serial.print(servoVal4, DEC);
   Serial.print(",");
   Serial.print(RotationV1, DEC);
   Serial.print("/");

Then we get better results:

.255,0,0,255,340/.255,0,0,255,344/.255,0,0,255,368/

[quote author=Nick Gammon link=topic=89212.msg682144#msg682144 date=1328654431] Did you think to open the serial monitor on the sending side and check what was actually being sent? I did and saw this:

,350/35/

Hardly the numbers you expect, eh?

Now if we change the sending code to send "decimal" numbers like this:

  Serial.print(".");
   Serial.print(servoVal1, DEC);
   Serial.print(",");
   Serial.print(servoVal2, DEC);
   Serial.print(",");
   Serial.print(servoVal3, DEC);
   Serial.print(",");
   Serial.print(servoVal4, DEC);
   Serial.print(",");
   Serial.print(RotationV1, DEC);
   Serial.print("/");

Then we get better results:

.255,0,0,255,340/.255,0,0,255,344/.255,0,0,255,368/

[/quote] Ah perfect! Now another problem... So i have 5 of these: http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=6221

I am using an arduino for all this also. Now should i just power these servos with the 5v and gnd from the arduino or something else? When i power it with the arduino it powers then restarts then repeats all that. I have a 7.2v 2200mah lipo battery that im using for all this. I am also powering the xbee too.

I certainly would not power them from the Arduino 5V line. That goes through a voltage regulator that is not designed to handle that amount of current. I assume (hope) you are using some kind of motor board to actually drive the motors. That should be independently powered, not from the Arduino's 5V line.

[quote author=Nick Gammon link=topic=89212.msg682267#msg682267 date=1328663038] I certainly would not power them from the Arduino 5V line. That goes through a voltage regulator that is not designed to handle that amount of current. I assume (hope) you are using some kind of motor board to actually drive the motors. That should be independently powered, not from the Arduino's 5V line. [/quote] I made a custom shield that i have the digital lines from the arduino tied to then the power from the lipo battery. I have common grounds connected also. Should this work?

Is this different to what you said earlier?

should i just power these servos with the 5v and gnd from the arduino or something else?

Certainly you should have the grounds common. I agree with that. And from the battery I would run a wire to the Arduino's "power in" socket (so it gets voltage regulated). And also direct from the battery to the motor shield.

Sounds OK, subject to seeing a schematic.

[quote author=Nick Gammon link=topic=89212.msg682286#msg682286 date=1328664447] Is this different to what you said earlier?

should i just power these servos with the 5v and gnd from the arduino or something else?

Certainly you should have the grounds common. I agree with that. And from the battery I would run a wire to the Arduino's "power in" socket (so it gets voltage regulated). And also direct from the battery to the motor shield.

Sounds OK, subject to seeing a schematic. [/quote] I believe it should be something like this?

So i fallowed this diagram and it works fine :) one thing with the code is that it is really jumpy and random. The fingers do move when i move mine but there is a weird delay and the servos are pretty much always moving no matter if i flex my hand or not. We are really close!!!

Try increasing the baud rate to 115200 on both sides.

[quote author=Nick Gammon link=topic=89212.msg682322#msg682322 date=1328667361] Try increasing the baud rate to 115200 on both sides. [/quote] hmmm now nothing is happening. It is still receiving though. Do i need to reconfigure the xbees for 115200?

I'd forgotten about them. If you can, yes, if you are talking through them. I found with my robot car that a slow communication rate can make the response to controls a bit sluggish.

For example:

.123,100,92,42,99/

That's 18 bytes. At 9600 baud (960 characters per second) that would take 18.7 mS to send. Maybe the problem is something else.

[quote author=Nick Gammon link=topic=89212.msg682334#msg682334 date=1328668998] I'd forgotten about them. If you can, yes, if you are talking through them. I found with my robot car that a slow communication rate can make the response to controls a bit sluggish.

For example:

.123,100,92,42,99/

That's 18 bytes. At 9600 baud (960 characters per second) that would take 18.7 mS to send. Maybe the problem is something else. [/quote] Could it be the delay? should i change that?

   Serial.print(".");
   Serial.print(servoVal1, DEC);
   Serial.print(",");
   Serial.print(servoVal2, DEC);
   Serial.print(",");
   Serial.print(servoVal3, DEC);
   Serial.print(",");
   Serial.print(servoVal4, DEC);
   Serial.print(",");
   Serial.print(RotationV1, DEC);
   Serial.print("/");
   
   delay(10);

You and your delays! Yes get rid of it unless you want a 10 mS sluggishness.

Also comment-out the debugging prints in the receiving end.

[quote author=Nick Gammon link=topic=89212.msg682348#msg682348 date=1328670957] Also comment-out the debugging prints in the receiving end. [/quote] That did it! perfect!! im going to see if the client wants the feedback system and ill do the code and post it on here

Thank you so much! I will credit you as much as i can! thank you :)