r1upper/User/module/ball.cpp
2025-04-12 15:18:06 +08:00

141 lines
4.0 KiB
C++

#include "ball.hpp"
#include "bsp_delay.h"
#include "remote_control.h"
#include "detect.h"
extern RC_ctrl_t rc_ctrl;
#define KP 0.8
#define KD 0.008
//PE9 刹车光电
//PE11 接球气缸
//PE13 爪子气缸
//PE14 下球气缸
//PC6 接球光电
//PI6 运球光电
int aaa=0;
// 定义状态机变量
BallState_t currentBallState = BALL_IDLE;
Ball ::Ball()
{
aaa=10;
//ballState =HAL_GPIO_ReadPin(in_ball_GPIO_Port, in_ball_Pin);
detect_init();
}
void Ball ::ballCatch(void)
{
if(rc_ctrl.ch[1]>=300)
{
HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET);//收网
}
else if(rc_ctrl.ch[1]<300)
{
HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET);//放网
}
}
void Ball ::ballFlow(void)
{
GO_M8010_send_data(&huart6, 1,0,0,angleSet[1],0.5,KP,KD);
}
void Ball ::ballZero(void)
{
GO_M8010_send_data(&huart6, 1,0,0,0,0,0,0);
}
void Ball ::ballHadling(void)
{
if(rc_ctrl.sw[0]==306)
{
HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_SET);//爪子气缸 开爪
osDelay(200);
HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET);//下球气缸 打出
osDelay(500);
angleSet[1] = 2;
ballFlow();
}
else
{
HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET);//爪子气缸 关爪
HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET);//下球气缸 打入
angleSet[1] = 0;
ballFlow();
}
}
void Ball::ballStateMachine() {
switch (currentBallState) {
case BALL_IDLE: {
// 空闲状态,等待遥控器输入
if (rc_ctrl.sw[0] == 306) { // 假设遥控器开关控制开始运球
// HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 收网
// osDelay(200); // 等待收网完成
currentBallState = BALL_RELEASE; // 切换到下球气缸弹出状态
}
break;
}
case BALL_RELEASE: {
// 下球气缸弹出,爪子张开
HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET); // 下球气缸弹出
HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_SET); // 爪子张开
osDelay(200); // 等待动作完成
currentBallState = BALL_JOINT_REVERSE; // 切换到关节电机反转状态
break;
}
case BALL_JOINT_REVERSE: {
// 关节电机反转置水平位置
angleSet[1] = 2; // 设置关节电机目标角度为水平位置
ballFlow(); // 控制关节电机动作
osDelay(500); // 等待电机动作完成
currentBallState = BALL_FALLING; // 切换到球加速落下状态
break;
}
case BALL_FALLING: {
// 球加速落下,等待光电检测
if (IS_PHOTOELECTRIC_BALL()) {
currentBallState = BALL_WAIT_BOUNCE; // 切换到等待反弹状态
}
break;
}
case BALL_WAIT_BOUNCE: {
// 等待光电检测反弹
osDelay(50); // 简单延时,避免误触发
if (IS_PHOTOELECTRIC_BALL()) {
currentBallState = BALL_NET_CLOSE; // 切换到收网状态
}
break;
}
case BALL_NET_CLOSE: {
// 收网状态
// HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); // 收网
// osDelay(200); // 等待收网完成
HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET); // 关闭爪子
HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 下球气缸复位
angleSet[1] = 1; // 关节电机复位
ballFlow();
currentBallState = BALL_IDLE; // 切换回空闲状态
break;
}
default: {
currentBallState = BALL_IDLE; // 默认回到空闲状态
break;
}
}
}