Go Down

Topic: controlling servos through serial (Read 1 time) previous topic - next topic

PaulS

Suppose you type "000000101" in the serial monitor, and hit send. How many passes through loop() do you think it takes all that data to arrive?

Way more than you are coding for, that is certain.

Quote
it should be

myservo3.attach(8);

Really?

Costello

...... i keep holding the shift key..... it should be myservo3.attach(8)......... there!!! i feel very proud of myself now

but what was that about it being way more then im coding for?

if i keep out the increment movement and the pressure sensor code, and just have "myservo3.write(n3);" then it works just fine. as sson as i try to add grip control it falls apart.

how do "code" for more? im pretty new to arduino

Costello

.... could you over look the smiley face please. i dont know how to stop it happening, its not the shift key anyway

PaulS

You need to send a packet. That has a (optional) start pf packet marker, and a (required) end of packet marker.

You read serial data, whenever it is available. You append the data to an array if the char/byte read is NOT the end of packet marker. If it is, you use the data in the array.

You do not assume that all the data arrives in one iteration of loop, and you do not use the data in the array until the whole packet arrives.

Here's an example:
Code: [Select]

#define SOP '<'
#define EOP '>'

bool started = false;
bool ended = false;

char inData[80];
byte index;

void setup()
{
   Serial.begin(57600);
   // Other stuff...
}

void loop()
{
  // Read all serial data available, as fast as possible
  while(Serial.available() > 0)
  {
    char inChar = Serial.read();
    if(inChar == SOP)
    {
       index = 0;
       inData[index] = '\0';
       started = true;
       ended = false;
    }
    else if(inChar == EOP)
    {
       ended = true;
       break;
    }
    else
    {
      if(index < 79)
      {
        inData[index] = inChar;
        index++;
        inData[index] = '\0';
      }
    }
  }

  // We are here either because all pending serial
  // data has been read OR because an end of
  // packet marker arrived. Which is it?
  if(started && ended)
  {
    // The end of packet marker arrived. Process the packet

    // Reset for the next packet
    started = false;
    ended = false;
    index = 0;
    inData[index] = '\0';
  }
}

zoomkat

Quote
i dont know how to stop it happening, its not the shift key anyway


Use the # in the post tool bar for a code box. You have been using the quote box tool (put cursor over the tool icon to see what it does). Below is some test code for multiple servos that uses a , as an end of string delimiter. Note that I don't have servos currently to test the code.

Code: [Select]

//zoomkat 11-22-12 simple delimited ',' string parce
//from serial port input (via serial monitor)
//and print result out serial port
//multi servos added

String readString;
#include <Servo.h>
Servo myservoa, myservob, myservoc, myservod;  // create servo object to control a servo

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

  //myservoa.writeMicroseconds(1500); //set initial servo position if desired

  myservoa.attach(6);  //the pin for the servoa control
  myservob.attach(7);  //the pin for the servob control
  myservoc.attach(8);  //the pin for the servoc control
  myservod.attach(9);  //the pin for the servod control
  Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded
}

void loop() {

  //expect single strings like 700a, or 1500c, or 2000d,
  //or like 30c, or 90a, or 180d,
  //or 30c,180b,70a,120d,

  if (Serial.available())  {
    char c = Serial.read();  //gets one byte from serial buffer
    if (c == ',') {
      if (readString.length() >1) {
        Serial.println(readString); //prints string to serial port out

        int n = readString.toInt();  //convert readString into a number

        // auto select appropriate value, copied from someone elses code.
        if(n >= 500)
        {
          Serial.print("writing Microseconds: ");
          Serial.println(n);
          if(readString.indexOf('a') >0) myservoa.writeMicroseconds(n);
          if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
          if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
          if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
        }
        else
        {   
          Serial.print("writing Angle: ");
          Serial.println(n);
          if(readString.indexOf('a') >0) myservoa.write(n);
          if(readString.indexOf('b') >0) myservob.write(n);
          if(readString.indexOf('c') >0) myservoc.write(n);
          if(readString.indexOf('d') >0) myservod.write(n);
        }
         readString=""; //clears variable for new input
      }
    } 
    else {     
      readString += c; //makes the string readString
    }
  }
}

Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

Go Up