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.
Dependencies: mbed SpeedController Encoder CruizCore_R1370P
Diff: main.cpp
- Revision:
- 0:c17bc30288a2
- Child:
- 1:9d2b2b5ec36f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Mar 04 02:07:55 2020 +0000
@@ -0,0 +1,170 @@
+#include "mbed.h"
+#include "EC.h"
+#include "SpeedController.h"
+#define RESOLUTION 500
+#include "math.h"
+#include "R1370P.h"
+
+//PwmOut motor_1F(PA_5);//1Forward Right motor Forward
+//PwmOut motor_1B(PC_7);//Forward Right motor Back
+//PwmOut motor_2F(PC_9);//2Forward Left motor Forward
+//PwmOut motor_2B(PA_1);//Forward Left motor Back
+//PwmOut motor_3F(PA_10);//3Back Right motor Forward
+//PwmOut motor_3B(PB_4);//Back Right motor Back
+//PwmOut motor_4F(PA_9);//4Back Left motor Forward
+//PwmOut motor_4B(PA_7);//Back Left motor Back
+
+Ec2multi ec[]= {Ec2multi(PC_5,PB_2,RESOLUTION),
+ Ec2multi(PA_11,PB_1,RESOLUTION),
+ Ec2multi(PB_12,PB_15,RESOLUTION),
+ Ec2multi(PC_4,PB_14,RESOLUTION)
+ }; //1逓倍用class
+
+Ec2multi ecXY[]= {Ec2multi(PC_6,PB_8,RESOLUTION),
+ Ec2multi(PB_9,PC_8,RESOLUTION)
+ };
+
+SpeedControl motor[]= {SpeedControl(PA_5,PC_7,50,ec[0]),
+ SpeedControl(PC_9,PA_1,50,ec[1]),
+ SpeedControl(PA_10,PB_4,50,ec[2]),
+ SpeedControl(PA_9,PA_7,50,ec[3])
+ };
+
+//R1370P gyro(PA_11,PA_12);
+
+DigitalIn button(USER_BUTTON);
+
+Ticker ticker;
+
+void calOmega()
+{
+ for(int i=0; i<4; i++) {
+ ec[i].calOmega();
+ }
+}
+
+//自己位置取得
+class Location
+{
+public:
+ Location():x_(0),y_(0)
+ {
+ for(int i =0; i<2; i++) {
+ old_count[i]=0;
+ }
+ }
+ void calXY()
+ {
+ double ec_count[2]= {};
+ double a,b;
+ ec_count[0]=ecXY[0].getCount();
+ ec_count[1]=ecXY[1].getCount();
+ a = (ec_count[0]-old_count[0])/sqrt(2.0);
+ b = (ec_count[1]-old_count[1])/sqrt(2.0);
+ x_=x_+a + b;
+ y_=y_+a - b;
+ old_count[0]=ec_count[0];
+ old_count[1]=ec_count[1];
+ }
+ double getX()
+ {
+ return x_;
+ }
+ double getY()
+ {
+ return y_;
+ }
+
+private:
+ double x_;
+ double y_;
+ double old_count[2];
+};
+
+
+int plot[5][2]= {
+ {0,0}
+ ,{0,3000}
+ ,{3000,3000}
+ ,{3000,0}
+ ,{0,0}
+};
+
+//目的地決定
+/*class Aim
+{
+ Aim(int plot[][2]):plot_(&plot[0][0]) {}
+public:
+private:
+ int *(plot_[2]);
+};*/
+
+//出力を計算
+double omega[4];
+int x,y;
+void motorOut()
+{
+ for(int i=0; i<4; i++) {
+ motor[i].Sc(omega[i]);
+ }
+}
+int main()
+{
+ ticker.attach(motorOut,0.09);
+ printf("start\r\n");
+ motor[0].setEquation(0.008031,-0.022300,-0.008839,-0.016290);
+ motor[1].setEquation(0.008878,-0.016622,-0.009702,-0.015806);
+ motor[2].setEquation(0.008637,-0.016537,-0.009397,-0.012159);
+ motor[3].setEquation(0.008096,-0.014822,-0.008801,-0.016645);
+
+ motor[0].setDutyLimit(0.5);
+ motor[1].setDutyLimit(0.5);
+ motor[2].setDutyLimit(0.5);
+ motor[3].setDutyLimit(0.5);
+
+ motor[0].setPDparam( 0.004839, 0.0026290 );
+ motor[1].setPDparam( 0.004702, 0.025806 );
+ motor[2].setPDparam( 0.004397, 0.025159 );
+ motor[3].setPDparam( 0.004801, 0.026645 );
+
+ int n=0,dx,dy,aimX,aimY;
+ double vx,vy;
+ Location location;
+ // Aim aim(&(plot[0]));
+ while(1) {
+ //自己位置取得
+ location.calXY();
+ x=location.getX();
+ y=location.getY();
+ printf("%lf %lf %lf %lf location %d,%d \r\n",omega[0],omega[1],omega[2],omega[3],x,y);
+ //目的地決定(syuusoku check)
+ aimX = plot[n][0];
+ aimY = plot[n][1];
+ //出力を計算(kitai xy);
+ dx=aimX-x;
+ dy=aimY-y;
+ vx=dx/sqrt((double)dx*dx+dy*dy);
+ vy=dy/sqrt((double)dx*dx+dy*dy);
+
+ //cal 4 wheel
+ omega[0]= -30*vx/sqrt(2.0)+30*vy/sqrt(2.0);
+ omega[1]=-30*vx/sqrt(2.0)-30*vy/sqrt(2.0);
+ omega[2]= 30*vx/sqrt(2.0)-30*vy/sqrt(2.0);
+ omega[3]= 30*vx/sqrt(2.0)+30*vy/sqrt(2.0);
+
+ int j=0;
+ if(dx<50 &&dx>-50) {
+ if(dy<50 && dy>-50) {
+ n++;
+ printf("reached Location");
+ while(j<4) {
+ motor[j].stop();
+ j++;
+ }
+ wait(1);
+ }
+
+ }
+ }
+
+}