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.
Diff: omuni.cpp
- Revision:
- 1:75b51c0b7f47
- Parent:
- 0:c0f3e14f1ed1
diff -r c0f3e14f1ed1 -r 75b51c0b7f47 omuni.cpp
--- a/omuni.cpp Tue Oct 10 12:50:39 2017 +0000
+++ b/omuni.cpp Wed Oct 11 08:42:46 2017 +0000
@@ -1,62 +1,99 @@
#include "omuni.h"
- int8_t omuni::map(int8_t in, int8_t inMin, int8_t inMax, int8_t outMin, int8_t outMax) {
- // check it's within the range
- if (inMin<inMax) {
- if (in <= inMin)
- return outMin;
- if (in >= inMax)
- return outMax;
- } else { // cope with input range being backwards.
- if (in >= inMin)
- return outMin;
- if (in <= inMax)
- return outMax;
- }
- // calculate how far into the range we are
- float scale = float(in-inMin)/float(inMax-inMin);
- // calculate the output.
- return int8_t(outMin + scale*float(outMax-outMin));
- }
-
-
- omuni::omuni(I2C* i2c_,int8_t addr1,int8_t addr2,int8_t addr3)
- :i2c(i2c_),m1(i2c_,addr1),m2(i2c_,addr2),m3(i2c_,addr3)
+int8_t omuni::map(int8_t in, int8_t inMin, int8_t inMax, int8_t outMin, int8_t outMax)
+{
+ // check it's within the range
+ if (inMin<inMax)
+ {
+ if (in <= inMin)
+ return outMin;
+ if (in >= inMax)
+ return outMax;
+ }
+ else
+ {
+ // cope with input range being backwards.
+ if (in >= inMin)
+ return outMin;
+ if (in <= inMax)
+ return outMax;
+ }
+ // calculate how far into the range we are
+ float scale = float(in-inMin)/float(inMax-inMin);
+ // calculate the output.
+ return int8_t(outMin + scale*float(outMax-outMin));
+}
+
+omuni::omuni(I2C* i2c_,int8_t addr1,int8_t addr2,int8_t addr3)
+ :i2c(i2c_),m1(i2c_,addr1),m2(i2c_,addr2),m3(i2c_,addr3)
+{
+ RXData[0] = 'H';
+ RXData[1] = 0 ;
+ RXData[2] = 0 ;
+ RXData[3] = 0 ;
+ RXData[4] = 0 ;
+}
+
+void omuni::out(char rxdata[dataNum],float L)
+{
+ signed char x1 = map(rxdata[1],-90,90,-100,100);
+ signed char y1 = map(rxdata[2],-90,90,-100,100);
+ signed char x2 = map(rxdata[3],-90,90,-100,100);
+ signed char y2 = map(rxdata[4],-90,90,-100,100);
+ float r1 = pow(x1*x1+y1*y1,0.5)/100;
+ float r2 = pow(x2*x2+y2*y2,0.5)/100;
+ float sieta1 = atan2(double(x1),double(y1));
+ float sieta2 = atan2(double(x2),double(y2));
+ if(r2 < 0.1F)r2 = 0;
+ float alpha = PI/2;
+ float x_2 = cos(sieta2);
+ float y_2 = sin(sieta2);
+ float w = 0;
+ if(r1 > 0.1F)
+ {
+ if(sieta1 > PI/3 && sieta1 < PI*2/3.0)
+ w = PI/4;
+ if((sieta1 < -PI/3 && sieta1 > -2*PI/3.0))
+ w = -PI/4;
+ }
+ float s1 = r2*float(sin(alpha)*-x2*0.01) + float(L*w);
+ float s2 = r2*float(sin(alpha+4.0/3*PI)*-x2 - cos(alpha+4.0/3*PI)*y2)*0.01 + float(L*w);
+ float s3 = r2*float(sin(alpha+2.0/3*PI)*-x2 - cos(alpha+2.0/3*PI)*y2)*0.01 + float(L*w);
+ if(s1 || s2 || s3)
+ acceleration();
+ else
+ speed_reset();
+ m1 = speed * s1;
+ m2 = speed * s2;
+ m3 = speed * s3;
+ //printf("%5.2f : %5.2f : %5.2f : %5.2f",(float)x2,(float)y2,sieta1*180/PI,r1);
+ //printf("\n");
+}
+
+void omuni::acceleration()
+{
+ int time = timer.read_ms();
+ if(time < 1000)
+ {
+ if(time == 0)
{
- RXData[0] = 'H';
- RXData[1] = 0 ;
- RXData[2] = 0 ;
- RXData[3] = 0 ;
- RXData[4] = 0 ;
+ timer.start();
+ time = 10;
}
- void omuni::out(char rxdata[dataNum],float L)
- {
- signed char x1 = map(rxdata[1],-90,90,-100,100);
- signed char y1 = map(rxdata[2],-90,90,-100,100);
- signed char x2 = map(rxdata[3],-90,90,-100,100);
- signed char y2 = map(rxdata[4],-90,90,-100,100);
- float r1 = pow(x1*x1+y1*y1,0.5)/100;
- float r2 = pow(x2*x2+y2*y2,0.5)/100;
- float sieta1 = atan2(double(x1),double(y1));
- float sieta2 = atan2(double(x2),double(y2));
- if(r2 < 0.1F)r2 = 0;
- float alpha = PI/2;
- float x_2 = cos(sieta2);
- float y_2 = sin(sieta2);
- float w = 0;
- if(r1 > 0.1F){
- if(sieta1 > PI/3 && sieta1 < PI*2/3.0)
- w = PI/4;
- if((sieta1 < -PI/3 && sieta1 > -2*PI/3.0))
- w = -PI/4;
- }
- float s1 = r2*float(sin(alpha)*-x2*0.01) + float(L*w);
- float s2 = r2*float(sin(alpha+4.0/3*PI)*-x2 - cos(alpha+4.0/3*PI)*y2)*0.01 + float(L*w);
- float s3 = r2*float(sin(alpha+2.0/3*PI)*-x2 - cos(alpha+2.0/3*PI)*y2)*0.01 + float(L*w);
- m1 = s1;
- m2 = s2;
- m3 = s3;
- //printf("%5.2f : %5.2f : %5.2f : %5.2f",(float)x2,(float)y2,sieta1*180/PI,r1);
- //printf("\n");
- }
\ No newline at end of file
+ //if(time >= 1000) timer.stop();
+ speed = time / 1000.0f;
+ }
+ else
+ {
+ timer.stop();
+ speed = 1.0;
+ }
+}
+
+void omuni::speed_reset()
+{
+ speed = 0;
+ timer.stop();
+ timer.reset();
+}
\ No newline at end of file