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)