Car/Peripheral/Src/control.c

204 lines
3.7 KiB
C
Raw Permalink Normal View History

2024-07-15 20:10:12 +08:00
#include "control.h"
#include "hcsr04.h"
#include "led.h"
#include "motor.h"
2024-07-19 12:32:54 +08:00
#include "buzzer.h"
#include "servo.h"
2024-07-15 20:10:12 +08:00
#define CMD_MOVE 0
#define CMD_ROTATE 1
#define CMD_BUZZER 2
#define CMD_SPEED 3
2024-07-19 12:32:54 +08:00
#define CMD_SERVO 4
2024-07-15 20:10:12 +08:00
// #define CMD_SING 5
#define CMD_LED 6
// #define CMD_FIRE 7
2024-07-19 12:32:54 +08:00
#define CMD_SERVO_RESET 8
2024-07-15 20:10:12 +08:00
// 小车默认速度
static int8_t speed = 20;
uint8_t mode = MODE_REMOTE;
void carMove(uint8_t state);
void carSpin(uint8_t state);
void callBuzzer(uint8_t state);
void setSpeed(uint8_t state);
2024-07-19 12:32:54 +08:00
void setServo(uint8_t state);
2024-07-15 20:10:12 +08:00
// void sing(uint8_t state);
void setLed(uint8_t state);
// void fire(uint8_t state);
void CONTROL_CommonCmd(uint8_t type, uint8_t state)
{
switch (type)
{
case CMD_MOVE:
carMove(state);
break;
case CMD_ROTATE:
carSpin(state);
break;
case CMD_BUZZER:
callBuzzer(state);
break;
case CMD_SPEED:
setSpeed(state);
break;
2024-07-19 12:32:54 +08:00
case CMD_SERVO:
setServo(state);
break;
2024-07-15 20:10:12 +08:00
// case CMD_SING:
// break;
case CMD_LED:
setLed(state);
break;
2024-07-19 12:32:54 +08:00
// case CMD_FIRE:
// break;
case CMD_SERVO_RESET:
SERVO_Init();
break;
2024-07-15 20:10:12 +08:00
}
}
2024-07-19 12:32:54 +08:00
inline void CONTROL_Servo(uint8_t degree)
{
SERVO_Rotate(degree);
}
inline void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b)
2024-07-15 20:10:12 +08:00
{
LED_Start(LED_ALL);
LED_SetDuty(r, g, b);
}
void CONTROL_Mode(uint8_t new_mode, uint8_t state)
{
if (state == 0)
{
mode = MODE_STOP;
MOTOR_Stop();
}
else
{
mode = new_mode;
switch (new_mode)
{
case MODE_REMOTE:
speed = 20;
MOTOR_SetDuty(speed, speed);
2024-07-17 22:14:32 +08:00
MOTOR_Init();
2024-07-15 20:10:12 +08:00
break;
case MODE_PATROL:
break;
case MODE_AVOID:
break;
default:
mode = MODE_STOP;
MOTOR_Stop();
break;
}
}
}
void carMove(uint8_t state)
{
if (state == 0)
MOTOR_Stop();
else
{
2024-07-17 22:14:32 +08:00
MOTOR_Init();
2024-07-15 20:10:12 +08:00
switch (state)
{
// 前进
case 1:
MOTOR_SetDuty(speed, speed);
break;
// 后退
case 2:
MOTOR_SetDuty(-speed, -speed);
break;
// 左转
case 3:
MOTOR_SetDuty(0, speed);
break;
// 右转
case 4:
MOTOR_SetDuty(speed, 0);
break;
}
}
}
2024-07-19 12:32:54 +08:00
inline void carSpin(uint8_t state)
2024-07-15 20:10:12 +08:00
{
if (state == 1)
MOTOR_SetDuty(speed, -speed);
else if (state == 2)
MOTOR_SetDuty(-speed, speed);
}
2024-07-19 12:32:54 +08:00
inline void callBuzzer(uint8_t state)
2024-07-15 20:10:12 +08:00
{
2024-07-19 12:32:54 +08:00
BUZZER_StartTimed(5);
2024-07-15 20:10:12 +08:00
}
void setSpeed(uint8_t state)
{
if (state == 1)
speed += 10;
else if (state == 2)
speed -= 10;
if (speed > 100)
speed = 100;
else if (speed < 20)
speed = 20;
}
2024-07-19 12:32:54 +08:00
void setServo(uint8_t state)
{
if (state == 1)
SERVO_Rotate(180);
else if (state == 2)
SERVO_Rotate(0);
}
2024-07-15 20:10:12 +08:00
void setLed(uint8_t state)
{
LED_Start(LED_ALL);
switch (state)
{
// 白
case 1:
LED_SetDuty(255, 255, 255);
break;
// 红
case 2:
LED_SetDuty(255, 0, 0);
break;
// 绿
case 3:
LED_SetDuty(0, 255, 0);
break;
// 蓝
case 4:
LED_SetDuty(0, 0, 255);
break;
// 青
case 5:
LED_SetDuty(0, 255, 255);
break;
// 品红
case 6:
LED_SetDuty(255, 0, 255);
break;
// 黄
case 7:
LED_SetDuty(255, 255, 0);
break;
// 关
default:
LED_SetDuty(0, 0, 0);
break;
}
}