Hairo ROBOCON2021 TrackedVehicle moudule library. Ibaraki KOSEN
Dependencies: mbed TrackedVehicle PS3
README.h
- Committer:
- st17099ng
- Date:
- 2021-12-05
- Revision:
- 2:8b32f6901e10
- Parent:
- 1:ca42cf6ae77e
File content as of revision 2:8b32f6901e10:
/************************************************************************************************* program変更履歴 -------------------------------------------------------------------- 2021/10/11 R.I.P. TrackedVehicleにConvert_PS3toMsgとして移行 PS3Data -> Duty変換関数 void Data_To_Duty(void) { bool r1 = ps3.getButtonState( R1 ); bool l1 = ps3.getButtonState( L1 ); bool r2 = ps3.getButtonState( R2 ); bool l2 = ps3.getButtonState( L2 ); MD1_MaxDuty = ps3.getRightJoystickYaxis()*2+0x7F; MD2_MaxDuty = ps3.getRightJoystickYaxis()*2+0x7F; MD3_MaxDuty = ps3.getLeftJoystickYaxis()*2+0x7F; MD4_MaxDuty = ps3.getLeftJoystickYaxis()*2+0x7F; モジュール1 信地右旋回 if( ( r1 == 1 ) && ( MD1_MaxDuty >= 0xBF ) ) { MD1_Duty = BREAK_DUTY; MD2_Duty = HALF_CCW_DUTY; 信地左旋回 } else if( ( l1 == 1 ) && ( MD1_MaxDuty >= 0xBF ) ) { MD1_Duty = HALF_CCW_DUTY; MD2_Duty = BREAK_DUTY; 超信地右旋回 } else if( r1 == 1) { MD1_Duty = HALF_CW_DUTY; MD2_Duty = HALF_CCW_DUTY; 超信地左旋回 } else if( l1 == 1 ) { MD1_Duty = HALF_CCW_DUTY; MD2_Duty = HALF_CW_DUTY; 前進(JoyStickの閾値32の時 計算式:DEC(32*2) + HEX(0x7F) = 0xBF } else if( MD1_MaxDuty >= 0xBF ) { // MD1_Duty = CCW10_DUTY; MD1_Duty = HALF_CCW_DUTY; MD2_Duty = HALF_CCW_DUTY; 後進(JoyStickの閾値-32の時 計算式:DEC(-32*2) + HEX(0x7F) = 0x3F } else if( MD1_MaxDuty <= 0x3F ) { MD1_Duty = CW10_DUTY; MD1_Duty = HALF_CW_DUTY; MD2_Duty = HALF_CW_DUTY; 停止 } else { MD1_Duty = BREAK_DUTY; MD2_Duty = BREAK_DUTY; } モジュール2 信地右旋回 if( ( r2 == 1 ) && ( MD3_MaxDuty >= 0xBF ) ) { MD3_Duty = BREAK_DUTY; MD4_Duty = HALF_CCW_DUTY; 信地左旋回 } else if( ( l2 == 1 ) && ( MD3_MaxDuty >= 0xBF ) ) { MD3_Duty = HALF_CCW_DUTY; MD4_Duty = BREAK_DUTY; 超信地右旋回 } else if( r2 == 1) { MD3_Duty = HALF_CW_DUTY; MD4_Duty = HALF_CCW_DUTY; 超信地左旋回 } else if( l2 == 1 ) { MD3_Duty = HALF_CCW_DUTY; MD4_Duty = HALF_CW_DUTY; 前進(JoyStickの閾値32の時 計算式:DEC(32*2) + HEX(0x7F) = 0xBF } else if( MD3_MaxDuty >= 0xBF ) { MD3_Duty = HALF_CCW_DUTY; MD4_Duty = HALF_CCW_DUTY; 後進(JoyStickの閾値-32の時 計算式:DEC(-32*2) + HEX(0x7F) = 0x3F } else if( MD3_MaxDuty <= 0x3F ) { MD3_Duty = HALF_CW_DUTY; MD4_Duty = HALF_CW_DUTY; 停止 } else { MD3_Duty = BREAK_DUTY; MD4_Duty = BREAK_DUTY; } } ---台形制御をMDのプログラムに導入したため--- ---台形制御関数--- void Trapezoid_Ctrl(CANMessage *msg, char MD_Duty) { int Diff_Duty = MD_Duty - msg->data[2]; if ( msg->data[2] == MD_Duty ) { msg->data[2] = MD_Duty; } else if( Diff_Duty >= 3 ) { msg->data[2] += ADJUST_DUTY; } else if( ( Diff_Duty < 3 ) && ( Diff_Duty > 0 ) ) { msg->data[2] += Diff_Duty; } else if( ( Diff_Duty > -3 ) && ( Diff_Duty < 0 ) ) { msg->data[2] += Diff_Duty; } else if( Diff_Duty <= 3 ) { msg->data[2] -= ADJUST_DUTY; } } 2021/08/26 R.I.P. --void Soft_Duty(void) -> void Trapezoid_Ctrl(CANMessage *msg, char MD_Duty) に変更--- void Soft_Duty(void) { if(msg1.data[2] == MD1_Duty) { msg1.data[2] = MD1_Duty; } else if(msg1.data[2] <= MD1_Duty) { msg1.data[2] += ADJUST_DUTY; } else if(msg1.data[2] >= MD1_Duty) { msg1.data[2] -= ADJUST_DUTY; } if(msg2.data[2] == MD2_Duty) { msg2.data[2] = MD2_Duty; } else if(msg2.data[2] <= MD2_Duty) { msg2.data[2] += ADJUST_DUTY; } else if(msg2.data[2] >= MD2_Duty) { msg2.data[2] -= ADJUST_DUTY; } } ---[実装未定]PS3コン切替式非常停止--- if( Old_Emg_Flag != Emg_Flag ) { if( ( Old_Emg_Flag == 0 ) && ( Emg_Flag == 1 ) ) {//立ち上がり led1 = 0; emg_stop_tri = 0;//停止 } else if( ( Old_Emg_Flag == 1 ) && ( Emg_Flag == 0 ) ) {//立下り led1 = 0; emg_stop_tri = 0;//停止 } } else { Old_Emg_Flag = Emg_Flag; } ---ノードが増えると割込みによる運用が出来なくなる--- ticker.attach(&CAN1_Trans, 0.05); ---CAN1送信関数--- void CAN1_Trans(void) { if( !(can1.write(msg1)) ) { pc.printf("\033[1;1Hmsg1 failed"); } if( !(can1.write(msg2)) ) { pc.printf("\033[2;1Hmsg2 failed"); } if( !(can1.write(msg3)) ) { pc.printf("\033[3;1Hmsg3 failed"); } if( !(can1.write(msg4)) ) { pc.printf("\033[4;1Hmsg4 failed"); } } ***************************************************************************************************/