NHK2019_Team_B_Automatic_machine_maegawa
Dependencies: SerialMultiByte QEI omni_wheel PID R1370MeasuringWheel IRsensor ikarashiMDC_2byte_ver Eigen
Revision 1:acb42f35c7c2, committed 2019-10-02
- Comitter:
- skouki
- Date:
- Wed Oct 02 09:56:47 2019 +0000
- Parent:
- 0:76663617eca3
- Commit message:
- NHK2019_TEAM_B_MAEGAWA
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Fri Sep 13 02:15:30 2019 +0000
+++ b/main.cpp Wed Oct 02 09:56:47 2019 +0000
@@ -8,8 +8,8 @@
#include"PID.h"
#include"IRsensor.h"
-#define YPOINT 4000
-#define GAP 0
+#define YPOINT 6400
+#define GAP 20
Serial serial(MDCTX,MDCRX,115200);
ikarashiMDC motor[]={
@@ -18,7 +18,7 @@
ikarashiMDC(1,2,SM,&serial),
ikarashiMDC(1,3,SM,&serial)
};
-PositionController position_control_1(500,500,0.1,0.01,0.8);
+PositionController position_control_1(1000,1000,0.1,0.1,0.3);
OmniWheel omni(4);
SerialMultiByte s(SERIALTX,SERIALRX);
@@ -28,13 +28,14 @@
PID pid_y(0,0,0,0.001);
Serial pc(USBTX,USBRX,115200);
-DigitalIn debug_button(USER_BUTTON);
+DigitalIn an(USER_BUTTON);
DigitalOut debug_led_0(LED_0);
DigitalOut debug_led_1(LED_2);
DigitalOut debug_led_2(LED_1);
DigitalOut emergency_stop(EMERGENCY_STOP);
IRsensor IR0(IR_0);
+IRsensor IR1(IR_1);
int mode;
int instruction_mode;
@@ -45,6 +46,8 @@
double dai_x,dai_high_y;
int gap = GAP;
+double ir_distance;
+int data_a;
void set_up()
{
@@ -55,9 +58,10 @@
omni.wheel[3].setRadian(PIII + theta);
s.setHeaders('A','Z');
- s.startReceive(1);
+ s.startReceive(2);
IR0.startAveraging(5);
+ IR1.startAveraging(5);
}
@@ -66,7 +70,7 @@
pid_x.setProcessValue(m.getOutX());
X_power += pid_x.compute();
- position_control_1.compute(0.0,m.getOutY());
+ position_control_1.compute(1,m.getOutY());
Y_power += position_control_1.getVelocityY();
pid_spin.setProcessValue(m.getjyroAngle());
@@ -76,7 +80,9 @@
void mode2()
{
- X_power -= 0.3;
+ if(data_a)X_power -= 0.3;
+ else X_power += 0.3;
+
pid_y.setProcessValue(m.getOutY());
Y_power += pid_y.compute();
@@ -91,7 +97,7 @@
pid_x.setProcessValue(m.getOutX());
X_power += pid_x.compute();
- Y_power += 0.3;
+ Y_power += 0.15;
pid_spin.setProcessValue(m.getjyroAngle());
spin_power = pid_spin.compute();
@@ -111,10 +117,36 @@
}
+void mode5()
+{
+ if(data_a)X_power -= 0.3;
+ else X_power += 0.3;
+
+ pid_y.setProcessValue(m.getOutY());
+ Y_power += pid_y.compute();
+
+ pid_spin.setProcessValue(m.getjyroAngle());
+ spin_power = pid_spin.compute();
+
+}
+
+void mode6()
+{
+ if(data_a)X_power -= 0.3;
+ else X_power += 0.3;
+
+ pid_y.setProcessValue(m.getOutY());
+ Y_power += pid_y.compute();
+
+ pid_spin.setProcessValue(m.getjyroAngle());
+ spin_power = pid_spin.compute();
+
+ if(m.getjyroAngle() >=10.0)Y_power -= 0.5;
+}
void to_main()
{
unsigned char data[5];
- unsigned char getdata[1];
+ unsigned char getdata[2];
int X_ = m.getOutX();
int Y_ = m.getOutY();
data[0] = mode;
@@ -139,6 +171,7 @@
s.sendData(data,5);
s.getData(getdata);
instruction_mode = getdata[0];
+ data_a = getdata[1];
if(instruction_mode)debug_led_1 = !debug_led_1;
}
@@ -146,18 +179,25 @@
{
set_up();
emergency_stop = 1;
+ an.mode(PullUp);
while(true){
debug_led_0 = !debug_led_0;
+ if(m.getjyroAngle() <= 1.0 && m.getjyroAngle() >= -1.0){
+ debug_led_2 = 1;
+ }
+ else debug_led_2 = 0;
X_power = 0.0;
Y_power = 0.0;
spin_power = 0.0;
+ if(data_a)ir_distance = IR0.get_Averagingdistance();
+ else ir_distance = IR1.get_Averagingdistance();
to_main();
if(instruction_mode == 1&&mode == 0){
pid_x.reset();
- pid_x.setTunings(3.0,1.0,0.000001);
+ pid_x.setTunings(10.0,1.0,0.000001);
pid_x.setInputLimits(-1000.0,1000.0);
pid_x.setOutputLimits(-1.0,1.0);
pid_x.setBias(0);
@@ -167,7 +207,7 @@
position_control_1.targetXY(1,int(y_point));
pid_spin.reset();
- pid_spin.setTunings(5.0,1.0,0.000001);
+ pid_spin.setTunings(10.0,1.0,0.000001);
pid_spin.setInputLimits(-180.0,180.0);
pid_spin.setOutputLimits(-0.5,0.5);
pid_spin.setBias(0);
@@ -180,7 +220,7 @@
if(instruction_mode == 2&&mode == 1){
pid_y.reset();
- pid_y.setTunings(1.0,1.0,0.000001);
+ pid_y.setTunings(3.0,1.0,0.000001);
pid_y.setInputLimits(y_point - 1000.0 , y_point + 1000.0);
pid_y.setOutputLimits(-1.0,1.0);
pid_y.setBias(0);
@@ -198,7 +238,7 @@
mode = 2;
}
- if(IR0.get_Averagingdistance()<=20&&mode == 2){
+ if(((ir_distance<=10&&mode == 2)||instruction_mode == 0xff - 1) && mode != 0xff){
dai_x = m.getOutX();
mode = 0xff;
}
@@ -223,7 +263,7 @@
mode = 3;
}
- if(IR0.get_Averagingdistance()>=50&&mode == 3){
+ if(ir_distance>=20&&mode == 3){
dai_high_y = m.getOutY();
pid_x.reset();
@@ -235,7 +275,7 @@
pid_x.setSetPoint(dai_x);
pid_y.reset();
- pid_y.setTunings(1.0,1.0,0.000001);
+ pid_y.setTunings(10.0,1.0,0.000001);
pid_y.setInputLimits(dai_high_y + gap - 1000.0 ,dai_high_y + gap + 1000.0);
pid_y.setOutputLimits(-1.0,1.0);
pid_y.setBias(0);
@@ -253,14 +293,62 @@
mode = 4;
}
- if(Y_power < 0.05 && Y_power > -0.05 && mode == 4){
- mode = 0xff;
+ if(instruction_mode == 5&&mode == 4){
+ //gap = GAP - 30;
+
+ pid_y.reset();
+ pid_y.setTunings(5.0,1.0,0.000001);
+ pid_y.setInputLimits(dai_high_y + gap - 1000.0 ,dai_high_y + gap + 1000.0);
+ pid_y.setOutputLimits(-1.0,1.0);
+ pid_y.setBias(0);
+ pid_y.setMode(1);
+ pid_y.setSetPoint(dai_high_y + gap);
+
+ pid_spin.reset();
+ pid_spin.setTunings(5.0,1.0,0.000001);
+ pid_spin.setInputLimits(-180.0,180.0);
+ pid_spin.setOutputLimits(-0.5,0.5);
+ pid_spin.setBias(0);
+ pid_spin.setMode(1);
+ pid_spin.setSetPoint(0.0);
+
+ mode = 5;
}
+/*
+ if(m.getOutX() <= -1600 && mode==5){
+ //gap = GAP - 50;
+
+ pid_y.reset();
+ pid_y.setTunings(5.0,1.0,0.000001);
+ pid_y.setInputLimits(dai_high_y + gap - 1000.0 ,dai_high_y + gap + 1000.0);
+ pid_y.setOutputLimits(-1.0,1.0);
+ pid_y.setBias(0);
+ pid_y.setMode(1);
+ pid_y.setSetPoint(dai_high_y + gap);
+
+ pid_spin.reset();
+ pid_spin.setTunings(5.0,1.0,0.000001);
+ pid_spin.setInputLimits(-180.0,180.0);
+ pid_spin.setOutputLimits(-0.5,0.5);
+ pid_spin.setBias(0);
+ pid_spin.setMode(1);
+ pid_spin.setSetPoint(0.0);
+
+ mode = 6;
+
+ }
+ */
+
+ if(an.read()==0)y_point = 0;
if(mode == 1)mode1();
if(mode == 2)mode2();
if(mode == 3)mode3();
if(mode == 4)mode4();
+ if(mode == 5)mode5();
+ if(mode == 6)mode6();
+ if(m.getOutX() <= -3400){X_power = 0.0;Y_power = 0.0;}
+
omni.computeXY(Y_power,-X_power,-spin_power);
@@ -270,5 +358,7 @@
motor[i].setSpeed(omni_power[i]);
}
+ //pc.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n\r",m.getOutX(),m.getOutY(),m.getjyroAngle(),X_power,Y_power,spin_power,ir_distance);
+
}
}