Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@4:ece7bfb06944, 2018-11-28 (annotated)
- Committer:
- drewrobinson
- Date:
- Wed Nov 28 21:12:14 2018 +0000
- Revision:
- 4:ece7bfb06944
- Parent:
- 3:010fde11bfad
ACTUAL FINAL RUDDER
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| LukeMar | 0:8ed926c84e2f | 1 | /* |
| LukeMar | 0:8ed926c84e2f | 2 | Test for manual control thread |
| LukeMar | 0:8ed926c84e2f | 3 | Spektrum receiver simple test |
| LukeMar | 0:8ed926c84e2f | 4 | |
| LukeMar | 0:8ed926c84e2f | 5 | range on transmitter is 344-1564 |
| LukeMar | 0:8ed926c84e2f | 6 | to correspond to rudder angle of 90-270 |
| LukeMar | 0:8ed926c84e2f | 7 | current eqn to convert RC output is |
| LukeMar | 0:8ed926c84e2f | 8 | |
| LukeMar | 0:8ed926c84e2f | 9 | (IN/6.77)+39.19 |
| LukeMar | 0:8ed926c84e2f | 10 | |
| LukeMar | 0:8ed926c84e2f | 11 | NB: The specification for Spektrum Remote Receiver Interfacing, |
| LukeMar | 0:8ed926c84e2f | 12 | rev A, 12 Apr 2016, has a note about servo position ranges: |
| LukeMar | 0:8ed926c84e2f | 13 | "A full range of servo position data ranges from 0-1024 or 0-2045 depending |
| LukeMar | 0:8ed926c84e2f | 14 | on the bind type. These limits are equivalent to a +/-150% travel setting |
| LukeMar | 0:8ed926c84e2f | 15 | in AirWare. This full range translates to a range of 1194us which when |
| LukeMar | 0:8ed926c84e2f | 16 | applied to a pwm servo signal equals 903-2097us. At +/-100% travel, the |
| LukeMar | 0:8ed926c84e2f | 17 | data range is equivalent to a servo position data range of approximately |
| LukeMar | 0:8ed926c84e2f | 18 | 341 to 1707 which translated to pwm equals 1102 us to 1898 us." |
| LukeMar | 0:8ed926c84e2f | 19 | */ |
| LukeMar | 0:8ed926c84e2f | 20 | |
| LukeMar | 0:8ed926c84e2f | 21 | #include "mbed.h" |
| LukeMar | 0:8ed926c84e2f | 22 | //#include "rtos.h" |
| LukeMar | 0:8ed926c84e2f | 23 | #include "Spektrum.h" |
| LukeMar | 0:8ed926c84e2f | 24 | #include "unity.h" |
| LukeMar | 0:8ed926c84e2f | 25 | //****RC control universal variables**** |
| LukeMar | 0:8ed926c84e2f | 26 | Serial pc(USBTX, USBRX, 115200); |
| LukeMar | 0:8ed926c84e2f | 27 | Spektrum rx(p13, p14); |
| LukeMar | 0:8ed926c84e2f | 28 | char c; |
| LukeMar | 0:8ed926c84e2f | 29 | int i; |
| LukeMar | 0:8ed926c84e2f | 30 | int j; |
| LukeMar | 0:8ed926c84e2f | 31 | float now; |
| LukeMar | 0:8ed926c84e2f | 32 | //***Stepper Motor universal variables*** |
| LukeMar | 1:9e727d54e80c | 33 | AnalogIn r_ain(p18); |
| LukeMar | 1:9e727d54e80c | 34 | PwmOut rudder( p22 ); |
| LukeMar | 1:9e727d54e80c | 35 | DigitalOut r_dir( p21 ); |
| LukeMar | 1:9e727d54e80c | 36 | DigitalOut r_I(p23); |
| LukeMar | 1:9e727d54e80c | 37 | DigitalOut r_slp(p30); //sleep |
| drewrobinson | 3:010fde11bfad | 38 | DigitalOut slp(p29); |
| LukeMar | 2:f5c2fa19497b | 39 | DigitalOut led(LED1); |
| LukeMar | 2:f5c2fa19497b | 40 | float r_ang; |
| LukeMar | 2:f5c2fa19497b | 41 | float r_pos; |
| LukeMar | 1:9e727d54e80c | 42 | float RC_1; |
| LukeMar | 0:8ed926c84e2f | 43 | |
| LukeMar | 0:8ed926c84e2f | 44 | //**get position** |
| LukeMar | 1:9e727d54e80c | 45 | float posr(); |
| LukeMar | 0:8ed926c84e2f | 46 | |
| LukeMar | 0:8ed926c84e2f | 47 | |
| LukeMar | 0:8ed926c84e2f | 48 | int main(void) |
| LukeMar | 0:8ed926c84e2f | 49 | { |
| LukeMar | 2:f5c2fa19497b | 50 | |
| drewrobinson | 3:010fde11bfad | 51 | r_I=0; //sets for 1.5amp output |
| drewrobinson | 3:010fde11bfad | 52 | rudder.period(.001); //sets the pulse width modulation period |
| drewrobinson | 3:010fde11bfad | 53 | rudder.pulsewidth(0); |
| drewrobinson | 3:010fde11bfad | 54 | slp = 0; |
| drewrobinson | 3:010fde11bfad | 55 | r_slp = 0; //sstarts the current driver in off state |
| LukeMar | 2:f5c2fa19497b | 56 | wait(10); |
| LukeMar | 2:f5c2fa19497b | 57 | led = 1; //indicate that the wait period is over |
| LukeMar | 2:f5c2fa19497b | 58 | |
| LukeMar | 0:8ed926c84e2f | 59 | // loop |
| LukeMar | 0:8ed926c84e2f | 60 | while(1) { |
| LukeMar | 0:8ed926c84e2f | 61 | //now = rtos::Kernel::get_ms_count(); |
| LukeMar | 0:8ed926c84e2f | 62 | //***JUST ADDED stepper code |
| LukeMar | 0:8ed926c84e2f | 63 | |
| LukeMar | 0:8ed926c84e2f | 64 | if (rx.valid) { |
| LukeMar | 2:f5c2fa19497b | 65 | RC_1 = rx.channel[1]; |
| drewrobinson | 3:010fde11bfad | 66 | //pc.printf(" rc: %f\n",rx.channel[0]); |
| LukeMar | 0:8ed926c84e2f | 67 | } else { |
| drewrobinson | 3:010fde11bfad | 68 | //pc.printf(" invalid\r\n"); |
| LukeMar | 1:9e727d54e80c | 69 | r_slp = 0; |
| LukeMar | 0:8ed926c84e2f | 70 | } |
| LukeMar | 0:8ed926c84e2f | 71 | //39.19 |
| drewrobinson | 3:010fde11bfad | 72 | r_ang = (RC_1/6.77)-5.0; |
| LukeMar | 0:8ed926c84e2f | 73 | |
| LukeMar | 1:9e727d54e80c | 74 | r_pos = (r_ain-.108)/.002466; |
| drewrobinson | 3:010fde11bfad | 75 | pc.printf(" %.3f\r\n",r_pos); |
| LukeMar | 0:8ed926c84e2f | 76 | //pc.printf(" %.3f\n",); |
| LukeMar | 1:9e727d54e80c | 77 | if((r_pos > (r_ang-3.0)) && (r_pos < (r_ang+3.0))) { |
| LukeMar | 1:9e727d54e80c | 78 | rudder.pulsewidth(0); |
| LukeMar | 1:9e727d54e80c | 79 | r_slp = 0; |
| LukeMar | 0:8ed926c84e2f | 80 | } |
| drewrobinson | 3:010fde11bfad | 81 | if( (r_pos > (r_ang+3.0)) && r_pos < 235.0) { |
| LukeMar | 1:9e727d54e80c | 82 | r_slp = 1; |
| LukeMar | 1:9e727d54e80c | 83 | r_dir = 1; //left?? |
| LukeMar | 1:9e727d54e80c | 84 | rudder.pulsewidth(.0005); |
| drewrobinson | 3:010fde11bfad | 85 | //pc.printf("pos: %.3f\n",r_pos); |
| drewrobinson | 4:ece7bfb06944 | 86 | Thread::wait(10); |
| LukeMar | 1:9e727d54e80c | 87 | r_pos = posr(); |
| LukeMar | 0:8ed926c84e2f | 88 | }//if pos |
| drewrobinson | 3:010fde11bfad | 89 | if((r_pos < (r_ang-3.0)) && r_pos > 55.0) { |
| LukeMar | 1:9e727d54e80c | 90 | r_slp = 1; |
| LukeMar | 1:9e727d54e80c | 91 | r_dir = 0; //right?? |
| LukeMar | 1:9e727d54e80c | 92 | rudder.pulsewidth(.0005); |
| drewrobinson | 3:010fde11bfad | 93 | //pc.printf("pos: %.3f\n",r_pos); |
| drewrobinson | 4:ece7bfb06944 | 94 | Thread::wait(10); |
| LukeMar | 1:9e727d54e80c | 95 | r_pos = posr(); |
| LukeMar | 0:8ed926c84e2f | 96 | } |
| drewrobinson | 3:010fde11bfad | 97 | if(r_pos > 210.0){ |
| drewrobinson | 3:010fde11bfad | 98 | r_slp = 1; |
| drewrobinson | 3:010fde11bfad | 99 | while(r_pos > 210.0) { |
| drewrobinson | 3:010fde11bfad | 100 | r_dir = 1; //right?? |
| drewrobinson | 3:010fde11bfad | 101 | rudder.pulsewidth(.0005); |
| drewrobinson | 3:010fde11bfad | 102 | //pc.printf("pos: %.3f\n",r_pos); |
| drewrobinson | 3:010fde11bfad | 103 | r_pos = posr(); |
| drewrobinson | 3:010fde11bfad | 104 | }//while |
| drewrobinson | 3:010fde11bfad | 105 | }//if |
| drewrobinson | 3:010fde11bfad | 106 | if(r_pos <80.0){ |
| drewrobinson | 3:010fde11bfad | 107 | r_slp = 1; |
| drewrobinson | 3:010fde11bfad | 108 | while(r_pos < 80.0) { |
| drewrobinson | 3:010fde11bfad | 109 | r_dir = 0; //right?? |
| drewrobinson | 3:010fde11bfad | 110 | rudder.pulsewidth(.0005); |
| drewrobinson | 3:010fde11bfad | 111 | //pc.printf("pos: %.3f\n",r_pos); |
| drewrobinson | 3:010fde11bfad | 112 | r_pos = posr(); |
| drewrobinson | 3:010fde11bfad | 113 | }//while |
| drewrobinson | 3:010fde11bfad | 114 | }//if |
| drewrobinson | 3:010fde11bfad | 115 | |
| LukeMar | 0:8ed926c84e2f | 116 | //***END OF JUST ADDED |
| LukeMar | 0:8ed926c84e2f | 117 | ThisThread::sleep_until(121); |
| LukeMar | 0:8ed926c84e2f | 118 | }//while(1) |
| LukeMar | 0:8ed926c84e2f | 119 | } // main() for TESTS/receiver/simple |
| LukeMar | 0:8ed926c84e2f | 120 | |
| LukeMar | 0:8ed926c84e2f | 121 | |
| LukeMar | 0:8ed926c84e2f | 122 | |
| LukeMar | 1:9e727d54e80c | 123 | float posr() |
| LukeMar | 0:8ed926c84e2f | 124 | { |
| LukeMar | 1:9e727d54e80c | 125 | float r1; |
| LukeMar | 1:9e727d54e80c | 126 | float r2; |
| LukeMar | 1:9e727d54e80c | 127 | float r3; |
| LukeMar | 1:9e727d54e80c | 128 | r1 = (r_ain-.108)/.002466; |
| LukeMar | 1:9e727d54e80c | 129 | r2 = (r_ain-.108)/.002466; |
| LukeMar | 1:9e727d54e80c | 130 | r3 = (r_ain-.108)/.002466; |
| LukeMar | 1:9e727d54e80c | 131 | return (r1+r2+r3)/3.0; |
| LukeMar | 0:8ed926c84e2f | 132 | } |