This program uses SeeedArch to control the two servo motors of a small sailboat. One is general servo (rudder), and the other one is the multi-turn servo.

Dependencies:   Servo mbed

main.cpp

Committer:
zlmun
Date:
2013-11-20
Revision:
0:6049dd45a7aa

File content as of revision 0:6049dd45a7aa:

#include "mbed.h"
#include "Servo.h"

//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
//DigitalOut led3(LED3);
//DigitalOut led4(LED4);

/*
The arch cookbook in mbed.org website
    http://mbed.org/users/viswesr/notebook/arch-cookbook/
*/
PwmOut servo(P1_24);    //seeedarch pin for the multiturn servo
Servo rudder(P1_25);    //seeedarch pin for the rudder servo

Serial bbb(P1_18,P1_17);//seeedarch pin for the UART communication tx, rx


AnalogIn ain(P0_11);//seeedarch analog in pin

void servo_initial(void);
void multiturn_servo(int type, int circle);

int main() 
{
    int circle=5;
    
    //servo_initial();
    bbb.baud(115200);
    while(~bbb.writeable());
    bbb.putc('s');
    while(1)
    {
         if(bbb.readable()) {
            bbb.putc(bbb.getc()+1);
        }    

    }
  
    while(1)
    {
        //Multiturn servo
        multiturn_servo(2,1);//20+10 degree
        multiturn_servo(0,10);
        multiturn_servo(2,1);//20+20 degree
        multiturn_servo(0,10);
        multiturn_servo(2,1);//50
        multiturn_servo(0,10);
        multiturn_servo(2,1);//60
        multiturn_servo(0,10);
        multiturn_servo(2,1);//70
        multiturn_servo(0,10);
        multiturn_servo(2,1);//80
        multiturn_servo(0,10); 
        
        
        //multiturn_servo(1,1);
        multiturn_servo(1,2);
        multiturn_servo(0,10);
        multiturn_servo(1,2);
        multiturn_servo(0,10);
        multiturn_servo(1,2);
        multiturn_servo(0,10);
        multiturn_servo(1,2);
        multiturn_servo(0,10);
        multiturn_servo(1,4);
        multiturn_servo(0,10);
        multiturn_servo(1,5);
        multiturn_servo(0,10);
        wait(2);
        
        //Rudder servo
        rudder.write(0.0);
        wait(0.01);
        wait(2);
        rudder.write(0.5);
        wait(0.01);
        wait(2);
        rudder.write(1.0);
        wait(0.01);
        wait(2);
     }      
}

void servo_initial()
{
        servo.period_ms(22);          //multiturn servo requires a 22ms period
        //Initial the position to far end
        multiturn_servo(1,10);
        multiturn_servo(0,20);
}

/*
    Control the multiturn servo to turn or stop it
    To turn the servo clockwise use pulsewidth 1.7 ms
    To turn the servo counter clockwise use pulsewidth 2.0 ms
    To stop the servo use the pulsewidth 10 ms
*/
void multiturn_servo(int type, int circle)
{
    float pulse_width=0.0;
    int i;
    
    switch(type)
    {
        case 0:
            pulse_width=10.0;//stop
            break;
        case 1:
            pulse_width=1.6;//counter clockwise
            break;
        case 2:
            pulse_width=2.0;//clockwise
            break;
    }
    for(i=0;i<circle;i++)
    {
        servo.pulsewidth_ms(pulse_width); // servo position determined by a pulsewidth between 1-2ms
        wait(0.25);
    }   

}