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.
Diff: main.cpp
- 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);