aaa

Fork of Move by 涼太郎 中村

Revision:
0:d7ff86f25eaa
Child:
1:405e28b64fdb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/move.cpp	Fri Sep 02 12:40:45 2016 +0000
@@ -0,0 +1,257 @@
+#include "mbed.h"
+#include "move.h"
+#include "locate.h"
+
+PwmOut M1cw(PA_11);
+PwmOut M1ccw(PB_15);
+PwmOut M2ccw(PB_14);
+PwmOut M2cw(PB_13);
+
+//const int allowlength=5;
+//const float allowdegree=0.02;
+const int rightspeed=29*2;
+const int leftspeed=31*2;
+const int turnspeed=15*2;
+
+//const float PIfact=2.89;
+
+
+void initmotor()
+{
+    M1cw.period_us(256);
+    M1ccw.period_us(256);
+    M2cw.period_us(256);
+    M2ccw.period_us(256);
+
+}
+
+void move(int left,int right)
+{
+
+    float rightduty,leftduty;
+
+    if(right>256) {
+        right=256;
+    }
+    if(left>256) {
+        left=256;
+    }
+    if(right<-256) {
+        right=-256;
+    }
+    if(left<-256) {
+        left=-256;
+    }
+
+    rightduty=right/256.0;
+    leftduty=left/256.0;
+    if(right>0) {
+        M1cw.write(1-rightduty);
+        M1ccw.write(1);
+    } else {
+        M1cw.write(1);
+        M1ccw.write(1+rightduty);
+    }
+
+    if(left>0) {
+        M2cw.write(1-leftduty);
+        M2ccw.write(1);
+    } else {
+        M2cw.write(1);
+        M2ccw.write(1+leftduty);
+    }
+}
+
+
+void movelength(int length)
+{
+    int px,py;
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    //int pt=coordinateTheta();
+
+    move(rightspeed,leftspeed);
+    while(1) {
+
+        update();
+        //pc.printf("dx:%d, dy:%d, l:%d x:%d y:%d t:%f\n\r",px-coordinateX(),py-coordinateY(),length,coordinateX(),coordinateY(), coordinateTheta());
+        if(((px-coordinateX())*(px-coordinateX())+(py-coordinateY())*(py-coordinateY()))>length*length) {
+            break;
+        }
+
+    }
+    move(0,0);
+}
+
+void turncw()
+{
+    float pt;
+    move((-1)*turnspeed,turnspeed);
+
+    update();
+    pt=coordinateTheta();
+
+    while(1) {
+        update();
+        if(pt-coordinateTheta()>PI/2) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+void turnccw()
+{
+    float pt;
+    move(turnspeed,(-1)*turnspeed);
+
+    update();
+    pt=coordinateTheta();
+
+    while(1) {
+        update();
+        if(pt-coordinateTheta()<(-1)*PI/2) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+void turn_cw()
+{
+    float pt;
+    move((-1)*turnspeed,turnspeed);
+
+    update();
+    pt=coordinateTheta();
+
+    while(1) {
+        update();
+        if(pt-coordinateTheta()>PI/2) {
+            move(0,0);
+            break;
+        }
+    }
+
+    hosei_turn(pt, true, PI/2);
+}
+
+void turn_ccw()
+{
+    float pt;
+    move(turnspeed,(-1)*turnspeed);
+
+    update();
+    pt=coordinateTheta();
+
+    while(1) {
+        update();
+        if(pt-coordinateTheta()<(-1)*PI/2) {
+            move(0,0);
+            break;
+        }
+    }
+
+    hosei_turn(pt, false, PI/2);
+}
+
+void hosei_turn(float pt, bool cw, float rad)
+{
+    int np;
+    if(cw) np = 1;
+    else   np = -1;
+    while(1) {
+        update();
+        if(pt-coordinateTheta() < np * rad - ALLOW_RAD) {
+            move(-15, 15);
+        } else if(pt-coordinateTheta() > np * rad + ALLOW_RAD) {
+            move(15, -15);
+        } else {
+            move(0,0);
+            return;
+        }
+    }
+}
+
+void turn_direction(int rad)
+{
+    move(turnspeed, (-1)*turnspeed);
+
+    update();
+
+    while(1) {
+        update();
+        if(coordinateTheta() < rad + 0.1 && coordinateTheta() > rad - 0.1) {
+            move(0,0);
+            break;
+        }
+    }
+
+    hosei_turn(0, false, rad);        
+}
+void pmovex(int length)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+    int k_y=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+    int k_theta=10;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dy>7) {
+            dy=7;
+        }
+        if(dy<-7) {
+            dy=-7;
+        }
+        move(rightspeed-k_y*dy-k_theta*dtheta,leftspeed+k_y*dy+k_theta*dtheta);
+
+        if(dx>length) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+void pmovey(int length)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+    int k_x=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+    int k_theta=10;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dx>7) {
+            dx=7;
+        }
+        if(dx<-7) {
+            dx=-7;
+        }
+        move(rightspeed-k_x*dx-k_theta*dtheta,leftspeed+k_x*dx+k_theta*dtheta);
+
+        if(dy>length) {
+            move(0,0);
+            break;
+        }
+    }
+}