The code will follow. I have one servo that runs through serial communication. When I enter a "1" the servo moves to 90 degrees, when I enter a "0" the servo returns to 0 degrees. It's pretty simple.
I am having a difficult time getting an additional 3 servo's to operate in conjunction with the first servo. I have added the addition servo's to pins 5,6,7,8 and would like them to move like the single servo does when I enter 1111 into serial monitor. Also, if I enter 0000 I would like them all to return.
But, I guess the hard part I am having is figuring out when I enter 1100 how to make the first and second servo move to 90 degrees and the third and forth to move to 0 degrees. These aren't all the four digit combinations I am using. I am using all variations of four digital 1s, and 0s.
Also, I do not think I attached the servo's property in the code to do this. I do not understand how to add them in properly.
#include <Servo.h>
Servo myservo; // Create servo object to control a servo
char readstr[4]; // Character Array to store the serial input
int cstrpos = 0; // Variable to store the current input array position
long val = 0; // variable to store the value from the input
int maxValue = 0; //The "0" value causes the servo to return to Zero degrees when a "0" is input into the serial monitor.
void setup()
{
Serial.begin(9600); // Startup the Serial Interface
myservo.attach(5); // Attaches the servo on pin 5 to the servo object
myservo.attach(6);
myservo.attach(7);
myservo.attach(8);
}
void loop()
{
char ch; //A Place to Store the character we just read
if (Serial.available()) // is there anything to be read from serial port?
{
ch = Serial.read(); // read a single character
// print out to serial port the character we received (similar to an echo)
Serial.print(ch);
if (ch >= '0' && ch <= '1') // Number so store it in the input array. Note that if any other than 1 or 0 is pressed, nothing will happen. 1 is to go to 90, 0 is to return.
// This number can be change from 0-9 and will always go to 90 degrees because that is the degrees set below.
{
readstr[cstrpos] = ch; // Add the read character to the array of read numbers
++cstrpos; // Increase the position in the array
}
else // not a number so lets set the position of the servo
{
readstr[cstrpos] = '\0'; // Add a null to the end of the string array to terminate the string
val = atol(readstr); // Convert the string to a long int
if (val > maxValue) {
val = 90; //A value of 90 is the degrees in which the servo will stop. In this case, the servo will stop at 90 degrees.
}
cstrpos = 0; // Reset the array position back to the beginning so the next input starts a new input
//Print to the serial port what we are going to do
Serial.print("Servo set to: ");
Serial.println(val);
Serial.println("");
}
}
// The servo needs constant feed of values so we constantly output the PWM value
myservo.write(val); // Set the PWM value to send to the servo
delay(15);
}
But, I guess the hard part I am having is figuring out when I enter 1100 how to make the first and second servo move to 90 degrees and the third and forth to move to 0 degrees. These aren't all the four digit combinations I am using. I am using all variations of four digital 1s, and 0s.
So you need an array to store the 4 bytes. As serial data comes in, put it in the array. If it's a new line, it's time to process the data. Loop through each item in the buffer and set the proper degrees based on the value.
Also, I do not think I attached the servo's property in the code to do this. I do not understand how to add them in properly.
All you've done is create a single servo object, and re-attach different pins to the single servo. You need an array of servos, and an array of pins.
//zoomkat 11-22-12 simple delimited ',' string parse
//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 combined like 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
}
}
}
Thanks for posting this test code. I gave it a go and it seems to be working properly in the serial monitor but the servo's themselves are not actually moving. I think I have to modify it a bit. I may just start completely from scratch, this is getting to be frustrating. I'm going to go back and try to make it work with an Array like suggested earlier. I'll make a new post when that part is done and working, before I attempt part 2 (getting the Uno to read 1,1,0,0, from an SD card and actually making the servos to move).
What external power source are you using to power these servos?
There are four micro servo's and they are powered by a four AA battery pack totaling 6V.
So have you tried just creating the four servo objects with the four separate pins, and just move them all at the same time to make sure the wiring/power isn't an issue, and not worrying about Serial communication for now?
So have you tried just creating the four servo objects with the four separate pins, and just move them all at the same time to make sure the wiring/power isn't an issue, and not worrying about Serial communication for now?
Yes, I have tried this. They all seem to function correctly.
So have you tried just creating the four servo objects with the four separate pins, and just move them all at the same time to make sure the wiring/power isn't an issue, and not worrying about Serial communication for now?
Yes, I have tried this. They all seem to function correctly.
Well unfortunately, Zoomkat is the only regular I have seen that regularly recommends serial communications using the String object, so you might have to wait for him/her to reply. It would probably be a good idea, to post whatever the updated code is that is still not working.