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
main.cpp
- Committer:
- koheim
- Date:
- 2020-03-04
- Revision:
- 2:08b8f6b05c22
- Parent:
- 1:9d2b2b5ec36f
File content as of revision 2:08b8f6b05c22:
#include "mbed.h" #include "EC.h" #include "SpeedController.h" #define RESOLUTION 500 #include "math.h" #include "R1370P.h" #include"hcsr04.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]) }; HCSR04 echo[]= {HCSR04(PC_0,PC_12),//A HCSR04(PA_15,PB_7),//A HCSR04(PH_1,PB_0),// B HCSR04(PC_3,PB_10),//B }; DigitalIn button(USER_BUTTON); Serial pc(USBTX, USBRX); // tx, rx R1370P gyro(PC_10,PC_11); // tx, rx Ticker ticker; void calOmega() { for(int i=0; i<4; i++) { ec[i].calOmega(); } } //自己位置取得 double theta=0; 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 ax,ay,bx,by; ec_count[0]=ecXY[0].getCount(); ec_count[1]=ecXY[1].getCount(); ax = (ec_count[0]-old_count[0])*cos(45+theta); ay = (ec_count[0]-old_count[0])*sin(45+theta); bx = (ec_count[1]-old_count[1])*cos(45-theta); by = (ec_count[1]-old_count[1])*sin(45-theta); x_=x_+ax + bx; y_=y_+ay - by; 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,10000} ,{5000,10000} ,{5000,0} ,{0,0} }; //出力を計算 double omega[4]; int x,y; //出力 double vx,vy; void setOmega(int max) { omega[0]=max*vx/sqrt(2.0)-max*vy/sqrt(2.0); omega[1]=-max*vx/sqrt(2.0)-max*vy/sqrt(2.0); omega[2]=-max*vx/sqrt(2.0)+max*vy/sqrt(2.0); omega[3]=max*vx/sqrt(2.0)+max*vy/sqrt(2.0); } void motorOut() { for(int i=0; i<4; i++) { motor[i].Sc((int)omega[i]); } } void echo_() { double a=0,b=0,c=0,d=0; for(int i=0; i<4; i++) { echo[i].start(); } wait(1);//minimum wait is 30msec a=echo[0].get_dist_cm(); b=echo[1].get_dist_cm(); c=echo[2].get_dist_cm(); d=echo[3].get_dist_cm(); printf("a:%f b:%f c:%f d:%f\r\n",a,b,c,d); if(a<5||b<5||c<5||d<5) { for(int j=0; j<4; j++) { motor[j].stop(); } } } int main() { gyro.initialize(); //main関数の最初に一度だけ実行 gyro.acc_offset(); ticker.attach(motorOut,0.05); 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 a=0,b=0,c=0,d=0; Location location; while(1) { //自己位置取得 theta=gyro.getAngle(); //角度の値を受け取る location.calXY(); x=location.getX(); y=location.getY(); printf("%3.3f %3.3f %3.3f %3.3f 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); //四輪の出力計算 setOmega(10); if(dx<100 &&dx>-100) { if(dy<100 && dy>-100) { n++; printf("reached Location"); for(int j=0; j<4; j++) { motor[j].stop(); } wait(2); } } if(n>4) { for(int j=0; j<4; j++) { motor[j].stop(); } } } }