Show Posts
Pages: 1 [2] 3 4 ... 13
16  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 07, 2012, 04:54:45 pm
On the receiving end, what do the serial prints show?
This is a small bit of what i get.
Code:
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.
17  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 07, 2012, 04:23:26 pm
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?
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:
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);
}
18  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 07, 2012, 04:08:56 pm
Can you explain to me in your own words what you think the flash() function does? Here, I'll reproduce it:

Code:
void flash ()
  {
  digitalWrite (LED, HIGH);
  digitalWrite (LED, LOW);
  }  // end of flash

Once you have told me what it does, can you tell me if your program needs it to do that or not?
It just slows it down so you can get all 5 values at the same time. Because i am using 9600 i believe i do. This is just what i understood from the pictures a few pages back and your website.
19  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 07, 2012, 03:15:05 pm
So luckily i was reading this over and i saw that there was more code that you posted. code doesnt seem to be very mobile friendly.

It was indeed lucky that you read the code I posted. Otherwise my time would have been wasted.
Do I still use that flash function if im sending at 9600? Does the code look like it has everything there?
20  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 04, 2012, 01:05:11 am
So luckily i was reading this over and i saw that there was more code that you posted. code doesnt seem to be very mobile friendly.

It was indeed lucky that you read the code I posted. Otherwise my time would have been wasted.
So does everything look good in that code then? It's still not working :/ the receiving LED comes on but in the serial monitor of the receiving side there is nothing.
21  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 03, 2012, 11:26:55 pm
This works with what I presume is your data:

Code:
/*

Author: Nick Gammon
Date:   2nd February 2012

 example input: .123,100,92,42,99/

*/

// how much serial data we expect before a terminator
const unsigned int MAX_INPUT = 100;
const char TERMINATOR = '/';
const char STARTER = '.';

void setup ()
{
  Serial.begin(115200);
} // end of setup

int middle, thumb, ring, pointer, rotation;

// here to process incoming serial data after a terminator received
void process_data (char * data)
  {

  // convert strings into numbers:

  middle = atoi (strtok (data, ","));
  thumb = atoi (strtok (NULL, ","));
  ring = atoi (strtok (NULL, ","));
  pointer = atoi (strtok (NULL, ","));
  rotation = atoi (strtok (NULL, ","));
 
// control the servos here!

// for now I am displaying what I got ...

  Serial.print ("middle = ");
  Serial.println (middle);
  Serial.print ("thumb = ");
  Serial.println (thumb);
  Serial.print ("ring = ");
  Serial.println (ring);
  Serial.print ("pointer = ");
  Serial.println (pointer);
  Serial.print ("rotation = ");
  Serial.println (rotation);
 
  }  // end of process_data
 

void loop()
{
static char input_line [MAX_INPUT];
static unsigned int input_pos = 0;

  if (Serial.available () > 0)
    {
    char inByte = Serial.read ();

    switch (inByte)
      {

      case TERMINATOR:   // end of text
        input_line [input_pos] = 0;  // terminating null byte
       
        // terminator reached! process input_line here ...
        process_data (input_line);
       
        // reset buffer for next time
        input_pos = 0; 
        break;
 
      case STARTER: 
        // reset buffer
        input_pos = 0;       
        break;
 
      default:
        // keep adding if not full ... allow for terminating null byte
        if (input_pos < (MAX_INPUT - 1))
          input_line [input_pos++] = inByte;
        break;

      }  // end of switch

  }  // end of incoming data

  // do other stuff here like testing digital input (button presses) ...

}  // end of loop

Quote
  if (Serial.available () > 0)            **change this to something like:  if (Serial.available () > smiley-cool because there are 9 characters **

No. It gets a byte at a time. That's the WHOLE idea.

Quote
    char inByte = Serial.read ();              **times this by 9? **

No. It adds to a buffer. You don't do 9 reads. How do you know it is 9? How do you know in advance if you are getting 1-digit, 2-digit, 3-digit numbers? Try to think through what you are sending.
So luckily i was reading this over and i saw that there was more code that you posted. code doesnt seem to be very mobile friendly. I added in the servo part and everything. does this look good? do i need the flash(); function if im going to send at 9600?
Code:
#include <Servo.h>

Servo myservo1;  // create servo object to control a servo
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;

// how much serial data we expect before a terminator
const unsigned int MAX_INPUT = 100;
const char TERMINATOR = '/';
const char STARTER = '.';

void setup ()
{
  Serial.begin(9600);
 
   myservo1.attach(2); //middle
   myservo2.attach(3); //thumb
   myservo3.attach(4); //ring
   myservo4.attach(5); //pinky
   myservo5.attach(6); //pointer
   myservo7.attach(7); //swivel
} // end of setup

int middle, thumb, ring, pointer, rotation;

// here to process incoming serial data after a terminator received
void process_data (char * data)
  {

  // convert strings into numbers:

  middle = atoi (strtok (data, ","));
  thumb = atoi (strtok (NULL, ","));
  ring = atoi (strtok (NULL, ","));
  pointer = atoi (strtok (NULL, ","));
  rotation = atoi (strtok (NULL, ","));
 
    myservo1.write(middle);
    myservo2.write(thumb);
    myservo3.write(ring);
    myservo4.write(ring);
    myservo5.write(pointer);
    myservo7.write(rotation);

// for now I am displaying what I got ...

  Serial.print ("middle = ");
  Serial.println (middle);
  Serial.print ("thumb = ");
  Serial.println (thumb);
  Serial.print ("ring = ");
  Serial.println (ring);
  Serial.print ("pointer = ");
  Serial.println (pointer);
  Serial.print ("rotation = ");
  Serial.println (rotation);
 
  }  // end of process_data
 

void loop()
{
static char input_line [MAX_INPUT];
static unsigned int input_pos = 0;

  if (Serial.available () > 0)
    {
    char inByte = Serial.read ();

    switch (inByte)
      {

      case TERMINATOR:   // end of text
        input_line [input_pos] = 0;  // terminating null byte
       
        // terminator reached! process input_line here ...
        process_data (input_line);
       
        // reset buffer for next time
        input_pos = 0; 
        break;
 
      case STARTER: 
        // reset buffer
        input_pos = 0;       
        break;
 
      default:
        // keep adding if not full ... allow for terminating null byte
        if (input_pos < (MAX_INPUT - 1))
          input_line [input_pos++] = inByte;
        break;

      }  // end of switch

  }  // end of incoming data

  // do other stuff here like testing digital input (button presses) ...

}  // end of loop
22  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 03, 2012, 06:19:58 pm
This works with what I presume is your data:

Code:
/*

Author: Nick Gammon
Date:   2nd February 2012

 example input: .123,100,92,42,99/

*/

// how much serial data we expect before a terminator
const unsigned int MAX_INPUT = 100;
const char TERMINATOR = '/';
const char STARTER = '.';

void setup ()
{
  Serial.begin(115200);
} // end of setup

int middle, thumb, ring, pointer, rotation;

// here to process incoming serial data after a terminator received
void process_data (char * data)
  {

  // convert strings into numbers:

  middle = atoi (strtok (data, ","));
  thumb = atoi (strtok (NULL, ","));
  ring = atoi (strtok (NULL, ","));
  pointer = atoi (strtok (NULL, ","));
  rotation = atoi (strtok (NULL, ","));
 
// control the servos here!

// for now I am displaying what I got ...

  Serial.print ("middle = ");
  Serial.println (middle);
  Serial.print ("thumb = ");
  Serial.println (thumb);
  Serial.print ("ring = ");
  Serial.println (ring);
  Serial.print ("pointer = ");
  Serial.println (pointer);
  Serial.print ("rotation = ");
  Serial.println (rotation);
 
  }  // end of process_data
 

void loop()
{
static char input_line [MAX_INPUT];
static unsigned int input_pos = 0;

  if (Serial.available () > 0)
    {
    char inByte = Serial.read ();

    switch (inByte)
      {

      case TERMINATOR:   // end of text
        input_line [input_pos] = 0;  // terminating null byte
       
        // terminator reached! process input_line here ...
        process_data (input_line);
       
        // reset buffer for next time
        input_pos = 0; 
        break;
 
      case STARTER: 
        // reset buffer
        input_pos = 0;       
        break;
 
      default:
        // keep adding if not full ... allow for terminating null byte
        if (input_pos < (MAX_INPUT - 1))
          input_line [input_pos++] = inByte;
        break;

      }  // end of switch

  }  // end of incoming data

  // do other stuff here like testing digital input (button presses) ...

}  // end of loop

Quote
  if (Serial.available () > 0)            **change this to something like:  if (Serial.available () > smiley-cool because there are 9 characters **

No. It gets a byte at a time. That's the WHOLE idea.

Quote
    char inByte = Serial.read ();              **times this by 9? **

No. It adds to a buffer. You don't do 9 reads. How do you know it is 9? How do you know in advance if you are getting 1-digit, 2-digit, 3-digit numbers? Try to think through what you are sending.
Alright. So do i even need to send the commas? So i am sending 5 sensor values, once it reads those it store them in a buffer? but then how do i access them and move the servos with them?
23  Using Arduino / Programming Questions / Re: Wireless control system problem on: February 01, 2012, 11:45:36 pm
The link I gave you about 2 or 3 pages back now, more than once, shows how to put text into a buffer. You are choosing to ignore the methods shown there, which I put there to teach people how to do this, and sticking with your code, which we have said won't work. The top part of that page. Where it says "Buffering input".
So help me understand this

Do i go something like this?
Code:
const unsigned int MAX_INPUT = 50;

void setup ()
{
  Serial.begin(9600);
} // end of setup

// here to process incoming serial data after a terminator received
void process_data (char * data)
  {
  // for now just display it
  Serial.println (data);
  }  // end of process_data
 

void loop()
{
static char input_line [MAX_INPUT];
static unsigned int input_pos = 0;

  if (Serial.available () > 0)            **change this to something like:  if (Serial.available () > 8) because there are 9 characters **
    {
    char inByte = Serial.read ();              **times this by 9? **

    switch (inByte)
      {

      case '\n':   // end of text
        input_line [input_pos] = 0;  // terminating null byte
       
        // terminator reached! process input_line here ...  **Have the  char inByte's control the servos here? **
        process_data (input_line);
       
        // reset buffer for next time
        input_pos = 0; 
        break;
 
      case '\r':   // discard carriage return
        break;
 
      default:
        // keep adding if not full ... allow for terminating null byte
        if (input_pos < (MAX_INPUT - 1))
          input_line [input_pos++] = inByte;
        break;

      }  // end of switch

  }  // end of incoming data

  // do other stuff here like testing digital input (button presses) ...

}  // end of loop
Do i need to add more to anything else to this? Also would it be good to add that flash(); function to read the better for this too?
24  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 30, 2012, 10:35:41 pm
Capture the whole lot into a buffer.
So i have this now:

Code:
...
   vals[0] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[1] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[2] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[3] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[4] = Serial.read();
   flash ();
...


I don't think you are paying the slightest bit of attention to what I am saying. You look at the page, grab a bit of code, stick it in, and hope for the best. What is the "flash ()" for?

What you are doing there is not putting the incoming text into a buffer, as I have recommended about three or four times now.
I guess im just unsure how to but the incoming text into a buffer. Im new at coding and come here for help. I thank you so much for putting effort in trying to teach and help! I just need to understand a bit more. How would i put the incoming text into a buffer?

Thank you again!
25  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 30, 2012, 10:33:53 pm
Why are you still calling Serial.read(), and throwing away the character read?

He's getting rid of what he hopes, without any justification whatsoever, is a comma.
So i do want to keep the Serial.read() to get rid of the comma?
26  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 28, 2012, 09:36:40 pm
Quote
Doesnt this store it?
Yes.

This, on the other hand, throws it away:
Code:
   Serial.read();
So i get rid of those. Separate it at the commas and convert them?
27  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 28, 2012, 09:18:26 pm
Quote
How am i throwing away the character read?
You call Serial.read() to get the next value in the buffer. If you don't store the value, what do you think happens to it?
Doesnt this store it?
Code:
vals[4] = Serial.read();
So im waiting until i have all 5 values then im moving the servos with them right?
28  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 28, 2012, 09:10:15 pm
Why are you still calling Serial.read(), and throwing away the character read?
oh so i dont need the Serial.read(), i used it to get rid of the comma. How am i throwing away the character read?
29  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 28, 2012, 09:00:16 pm
Capture the whole lot into a buffer. You could look for a terminating "/" character, since that is what you are sending.

There's an example of doing that here: http://gammon.com.au/serial

Then you could use strtok to break the resulting string apart at the commas, and use atoi to convert the ASCII strings into numbers you can send to the servos.
So i have this now:

Code:
void loop()
{

   while((char)Serial.read() !='.');
   
   if (Serial.available() >8)
   {
   
   vals[0] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[1] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[2] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[3] = Serial.read();
   flash ();
   Serial.read();
   flash ();
   
   vals[4] = Serial.read();
   flash ();
   }
   while((char)Serial.read() !='/')
   {
    myservo1.write(vals[0]);
    myservo2.write(vals[1]);
    myservo3.write(vals[2]);
    myservo4.write(vals[2]);
    myservo5.write(vals[3]);
    myservo7.write(vals[4]);
   }

Whats the easiest way to use atoi and strok with this?
30  Using Arduino / Programming Questions / Re: Wireless control system problem on: January 28, 2012, 08:47:55 pm
Capture the whole lot into a buffer. You could look for a terminating "/" character, since that is what you are sending.

There's an example of doing that here: http://gammon.com.au/serial

Then you could use strtok to break the resulting string apart at the commas, and use atoi to convert the ASCII strings into numbers you can send to the servos.
Ahh didn't scroll all the way to the bottom smiley
Pages: 1 [2] 3 4 ... 13