From f5a40b99b17c4ed5f66d480fe9fa366941830d8a Mon Sep 17 00:00:00 2001 From: ws <1621320660@qq.com> Date: Wed, 25 Jun 2025 10:48:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E7=90=83=E8=B5=9B=E5=B7=B2=E6=B5=8B?= =?UTF-8?q?=EF=BC=8C=E8=BF=99=E4=B8=AA=E8=BF=9B=E6=94=BB=E6=83=B3=E6=B3=95?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MDK-ARM/.vscode/keil-assistant.log | 6 ++++ MDK-ARM/.vscode/uv4.log | 4 +-- MDK-ARM/.vscode/uv4.log.lock | 2 +- MDK-ARM/R1.uvoptx | 24 +++++++++++----- MDK-ARM/README.md | 11 +++---- User/bsp/TopDefine.h | 6 ++-- User/module/ball.cpp | 27 ++++++++++++++---- User/module/shoot.cpp | 46 ++++++++++++++++++------------ User/module/shoot.hpp | 4 ++- User/task/userTask.h | 2 +- 10 files changed, 86 insertions(+), 46 deletions(-) diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log index b185d46..d299dca 100644 --- a/MDK-ARM/.vscode/keil-assistant.log +++ b/MDK-ARM/.vscode/keil-assistant.log @@ -60,3 +60,9 @@ [info] Log at : 2025/6/24|12:24:51|GMT+0800 +[info] Log at : 2025/6/24|19:22:03|GMT+0800 + +[info] Log at : 2025/6/24|21:35:17|GMT+0800 + +[info] Log at : 2025/6/25|09:51:44|GMT+0800 + diff --git a/MDK-ARM/.vscode/uv4.log b/MDK-ARM/.vscode/uv4.log index 0751b3e..41a6d6b 100644 --- a/MDK-ARM/.vscode/uv4.log +++ b/MDK-ARM/.vscode/uv4.log @@ -1,8 +1,8 @@ *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\keil\ARM\ARMCC\Bin' Build target 'R1' -compiling ball.cpp... +compiling shoot.cpp... linking... -Program Size: Code=30768 RO-data=1832 RW-data=260 ZI-data=32244 +Program Size: Code=31344 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:05 diff --git a/MDK-ARM/.vscode/uv4.log.lock b/MDK-ARM/.vscode/uv4.log.lock index 8d7ef38..5d1c280 100644 --- a/MDK-ARM/.vscode/uv4.log.lock +++ b/MDK-ARM/.vscode/uv4.log.lock @@ -1 +1 @@ -2025/6/24 2:11:53 \ No newline at end of file +2025/6/25 9:57:28 \ No newline at end of file diff --git a/MDK-ARM/R1.uvoptx b/MDK-ARM/R1.uvoptx index 79f860a..391746e 100644 --- a/MDK-ARM/R1.uvoptx +++ b/MDK-ARM/R1.uvoptx @@ -158,7 +158,7 @@ 0 1 - rc_ctrl,0x0A + ball,0x0A 1 @@ -168,17 +168,27 @@ 2 1 - ball,0x0A + triggerCount,0x0A 3 1 - aaaa,0x0A + abc,0x0A 4 1 - aaaxxx,0x0A + rc_ctrl,0x0A + + + 5 + 1 + nucbuf + + + 6 + 1 + nuc_v @@ -939,7 +949,7 @@ User/device - 0 + 1 0 0 0 @@ -1031,7 +1041,7 @@ User/module - 1 + 0 0 0 0 @@ -1063,7 +1073,7 @@ User/task - 1 + 0 0 0 0 diff --git a/MDK-ARM/README.md b/MDK-ARM/README.md index dfbbd1f..2616111 100644 --- a/MDK-ARM/README.md +++ b/MDK-ARM/README.md @@ -21,16 +21,17 @@ r1上层 ## 待解决 -+ 用了将运球和伸缩绑定到一起 -+ 串口收数加个滤波 ++ 用了将运球和伸缩绑定到一起 √ ++ 串口收数加个滤波 √ ## 思路 + 👆 传球档 👆 配合档 + 中 初始档 中 初始档 + 👇 发射档 👇 运球档 -+ 我现在已经收到了运球完成的信号 - + 发射就应该去蓄力接球了 ++ 起步遥控档我直接蓄力准备接球 + + 可多次的运球 + + 缩回转移球 + 蓄力到位,收到掉落信号和已伸出信号 + 根据视觉拟合信息的动态调整 - + 拨置👇发射清空掉落信号 (发送归位信号?) + + 拨置👇发射清空掉落信号 diff --git a/User/bsp/TopDefine.h b/User/bsp/TopDefine.h index fb37b6c..9f9a78e 100644 --- a/User/bsp/TopDefine.h +++ b/User/bsp/TopDefine.h @@ -16,9 +16,7 @@ #endif -#define TESTUP 1 -#define ONE_CONTROL 0 - +#define ONE_CONTROL 1 //是否使用大疆DT7遥控器 #ifndef DT7 #define DT7 0 @@ -36,7 +34,7 @@ #define BALL_DOWN (1<<1) //运球结束 -#define PREPARE (1<<0) +//#define PREPARE (1<<0) //伸缩结束 #define EXTEND_OK (1<<3) diff --git a/User/module/ball.cpp b/User/module/ball.cpp index 9558457..124fc96 100644 --- a/User/module/ball.cpp +++ b/User/module/ball.cpp @@ -81,7 +81,7 @@ void Ball::Send_control() } -#if TESTUP +#if ONE_CONTROL==0 void Ball::ballDown(void) { @@ -151,6 +151,7 @@ void Ball::ballHadling(void) HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 if (rc_key == DOWN2) // 检测按键是否被按下 { + triggerCount = 0; // 重置触发计数 currentState1 = BALL_FORWARD; } @@ -179,6 +180,7 @@ void Ball::ballHadling(void) break; case BALL_FLAG: + osDelay(10); // 延时 50ms if (triggerCount == 1 && ball_state == 0 && last_ball_state == 1) // 第二次检测到球 { triggerCount++; // 增加触发计数 @@ -190,7 +192,7 @@ void Ball::ballHadling(void) case BALL_CLOSE: if (triggerCount == 2) // 确保是第二次触发 { - //osDelay(5); + osDelay(50); HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 currentState1 = BALL_FINISH; // 切换到反转状态 } @@ -200,6 +202,7 @@ void Ball::ballHadling(void) osDelay(50); // 延时 50ms HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET); // 确保气缸爪子闭合 HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + triggerCount = 0; // 重置触发计数 //currentState1 = BALL_IDLE; // 回到空闲状态 @@ -213,7 +216,6 @@ void Ball::ballHadling(void) } - #endif #if ONE_CONTROL @@ -233,7 +235,6 @@ void Ball::ball_control() break; case DOWN2: - osThreadFlagsSet(task_struct.thread.shoot, PREPARE); // 通知发射任务快点去蓄力 ballHadling(); break; @@ -297,8 +298,22 @@ void Ball::Idle_control() osThreadFlagsClear(EXTEND_OK); // 拨杆回到中间挡位时,回位并重置状态机 - xiaomi.position = I_ANGLE; - currentState1 = BALL_IDLE; + if(currentState1==EXTEND_FINISH)//转移后 + { + xiaomi.position = I_ANGLE; + currentState1 = BALL_IDLE; + } + if(currentState1==BALL_FINISH)//运球完成 + { + xiaomi.position = O_ANGLE; + currentState1 = BALL_IDLE; + } + else + { + currentState1 = BALL_IDLE; + } + //xiaomi.position = I_ANGLE; + } int ball_state = 0; diff --git a/User/module/shoot.cpp b/User/module/shoot.cpp index e8f8c63..754bd4a 100644 --- a/User/module/shoot.cpp +++ b/User/module/shoot.cpp @@ -28,7 +28,7 @@ const fp32 Shoot:: M2006_angle_PID[3] = { 15, 0.1, 0}; #define TO_BOTTOM 5.0f #define INIT_POS -130 -#define TOP_POS -210 +#define TOP_POS -211 #define BOTTOM_POS 0 #define GO_ERROR 1.0f #define Tigger_DO 0 @@ -57,6 +57,7 @@ Shoot::Shoot() go1.W = 0, go1.T = 0, + limit_speed=TO_TOP;//快速上去 fire_pos = INIT_POS; // 发射位置 BSP_UART_RegisterCallback(BSP_UART_RS485, BSP_UART_RX_CPLT_CB, USART1_RxCompleteCallback);//注册串口回调函数,bsp层 @@ -124,6 +125,7 @@ int Shoot::GO_SendData(float pos,float limit) // F键 sw[0]👆 1800 👇200 // E键 sw[1] 👆 200 shoot 中 1000 stop sw[2]200 sw[2]👇1800 // G键 sw[6]👆 1800 中 1000 👇200 +// B键 sw[3]👆 200 开 中 1000 👇1800 关 //左旋 sw[7] 200 --1800 void Shoot::rc_mode() { @@ -147,6 +149,15 @@ void Shoot::rc_mode() { mode_key=VSION; } + if(rc_ctrl.sw[3]==1800) + { + ready_key=PREPARE; + } + else + { + ready_key=0; //默认不准备 + } + // if(rc_ctrl.sw[7]==200) // { @@ -190,7 +201,7 @@ knob_increment = map_min + (map_max - map_min) * (current_knob_value - knob_min) -#if TESTUP +#if ONE_CONTROL==0 void Shoot::shoot_control() { @@ -279,7 +290,7 @@ break; abs_limit_min_max_fp(&go1.Pos ,-210.0f,2.0f); // 发送数据到蓄力电机 - GO_SendData(go1.Pos, 5.0f); + GO_SendData(go1.Pos,limit_speed); // 控制扳机电机 trigger_control(); @@ -292,6 +303,7 @@ void Shoot :: shoot_Current() case SHOOT_IDLE: // 初始状态:钩子移动到顶部,钩住拉簧 control_pos = TOP_POS; // 顶部位置 + limit_speed=TO_TOP;//快速上去 go1.Pos = control_pos; t_posSet = Tigger_ZERO; // 扳机松开 if (feedback.fd_gopos <-209) { @@ -313,6 +325,7 @@ void Shoot :: shoot_Current() if (is_hooked) { go1.Pos = fire_pos; // 下拉到中间挡位位置 + limit_speed=TO_BOTTOM;//慢速下来 if (feedback.fd_gopos >= fire_pos - GO_ERROR && feedback.fd_gopos <= fire_pos + GO_ERROR) { BSP_Buzzer_Start(); BSP_Buzzer_Set(1,5000); @@ -331,7 +344,7 @@ void Shoot :: shoot_Current() void Shoot::RemoveError() { currentState = SHOOT_IDLE; - control_pos = TOP_POS; + control_pos = TOP_POS+1.0f; if (feedback.fd_gopos >= control_pos - 0.5f&& feedback.fd_gopos<= control_pos + 0.5f) { t_posSet = Tigger_ZERO; @@ -344,7 +357,7 @@ void Shoot::RemoveError() { BSP_Buzzer_Stop(); } - + limit_speed=3.0f;//慢慢送上去 go1.Pos = control_pos; } @@ -368,13 +381,8 @@ switch (mode_key) fire_pos = distance; // 视觉拟合的力 switch (rc_key) { case MIDDLE1: - - if(shoot_thread & PREPARE) // 如果收到放球完成的通知 - { ball_receive(); // 执行接收球的操作 - - } - + if(shoot_thread & EXTEND_OK) // 如果收到伸缩完成的通知 { go1.Pos = fire_pos; // 设置蓄力电机位置 @@ -411,12 +419,6 @@ break; switch (rc_key) { case MIDDLE1: - if(shoot_thread & PREPARE) // 如果收到放球完成的通知 - { - ball_receive(); // 执行接收球的操作 - - } - if(shoot_thread & EXTEND_OK) // 如果收到伸缩完成的通知 { fire_pos = INIT_POS + knob_increment; // 根据旋钮值调整发射位置 @@ -427,6 +429,10 @@ break; BSP_Buzzer_Set(1,5000); } } + else + { + ball_receive(); // 执行接收球的操作 + } break; case DOWN1: @@ -469,6 +475,8 @@ void Shoot ::ball_receive() switch (currentState) { case SHOOT_IDLE: + //底盘手动档直接蓄力 + if(ready_key == PREPARE){ // 初始状态:钩子移动到顶部,钩住拉簧 control_pos = TOP_POS; limit_speed=TO_TOP;//快速上去 @@ -477,7 +485,7 @@ void Shoot ::ball_receive() { currentState = GO_TOP; // 切换到准备发射状态 } - + } break; case GO_TOP: t_posSet = Tigger_DO; @@ -493,7 +501,7 @@ void Shoot ::ball_receive() if(feedback.fd_gopos >= BOTTOM_POS - 1.0f && feedback.fd_gopos <= BOTTOM_POS + 1.0f) { - osThreadFlagsClear(PREPARE); // 清除任务通知标志位 + //osThreadFlagsClear(PREPARE); // 清除任务通知标志位 } break; diff --git a/User/module/shoot.hpp b/User/module/shoot.hpp index 76bc8ec..ca78f6c 100644 --- a/User/module/shoot.hpp +++ b/User/module/shoot.hpp @@ -39,7 +39,8 @@ typedef enum SHOOT, WAIT, TEST, - VSION + VSION, + PREPARE }rc_mode; // 光电传感器读取宏 @@ -86,6 +87,7 @@ public: //==========================公共变量========================== int16_t rc_key; //遥控器按键 int16_t mode_key; + int16_t ready_key; int16_t trigger_key; ShootState_t currentState; //状态机 diff --git a/User/task/userTask.h b/User/task/userTask.h index fa0f2fa..56a839d 100644 --- a/User/task/userTask.h +++ b/User/task/userTask.h @@ -19,7 +19,7 @@ extern "C" { #define TASK_FREQ_MONITOR (2u) #define TASK_FREQ_CAN (1500u) #define TASK_FREQ_AI (500u) -#define TASK_FREQ_BALL (700u) +#define TASK_FREQ_BALL (500u) #define TASK_INIT_DELAY_INFO (500u) #define TASK_INIT_DELAY_MONITOR (10)