From e420cea621e11db565bb3ae9027d83b44b4a12ff Mon Sep 17 00:00:00 2001 From: ws <1621320660@qq.com> Date: Thu, 26 Jun 2025 03:22:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BB=E5=AE=88=E6=96=B9=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MDK-ARM/.vscode/uv4.log | 4 ++- MDK-ARM/.vscode/uv4.log.lock | 2 +- MDK-ARM/R1.uvoptx | 24 +++++++++++-- MDK-ARM/README.md | 10 ++++-- User/bsp/TopDefine.h | 13 +++++--- User/module/ball.cpp | 65 +++++++++++++++++++++++++++--------- User/module/ball.hpp | 12 ++----- User/module/shoot.cpp | 35 +++++++++++++------ User/module/shoot.hpp | 3 +- User/task/ballTask.cpp | 4 +-- 10 files changed, 122 insertions(+), 50 deletions(-) diff --git a/MDK-ARM/.vscode/uv4.log b/MDK-ARM/.vscode/uv4.log index 48af34e..f22d47c 100644 --- a/MDK-ARM/.vscode/uv4.log +++ b/MDK-ARM/.vscode/uv4.log @@ -1,8 +1,10 @@ *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\keil\ARM\ARMCC\Bin' Build target 'R1' +compiling shootTask.cpp... +compiling shoot.cpp... compiling ball.cpp... linking... -Program Size: Code=31076 RO-data=1832 RW-data=268 ZI-data=32252 +Program Size: Code=31644 RO-data=1832 RW-data=268 ZI-data=32252 FromELF: creating hex file... "R1\R1.axf" - 0 Error(s), 0 Warning(s). Build Time Elapsed: 00:00:06 diff --git a/MDK-ARM/.vscode/uv4.log.lock b/MDK-ARM/.vscode/uv4.log.lock index 66b39d7..ad9a215 100644 --- a/MDK-ARM/.vscode/uv4.log.lock +++ b/MDK-ARM/.vscode/uv4.log.lock @@ -1 +1 @@ -2025/6/25 21:22:14 \ No newline at end of file +2025/6/26 3:22:31 \ No newline at end of file diff --git a/MDK-ARM/R1.uvoptx b/MDK-ARM/R1.uvoptx index 269e98a..59120d2 100644 --- a/MDK-ARM/R1.uvoptx +++ b/MDK-ARM/R1.uvoptx @@ -175,7 +175,25 @@ 1 ball_exit,0x0A + + 4 + 1 + nucbuf + + + 5 + 1 + nuc_v + + + + 4 + 0 + nucbuf + 0 + + 0 @@ -934,7 +952,7 @@ User/device - 0 + 1 0 0 0 @@ -1026,7 +1044,7 @@ User/module - 0 + 1 0 0 0 @@ -1058,7 +1076,7 @@ User/task - 0 + 1 0 0 0 diff --git a/MDK-ARM/README.md b/MDK-ARM/README.md index 2616111..c7c22c8 100644 --- a/MDK-ARM/README.md +++ b/MDK-ARM/README.md @@ -29,9 +29,15 @@ r1上层 + 👆 传球档 👆 配合档 + 中 初始档 中 初始档 + 👇 发射档 👇 运球档 -+ 起步遥控档我直接蓄力准备接球 - + 可多次的运球 ++ 起步遥控档我直接蓄力准备接球 + 可多次的运球 + 缩回转移球 + 蓄力到位,收到掉落信号和已伸出信号 + 根据视觉拟合信息的动态调整 + 拨置👇发射清空掉落信号 + ++ 用一个攻守方档 + + 攻方时拨下立马蓄力并伸出(可小角度) + + 守方时不动并保持缩回 + + 👇 运球档正常运球 + + 中 初始档直接缩回 + + 👆 配合档 完成配合并伸出才能发射 diff --git a/User/bsp/TopDefine.h b/User/bsp/TopDefine.h index 1308809..0f5be42 100644 --- a/User/bsp/TopDefine.h +++ b/User/bsp/TopDefine.h @@ -16,7 +16,11 @@ #endif -#define ONE_CONTROL 0 +#define ONE_CONTROL 1 + + + + //是否使用大疆DT7遥控器 #ifndef DT7 #define DT7 0 @@ -33,9 +37,10 @@ //运球 #define BALL_DOWN (1<<1) -//运球结束 -//#define PREPARE (1<<0) - +//可以蓄力标志 +#define READY_TELL (1<<0) +//运球完成 +#define HANDING_FINISH (1<<2) //伸缩结束 #define EXTEND_OK (1<<3) diff --git a/User/module/ball.cpp b/User/module/ball.cpp index 1a15f5c..534d011 100644 --- a/User/module/ball.cpp +++ b/User/module/ball.cpp @@ -12,6 +12,7 @@ extern int ball_exit; //伸缩 #define I_ANGLE 147 #define O_ANGLE 187 +#define WAIT_POS 165 //PE11 气缸 @@ -72,6 +73,14 @@ void Ball::rc_mode() extern_key=OUT; } + if(rc_ctrl.sw[5]==1800) + { + ready_key=SIDE; + } + if(rc_ctrl.sw[5]==200) + { + ready_key=0; //默认不准备 + } } void Ball::Send_control() @@ -222,7 +231,10 @@ void Ball::ball_control() hand_thread = osThreadFlagsGet(); // 获取任务通知标志位 ball_state = HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin); // 读取光电状态(有球 1,无球 0) - switch (rc_key){ + //进攻 + if(ready_key==SIDE) + { + switch (rc_key){ case MIDDLE2: Idle_control(); break; @@ -236,6 +248,17 @@ void Ball::ball_control() break; } + } + //防守 + else + { + xiaomi.position = I_ANGLE; // 保持收回 + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + + } + + Send_control(); @@ -260,7 +283,7 @@ void Ball::ballDown(void) HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 检测到球自由下落一次就切换状态 - if(ball_state == 0) + if(ball_state == 1) { currentState1 = EXTEND_OUT; } @@ -291,9 +314,22 @@ void Ball::Idle_control() HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保爪气缸关闭 HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 - osThreadFlagsClear(PREPARE); + osThreadFlagsClear(EXTEND_OK); + if(ready_key==SIDE) // 检测是否准备好 + { + xiaomi.position = WAIT_POS; + if(feedback->position_deg >= WAIT_POS-3) + { + osThreadFlagsSet(task_struct.thread.shoot, READY_TELL); + } + } + else + { + xiaomi.position = I_ANGLE; // 默认回到收回位置 + } + // 拨杆回到中间挡位时,回位并重置状态机 if(currentState1==EXTEND_FINISH)//转移后 { @@ -322,13 +358,14 @@ void Ball::ballHadling(void) switch (currentState1) { case BALL_IDLE: - HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 - HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 - if (rc_key == DOWN2) // 检测按键是否被按下 - { - - - currentState1 = BALL_FORWARD; + if (rc_key == DOWN2) + { + xiaomi.position = O_ANGLE;//外伸 + if(feedback->position_deg>= O_ANGLE-1)// 确保伸缩电机到位 + { + currentState1 = BALL_FORWARD; + } + } break; @@ -369,13 +406,9 @@ void Ball::ballHadling(void) case BALL_FINISH: osDelay(50); // 延时 50ms + //osThreadFlagsSet(task_struct.thread.ball, HANDING_FINISH); HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保气缸爪子闭合 HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 - - - - //currentState1 = BALL_IDLE; // 回到空闲状态 - break; default: @@ -386,6 +419,6 @@ void Ball::ballHadling(void) } - + #endif diff --git a/User/module/ball.hpp b/User/module/ball.hpp index 2dd7da9..f92b606 100644 --- a/User/module/ball.hpp +++ b/User/module/ball.hpp @@ -31,14 +31,6 @@ typedef enum { } BallState_t; -typedef enum -{ - MOTOR_1 = 0, - MOTOR_2 = 1, - MOTOR_3 = 2, - MOTOR_DOWN = 3, - MOTOR_NUM -}motorhangd_e; typedef enum { @@ -46,7 +38,8 @@ typedef enum MIDDLE2, DOWN2, IN, - OUT + OUT, + SIDE }ball_rc_mode; // 定义光电传感器检测宏 @@ -78,6 +71,7 @@ public: //==========================公共变量==========================// int16_t rc_key; //遥控器按键 int16_t extern_key; + int16_t ready_key; //准备按键 //用于传接球,运球后通知 volatile BallState_t ballStatus;//是否有球 volatile uint32_t hand_thread;//接收传回的线程通知 diff --git a/User/module/shoot.cpp b/User/module/shoot.cpp index 545462c..9de9789 100644 --- a/User/module/shoot.cpp +++ b/User/module/shoot.cpp @@ -156,11 +156,11 @@ void Shoot::rc_mode() // } if(rc_ctrl.sw[5]==1800) { - ready_key=PREPARE; + ready_key=OFFENSIVE; } - else + else if(rc_ctrl.sw[5]==200) { - ready_key=0; //默认不准备 + ready_key=DEFENSE; } // //旋钮增量 @@ -370,6 +370,7 @@ feedback.fd_tpos = trigger_Motor->total_angle; shoot_thread = osThreadFlagsGet(); // 获取任务通知标志位 +if(ready_key==OFFENSIVE){ switch (mode_key) { case VSION: @@ -424,9 +425,15 @@ break; BSP_Buzzer_Set(1,5000); } } + if(shoot_thread & READY_TELL) // 如果收到等待配合的通知 + { + ball_receive(); // 执行接收球的操作 + } else { - ball_receive(); // 执行接收球的操作 + go1.Pos = TOP_POS-3.0f; //-208 + limit_speed=TO_TOP;//快速上去 + t_posSet = Tigger_ZERO; // 扳机松开 } break; @@ -455,6 +462,14 @@ break; break; } +} +else if(ready_key==DEFENSE)//攻守档总控 +{ + go1.Pos = TOP_POS-3.0f; //-208 + limit_speed=TO_TOP;//快速上去 + t_posSet = Tigger_ZERO; // 扳机松开 + +} abs_limit_min_max_fp(&go1.Pos ,-210.0f,2.0f); // 发送数据到蓄力电机 @@ -470,18 +485,16 @@ void Shoot ::ball_receive() switch (currentState) { case SHOOT_IDLE: - //底盘手动档直接蓄力 - if(ready_key == PREPARE){ // 初始状态:钩子移动到顶部,钩住拉簧 control_pos = TOP_POS; limit_speed=TO_TOP;//快速上去 t_posSet = Tigger_ZERO; - if(feedback.fd_gopos >= TOP_POS - 0.5f && feedback.fd_gopos <= TOP_POS + 0.5f) + if(feedback.fd_gopos <-209) { currentState = GO_TOP; // 切换到准备发射状态 } - } break; + case GO_TOP: t_posSet = Tigger_DO; if (trigger_Motor->total_angletotal_angle>Tigger_DO-1.0f) @@ -496,7 +509,7 @@ void Shoot ::ball_receive() if(feedback.fd_gopos >= BOTTOM_POS - 1.0f && feedback.fd_gopos <= BOTTOM_POS + 1.0f) { - //osThreadFlagsClear(PREPARE); // 清除任务通知标志位 + osThreadFlagsClear(READY_TELL); // 清除任务通知标志位 } break; @@ -514,14 +527,14 @@ void Shoot::RemoveError() { t_posSet = Tigger_ZERO; is_hooked = false; } - if(trigger_Motor->total_angle>=Tigger_ZERO-10) + if(trigger_Motor->total_angle>=Tigger_ZERO-5) { //认为完全松开 control_pos=INIT_POS; BSP_Buzzer_Stop(); } - + limit_speed=3.0f;//慢慢送上去 go1.Pos = control_pos; } diff --git a/User/module/shoot.hpp b/User/module/shoot.hpp index ca78f6c..7f96aab 100644 --- a/User/module/shoot.hpp +++ b/User/module/shoot.hpp @@ -40,7 +40,8 @@ typedef enum WAIT, TEST, VSION, - PREPARE + OFFENSIVE, + DEFENSE }rc_mode; // 光电传感器读取宏 diff --git a/User/task/ballTask.cpp b/User/task/ballTask.cpp index dca3947..92c8bdd 100644 --- a/User/task/ballTask.cpp +++ b/User/task/ballTask.cpp @@ -22,8 +22,8 @@ void FunctionBall(void *argument) const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_BALL; -// osDelay(6000);//等待极致控制板启动 -// XiaomiWait_init(1,&hcan2); //小米电机初始化 + osDelay(6000);//等待极致控制板启动 + XiaomiWait_init(1,&hcan2); //小米电机初始化 uint32_t tick = osKernelGetTickCount();