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.
main.cpp@0:6049dd45a7aa, 2013-11-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |