Drew Robinson / Mbed 2 deprecated sailbot_MAST3

Dependencies:   mbed

Committer:
drewrobinson
Date:
Wed Nov 28 21:00:21 2018 +0000
Revision:
2:2195a4abdf8c
Parent:
1:e2865ed633bb
best mast to date

Who changed what in which revision?

UserRevisionLine numberNew 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:e2865ed633bb 33 AnalogIn ain(p20);
LukeMar 1:e2865ed633bb 34 PwmOut motor( p25 );
LukeMar 1:e2865ed633bb 35 DigitalOut dir( p24 );
LukeMar 1:e2865ed633bb 36 DigitalOut I(p26);
LukeMar 1:e2865ed633bb 37 DigitalOut slp(p29); //sleep
drewrobinson 2:2195a4abdf8c 38 DigitalOut r_slp(p30);
drewrobinson 2:2195a4abdf8c 39 DigitalOut m_led(LED1);
drewrobinson 2:2195a4abdf8c 40 float d_ang;
drewrobinson 2:2195a4abdf8c 41 float pos;
LukeMar 0:8ed926c84e2f 42 float RC_O;
LukeMar 0:8ed926c84e2f 43
LukeMar 0:8ed926c84e2f 44 //**get position**
drewrobinson 2:2195a4abdf8c 45 float posi();
LukeMar 0:8ed926c84e2f 46
LukeMar 0:8ed926c84e2f 47
LukeMar 0:8ed926c84e2f 48 int main(void)
LukeMar 0:8ed926c84e2f 49 {
drewrobinson 2:2195a4abdf8c 50 I=0; //sets for 1.5amp output
drewrobinson 2:2195a4abdf8c 51 motor.period(.001); //sets the pulse width modulation period
drewrobinson 2:2195a4abdf8c 52 motor.pulsewidth(0);
drewrobinson 2:2195a4abdf8c 53 slp = 0;
drewrobinson 2:2195a4abdf8c 54 r_slp = 0; //sstarts the current driver in off state
drewrobinson 2:2195a4abdf8c 55 wait(10);
drewrobinson 2:2195a4abdf8c 56 m_led = 1; //indicate that the wait period is over
LukeMar 0:8ed926c84e2f 57 // loop
LukeMar 0:8ed926c84e2f 58 while(1) {
LukeMar 0:8ed926c84e2f 59 //now = rtos::Kernel::get_ms_count();
LukeMar 0:8ed926c84e2f 60 //***JUST ADDED stepper code
LukeMar 0:8ed926c84e2f 61
LukeMar 0:8ed926c84e2f 62 if (rx.valid) {
LukeMar 0:8ed926c84e2f 63 RC_O = rx.channel[0];
drewrobinson 2:2195a4abdf8c 64 //pc.printf(" rc: %f\n",rx.channel[0]);
LukeMar 0:8ed926c84e2f 65 } else {
drewrobinson 2:2195a4abdf8c 66 //pc.printf(" invalid\r\n");
LukeMar 0:8ed926c84e2f 67 slp = 0;
LukeMar 0:8ed926c84e2f 68 }
LukeMar 0:8ed926c84e2f 69 //39.19
LukeMar 0:8ed926c84e2f 70 d_ang = (RC_O/6.77)+39.19;
LukeMar 0:8ed926c84e2f 71
LukeMar 0:8ed926c84e2f 72 pos = (ain-.108)/.002466;
drewrobinson 2:2195a4abdf8c 73 pc.printf(" %.3f\n",pos);
drewrobinson 2:2195a4abdf8c 74 if((pos > (d_ang-3.0))) {
LukeMar 0:8ed926c84e2f 75 motor.pulsewidth(0);
LukeMar 0:8ed926c84e2f 76 slp = 0;
LukeMar 0:8ed926c84e2f 77 }
drewrobinson 2:2195a4abdf8c 78 if( (pos > (d_ang+3.0))) {
LukeMar 0:8ed926c84e2f 79 slp = 1;
LukeMar 0:8ed926c84e2f 80 while(pos > d_ang) {
LukeMar 0:8ed926c84e2f 81 dir = 1; //left??
LukeMar 0:8ed926c84e2f 82 motor.pulsewidth(.0005);
drewrobinson 2:2195a4abdf8c 83 //pc.printf("pos: %.3f\n",pos);
drewrobinson 2:2195a4abdf8c 84 pos = posi();
LukeMar 0:8ed926c84e2f 85 }//while pos
LukeMar 0:8ed926c84e2f 86 motor.pulsewidth(0);
LukeMar 0:8ed926c84e2f 87 }//if pos
LukeMar 0:8ed926c84e2f 88 if((pos < (d_ang-3.0)) && pos > 90.0) {
LukeMar 0:8ed926c84e2f 89 slp = 1;
LukeMar 0:8ed926c84e2f 90 while(pos < d_ang) {
LukeMar 0:8ed926c84e2f 91 dir = 0; //right??
LukeMar 0:8ed926c84e2f 92 motor.pulsewidth(.0005);
drewrobinson 2:2195a4abdf8c 93 //pc.printf("pos: %.3f\n",pos);
drewrobinson 2:2195a4abdf8c 94 pos = posi();
LukeMar 0:8ed926c84e2f 95 }//while pos
LukeMar 0:8ed926c84e2f 96 motor.pulsewidth(0);
LukeMar 0:8ed926c84e2f 97 }
LukeMar 0:8ed926c84e2f 98 //***END OF JUST ADDED
LukeMar 0:8ed926c84e2f 99 ThisThread::sleep_until(121);
LukeMar 0:8ed926c84e2f 100 }//while(1)
LukeMar 0:8ed926c84e2f 101 } // main() for TESTS/receiver/simple
LukeMar 0:8ed926c84e2f 102
LukeMar 0:8ed926c84e2f 103
LukeMar 0:8ed926c84e2f 104
drewrobinson 2:2195a4abdf8c 105 float posi()
LukeMar 0:8ed926c84e2f 106 {
LukeMar 0:8ed926c84e2f 107 float p1;
LukeMar 0:8ed926c84e2f 108 float p2;
LukeMar 0:8ed926c84e2f 109 float p3;
LukeMar 0:8ed926c84e2f 110 p1 = (ain-.108)/.002466;
LukeMar 0:8ed926c84e2f 111 p2 = (ain-.108)/.002466;
LukeMar 0:8ed926c84e2f 112 p3 = (ain-.108)/.002466;
LukeMar 0:8ed926c84e2f 113 return (p1+p2+p3)/3.0;
LukeMar 0:8ed926c84e2f 114 }