Ahhh…I did disconnect the ground wire. I’m charging up the battery pack and will try it again WITH the ground wire connected.
Thanks,
Phil
Ahhh…I did disconnect the ground wire. I’m charging up the battery pack and will try it again WITH the ground wire connected.
Thanks,
Phil
IT’S ALIVE!
Thanks for your help an patience as I made every rookie mistake without frying the board. Now I have multiple servos moving and can begin working on servo routines.
Thanks again,
Phil
Here’s where the Pololu servo controller has been put to work for now. It will be a week or two until I have the 360 panobot ground version completed.
Thanks for you help,
Phil
Looks very nice, I’d love to see more, like maybe a video when it’s all done.
-Adam
Adam,
Here’s a video of the Pololu micro servo controller board at work. phil007.com/panobot/
I’m trying to adjust the servo speed but the code I entered from above isn’t working for me…what did I do wrong this time! The code below is what I’m using to test the servo speed. The servos continue to run at full speed.
Thanks,
Phil
int panServo;
int tiltServo;
int panDelay = 4500;
int tiltDelay =5000;
void setup()// run once, when the sketch starts
{
Serial.begin(9600);
}
void loop() //Main program loop, executes forever after setup()
{
servoSetSpeed(0,10); // Pan servo speed
put(0,5000); // Pan servo right
delay(panDelay); // Delay
servoSetSpeed(0,50); // Pan servo speed
put(0,4000); // Pan servo right
delay(panDelay); // Delay
servoSetSpeed(0,100); // Pan servo speed
put(0,3000); // Pan servo right
delay(panDelay); // Delay
servoSetSpeed(0,127); // Pan servo speed
put(0,2000); // Pan servo right
delay(panDelay); // Delay
servoSetSpeed(0,127); // Pan servo speed
put(0,5000); // Pan servo right
delay(panDelay); // Delay
delay(10000); // 10 second delay
}
void put(int servo, int angle)
{
//servo is the servo number (typically 0-7)
//angle is the absolute position from 500 to 5500
unsigned char buff[6];
unsigned int temp;
unsigned char pos_hi,pos_low;
//Convert the angle data into two 7-bit bytes
temp=angle&0x1f80;
pos_hi=temp>>7;
pos_low=angle & 0x7f;
//Construct a Pololu Protocol command sentence
buff[0]=0x80; //start byte
buff[1]=0x01; //device id
buff[2]=0x04; //command number
buff[3]=servo; //servo number
buff[4]=pos_hi; //data1
buff[5]=pos_low; //data2
//Send the command to the servo controller
for(int i=0;i<6;i++){
Serial.print(buff[i],BYTE);
}
}
void servoSetSpeed(int servo, int speed){
//servo is the servo number (typically 0-7)
//speed is servo speed (1=fastest, 127=slowest)
//set speed to zero to turn off speed limiting
unsigned char buff[5];
unsigned char speedcmd;
speedcmd=speed&0x7f;//take only lower 7 bits of speed
buff[0]=0x80;//start byte
buff[1]=0x01;//device id
buff[2]=0x01;//command number
buff[3]=servo;//servo number
buff[4]=speed;//data1
for(int i=0;i<5;i++){
Serial.print(buff[i],BYTE);
}
}
Super-cool panorama Phil! I bet a lot of people would be interested in your project just as a way to make such nice panoramas with an ordinary camera. What software did you use to do the stitching?
Anyway, as I said, I rewrite these functions from some Windows code I wrote, and I didn’t actually test my speed function on an Arduino (or otherwise, for which there is no excuse!), and while it does technically work as written, there are a couple of minor things wrong with it.
First off, I do have the speed settings backwards in my comments. 0 is no speed limiting, but 1 is the slowest possible servo motion, with 127 being the fastest. Something to keep in mind is that most servos won’t be able to keep up with the faster speeds anyway. I’m testing this on an old junker Hobbico servo, and it maxes out at about 45, so any setting above 45 just moves at the servo’s max speed.
You’re using those Servo City down-gearing boxes, so your max speed is going to be even lower than with just the servo alone. Maybe in the 1-10 range. Now, you thought you were using the slowest speed, but the last command in your test code loop ends by putting the servo back to 5000 at speed 127, the fastest limited speed possible. When the loop repeats, your first command drives the servo to 5000 at speed 10, which you might actually be able to see, but the servo is already at position 5000 so it doesn’t go anywhere!
I also do a check to clear the highest bit of the input number, just in case you try to put in like 255 or something, but the code as written doesn’t actually use that new variable! Come to think of it, I have a lot of variables declared as integers, when they really only need to be characters, and sending the commands byte by byte the buffers are really unnecessary (It made much more sense to write it this way in Windows). Also, I’m compiling this in Arduino for the first time, and “speed” seems to be some sort of reserved variable name (it turns maroon in the editor). I don’t know what it does, and while it seems to work, I should name it something else just to be on the safe side.
So, the Arduino-safe (and now tested!), and less memory hogging servo control functions would look like this:
void put(unsigned char servo, unsigned int angle){
//servo is the servo number (typically 0-7)
//angle is the absolute position from 500 to 5500
//Send a Pololu Protocol command
Serial.print(0x80,BYTE); //start byte
Serial.print(0x01,BYTE); //device id
Serial.print(0x04,BYTE); //command number
Serial.print(servo,BYTE); //servo number
//Convert the angle data into two 7-bit bytes
Serial.print(((angle>>7)&0x3f),BYTE); //data1
Serial.print((angle&0x7f),BYTE); //data2
}
void servoOff(unsigned char servo){//turns off a servo
//(servo will go limp until next position command)
//servo is the servo number (typically 0-7)
//Send a Pololu Protocol command
Serial.print(0x80,BYTE);//start byte
Serial.print(0x01,BYTE);//device id
Serial.print(0x00,BYTE);//command number
Serial.print(servo,BYTE);//servo number
Serial.print(0x0f,BYTE);//data1 (turn servo off, keep full range)
}
void servoSetSpeed(unsigned char servo, unsigned char speedcmd){
//servo is the servo number (typically 0-7)
//speed is servo speed (1=slowest, 127=fastest)
//set speed to zero to turn off speed limiting
speedcmd=speedcmd&0x7f;//take only lower 7 bits of the speed
//Send a Pololu Protocol command
Serial.print(0x80,BYTE);//start byte
Serial.print(0x01,BYTE);//device id
Serial.print(0x01,BYTE);//command number
Serial.print(servo,BYTE);//servo number
Serial.print(speedcmd,BYTE);//data1
}
I hope Zagrophyte is still watching this thread!
-Adam
P.S. Aptly named, and intentionally or not, Arduino is Italian, and translates as “a little arduous.” Only a little! Actually I’m not sure that it’s proper to apply the -ino suffix to an adjective, like arduo, but it is funny!
Adam,
Thanks again for you quick support. I now have full control over the servo speed.
I used PTGui to stitch the pictures. When I get a little better with stitching the program I’ll fix the errors.
In a few weeks when I get code fine tuned I’ll post a “how to” on building this panobot that will include part sources and code.
Phil
Hello,
I was wondering when we would see your “How To” break down for building the Panobot. I am really interested. I also wanted to know what the black box underneath the Arduino was for.
Thanks
DIY parts list is coming soon, maybe this weekend. The basic code from this tread will get you taking pictures. It could be a month or two until I have anything better.
Number two was completed today.
Phil
Thanks. I will be patiently waiting for the DIY list.
By the way, are you planning on selling these? How much?
It’s a DYI project, Do It Yourself.
Here’s picture of all the parts I used to build my panobot. After clicking on the image you’ll see notes that include descriptions and links.
Who’s going to build the next one?
Phil
Phil,
Thanks so much for the equipment breakdown. You are very generous with your knowledge. I am hoping to build this pretty soon. I currently have the Canon A640 with Canon wide angle lens and adapter. I guess I am gonna have to program the Arduino Diecimila to take a lot more pictures for the spherical pano.
By the way, would it be to much to ask for a wiring diagram. I really would like to know where all the wires go.
Thanks again for your help
Thought I’d chyme in and point out that, although they are awesome and everyone should have one to play with, you don’t actually need a microcontroller (i.e. the Arduino) to command the Pololu serial servo controllers. For example, The Micro Serial Servo Controller has an RS-232 level serial input, so you could cut up a serial cable and command it directly from a computer. You could also use a USB to Serial adapter (RS-232 or TTL level, the only difference is where you make your connections).
There are advantages to doing it either way, just thought you might like to know.
-Adam
For a while now I thought that the Vcc=Vs jumper on the Pololu serial servo controllers connected the servo power to the on-board voltage regulator, so in this case the servo power had to be greater than five volts.
It turns out (thanks Ben!) that this jumper actually bypasses the on-board regulator, and applies the servo power voltage directly to the on-board PIC microcontroller! So, if you’re using one source for both servo and electronics power through the Vcc=Vs jumper, it needs to be less than 5V, not more.
Fortunately for me (and maybe you too) the absolute maximum voltage rating on the PIC16F628A is 6.5v, or none of my servo controllers would be working right now!
So, the correct power options for the serial servo controllers are:
I went through and edited the wrong values wherever I could find them, but I thought I should also add a new post about it to this thread. Sorry about the mix-up!
-Adam
Thanks for the info!!
Hmmm…I’ve been using a 6 cell battery pack like this one and it’s reading 6.65v after some use. I’m sure the voltage reads higher when it comes off the charger.
Now might be a good time to try out the 5 cell pack.
Phil
Glad to hear your servo controller hasn’t started smoking yet!
You can use that same pack for both still, you’ll want to wire it to the servo power pins and the VIN pin (so it will go through the regulator). I don’t imagine it will drop much below 5V while you’re using it, but things might start acting oddly at that point.
-Adam
After the 5 cell pack is charged it reads just over 7v. Would this circuit work without any problems?
Phil
Yeah, that should be just fine. In your pictures it looks like you’re using Hitec servos, and they’re generally good at dealing with higher-than-advertised voltages (plus your batteries will drop really quickly from that just-charged peak as you use them).
-Adam