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();