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:
- 17:de3bc1999ae7
- Parent:
- 16:05b26003da50
- Child:
- 18:851f783ec516
diff -r 05b26003da50 -r de3bc1999ae7 main.cpp
--- a/main.cpp Sun Sep 01 12:12:55 2019 +0000
+++ b/main.cpp Tue Sep 03 05:47:40 2019 +0000
@@ -4,7 +4,7 @@
/* designed by Yuhi Takaku from 5D, mail: rab1sy23@gmail.com */
/* Sensor: encorder*4 */
/* ------------------------------------------------------------------- */
-/* 4方向の直進補正をしてみた */
+/* 遠隔非常停止対応 & 移動時のバグを改善と */
/* ------------------------------------------------------------------- */
#include "mbed.h"
#include "math.h"
@@ -38,28 +38,28 @@
PID back_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 right_migimae(6000000.0, 0.0, 0.0, 0.001);
+PID right_migiusiro(6000000.0, 0.0, 0.0, 0.001);
+PID right_hidarimae(6000000.0, 0.0, 0.0, 0.001);
+PID right_hidariusiro(6000000.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 left_migimae(6000000.0, 0.0, 0.0, 0.001);
+PID left_migiusiro(6000000.0, 0.0, 0.0, 0.001);
+PID left_hidarimae(6000000.0, 0.0, 0.0, 0.001);
+PID left_hidariusiro(6000000.0, 0.0, 0.0, 0.001);
//右旋回
-PID turn_right_migimae(4500000.0, 0.0, 0.0, 0.001);
-PID turn_right_migiusiro(4500000.0, 0.0, 0.0, 0.001);
-PID turn_right_hidarimae(4500000.0, 0.0, 0.0, 0.001);
-PID turn_right_hidariusiro(4500000.0, 0.0, 0.0, 0.001);
+PID turn_right_migimae(18000000.0, 0.0, 0.0, 0.001);
+PID turn_right_migiusiro(18000000.0, 0.0, 0.0, 0.001);
+PID turn_right_hidarimae(18000000.0, 0.0, 0.0, 0.001);
+PID turn_right_hidariusiro(18000000.0, 0.0, 0.0, 0.001);
//左旋回
-PID turn_left_migimae(4500000.0, 0.0, 0.0, 0.001);
-PID turn_left_migiusiro(4500000.0, 0.0, 0.0, 0.001);
-PID turn_left_hidarimae(4500000.0, 0.0, 0.0, 0.001);
-PID turn_left_hidariusiro(4500000.0, 0.0, 0.0, 0.001);
+PID turn_left_migimae(18000000.0, 0.0, 0.0, 0.001);
+PID turn_left_migiusiro(18000000.0, 0.0, 0.0, 0.001);
+PID turn_left_hidarimae(18000000.0, 0.0, 0.0, 0.001);
+PID turn_left_hidariusiro(18000000.0, 0.0, 0.0, 0.001);
//MDとの通信ポート
I2C i2c(PB_9, PB_8); //SDA, SCL
@@ -67,6 +67,9 @@
//PCとの通信ポート
Serial pc(USBTX, USBRX); //TX, RX
+//特小モジュールとの通信ポート
+Serial pic(A0, A1);
+
//12V停止信号ピン
DigitalOut emergency(D11);
@@ -75,8 +78,10 @@
DigitalOut USR_LED3(PC_2);
DigitalOut USR_LED4(PC_3);
+//遠隔非常停止ユニットLED
+AnalogOut myled(A2);
+
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);
@@ -85,7 +90,9 @@
//QEI wheel1(D2, D3, NC, 624);
//QEI wheel2(D5, D4, NC, 624);
-Ticker look_switch;
+Ticker look_switch;
+
+Timer counter;
//エンコーダ値格納変数
int x_pulse1, x_pulse2, y_pulse1, y_pulse2;
@@ -100,24 +107,31 @@
char migimae_data[1], migiusiro_data[1], hidarimae_data[1], hidariusiro_data[1];
char true_migimae_data[1], true_migiusiro_data[1], true_hidarimae_data[1], true_hidariusiro_data[1];
+//非常停止関連変数
+char RDATA;
+char baff;
+int flug = 0;
+
//関数のプロトタイプ宣言
void incriment(void);
void init(void);
void init_send(void);
+void get(void);
void get_pulses(void);
void print_pulses(void);
-void front(unsigned int target);
-void back(unsigned int target);
-void right(unsigned int target);
-void left(unsigned int target);
-void turn_right(unsigned int target);
-void turn_left(unsigned int target);
-void front_PID(unsigned int target);
-void back_PID(unsigned int target);
-void right_PID(unsigned int target);
-void left_PID(unsigned int target);
-void turn_right_PID(unsigned int target);
-void turn_left_PID(unsigned int target);
+void get_emergency(void);
+void front(int target);
+void back(int target);
+void right(int target);
+void left(int target);
+void turn_right(int target);
+void turn_left(int target);
+void front_PID(int target);
+void back_PID(int target);
+void right_PID(int target);
+void left_PID(int target);
+void turn_right_PID(int target);
+void turn_left_PID(int target);
void dondonkasoku(void);
int main(void) {
@@ -126,77 +140,69 @@
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();
+ get_emergency();
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);
+
+ //front(5000);
+ //back(-5000);
+ //right(-5000);
+ //left(5000);
+ //turn_right(550);
+ //turn_left(600);
+
+ if(counter.read() < 5.00f) {
+ counter.start();
+ front(1000);
}
- else if(phase == 1) {
- right(10000);
- }
- else if(phase == 2) {
- back(10000);
- }
- else if(phase == 3) {
- left(10000);
+ else if(counter.read() >= 5.00f && counter.read() < 10.00f) {
+ right(-1000);
}
-
- /*
- 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;
+ else if(counter.read() >= 10.00f && counter.read() < 15.00f) {
+ back(-1000);
+ }
+ else if(counter.read() >= 15.00f && counter.read() < 20.00f) {
+ left(1000);
}
- */
-
- //back(5000);
- //right(14000);
- //left(14000); //直進補正済
- //turn_right(600);
- //turn_left(300);
+ else if(counter.read() >= 20.00f && counter.read() < 25.00f) {
+ turn_right(550);
+ }
+ else if(counter.read() >= 25.00f && counter.read() < 30.00f) {
+ turn_left(600);
+ }
+ else if(counter.read() >= 30.00f) {
+ counter.reset();
+ }
}
}
void incriment(void) {
+
if(start_switch == 0) {
phase++;
}
}
+
void init(void) {
//緊急停止用信号ピンをLow
- emergency = 0;
- //USR_LED1 = 1; USR_LED2 = 1; USR_LED3 = 1; USR_LED4 = 1;
+ //emergency = 0;
//通信ボーレートの設定
pc.baud(460800);
@@ -204,6 +210,11 @@
start_switch.mode(PullUp);
+ //非常停止関連
+ pic.baud(19200);
+ pic.format(8, Serial::None, 1);
+ pic.attach(get, Serial::RxIrq);
+
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;
true_migimae_data[0] = 0x80; true_migiusiro_data[0] = 0x80; true_hidarimae_data[0] = 0x80; true_hidariusiro_data[0] = 0x80;
@@ -219,6 +230,17 @@
wait(0.1);
}
+void get(void) {
+
+ baff = pic.getc();
+
+ for(; flug; flug--)
+ RDATA = baff;
+
+ if(baff == ':')
+ flug = 1;
+}
+
void get_pulses(void) {
x_pulse1 = wheel_x1.getPulses();
@@ -228,14 +250,26 @@
}
void print_pulses(void) {
-
- //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("%f %d\n\r", counter.read(), phase);
+ //pc.printf("x1: %d, x2: %d, y1: %d, y2: %d\n\r", x_pulse1, x_pulse2, y_pulse1, y_pulse2);
//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) {
+void get_emergency(void) {
+ if(RDATA == '1') {
+ myled = 1;
+ emergency = 1;
+ }
+ else if(RDATA == '9'){
+ myled = 0.2;
+ emergency = 0;
+ }
+}
+
+void front(int target) {
+
front_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
i2c.write(0x12, true_migiusiro_data, 1, false);
@@ -244,7 +278,7 @@
wait_us(20);
}
-void back(unsigned int target) {
+void back(int target) {
back_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
@@ -254,7 +288,7 @@
wait_us(20);
}
-void right(unsigned int target) {
+void right(int target) {
right_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
@@ -264,7 +298,7 @@
wait_us(20);
}
-void left(unsigned int target) {
+void left(int target) {
left_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
@@ -274,7 +308,7 @@
wait_us(20);
}
-void turn_right(unsigned int target) {
+void turn_right(int target) {
turn_right_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
@@ -284,7 +318,7 @@
wait_us(20);
}
-void turn_left(unsigned int target) {
+void turn_left(int target) {
turn_left_PID(target);
i2c.write(0x10, true_migimae_data, 1, false);
@@ -294,7 +328,7 @@
wait_us(20);
}
-void front_PID(unsigned int target) {
+void front_PID(int target) {
//センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
front_migimae.setInputLimits(-2147483648, 2147483647);
@@ -304,22 +338,32 @@
//制御量の最小、最大
//正転(目標に達してない)
- if((y_pulse1 < target) || (y_pulse2 < target)) {
+ 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)) {
- //front_migimae.setOutputLimits(0x00, /*0x7B*/0x79);
- //front_migiusiro.setOutputLimits(0x00, /*0x7B*/0x76);
- //front_hidarimae.setOutputLimits(0x00, /*0x7B*/0x79);
- //front_hidariusiro.setOutputLimits(0x00, /*0x7B*/0x79);
+ //左側が前に出ちゃった♥(右側だけ回して左側は停止)
+ else if((y_pulse1 < target) && (y_pulse2 > target)) {
+ front_migimae.setOutputLimits(0x84, 0xF7);
+ front_migiusiro.setOutputLimits(0x84, 0xF7);
+ front_hidarimae.setOutputLimits(0x7C, 0x83);
+ front_hidariusiro.setOutputLimits(0x7C, 0x83);
+ }
+ //右側が前に出ちゃった♥(左側だけ回して右側は停止)
+ else if((y_pulse1 > target) && (y_pulse2 < target)) {
front_migimae.setOutputLimits(0x7C, 0x83);
front_migiusiro.setOutputLimits(0x7C, 0x83);
- front_hidarimae.setOutputLimits(0x7C, 0x83);
- front_hidariusiro.setOutputLimits(0x7C, 0x83);
+ front_hidarimae.setOutputLimits(0x84, 0xFF);
+ front_hidariusiro.setOutputLimits(0x84, 0xFF);
+ }
+ //逆転(目標より行き過ぎ)
+ else if((y_pulse1 > target) && (y_pulse2 > target)) {
+ front_migimae.setOutputLimits(0x00, 0x7B);
+ front_migiusiro.setOutputLimits(0x00, 0x7B);
+ front_hidarimae.setOutputLimits(0x00, 0x73);
+ front_hidariusiro.setOutputLimits(0x00, 0x73);
}
//よくわからんやつ
@@ -348,31 +392,36 @@
//制御量を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] = 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;
+ //左側が前に出ちゃった♥(右側だけ回して左側は停止)
+ else 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] = 0x80;
true_hidariusiro_data[0] = 0x80;
}
+ //右側が前に出ちゃった♥(左側だけ回して右側は停止)
+ else if((y_pulse1 > target) && (y_pulse2 < target)) {
+ true_migimae_data[0] = 0x80;
+ true_migiusiro_data[0] = 0x80;
+ 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];
+ }
}
-void back_PID(unsigned int target) {
+void back_PID(int target) {
//センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
back_migimae.setInputLimits(-2147483648, 2147483647);
@@ -382,22 +431,32 @@
//制御量の最小、最大
//逆転(目標に達してない)
- if((abs(y_pulse1) < target) || (abs(y_pulse2) < target)) {
+ if((y_pulse1*-1 < target*-1) && (y_pulse2*-1 < target*-1)) {
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)) {
- //back_migimae.setOutputLimits(0x84, 0xFF);
- //back_migiusiro.setOutputLimits(0x84, 0xFF);
- //back_hidarimae.setOutputLimits(0x84, 0xFF);
- //back_hidariusiro.setOutputLimits(0x84, 0xFF);
+ //左側が後に出ちゃった♥(右側だけ回して左側は停止)
+ else if((y_pulse1*-1 < target*-1) && (y_pulse2*-1 > target*-1)) {
+ back_migimae.setOutputLimits(0x00, 0x7B);
+ back_migiusiro.setOutputLimits(0x00, 0x7B);
+ back_hidarimae.setOutputLimits(0x7C, 0x83);
+ back_hidariusiro.setOutputLimits(0x7C, 0x83);
+ }
+ //右側が後に出ちゃった♥(左側だけ回して右側は停止)
+ else if((y_pulse1*-1 > target*-1) && (y_pulse2*-1 < target*-1)) {
back_migimae.setOutputLimits(0x7C, 0x83);
back_migiusiro.setOutputLimits(0x7C, 0x83);
- back_hidarimae.setOutputLimits(0x7C, 0x83);
- back_hidariusiro.setOutputLimits(0x7C, 0x83);
+ back_hidarimae.setOutputLimits(0x00, 0x73);
+ back_hidariusiro.setOutputLimits(0x00, 0x73);
+ }
+ //正転(目標より行き過ぎ)
+ else if((y_pulse1*-1 > target*-1) && (y_pulse2*-1 > target*-1)) {
+ back_migimae.setOutputLimits(0x84, 0xF7);
+ back_migiusiro.setOutputLimits(0x84, 0xF7);
+ back_hidarimae.setOutputLimits(0x84, 0xFF);
+ back_hidariusiro.setOutputLimits(0x84, 0xFF);
}
//よくわからんやつ
@@ -407,16 +466,16 @@
back_hidariusiro.setMode(AUTO_MODE);
//目標値
- back_migimae.setSetPoint(target);
- back_migiusiro.setSetPoint(target);
- back_hidarimae.setSetPoint(target);
- back_hidariusiro.setSetPoint(target);
+ back_migimae.setSetPoint(target*-1);
+ back_migiusiro.setSetPoint(target*-1);
+ back_hidarimae.setSetPoint(target*-1);
+ back_hidariusiro.setSetPoint(target*-1);
//センサ出力
- back_migimae.setProcessValue(abs(y_pulse1));
- back_migiusiro.setProcessValue(abs(y_pulse1));
- back_hidarimae.setProcessValue(abs(y_pulse2));
- back_hidariusiro.setProcessValue(abs(y_pulse2));
+ back_migimae.setProcessValue(y_pulse1*-1);
+ back_migiusiro.setProcessValue(y_pulse1*-1);
+ back_hidarimae.setProcessValue(y_pulse2*-1);
+ back_hidariusiro.setProcessValue(y_pulse2*-1);
//制御量(計算結果)
migimae_data[0] = back_migimae.compute();
@@ -426,31 +485,36 @@
//制御量をPWM値に変換
//逆転(目標に達してない)
- if((abs(y_pulse1) < target) || (abs(y_pulse2) < target)) {
+ if((y_pulse1*-1 < target*-1) && (y_pulse2*-1 < target*-1)) {
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];
- 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;
+ //左側が後に出ちゃった♥(右側だけ回して左側は停止)
+ else if((y_pulse1*-1 < target*-1) && (y_pulse2*-1 > target*-1)) {
+ true_migimae_data[0] = 0x7B - migimae_data[0];
+ true_migiusiro_data[0] = 0x7B - migiusiro_data[0];
true_hidarimae_data[0] = 0x80;
true_hidariusiro_data[0] = 0x80;
}
+ //右側が後に出ちゃった♥(左側だけ回して右側は停止)
+ else if((y_pulse1*-1 > target*-1) && (y_pulse2*-1 < target*-1)) {
+ true_migimae_data[0] = 0x80;
+ true_migiusiro_data[0] = 0x80;
+ true_hidarimae_data[0] = 0x7B - hidarimae_data[0];
+ true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+ }
+ //正転(目標より行き過ぎ)
+ else if((y_pulse1*-1 > target*-1) && (y_pulse2*-1 > target*-1)) {
+ 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];
+ }
}
-void right_PID(unsigned int target) {
+void right_PID(int target) {
//センサ出力値の最小、最大
right_migimae.setInputLimits(-2147483648, 2147483647);
@@ -460,24 +524,33 @@
//制御量の最小、最大
//右進(目標まで達していない)
- if((abs(x_pulse1) < target) || (abs(x_pulse2) < target)) {
+ if((x_pulse1*-1 < target*-1) && (x_pulse2*-1 < target*-1)) {
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*-1 > target*-1) && (x_pulse2*-1 < target*-1)) {
+ right_migimae.setOutputLimits(0x7C, 0x83);
+ right_migiusiro.setOutputLimits(0x00, 0x7B);
+ right_hidarimae.setOutputLimits(0x7C, 0x83);
+ right_hidariusiro.setOutputLimits(0x84, 0xFF);
+ }
+ //後側が右に出ちゃった♥(前側だけ回して後側は停止)
+ else if((x_pulse1*-1 < target*-1) && (x_pulse2*-1 > target*-1)) {
+ right_migimae.setOutputLimits(0x84, 0xED);
+ right_migiusiro.setOutputLimits(0x7C, 0x83);
+ right_hidarimae.setOutputLimits(0x00, 0x69);
+ right_hidariusiro.setOutputLimits(0x7C, 0x83);
}
//左進(目標より行き過ぎ)
- 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);
+ else if((x_pulse1*-1 > target*-1) && (x_pulse2*-1 > target*-1)) {
+ right_migimae.setOutputLimits(0x84, 0xED);
+ right_migiusiro.setOutputLimits(0x00, 0x7B);
+ right_hidarimae.setOutputLimits(0x00, 0x69);
+ right_hidariusiro.setOutputLimits(0x84, 0xFF);
}
//よくわからんやつ
@@ -487,16 +560,16 @@
right_hidariusiro.setMode(AUTO_MODE);
//目標値
- right_migimae.setSetPoint(target);
- right_migiusiro.setSetPoint(target);
- right_hidarimae.setSetPoint(target);
- right_hidariusiro.setSetPoint(target);
+ right_migimae.setSetPoint(target*-1);
+ right_migiusiro.setSetPoint(target*-1);
+ right_hidarimae.setSetPoint(target*-1);
+ right_hidariusiro.setSetPoint(target*-1);
//センサ出力
- right_migimae.setProcessValue(abs(x_pulse1));
- right_migiusiro.setProcessValue(abs(x_pulse2));
- right_hidarimae.setProcessValue(abs(x_pulse1));
- right_hidariusiro.setProcessValue(abs(x_pulse2));
+ right_migimae.setProcessValue(x_pulse1*-1);
+ right_migiusiro.setProcessValue(x_pulse2*-1);
+ right_hidarimae.setProcessValue(x_pulse1*-1);
+ right_hidariusiro.setProcessValue(x_pulse2*-1);
//制御量(計算結果)
migimae_data[0] = right_migimae.compute();
@@ -506,31 +579,36 @@
//制御量をPWM値に変換
//右進(目標まで達していない)
- if((abs(x_pulse1) < target) || (abs(x_pulse2) < target)) {
+ if((x_pulse1*-1 < target*-1) && (x_pulse2*-1 < target*-1)) {
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((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];
+ //前側が右に出ちゃった♥(後側だけ回して前側は停止)
+ else if((x_pulse1*-1 > target*-1) && (x_pulse2*-1 < target*-1)) {
true_migimae_data[0] = 0x80;
+ true_migiusiro_data[0] = migiusiro_data[0];
+ true_hidarimae_data[0] = 0x80;
+ true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
+ }
+ //後側が右に出ちゃった♥(前側だけ回して後側は停止)
+ else if((x_pulse1*-1 < target*-1) && (x_pulse2*-1 > target*-1)) {
+ true_migimae_data[0] = 0x7B - migimae_data[0];
true_migiusiro_data[0] = 0x80;
- true_hidarimae_data[0] = 0x80;
+ true_hidarimae_data[0] = hidarimae_data[0];
true_hidariusiro_data[0] = 0x80;
- } else {
- true_migimae_data[0] = 0x80;
- true_migiusiro_data[0] = 0x80;
- true_hidarimae_data[0] = 0x80;
- true_hidariusiro_data[0] = 0x80;
+ }
+ //左進(目標より行き過ぎ)
+ else if((x_pulse1*-1 > target*-1) && (x_pulse2*-1 > target*-1)) {
+ 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];
}
}
-void left_PID(unsigned int target) {
+void left_PID(int target) {
//センサ出力値の最小、最大
left_migimae.setInputLimits(-2147483648, 2147483647);
@@ -540,27 +618,32 @@
//制御量の最小、最大
//左進(目標まで達していない)
- if((x_pulse1 < target) || (x_pulse2 < target)) {
+ 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((x_pulse1 > target) && (x_pulse2 < target)) {
+ left_migimae.setOutputLimits(0x7C, 0x83);
+ left_migiusiro.setOutputLimits(0x7C, 0x83);
+ left_hidarimae.setOutputLimits(0x00, 0x69);
+ left_hidariusiro.setOutputLimits(0x84, 0xFF);
+ }
+ //後側が左に出ちゃった♥(前側だけ回して後側は停止)
+ else if((x_pulse1 < target) && (x_pulse2 > target)) {
+ left_migimae.setOutputLimits(0x84, 0xED);
+ left_migiusiro.setOutputLimits(0x00, 0x7B);
+ left_hidarimae.setOutputLimits(0x7C, 0x83);
+ left_hidariusiro.setOutputLimits(0x7C, 0x83);
}
//右進(目標より行き過ぎ)
- 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);
+ else if((x_pulse1 > target) && (x_pulse2 > target)) {
+ left_migimae.setOutputLimits(0x00, 0x6C);
+ left_migiusiro.setOutputLimits(0x84, 0xFF);
+ left_hidarimae.setOutputLimits(0x84, 0xF0);
+ left_hidariusiro.setOutputLimits(0x00, 0x7B);
}
//よくわからんやつ
@@ -589,31 +672,36 @@
//制御量をPWM値に変換
//左進(目標まで達していない)
- if((x_pulse1 < target) || (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((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];
+ //前側が左に出ちゃった♥(後側だけ回して前側は停止)
+ else if((x_pulse1 > target) && (x_pulse2 < target)) {
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;
+ true_hidarimae_data[0] = 0x7B - hidarimae_data[0];
+ true_hidariusiro_data[0] = 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] = 0x80;
true_hidariusiro_data[0] = 0x80;
}
+ //右進(目標より行き過ぎ)
+ 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];
+ }
}
-void turn_right_PID(unsigned int target) {
+void turn_right_PID(int target) {
//センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
turn_right_migimae.setInputLimits(-2147483648, 2147483647);
@@ -623,26 +711,18 @@
//制御量の最小、最大
//右旋回(目標に達してない)
- //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);
+ if(x_pulse2 < target) {
+ turn_right_migimae.setOutputLimits(0x10, 0x7B);
+ turn_right_migiusiro.setOutputLimits(0x10, 0x7B);
+ turn_right_hidarimae.setOutputLimits(0x94, 0xFF);
+ turn_right_hidariusiro.setOutputLimits(0x94, 0xFF);
}
//左旋回(目標より行き過ぎ)
- //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);
+ else if(x_pulse2 > target) {
+ turn_right_migimae.setOutputLimits(0x94, 0xFF);
+ turn_right_migiusiro.setOutputLimits(0x94, 0xFF);
+ turn_right_hidarimae.setOutputLimits(0x10, 0x7B);
+ turn_right_hidariusiro.setOutputLimits(0x10, 0x7B);
}
//よくわからんやつ
@@ -658,10 +738,10 @@
turn_right_hidariusiro.setSetPoint(target);
//センサ出力
- 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));
+ turn_right_migimae.setProcessValue(x_pulse2);
+ turn_right_migiusiro.setProcessValue(x_pulse2);
+ turn_right_hidarimae.setProcessValue(x_pulse2);
+ turn_right_hidariusiro.setProcessValue(x_pulse2);
//制御量(計算結果)
migimae_data[0] = turn_right_migimae.compute();
@@ -671,35 +751,22 @@
//制御量をPWM値に変換
//右旋回(目標に達してない)
- //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) {
+ if(x_pulse2 < 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((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;
- true_hidarimae_data[0] = 0x80;
- true_hidariusiro_data[0] = 0x80;
+ else if(x_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];
}
}
-void turn_left_PID(unsigned int target) {
+void turn_left_PID(int target) {
//センサ出力値の最小、最大(とりあえずint型が持てる範囲に設定)
turn_left_migimae.setInputLimits(-2147483648, 2147483647);
@@ -709,22 +776,18 @@
//制御量の最小、最大
//右旋回(目標に達してない)
- //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);
+ turn_left_migimae.setOutputLimits(0x94, 0xFF);
+ turn_left_migiusiro.setOutputLimits(0x94, 0xFF);
+ turn_left_hidarimae.setOutputLimits(0x10, 0x7B);
+ turn_left_hidariusiro.setOutputLimits(0x10, 0x7B);
}
//左旋回(目標より行き過ぎ)
- //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);
+ turn_left_migimae.setOutputLimits(0x10, 0x7B);
+ turn_left_migiusiro.setOutputLimits(0x10, 0x7B);
+ turn_left_hidarimae.setOutputLimits(0x94, 0xFF);
+ turn_left_hidariusiro.setOutputLimits(0x94, 0xFF);
}
//よくわからんやつ
@@ -753,8 +816,6 @@
//制御量をPWM値に変換
//右旋回(目標に達してない)
- //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];
@@ -762,18 +823,11 @@
true_hidariusiro_data[0] = 0x7B - hidariusiro_data[0];
}
//左旋回(目標より行き過ぎ)
- //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];
true_hidariusiro_data[0] = hidariusiro_data[0];
- } else {
- true_migimae_data[0] = 0x80;
- true_migiusiro_data[0] = 0x80;
- true_hidarimae_data[0] = 0x80;
- true_hidariusiro_data[0] = 0x80;
}
}