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 hcsr04 Encoder CruizCore_R1370P
Revision 2:0be4cfbdf408, committed 2020-03-27
- Comitter:
- maxnagazumi
- Date:
- Fri Mar 27 06:31:20 2020 +0000
- Parent:
- 1:a692014d8e41
- Commit message:
- soho;
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Mar 12 05:52:39 2020 +0000
+++ b/main.cpp Fri Mar 27 06:31:20 2020 +0000
@@ -8,7 +8,7 @@
CAN can1(PB_5,PB_13);
/*
-0 start
+0 start/stop
1 to 4 , 6 to 9
5 stop
10 clock move
@@ -38,12 +38,12 @@
Serial pc(USBTX, USBRX); // tx, rx
R1370P gyro(PC_10,PC_11); // tx, rx
-HCSR04 echo[]= {
+/*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
-};
+};*/
//自己位置取得
double theta;
@@ -97,10 +97,14 @@
//目的地決定
int plot[][2]= {
{0,0}
- ,{800,13500}
- ,{1000,15500}
- ,{8654,16500}
- ,{16000,16500}
+ ,{2000,16000}
+ ,{8000,16000}
+ ,{4000,0}
+ ,{0,0}
+ ,{0,4000}
+ ,{4000,4000}
+ ,{4000,0}
+ ,{0,0}
};
double aimTheta[]= {//目標角度を指定
@@ -108,7 +112,7 @@
};
double zMin[]= { //速度の最少を指定
- 2,2,2, 2,2,2, 5,5,5, 5,5,5
+ 0,0,0,0,0,0,0,0,0,0,0,0
};
//出力を計算
@@ -182,7 +186,7 @@
}
//超音波
-class Sonic
+/*class Sonic
{
public:
Sonic()
@@ -210,16 +214,20 @@
double sonic_cm[4];
};
+*/
class CAN_ticker
{
public:
- CAN_ticker():x(0),data(0) {}
- void can_read()
+ CAN_ticker():x(0)
+ {
+ data[0]=0;
+ }
+ void canmsg_read()
{
CANMessage msg;
if(can1.read(msg)) {
if(msg.id == 1) {
- x=(short)(msg.data);
+ x=(short)(msg.data[0]);
}
}
}
@@ -228,92 +236,111 @@
return x;
}
private:
- char data;
+ char data[0];
int x;
};
//手動出力
+double canOmega[4]= {
+ 0,0,0,0
+};
void calOmega_CAN(int canx)
{
- int a=10,count=0;
- double canOmega[4];
+ static double a=0.1;
+ static int count=0;
switch(canx) {
case 1:
canOmega[0]=0;
- canOmega[1]=-a;
+ canOmega[1]=a;
canOmega[2]=0;
- canOmega[3]=a;
+ canOmega[3]=-a;
+ printf(" 1");
break;
case 2:
- canOmega[0]=-a*1.4;
- canOmega[1]=-a*1.4;
- canOmega[2]=a*1.4;
- canOmega[3]=a*1.4;
+ canOmega[0]=a*1.4;
+ canOmega[1]=a*1.4;
+ canOmega[2]=-a*1.4;
+ canOmega[3]=-a*1.4;
+ printf(" 2");
break;
case 3:
- canOmega[0]=-a;
+ canOmega[0]=a;
canOmega[1]=0;
- canOmega[2]=a;
+ canOmega[2]=-a;
canOmega[3]=0;
+ printf(" 3");
break;
case 4:
- canOmega[0]=a*1.4;
- canOmega[1]=-a*1.4;
- canOmega[2]=-a*1.4;
- canOmega[3]=a*1.4;
+ canOmega[0]=-a*1.4;
+ canOmega[1]=a*1.4;
+ canOmega[2]=a*1.4;
+ canOmega[3]=-a*1.4;
+ printf(" 4");
break;
case 5:
for(int i=0; i<4; i++) {
canOmega[i]=0;
}
+ printf(" 5");
break;
case 6:
- canOmega[0]=-a*1.4;
- canOmega[1]=a*1.4;
- canOmega[2]=a*1.4;
- canOmega[3]=-a*1.4;
+ canOmega[0]=a*1.4;
+ canOmega[1]=-a*1.4;
+ canOmega[2]=-a*1.4;
+ canOmega[3]=a*1.4;
+ printf(" 6");
break;
case 7:
- canOmega[0]=a;
- canOmega[1]=0;
- canOmega[2]=-a;
- canOmega[3]=0;
+ canOmega[0]=0;
+ canOmega[1]=-a;
+ canOmega[2]=0;
+ canOmega[3]=a;
+ printf(" 7");
break;
case 8:
- canOmega[0]=a*1.4;
- canOmega[1]=a*1.4;
- canOmega[2]=-a*1.4;
- canOmega[3]=-a*1.4;
+ canOmega[0]=-a*1.4;
+ canOmega[1]=-a*1.4;
+ canOmega[2]=a*1.4;
+ canOmega[3]=a*1.4;
+ printf(" 8");
break;
case 9:
- canOmega[0]=0;
- canOmega[1]=a;
- canOmega[2]=0;
- canOmega[3]=-a;
+ canOmega[0]=-a;
+ canOmega[1]=0;
+ canOmega[2]=a;
+ canOmega[3]=0;
+ printf(" 9");
break;
case 10:
for(int i=0; i<4; i++) {
- canOmega[i]=-a;
+ canOmega[i]=a;
}
+ printf(" 10");
break;
case 11:
for(int i=0; i<4; i++) {
- canOmega[i]=a;
+ canOmega[i]=-a;
}
+ printf(" 11");
break;
case 12:
- if(count%2==1) {
- a=20;
+ wait(0.2);
+ if(count==1) {
+ a=0.1;
+ count=0;
} else {
- a=10;
+ a=0.05;
+ count=1;
}
+ printf(" 12 Speed change");
break;
-
}
- for(int i=0; i<4; i++) {
- motor[i].Sc(canOmega[i]);
+ printf(" %f\r\n",a);
+ int i=0;
+ while(i<4) {
+ motor[i].turn(canOmega[i]);
+ i++;
}
-
}
//ticker に入れる関数
@@ -328,11 +355,13 @@
motor[i].Sc(omega.getOmega(i));
}
}
-
CAN_ticker canx;
void ticker_CanRead()
{
- canx.can_read();
+ canx.canmsg_read();
+ /*for(int i=0; i<4; i++) {
+ motor[i].Sc(canOmega[i]);
+ }*/
}
Location location;
@@ -343,10 +372,10 @@
}
int main()
{
- angle=gyro.getAngle();//角度初期化
can1.frequency(1000000);
gyro.initialize(); //main関数の最初に一度だけ実行
gyro.acc_offset();
+ angle=gyro.getAngle();//角度初期化
double z;
printf("start\r\n");
motor[0].setEquation(0.008031,-0.022300,-0.008839,-0.016290);
@@ -359,10 +388,10 @@
motor[2].setDutyLimit(0.4);
motor[3].setDutyLimit(0.4);
- motor[0].setPDparam( 0.1790, 0.00560);
- motor[1].setPDparam( 0.1705, 0.00620);
- motor[2].setPDparam( 0.1790, 0.00620);
- motor[3].setPDparam( 0.1680, 0.00560);
+ motor[0].setPDparam( 0.01790, 0.00560);
+ motor[1].setPDparam( 0.01705, 0.00620);
+ motor[2].setPDparam( 0.01790, 0.00620);
+ motor[3].setPDparam( 0.01680, 0.00560);
int first=0;
while(first==0) {
@@ -383,8 +412,10 @@
locTicker.attach(&calLoc,0.05);
canTicker.attach(&ticker_CanRead,0.1);//can読み込み
while(1) {
- canX=canx.get_xCAN();//0で手動化
- if(canX==0) {//手動化
+ canX=canx.get_xCAN();//0で手\動化
+ if(canX==13) {//手動化
+ wait(0.2);
+ printf("change1\r\n");
ticker.detach();
while(1) {
canX=canx.get_xCAN();
@@ -392,20 +423,26 @@
//自己位置取得
x=location.getX();
y=location.getY();
+ printf("X=%06d ,Y=%06d",x,y);
//目的地決定(syuusoku check)
aimX = plot[n][0];
aimY = plot[n][1];
dx=aimX-x;
dy=aimY-y;
distance = sqrt((float)dx*dx+dy*dy);
- if(distance<800) {
+ if(distance<1000) {
n++;
printf("reach%d\r\n",n);
time.reset();
}
- if(canX==0) {//自動化
+ if(canX==13) {//自動化
canX=20;
+ for(int i=0; i<4; i++) {
+ canOmega[i]=0;
+ }
ticker.attach(&motorOut,0.05);
+ printf("change2\r\n");
+ wait(0.1);
break;
}
}
@@ -413,8 +450,17 @@
//自己位置取得
x=location.getX();
y=location.getY();
- printf("X=%d,Y=%d,theta=%5.3f z=%5.3f %f\r\n",x,y,theta,z,time.read());
-
+ int i=0;
+ if(i==10) {
+ printf("X=%d,Y=%d,theta=%5.3f ,angle=%5.3f z=%5.3f n=%d\r\n",x,y,theta,angle,z,n);
+ for(int j=0; j<4; j++) {
+ printf("%d : %d,",j,ec[j].getCount());
+ }
+ printf("\r\n");
+ i=10;
+ } else {
+ i++;
+ }
//目的地決定(syuusoku check)
aimX = plot[n][0];
aimY = plot[n][1];
@@ -439,7 +485,7 @@
time.reset();
}
- if(n>=5) {
+ if(n>=8) {
for(int j=0; j<4; j++) {
motor[j].stop();
}