C programming code that works with Pololu SSC

Hi,

Does anyone have C code that works with the Pololu SSC, either RS232 or TTL serial? My code that worked with other Mini II SSC controllers previously now breaks down with the Pololu, so if there’s a base code that I can start from again that’ll be great. Thanks!

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;
}
1 Like

That’s great example.