Here is a basic console C application for testing servos in Windows using Com1 (sorry, I know you said you were using Linux, but it’s a start, the bit-building math should carry over).
-Adam
/*
Pololu Serial Servo Controller
Single Servo Test Program
Adam Borrell
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
HANDLE openPort(int);
void put(int, int);
void servoOff();
HANDLE fd;
void main(int argc, char *parameters[])
{
char input[32];
int il=0,ol=0;
int done=0;
int min=2000, max=4000, step=50, neutral=3000, servoNumb=0;
int ang;
fd=openPort(CBR_19200);
printf("Flipper Flipper\n\n");
printf("Commmands:\n");
printf("A - Increase servo position\n");
printf("Z - Decrease servo position\n");
printf("Q - Send servo to min\n");
printf("W - Send servo to neutral\n");
printf("E - Send servo to max\n");
printf("Spacebar - Emergency Servo Stop (no effect on digital servos)\n");
printf("Backspace - quit\n\n");
if(argc==1){
printf("Argument Format:\n");
printf("Servo Neutral Position 500-5500 (Defualt 3000)\n");
printf("Servo Min Position 500-5500 (Defualt 2000)\n");
printf("Servo Max Position 500-5500 (Defualt 4000)\n");
printf("Servo Step Size (Defualt 50)\n");
printf("Servo Number (Default 0)\n\n");
} else {
if(argc>1){
neutral=atoi(parameters[1]);
}
if(argc>2){
min=atoi(parameters[2]);
}
if(argc>3){
max=atoi(parameters[3]);
}
if(argc>4){
step=atoi(parameters[4]);
}
if(argc>5){
servoNumb=atoi(parameters[5]);
}
}
ang=neutral;
while (!done) {
*input = getch();
switch(*input){
case 32:
servoOff();
printf("Emergency Servo Stop\n");
break;
case 8:
done = 1;
break;
case'a':
if(ang<=(max-step)) ang+=step;
put(servoNumb,ang);
break;
case'z':
if(ang>=(min+step)) ang-=step;
put(servoNumb,ang);
break;
case'q':
ang=min;
put(servoNumb,ang);
break;
case'w':
ang=neutral;
put(servoNumb,ang);
break;
case'e':
ang=max;
put(servoNumb,ang);
break;
default:
break;
}
}
servoOff();
printf("done!\n");
return;
}
void put(int servo, int angle) {
unsigned char buff[6];
DWORD len;
unsigned short int temp;
unsigned char pos_hi,pos_low;
temp=angle & 0x1f80;
pos_hi=temp>>7;
pos_low=angle & 0x7f;
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
WriteFile(fd, &buff, 6, &len, 0);
printf("%s%d\n", "Servo Position ", angle);
return;
}
void servoOff() {
unsigned char buff[6];
DWORD len;
int servo;
buff[0]=0x80;//start byte
buff[1]=0x01;//device id
buff[2]=0x00;//command number
buff[4]=0x0f;//data1
for(servo=0;servo<8;servo++) {
buff[3]=servo;//servo number
WriteFile(fd, &buff, 5, &len, 0);
}
return;
}
HANDLE openPort (int baud) {
HANDLE fd;
COMMTIMEOUTS joy_timeouts = {0,0,0,0,0};
DCB joy_dcb;
fd=CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(fd==INVALID_HANDLE_VALUE) {
fprintf(stderr, "BOO: Could not open COM1 port!\n");
return (HANDLE) -1;
}
if(!GetCommState(fd, &joy_dcb)){
CloseHandle(fd);
fprintf(stderr, "BOO: Could not read COM1 state!\n");
return (HANDLE) -1;
}
joy_dcb.BaudRate=baud;
joy_dcb.ByteSize=8;
joy_dcb.fParity=0;
joy_dcb.Parity=NOPARITY;
joy_dcb.StopBits=ONESTOPBIT;
if(!SetCommState(fd, &joy_dcb)){
CloseHandle(fd);
fprintf(stderr, "ERROR: Could not set COM1 State!\n");
return (HANDLE) -1;
}
if(!SetCommTimeouts(fd, &joy_timeouts)){
CloseHandle(fd);
fprintf(stderr, "ERROR: Could not set COM1 Timeouts!/n");
return (HANDLE) -1;
}
return fd;
}