NHK2019_Team_B_Automatic_machine_maingawa
Dependencies: SerialMultiByte QEI omni_wheel PID R1370MeasuringWheel IRsensor ikarashiMDC_2byte_ver
main.cpp
- Committer:
- skouki
- Date:
- 2019-10-02
- Revision:
- 1:697097e548f9
- Parent:
- 0:f68b460de813
File content as of revision 1:697097e548f9:
#include"mbed.h" #include"SerialMultiByte.h" #include"pin_config.h" #include"IRsensor.h" #include"QEI.h" #include"PID.h" #include"ikarashiMDC.h" #define POINT 22380 SerialMultiByte sita_s(S_SERIALTX,S_SERIALRX); SerialMultiByte ue_s(U_SERIALTX,U_SERIALRX); DigitalIn start(STARTPIN); Serial pc(USBTX,USBRX,115200); DigitalOut debug_led_0(LED0); DigitalOut debug_led_1(LED1); DigitalOut debug_led_2(LED2); DigitalIn mode_r_b(MODE_R_B); PID pid(5.0,3.0,0.000001,0.001); Serial serial(MDCTX,MDCRX,115200); ikarashiMDC motor[]={ ikarashiMDC(1,0,SM,&serial), ikarashiMDC(1,1,SM,&serial), ikarashiMDC(1,2,SM,&serial), ikarashiMDC(1,3,SM,&serial) }; QEI wheel_2(QEI_1_1,QEI_1_2, NC, 500,QEI::X4_ENCODING); QEI wheel_1(QEI_3_1,QEI_3_2, NC, 500,QEI::X4_ENCODING); /* IRsensor IR0(IR_0); IRsensor IR1(IR_1); IRsensor IR2(IR_2); */ int mode=0; int u_mode=0,s_mode=0,m_mode=0; unsigned char itidata[4]; int X_,Y_; int data_a; double power[4]; bool end_flag = true; bool down_flag = false; bool debugmode = false; int height_point = POINT; double plus_power; int field; void to_sita(){ unsigned char data[6]; unsigned char getdata[1]; data[0] = mode; for(int i=0;i<4;i++){ data[i+1] = itidata[i]; } data[5] = field; sita_s.sendData(data,6); sita_s.getData(getdata); s_mode = getdata[0]; } /* void ir_checker(){ float ir_0 = IR0.get_Averagingdistance(); float ir_1 = IR1.get_Averagingdistance(); float ir_2 = IR2.get_Averagingdistance(); pc.printf("%.2f\\%.2f\\%.2f\\",ir_0,ir_1,ir_2); data_a = 2; if(ir_0 <= 40.0) { data_a = 1; return; } if(ir_2 <= 40.0){ data_a = 3; return; } data_a = 0; } */ void to_ue(){ unsigned char data[2]; unsigned char getdata[5]; data[0] = mode; data[1] = field; ue_s.sendData(data,2); ue_s.getData(getdata); u_mode=getdata[0]; for(int i=0;i<4;i++){ itidata[i] = getdata[i+1]; } } void syoukou() { if(debugmode)return; if(end_flag&&!down_flag){ if(height_point >= wheel_1.getPulses())power[0] = 0.8; else power[0] = 0.0; if(height_point >= wheel_2.getPulses()){ pid.setProcessValue(wheel_1.getPulses() - wheel_2.getPulses()); plus_power = pid.compute(); power[1] = 0.8 - plus_power; } else power[1] = 0.0; if((height_point <= wheel_1.getPulses())&&(height_point <= wheel_2.getPulses()))down_flag = true; } if(!end_flag){ power[0] += 0.0; power[1] += 0.0; } if(down_flag){ if((height_point-3000) < wheel_1.getPulses())power[0] -= 0.6; else power[0] = 0.0; if((height_point-3000) < wheel_2.getPulses())power[1] -= 0.6; else power[1] = 0.0; if(power[0]+power[1] == 0.0){ down_flag = false; end_flag = false; } } } void iti_checker() { int X_; if(itidata[1]>=(1<<7)){ itidata[1]-=(1<<7); X_=-1*(itidata[0]+(itidata[1]<<8)); } else X_= itidata[0]+(itidata[1]<<8); if(X_ <= -1000)motor[2].setSpeed(-0.2); else motor[2].setSpeed(0.0); } int main() { sita_s.setHeaders('A','Z'); sita_s.startReceive(1); ue_s.setHeaders('A','Z'); ue_s.startReceive(5); /* IR0.startAveraging(5); IR1.startAveraging(5); IR2.startAveraging(5);*/ pid.setInputLimits(-10000.0,10000.0); pid.setOutputLimits(-1.0,1.0); pid.setBias(0); pid.setMode(1); pid.setSetPoint(0.0); field = mode_r_b.read(); debug_led_1 = field; debug_led_2 = !field; while(1) { for(int i = 0;i < 2;i++)power[i] = 0.0; debug_led_0 = !debug_led_0; //ir_checker(); to_ue(); to_sita(); iti_checker(); if(start.read() == 0)mode = 1; if(mode==1&&s_mode ==2)mode = 2; if(mode == 2&&(u_mode == 0xff || s_mode == 0xff))mode = 0xff - 1; if((mode == 0xff - 1)&&u_mode == 0xff && s_mode == 0xff)mode = 3; if(mode == 3&&u_mode == 3 &&s_mode == 3)syoukou(); if(mode == 3&&u_mode == 3 &&s_mode == 4)syoukou(); if(mode == 3&&u_mode == 4 &&s_mode == 3)syoukou(); if(mode == 3&&u_mode == 4 &&s_mode == 4)syoukou(); if(mode == 3&&u_mode == 4 &&s_mode == 4&&!end_flag)mode = 5; if(mode == 1){ if(wheel_1.getPulses() <= 1000)power[0] += 0.5; else power[0] = 0; if(wheel_2.getPulses() <= 1000)power[1] += 0.5; else power[1] = 0; } /* if(u_mode == 6&&s_mode==6){ if((height_point-4000) < wheel_1.getPulses())power[0] -= 0.6; else power[0] = 0.0; if((height_point-4000) < wheel_2.getPulses())power[1] -= 0.6; else power[1] = 0.0; } */ motor[0].setSpeed(power[0]); motor[1].setSpeed(power[1]); pc.printf("%d,%d,%d,%d,%.2f,%.2f,%d\n\r",s_mode,u_mode,wheel_1.getPulses(),wheel_2.getPulses(),power[0],power[1],mode_r_b.read()); //pc.printf("%d\n\r",data_a); } return 0; }