ver6_2の修正版 変更点 phase1のバグ kaisyu関数 tyokudo関数

Dependencies:   mbed QEI PID

Revision:
16:05b26003da50
Parent:
15:d022288aec51
Child:
17:de3bc1999ae7
--- a/main.cpp	Mon Aug 26 02:23:20 2019 +0000
+++ b/main.cpp	Sun Sep 01 12:12:55 2019 +0000
@@ -4,7 +4,7 @@
 /* designed by Yuhi Takaku from 5D, mail: rab1sy23@gmail.com            */
 /* Sensor: encorder*4                                                   */
 /* -------------------------------------------------------------------  */
-/* PID関数を各方向毎に追加した                                              */
+/* 4方向の直進補正をしてみた                                                */
 /* -------------------------------------------------------------------  */
 #include "mbed.h"
 #include "math.h"
@@ -17,6 +17,9 @@
 #define Ti 0.0
 #define Td 0.0
 
+#define RED     0
+#define BLUE    1
+
 PID migimae(Kp, Ti, Td, 0.001);
 PID migiusiro(Kp, Ti, Td, 0.001);
 PID hidarimae(Kp, Ti, Td, 0.001);
@@ -35,16 +38,16 @@
 PID back_hidariusiro(4500000.0, 0.0, 0.0, 0.001);
 
 //右進
-PID right_migimae(4500000.0, 0.0, 0.0, 0.001);
-PID right_migiusiro(4500000.0, 0.0, 0.0, 0.001);
-PID right_hidarimae(4500000.0, 0.0, 0.0, 0.001);
-PID right_hidariusiro(4500000.0, 0.0, 0.0, 0.001);
+PID right_migimae(10000000.0, 0.0, 0.0, 0.001);
+PID right_migiusiro(10000000.0, 0.0, 0.0, 0.001);
+PID right_hidarimae(10000000.0, 0.0, 0.0, 0.001);
+PID right_hidariusiro(10000000.0, 0.0, 0.0, 0.001);
 
 //左進
-PID left_migimae(4500000.0, 0.0, 0.0, 0.001);
-PID left_migiusiro(4500000.0, 0.0, 0.0, 0.001);
-PID left_hidarimae(4500000.0, 0.0, 0.0, 0.001);
-PID left_hidariusiro(4500000.0, 0.0, 0.0, 0.001);
+PID left_migimae(10000000.0, 0.0, 0.0, 0.001);
+PID left_migiusiro(10000000.0, 0.0, 0.0, 0.001);
+PID left_hidarimae(10000000.0, 0.0, 0.0, 0.001);
+PID left_hidariusiro(10000000.0, 0.0, 0.0, 0.001);
 
 //右旋回
 PID turn_right_migimae(4500000.0, 0.0, 0.0, 0.001);
@@ -67,10 +70,13 @@
 //12V停止信号ピン
 DigitalOut emergency(D11);
 
-DigitalOut USR_LED1(PC_9);
-DigitalOut USR_LED2(PC_8);
-DigitalOut USR_LED3(PC_6);
-DigitalOut USR_LED4(PC_5);
+DigitalOut USR_LED1(PB_7);
+DigitalOut USR_LED2(PC_13);
+DigitalOut USR_LED3(PC_2);
+DigitalOut USR_LED4(PC_3);
+
+DigitalIn start_switch(PB_12);
+//InterruptIn start_switch(PB_12);
 
 QEI wheel_x1(PA_8 , PA_6 , NC, 624);
 QEI wheel_x2(PB_14, PB_13, NC, 624);
@@ -79,11 +85,15 @@
 //QEI wheel1(D2, D3, NC, 624);
 //QEI wheel2(D5, D4, NC, 624);
 
+Ticker  look_switch;
+
 //エンコーダ値格納変数
 int x_pulse1, x_pulse2, y_pulse1, y_pulse2;
 
 //操作の段階変数
 unsigned int phase = 0;
+unsigned int start_zone = 1;
+bool zone = RED;
 
 //MD送信データ変数
 char init_send_data[1];
@@ -91,6 +101,7 @@
 char true_migimae_data[1], true_migiusiro_data[1], true_hidarimae_data[1], true_hidariusiro_data[1];
 
 //関数のプロトタイプ宣言
+void incriment(void);
 void init(void);
 void init_send(void);
 void get_pulses(void);
@@ -113,20 +124,74 @@
     
     init();
     init_send();
-
+    
+    //look_switch.attach_us(&incriment, 100000.0);
+    //start_switch.fall(&incriment);
+    
+    while(1) {
+        if(!start_switch)
+            break;
+    }
+    
     while(1) {
         
         get_pulses();
         print_pulses();
-        front(500);
-        //back(500);
-        //right(500);
-        //left(500);
-        //turn_right(500);
-        //turn_left(500);
+        
+        if(start_switch == 0) {
+            USR_LED1 = 1;   USR_LED2 = 1;   USR_LED3 = 1;   USR_LED4 = 1;
+        } else { 
+            USR_LED1 = 0;   USR_LED2 = 0;   USR_LED3 = 0;   USR_LED4 = 0;
+        }
+                
+        if(phase == 0) {
+            front(10000);
+        }
+        else if(phase == 1) {
+            right(10000);
+        }
+        else if(phase == 2) {
+            back(10000);
+        }
+        else if(phase == 3) {
+            left(10000);
+        }
+        
+        /*
+        switch(phase) {
+            case 0:
+                turn_right(600);
+                break;
+            case 1:
+                right(14000);
+                break;
+            case 2: 
+                front(5000);
+                break;
+            case 3:
+                right(5000);
+                break;
+            case 4:
+                front(20000);
+                break;
+            default:
+                break;
+        }
+        */
+        
+        //back(5000);
+        //right(14000);
+        //left(14000);  //直進補正済
+        //turn_right(600);
+        //turn_left(300);
     }
 }
 
+void incriment(void) {
+    if(start_switch == 0) {
+        phase++;
+    }
+}
 void init(void) {
     
     //緊急停止用信号ピンをLow
@@ -134,8 +199,10 @@
     //USR_LED1 = 1;   USR_LED2 = 1;   USR_LED3 = 1;   USR_LED4 = 1;
 
     //通信ボーレートの設定
-    //pc.baud(460800);
-    pc.baud(9600);
+    pc.baud(460800);
+    //pc.baud(9600);
+    
+    start_switch.mode(PullUp);
     
     x_pulse1 = 0;   x_pulse2 = 0;   y_pulse1 = 0;   y_pulse2 = 0;
     migimae_data[0] = 0x80; migiusiro_data[0] = 0x80;   hidarimae_data[0] = 0x80;   hidariusiro_data[0] = 0x80;
@@ -162,7 +229,9 @@
 
 void print_pulses(void) {
     
-        pc.printf("x1: %d, x2: %d, y1: %d, y2: %d\n\r", x_pulse1, x_pulse2, y_pulse1, y_pulse2);
+        //pc.printf("phase: %d\n\r", phase);
+        //pc.printf("x1: %d, x2: %d, y1: %d, y2: %d, p: %d\n\r", x_pulse1, x_pulse2, y_pulse1, y_pulse2, phase);
+        //pc.printf("RF: %x, RB: %x, LF: %x, LB: %x\n\r", true_migimae_data[0], true_migiusiro_data[0], true_hidarimae_data[0], true_hidariusiro_data[0]);
 }
 
 void front(unsigned int target) {
@@ -228,70 +297,73 @@
 void front_PID(unsigned int target) {
 
         //センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        front_migimae.setInputLimits(-2147483648,     2147483647);
+        front_migiusiro.setInputLimits(-2147483648,   2147483647);
+        front_hidarimae.setInputLimits(-2147483648,   2147483647);
+        front_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //正転(目標に達してない)
-        if((y_pulse1 < target) && (y_pulse2 < target)) {
-            migimae.setOutputLimits(0x84,     0xFF);
-            migiusiro.setOutputLimits(0x84,   0xFF);
-            hidarimae.setOutputLimits(0x84,   0xFF);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
+        if((y_pulse1 < target) || (y_pulse2 < target)) {
+            front_migimae.setOutputLimits(0x84,     0xF7);
+            front_migiusiro.setOutputLimits(0x84,   0xF7);
+            front_hidarimae.setOutputLimits(0x84,   0xFF);
+            front_hidariusiro.setOutputLimits(0x84, 0xFF);
         }
         //逆転(目標より行き過ぎ)
-        else if((y_pulse1 > target) && (y_pulse2 > target)) {
-            migimae.setOutputLimits(0x00,     0x7B);
-            migiusiro.setOutputLimits(0x00,   0x7B);
-            hidarimae.setOutputLimits(0x00,   0x7B);
-            hidariusiro.setOutputLimits(0x00, 0x7B);
-        } else {
-            migimae.setOutputLimits(0x7C,     0x83);
-            migiusiro.setOutputLimits(0x7C,   0x83);
-            hidarimae.setOutputLimits(0x7C,   0x83);
-            hidariusiro.setOutputLimits(0x7C, 0x83);
+        else if((y_pulse1 > target) || (y_pulse2 > target)) {
+            //front_migimae.setOutputLimits(0x00,     /*0x7B*/0x79);
+            //front_migiusiro.setOutputLimits(0x00,   /*0x7B*/0x76);
+            //front_hidarimae.setOutputLimits(0x00,   /*0x7B*/0x79);
+            //front_hidariusiro.setOutputLimits(0x00, /*0x7B*/0x79);
+            front_migimae.setOutputLimits(0x7C,     0x83);
+            front_migiusiro.setOutputLimits(0x7C,   0x83);
+            front_hidarimae.setOutputLimits(0x7C,   0x83);
+            front_hidariusiro.setOutputLimits(0x7C, 0x83);
         }
 
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        front_migimae.setMode(AUTO_MODE);
+        front_migiusiro.setMode(AUTO_MODE);
+        front_hidarimae.setMode(AUTO_MODE);
+        front_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        front_migimae.setSetPoint(target);
+        front_migiusiro.setSetPoint(target);
+        front_hidarimae.setSetPoint(target);
+        front_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(y_pulse1);
-        migiusiro.setProcessValue(y_pulse1);
-        hidarimae.setProcessValue(y_pulse2);
-        hidariusiro.setProcessValue(y_pulse2);
+        front_migimae.setProcessValue(y_pulse1);
+        front_migiusiro.setProcessValue(y_pulse1);
+        front_hidarimae.setProcessValue(y_pulse2);
+        front_hidariusiro.setProcessValue(y_pulse2);
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = front_migimae.compute();
+        migiusiro_data[0]    = front_migiusiro.compute();
+        hidarimae_data[0]    = front_hidarimae.compute();
+        hidariusiro_data[0]  = front_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //正転(目標に達してない)
-        if((y_pulse1 < target) && (y_pulse2 < target)) {
+        if((y_pulse1 < target) || (y_pulse2 < target)) {
             true_migimae_data[0]     = migimae_data[0];
             true_migiusiro_data[0]   = migiusiro_data[0];
             true_hidarimae_data[0]   = hidarimae_data[0];
             true_hidariusiro_data[0] = hidariusiro_data[0];
         }
         //逆転(目標より行き過ぎ)
-        else if((y_pulse1 > target) && (y_pulse2 > target)) {
-            true_migimae_data[0]     = 0x7B - migimae_data[0];
-            true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
-            true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
-            true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+        else if((y_pulse1 > target) || (y_pulse2 > target)) {
+            //true_migimae_data[0]     = 0x79 - migimae_data[0];
+            //true_migiusiro_data[0]   = 0x76 - migiusiro_data[0];
+            //true_hidarimae_data[0]   = 0x79 - hidarimae_data[0];
+            //true_hidariusiro_data[0] = 0x79 - hidariusiro_data[0];
+            true_migimae_data[0]     = 0x80;
+            true_migiusiro_data[0]   = 0x80;
+            true_hidarimae_data[0]   = 0x80;
+            true_hidariusiro_data[0] = 0x80;
         } else {
             true_migimae_data[0]     = 0x80;
             true_migiusiro_data[0]   = 0x80;
@@ -303,70 +375,73 @@
 void back_PID(unsigned int target) {
     
         //センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        back_migimae.setInputLimits(-2147483648,     2147483647);
+        back_migiusiro.setInputLimits(-2147483648,   2147483647);
+        back_hidarimae.setInputLimits(-2147483648,   2147483647);
+        back_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //逆転(目標に達してない)
-        if((abs(y_pulse1) < target) && (abs(y_pulse2) < target)) {
-            migimae.setOutputLimits(0x00,     0x7B);
-            migiusiro.setOutputLimits(0x00,   0x7B);
-            hidarimae.setOutputLimits(0x00,   0x7B);
-            hidariusiro.setOutputLimits(0x0, 0x7B);
+        if((abs(y_pulse1) < target) || (abs(y_pulse2) < target)) {
+            back_migimae.setOutputLimits(0x00,     0x7B);
+            back_migiusiro.setOutputLimits(0x00,   0x7B);
+            back_hidarimae.setOutputLimits(0x00,   0x73);
+            back_hidariusiro.setOutputLimits(0x00, 0x73);
         }
         //正転(目標より行き過ぎ)
-        else if((abs(y_pulse1) > target) && (abs(y_pulse2) > target)) {
-            migimae.setOutputLimits(0x84,     0xFF);
-            migiusiro.setOutputLimits(0x84,   0xFF);
-            hidarimae.setOutputLimits(0x84,   0xFF);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
-        } else {
-            migimae.setOutputLimits(0x7C,     0x83);
-            migiusiro.setOutputLimits(0x7C,   0x83);
-            hidarimae.setOutputLimits(0x7C,   0x83);
-            hidariusiro.setOutputLimits(0x7C, 0x83);
+        else if((abs(y_pulse1) > target) || (abs(y_pulse2) > target)) {
+            //back_migimae.setOutputLimits(0x84,     0xFF);
+            //back_migiusiro.setOutputLimits(0x84,   0xFF);
+            //back_hidarimae.setOutputLimits(0x84,   0xFF);
+            //back_hidariusiro.setOutputLimits(0x84, 0xFF);
+            back_migimae.setOutputLimits(0x7C,     0x83);
+            back_migiusiro.setOutputLimits(0x7C,   0x83);
+            back_hidarimae.setOutputLimits(0x7C,   0x83);
+            back_hidariusiro.setOutputLimits(0x7C, 0x83);
         }
 
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        back_migimae.setMode(AUTO_MODE);
+        back_migiusiro.setMode(AUTO_MODE);
+        back_hidarimae.setMode(AUTO_MODE);
+        back_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        back_migimae.setSetPoint(target);
+        back_migiusiro.setSetPoint(target);
+        back_hidarimae.setSetPoint(target);
+        back_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(abs(y_pulse1));
-        migiusiro.setProcessValue(abs(y_pulse1));
-        hidarimae.setProcessValue(abs(y_pulse2));
-        hidariusiro.setProcessValue(abs(y_pulse2));
+        back_migimae.setProcessValue(abs(y_pulse1));
+        back_migiusiro.setProcessValue(abs(y_pulse1));
+        back_hidarimae.setProcessValue(abs(y_pulse2));
+        back_hidariusiro.setProcessValue(abs(y_pulse2));
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = back_migimae.compute();
+        migiusiro_data[0]    = back_migiusiro.compute();
+        hidarimae_data[0]    = back_hidarimae.compute();
+        hidariusiro_data[0]  = back_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //逆転(目標に達してない)
-        if((abs(y_pulse1) < target) && (abs(y_pulse2) < target)) {
+        if((abs(y_pulse1) < target) || (abs(y_pulse2) < target)) {
             true_migimae_data[0]     = 0x7B - migimae_data[0];
             true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
             true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
             true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
         }
         //正転(目標より行き過ぎ)
-        else if((abs(y_pulse1) > target) && (abs(y_pulse2) > target)) {
-            true_migimae_data[0]     = migimae_data[0];
-            true_migiusiro_data[0]   = migiusiro_data[0];
-            true_hidarimae_data[0]   = hidarimae_data[0];
-            true_hidariusiro_data[0] = hidariusiro_data[0];
+        else if((abs(y_pulse1) > target) || (abs(y_pulse2) > target)) {
+            //true_migimae_data[0]     = migimae_data[0];
+            //true_migiusiro_data[0]   = migiusiro_data[0];
+            //true_hidarimae_data[0]   = hidarimae_data[0];
+            //true_hidariusiro_data[0] = hidariusiro_data[0];
+            true_migimae_data[0]     = 0x80;
+            true_migiusiro_data[0]   = 0x80;
+            true_hidarimae_data[0]   = 0x80;
+            true_hidariusiro_data[0] = 0x80;
         } else {
             true_migimae_data[0]     = 0x80;
             true_migiusiro_data[0]   = 0x80;
@@ -378,65 +453,75 @@
 void right_PID(unsigned int target) {
 
         //センサ出力値の最小、最大
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        right_migimae.setInputLimits(-2147483648,     2147483647);
+        right_migiusiro.setInputLimits(-2147483648,   2147483647);
+        right_hidarimae.setInputLimits(-2147483648,   2147483647);
+        right_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //右進(目標まで達していない)
-        if((x_pulse1 < target) && (x_pulse2 < target)) {
-            migimae.setOutputLimits(0x00,     0x7B);
-            migiusiro.setOutputLimits(0x84,   0xFF);
-            hidarimae.setOutputLimits(0x84,   0xFF);
-            hidariusiro.setOutputLimits(0x00, 0x7B);
+        if((abs(x_pulse1) < target) || (abs(x_pulse2) < target)) {
+            right_migimae.setOutputLimits(0x00,     0x6C);
+            right_migiusiro.setOutputLimits(0x84,   0xFF);
+            right_hidarimae.setOutputLimits(0x84,   0xF0);
+            right_hidariusiro.setOutputLimits(0x00, 0x7B);
+            //right_migiusiro.setOutputLimits(0x84,   0xF1);
+            //right_hidariusiro.setOutputLimits(0x0E, 0x7B);
         }
         //左進(目標より行き過ぎ)
-        else if((x_pulse1 > target) && (x_pulse2 > target)) {
-            migimae.setOutputLimits(0x84,     0xFF);
-            migiusiro.setOutputLimits(0x00,   0x7B);
-            hidarimae.setOutputLimits(0x00,   0x7B);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
+        else if((abs(x_pulse1) > target) || (abs(x_pulse2) > target)) {
+            //right_migimae.setOutputLimits(0x84,     0xFF);
+            //right_migiusiro.setOutputLimits(0x00,   0x7B);
+            //right_hidarimae.setOutputLimits(0x00,   0x7B);
+            //right_hidariusiro.setOutputLimits(0x84, 0xFF);
+            right_migimae.setOutputLimits(0x7C,     0x83);
+            right_migiusiro.setOutputLimits(0x7C,   0x83);
+            right_hidarimae.setOutputLimits(0x7C,   0x83);
+            right_hidariusiro.setOutputLimits(0x7C, 0x83);
         }
 
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        right_migimae.setMode(AUTO_MODE);
+        right_migiusiro.setMode(AUTO_MODE);
+        right_hidarimae.setMode(AUTO_MODE);
+        right_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        right_migimae.setSetPoint(target);
+        right_migiusiro.setSetPoint(target);
+        right_hidarimae.setSetPoint(target);
+        right_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(x_pulse1);
-        migiusiro.setProcessValue(x_pulse1);
-        hidarimae.setProcessValue(x_pulse2);
-        hidariusiro.setProcessValue(x_pulse2);
+        right_migimae.setProcessValue(abs(x_pulse1));
+        right_migiusiro.setProcessValue(abs(x_pulse2));
+        right_hidarimae.setProcessValue(abs(x_pulse1));
+        right_hidariusiro.setProcessValue(abs(x_pulse2));
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = right_migimae.compute();
+        migiusiro_data[0]    = right_migiusiro.compute();
+        hidarimae_data[0]    = right_hidarimae.compute();
+        hidariusiro_data[0]  = right_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //右進(目標まで達していない)
-        if((x_pulse1 < target) && (x_pulse2 < target)) {     
+        if((abs(x_pulse1) < target) || (abs(x_pulse2) < target)) {     
             true_migimae_data[0]     = 0x7B - migimae_data[0];
             true_migiusiro_data[0]   = migiusiro_data[0];
             true_hidarimae_data[0]   = hidarimae_data[0];
             true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
         }
         //左進(目標より行き過ぎ)
-        else if((x_pulse1 > target) && (x_pulse2 > target)) {
-            true_migimae_data[0]     = migimae_data[0];
-            true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
-            true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
-            true_hidariusiro_data[0] = hidariusiro_data[0];
+        else if((abs(x_pulse1) > target) || (abs(x_pulse2) > target)) {
+            //true_migimae_data[0]     = migimae_data[0];
+            //true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
+            //true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
+            //true_hidariusiro_data[0] = hidariusiro_data[0];
+            true_migimae_data[0]     = 0x80;
+            true_migiusiro_data[0]   = 0x80;
+            true_hidarimae_data[0]   = 0x80;
+            true_hidariusiro_data[0] = 0x80;
         } else {
             true_migimae_data[0]     = 0x80;
             true_migiusiro_data[0]   = 0x80;
@@ -448,65 +533,78 @@
 void left_PID(unsigned int target) {
     
         //センサ出力値の最小、最大
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        left_migimae.setInputLimits(-2147483648,     2147483647);
+        left_migiusiro.setInputLimits(-2147483648,   2147483647);
+        left_hidarimae.setInputLimits(-2147483648,   2147483647);
+        left_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //左進(目標まで達していない)
-        if((abs(x_pulse1) < target) && (abs(x_pulse2) < target)) {
-            migimae.setOutputLimits(0x84,     0xFF);
-            migiusiro.setOutputLimits(0x00,   0x7B);
-            hidarimae.setOutputLimits(0x00,   0x7B);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
+        if((x_pulse1 < target) || (x_pulse2 < target)) {
+            left_migimae.setOutputLimits(0x84,     0xED);
+            left_migiusiro.setOutputLimits(0x00,   0x7B);
+            left_hidarimae.setOutputLimits(0x00,   0x69);
+            left_hidariusiro.setOutputLimits(0x84, 0xFF);
+            //left_migimae.setOutputLimits(0x84,     0xF6);
+            //left_hidarimae.setOutputLimits(0x09,   0x7B);
         }
         //右進(目標より行き過ぎ)
-        else if((abs(x_pulse1) > target) && (abs(x_pulse2) > target)) {
-            migimae.setOutputLimits(0x00,     0x7B);
-            migiusiro.setOutputLimits(0x84,   0xFF);
-            hidarimae.setOutputLimits(0x84,   0xFF);
-            hidariusiro.setOutputLimits(0x00, 0x7B);
+        else if((x_pulse1 > target) || (x_pulse2 > target)) {
+            //left_migimae.setOutputLimits(0x00,     0x7B);
+            //left_migiusiro.setOutputLimits(0x84,   0xFF);
+            //left_hidarimae.setOutputLimits(0x84,   0xFF);
+            //left_hidariusiro.setOutputLimits(0x00, 0x7B);
+            //left_migimae.setOutputLimits(0x09,     0x7B);
+            //left_migiusiro.setOutputLimits(0x88,   0xFF);
+            //left_hidarimae.setOutputLimits(0x84,   0xF6);
+            left_migimae.setOutputLimits(0x7C,     0x83);
+            left_migiusiro.setOutputLimits(0x7C,   0x83);
+            left_hidarimae.setOutputLimits(0x7C,   0x83);
+            left_hidariusiro.setOutputLimits(0x7C, 0x83);
         }
-
+        
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        left_migimae.setMode(AUTO_MODE);
+        left_migiusiro.setMode(AUTO_MODE);
+        left_hidarimae.setMode(AUTO_MODE);
+        left_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        left_migimae.setSetPoint(target);
+        left_migiusiro.setSetPoint(target);
+        left_hidarimae.setSetPoint(target);
+        left_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(abs(x_pulse1));
-        migiusiro.setProcessValue(abs(x_pulse1));
-        hidarimae.setProcessValue(abs(x_pulse2));
-        hidariusiro.setProcessValue(abs(x_pulse2));
+        left_migimae.setProcessValue(x_pulse1);
+        left_migiusiro.setProcessValue(x_pulse2);
+        left_hidarimae.setProcessValue(x_pulse1);
+        left_hidariusiro.setProcessValue(x_pulse2);
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = left_migimae.compute();
+        migiusiro_data[0]    = left_migiusiro.compute();
+        hidarimae_data[0]    = left_hidarimae.compute();
+        hidariusiro_data[0]  = left_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //左進(目標まで達していない)
-        if((abs(x_pulse1) < target) && (abs(x_pulse2) < target)) {     
+        if((x_pulse1 < target) || (x_pulse2 < target)) {     
             true_migimae_data[0]     = migimae_data[0];
             true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
             true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
             true_hidariusiro_data[0] = hidariusiro_data[0];
         }
         //右進(目標より行き過ぎ)
-        else if((abs(x_pulse1) > target) && (abs(x_pulse2) > target)) {
-            true_migimae_data[0]     = 0x7B - migimae_data[0];
-            true_migiusiro_data[0]   = migiusiro_data[0];
-            true_hidarimae_data[0]   = hidarimae_data[0];
-            true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+        else if((x_pulse1 > target) || (x_pulse2 > target)) {
+            //true_migimae_data[0]     = 0x7B - migimae_data[0];
+            //true_migiusiro_data[0]   = migiusiro_data[0];
+            //true_hidarimae_data[0]   = hidarimae_data[0];
+            //true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+            true_migimae_data[0]     = 0x80;
+            true_migiusiro_data[0]   = 0x80;
+            true_hidarimae_data[0]   = 0x80;
+            true_hidariusiro_data[0] = 0x80;
         } else {
             true_migimae_data[0]     = 0x80;
             true_migiusiro_data[0]   = 0x80;
@@ -518,65 +616,81 @@
 void turn_right_PID(unsigned int target) {
 
         //センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        turn_right_migimae.setInputLimits(-2147483648,     2147483647);
+        turn_right_migiusiro.setInputLimits(-2147483648,   2147483647);
+        turn_right_hidarimae.setInputLimits(-2147483648,   2147483647);
+        turn_right_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //右旋回(目標に達してない)
-        if((x_pulse1 < target) && (x_pulse2 < target) && (y_pulse1 < target) && (y_pulse2 < target)) {
-            migimae.setOutputLimits(0x00,   0x7B);
-            migiusiro.setOutputLimits(0x00, 0x7B);
-            hidarimae.setOutputLimits(0x84, 0xFF);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
+        //if((abs(x_pulse1) < target) || (x_pulse2 < target)) {
+        //if((x_pulse1 < target) || (abs(x_pulse2) < target) || (abs(y_pulse1) < target) || (y_pulse2 < target)) {
+        if(abs(x_pulse1) < target) {
+            turn_right_migimae.setOutputLimits(0x00,   0x7B);
+            turn_right_migiusiro.setOutputLimits(0x00, 0x7B);
+            turn_right_hidarimae.setOutputLimits(0x84, 0xFF);
+            turn_right_hidariusiro.setOutputLimits(0x84, 0xFF);
         }
         //左旋回(目標より行き過ぎ)
-        else if((x_pulse1 > target) && (x_pulse2 > target) && (y_pulse1 > target) && (y_pulse2 > target)) {
-            migimae.setOutputLimits(0x84,     0xFF);
-            migiusiro.setOutputLimits(0x84,   0xFF);
-            hidarimae.setOutputLimits(0x00,   0x7B);
-            hidariusiro.setOutputLimits(0x00, 0x7B);
+        //else if((abs(x_pulse1) > target) || (x_pulse2 > target)) {
+        //else if((x_pulse1 > target) || (abs(x_pulse2) > target) || (abs(y_pulse1) > target) || (y_pulse2 > target)) {
+        else if(abs(x_pulse1) > target) {
+            //turn_right_migimae.setOutputLimits(0x84,     0xFF);
+            //turn_right_migiusiro.setOutputLimits(0x84,   0xFF);
+            //turn_right_hidarimae.setOutputLimits(0x00,   0x7B);
+            //turn_right_hidariusiro.setOutputLimits(0x00, 0x7B);
+            turn_right_migimae.setOutputLimits(0x7C,     0x83);
+            turn_right_migiusiro.setOutputLimits(0x7C,   0x83);
+            turn_right_hidarimae.setOutputLimits(0x7C,   0x83);
+            turn_right_hidariusiro.setOutputLimits(0x7C, 0x83);
         }
 
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        turn_right_migimae.setMode(AUTO_MODE);
+        turn_right_migiusiro.setMode(AUTO_MODE);
+        turn_right_hidarimae.setMode(AUTO_MODE);
+        turn_right_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        turn_right_migimae.setSetPoint(target);
+        turn_right_migiusiro.setSetPoint(target);
+        turn_right_hidarimae.setSetPoint(target);
+        turn_right_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(x_pulse1);
-        migiusiro.setProcessValue(x_pulse2);
-        hidarimae.setProcessValue(y_pulse1);
-        hidariusiro.setProcessValue(y_pulse2);
+        turn_right_migimae.setProcessValue(abs(x_pulse1));
+        turn_right_migiusiro.setProcessValue(abs(x_pulse1));
+        turn_right_hidarimae.setProcessValue(abs(x_pulse1));
+        turn_right_hidariusiro.setProcessValue(abs(x_pulse1));
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = turn_right_migimae.compute();
+        migiusiro_data[0]    = turn_right_migiusiro.compute();
+        hidarimae_data[0]    = turn_right_hidarimae.compute();
+        hidariusiro_data[0]  = turn_right_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //右旋回(目標に達してない)
-        if((x_pulse1 < target) && (x_pulse2 < target) && (y_pulse1 < target) && (y_pulse1 < target)) {
+        //if((abs(x_pulse1) < target) || (x_pulse2 < target)) {
+        //if((x_pulse1 < target) || (abs(x_pulse2) < target) || (abs(y_pulse1) < target) || (y_pulse1 < target)) {
+        if(abs(x_pulse1) < target) {
             true_migimae_data[0]     = 0x7B - migimae_data[0];
             true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
             true_hidarimae_data[0]   = hidarimae_data[0];
             true_hidariusiro_data[0] = hidariusiro_data[0];
         }
         //左旋回(目標より行き過ぎ)
-        else if((x_pulse1 > target) && (x_pulse2 > target) && (y_pulse1 > target) && (y_pulse2 > target)) {
-            true_migimae_data[0]     = migimae_data[0];
-            true_migiusiro_data[0]   = migiusiro_data[0];
-            true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
-            true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+        //else if((abs(x_pulse1) > target) || (x_pulse2 > target)) {
+        //else if((x_pulse1 > target) || (abs(x_pulse2) > target) || (abs(y_pulse1) > target) || (y_pulse2 > target)) {
+        else if(abs(x_pulse1) > target) {
+            //true_migimae_data[0]     = migimae_data[0];
+            //true_migiusiro_data[0]   = migiusiro_data[0];
+            //true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
+            //true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+            true_migimae_data[0]     = 0x80;
+            true_migiusiro_data[0]   = 0x80;
+            true_hidarimae_data[0]   = 0x80;
+            true_hidariusiro_data[0] = 0x80;
         } else {
             true_migimae_data[0]     = 0x80;
             true_migiusiro_data[0]   = 0x80;
@@ -588,61 +702,69 @@
 void turn_left_PID(unsigned int target) {
             
         //センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
-        migimae.setInputLimits(-2147483648,     2147483647);
-        migiusiro.setInputLimits(-2147483648,   2147483647);
-        hidarimae.setInputLimits(-2147483648,   2147483647);
-        hidariusiro.setInputLimits(-2147483648, 2147483647);
+        turn_left_migimae.setInputLimits(-2147483648,     2147483647);
+        turn_left_migiusiro.setInputLimits(-2147483648,   2147483647);
+        turn_left_hidarimae.setInputLimits(-2147483648,   2147483647);
+        turn_left_hidariusiro.setInputLimits(-2147483648, 2147483647);
 
         //制御量の最小、最大
         //右旋回(目標に達してない)
-        if((abs(x_pulse1) < target) && (x_pulse2 < target) && (y_pulse1 < target) && (abs(y_pulse2) < target)) {
-            migimae.setOutputLimits(0x84,   0xFF);
-            migiusiro.setOutputLimits(0x84, 0xFF);
-            hidarimae.setOutputLimits(0x00, 0x7B);
-            hidariusiro.setOutputLimits(0x00, 0x7B);
+        //if((x_pulse1 < target) || (abs(x_pulse2) < target)) {
+        //if((abs(x_pulse1) < target) || (x_pulse2 < target) || (y_pulse1 < target) || (abs(y_pulse2) < target)) {
+        if(x_pulse1 < target) {
+            turn_left_migimae.setOutputLimits(0x84,   0xFF);
+            turn_left_migiusiro.setOutputLimits(0x84, 0xFF);
+            turn_left_hidarimae.setOutputLimits(0x00, 0x7B);
+            turn_left_hidariusiro.setOutputLimits(0x00, 0x7B);
         }
         //左旋回(目標より行き過ぎ)
-        else if((abs(x_pulse1) > target) && (x_pulse2 > target) && (y_pulse1 > target) && (abs(y_pulse2) > target)) {
-            migimae.setOutputLimits(0x00,     0x7B);
-            migiusiro.setOutputLimits(0x00,   0x7B);
-            hidarimae.setOutputLimits(0x84,   0xFF);
-            hidariusiro.setOutputLimits(0x84, 0xFF);
+        //else if((x_pulse1 > target) || (abs(x_pulse2) > target)) { 
+        //else if((abs(x_pulse1) > target) || (x_pulse2 > target) || (y_pulse1 > target) || (abs(y_pulse2) > target)) {
+        else if(x_pulse1 > target) {
+            turn_left_migimae.setOutputLimits(0x00,     0x7B);
+            turn_left_migiusiro.setOutputLimits(0x00,   0x7B);
+            turn_left_hidarimae.setOutputLimits(0x84,   0xFF);
+            turn_left_hidariusiro.setOutputLimits(0x84, 0xFF);
         }
 
         //よくわからんやつ
-        migimae.setMode(AUTO_MODE);
-        migiusiro.setMode(AUTO_MODE);
-        hidarimae.setMode(AUTO_MODE);
-        hidariusiro.setMode(AUTO_MODE);
+        turn_left_migimae.setMode(AUTO_MODE);
+        turn_left_migiusiro.setMode(AUTO_MODE);
+        turn_left_hidarimae.setMode(AUTO_MODE);
+        turn_left_hidariusiro.setMode(AUTO_MODE);
 
         //目標値
-        migimae.setSetPoint(target);
-        migiusiro.setSetPoint(target);
-        hidarimae.setSetPoint(target);
-        hidariusiro.setSetPoint(target);
+        turn_left_migimae.setSetPoint(target);
+        turn_left_migiusiro.setSetPoint(target);
+        turn_left_hidarimae.setSetPoint(target);
+        turn_left_hidariusiro.setSetPoint(target);
 
         //センサ出力
-        migimae.setProcessValue(abs(x_pulse1));
-        migiusiro.setProcessValue(abs(y_pulse1));
-        hidarimae.setProcessValue(abs(y_pulse2));
-        hidariusiro.setProcessValue(abs(x_pulse2));
+        turn_left_migimae.setProcessValue(x_pulse1);
+        turn_left_migiusiro.setProcessValue(x_pulse1);
+        turn_left_hidarimae.setProcessValue(x_pulse1);
+        turn_left_hidariusiro.setProcessValue(x_pulse1);
 
         //制御量(計算結果)
-        migimae_data[0]      = migimae.compute();
-        migiusiro_data[0]    = migiusiro.compute();
-        hidarimae_data[0]    = hidarimae.compute();
-        hidariusiro_data[0]  = hidariusiro.compute();
+        migimae_data[0]      = turn_left_migimae.compute();
+        migiusiro_data[0]    = turn_left_migiusiro.compute();
+        hidarimae_data[0]    = turn_left_hidarimae.compute();
+        hidariusiro_data[0]  = turn_left_hidariusiro.compute();
 
         //制御量をPWM値に変換
         //右旋回(目標に達してない)
-        if((abs(x_pulse1) < target) && (x_pulse2 < target) && (y_pulse1 < target) && (abs(y_pulse2) < target)) {
+        //if((x_pulse1 < target) || (abs(x_pulse2) < target)) {
+        //if((abs(x_pulse1) < target) || (x_pulse2 < target) || (y_pulse1 < target) || (abs(y_pulse2) < target)) {
+        if(x_pulse1 < target) {
             true_migimae_data[0]     = migimae_data[0];
             true_migiusiro_data[0]   = migiusiro_data[0];
             true_hidarimae_data[0]   = 0x7B - hidarimae_data[0];
             true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
         }
         //左旋回(目標より行き過ぎ)
-        else if((abs(x_pulse1) > target) && (x_pulse2 > target) && (y_pulse1 > target) && (abs(y_pulse2) > target)) {
+        //else if((x_pulse1 > target) || (abs(x_pulse2) > target)) { 
+        //else if((abs(x_pulse1) > target) || (x_pulse2 > target) || (y_pulse1 > target) || (abs(y_pulse2) > target)) {
+        else if(x_pulse1 > target) {
             true_migimae_data[0]     = 0x7B - migimae_data[0];
             true_migiusiro_data[0]   = 0x7B - migiusiro_data[0];
             true_hidarimae_data[0]   = hidarimae_data[0];
@@ -674,7 +796,7 @@
             wait(0.05);
         }
         //だんだん加速(逆転)
-        for(init_send_data[0] = 0x7B; init_send_data[0] <= 0x00; init_send_data[0]--){
+        for(init_send_data[0] = 0x7B; init_send_data[0] > 0x00; init_send_data[0]--){
             i2c.write(0x10, init_send_data, 1);
             i2c.write(0x12, init_send_data, 1);
             i2c.write(0x14, init_send_data, 1);