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

Committer:
zlmun
Date:
Wed Nov 20 00:50:55 2013 +0000
Revision:
0:6049dd45a7aa
The code is used for control the two servo motors (one general servo and one multi-turn servo)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zlmun 0:6049dd45a7aa 1 #include "mbed.h"
zlmun 0:6049dd45a7aa 2 #include "Servo.h"
zlmun 0:6049dd45a7aa 3
zlmun 0:6049dd45a7aa 4 //DigitalOut led1(LED1);
zlmun 0:6049dd45a7aa 5 //DigitalOut led2(LED2);
zlmun 0:6049dd45a7aa 6 //DigitalOut led3(LED3);
zlmun 0:6049dd45a7aa 7 //DigitalOut led4(LED4);
zlmun 0:6049dd45a7aa 8
zlmun 0:6049dd45a7aa 9 /*
zlmun 0:6049dd45a7aa 10 The arch cookbook in mbed.org website
zlmun 0:6049dd45a7aa 11 http://mbed.org/users/viswesr/notebook/arch-cookbook/
zlmun 0:6049dd45a7aa 12 */
zlmun 0:6049dd45a7aa 13 PwmOut servo(P1_24); //seeedarch pin for the multiturn servo
zlmun 0:6049dd45a7aa 14 Servo rudder(P1_25); //seeedarch pin for the rudder servo
zlmun 0:6049dd45a7aa 15
zlmun 0:6049dd45a7aa 16 Serial bbb(P1_18,P1_17);//seeedarch pin for the UART communication tx, rx
zlmun 0:6049dd45a7aa 17
zlmun 0:6049dd45a7aa 18
zlmun 0:6049dd45a7aa 19 AnalogIn ain(P0_11);//seeedarch analog in pin
zlmun 0:6049dd45a7aa 20
zlmun 0:6049dd45a7aa 21 void servo_initial(void);
zlmun 0:6049dd45a7aa 22 void multiturn_servo(int type, int circle);
zlmun 0:6049dd45a7aa 23
zlmun 0:6049dd45a7aa 24 int main()
zlmun 0:6049dd45a7aa 25 {
zlmun 0:6049dd45a7aa 26 int circle=5;
zlmun 0:6049dd45a7aa 27
zlmun 0:6049dd45a7aa 28 //servo_initial();
zlmun 0:6049dd45a7aa 29 bbb.baud(115200);
zlmun 0:6049dd45a7aa 30 while(~bbb.writeable());
zlmun 0:6049dd45a7aa 31 bbb.putc('s');
zlmun 0:6049dd45a7aa 32 while(1)
zlmun 0:6049dd45a7aa 33 {
zlmun 0:6049dd45a7aa 34 if(bbb.readable()) {
zlmun 0:6049dd45a7aa 35 bbb.putc(bbb.getc()+1);
zlmun 0:6049dd45a7aa 36 }
zlmun 0:6049dd45a7aa 37
zlmun 0:6049dd45a7aa 38 }
zlmun 0:6049dd45a7aa 39
zlmun 0:6049dd45a7aa 40 while(1)
zlmun 0:6049dd45a7aa 41 {
zlmun 0:6049dd45a7aa 42 //Multiturn servo
zlmun 0:6049dd45a7aa 43 multiturn_servo(2,1);//20+10 degree
zlmun 0:6049dd45a7aa 44 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 45 multiturn_servo(2,1);//20+20 degree
zlmun 0:6049dd45a7aa 46 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 47 multiturn_servo(2,1);//50
zlmun 0:6049dd45a7aa 48 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 49 multiturn_servo(2,1);//60
zlmun 0:6049dd45a7aa 50 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 51 multiturn_servo(2,1);//70
zlmun 0:6049dd45a7aa 52 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 53 multiturn_servo(2,1);//80
zlmun 0:6049dd45a7aa 54 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 55
zlmun 0:6049dd45a7aa 56
zlmun 0:6049dd45a7aa 57 //multiturn_servo(1,1);
zlmun 0:6049dd45a7aa 58 multiturn_servo(1,2);
zlmun 0:6049dd45a7aa 59 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 60 multiturn_servo(1,2);
zlmun 0:6049dd45a7aa 61 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 62 multiturn_servo(1,2);
zlmun 0:6049dd45a7aa 63 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 64 multiturn_servo(1,2);
zlmun 0:6049dd45a7aa 65 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 66 multiturn_servo(1,4);
zlmun 0:6049dd45a7aa 67 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 68 multiturn_servo(1,5);
zlmun 0:6049dd45a7aa 69 multiturn_servo(0,10);
zlmun 0:6049dd45a7aa 70 wait(2);
zlmun 0:6049dd45a7aa 71
zlmun 0:6049dd45a7aa 72 //Rudder servo
zlmun 0:6049dd45a7aa 73 rudder.write(0.0);
zlmun 0:6049dd45a7aa 74 wait(0.01);
zlmun 0:6049dd45a7aa 75 wait(2);
zlmun 0:6049dd45a7aa 76 rudder.write(0.5);
zlmun 0:6049dd45a7aa 77 wait(0.01);
zlmun 0:6049dd45a7aa 78 wait(2);
zlmun 0:6049dd45a7aa 79 rudder.write(1.0);
zlmun 0:6049dd45a7aa 80 wait(0.01);
zlmun 0:6049dd45a7aa 81 wait(2);
zlmun 0:6049dd45a7aa 82 }
zlmun 0:6049dd45a7aa 83 }
zlmun 0:6049dd45a7aa 84
zlmun 0:6049dd45a7aa 85 void servo_initial()
zlmun 0:6049dd45a7aa 86 {
zlmun 0:6049dd45a7aa 87 servo.period_ms(22); //multiturn servo requires a 22ms period
zlmun 0:6049dd45a7aa 88 //Initial the position to far end
zlmun 0:6049dd45a7aa 89 multiturn_servo(1,10);
zlmun 0:6049dd45a7aa 90 multiturn_servo(0,20);
zlmun 0:6049dd45a7aa 91 }
zlmun 0:6049dd45a7aa 92
zlmun 0:6049dd45a7aa 93 /*
zlmun 0:6049dd45a7aa 94 Control the multiturn servo to turn or stop it
zlmun 0:6049dd45a7aa 95 To turn the servo clockwise use pulsewidth 1.7 ms
zlmun 0:6049dd45a7aa 96 To turn the servo counter clockwise use pulsewidth 2.0 ms
zlmun 0:6049dd45a7aa 97 To stop the servo use the pulsewidth 10 ms
zlmun 0:6049dd45a7aa 98 */
zlmun 0:6049dd45a7aa 99 void multiturn_servo(int type, int circle)
zlmun 0:6049dd45a7aa 100 {
zlmun 0:6049dd45a7aa 101 float pulse_width=0.0;
zlmun 0:6049dd45a7aa 102 int i;
zlmun 0:6049dd45a7aa 103
zlmun 0:6049dd45a7aa 104 switch(type)
zlmun 0:6049dd45a7aa 105 {
zlmun 0:6049dd45a7aa 106 case 0:
zlmun 0:6049dd45a7aa 107 pulse_width=10.0;//stop
zlmun 0:6049dd45a7aa 108 break;
zlmun 0:6049dd45a7aa 109 case 1:
zlmun 0:6049dd45a7aa 110 pulse_width=1.6;//counter clockwise
zlmun 0:6049dd45a7aa 111 break;
zlmun 0:6049dd45a7aa 112 case 2:
zlmun 0:6049dd45a7aa 113 pulse_width=2.0;//clockwise
zlmun 0:6049dd45a7aa 114 break;
zlmun 0:6049dd45a7aa 115 }
zlmun 0:6049dd45a7aa 116 for(i=0;i<circle;i++)
zlmun 0:6049dd45a7aa 117 {
zlmun 0:6049dd45a7aa 118 servo.pulsewidth_ms(pulse_width); // servo position determined by a pulsewidth between 1-2ms
zlmun 0:6049dd45a7aa 119 wait(0.25);
zlmun 0:6049dd45a7aa 120 }
zlmun 0:6049dd45a7aa 121
zlmun 0:6049dd45a7aa 122 }