电子说
开箱介绍
在CW小程序中购买了小车,其中的包装特别好,外面有个箱子来装着,其中我们将外包装拆开,可以看见我们本次购买的小车的本体,我购买的是焊接完成的,所以我可以开箱直接试用,方便很多,如果大家追求方便可以购买成品,如果想锻炼其中也有推荐的开发套件可以自行焊接。
其中到手的主要物品在这里:

其中还有电池和电池充电器,就没拍摄进来。
小车展示

小车正面图
其中小车底板。经过后面才发现其中前面小车的LED灯没有焊接,估计是人工焊接的时候忘记焊接LED灯,导致我以为其中是没有LED,导致后面循迹一直出现问题,后面补了3个灯实现补光操作。
小车资料
其中让我感觉社区搭建很不错,其中的资料都是在飞书中可以找到,我下载了其中的小车代码,然后在keil5中进行调试。
小车功能实现
红外和循迹控制小车
其中main函数的代码估计是调试代码放上来其中的注释有点多,后面简约通过ai修改了一下,将其中的功能大致分为几个部分。
char oled_disbuff[25];
uint8_t key;
uint16_t SpeedDelay = 150;
uint8_t car_state, last_car_state;
int16_t speed = 0, last_speed;
uint8_t change_speed_flag, speed_illegal_flag, change_car_state_flag, avoidance_flag, Gray_voice_flag;
float Hc04_val;
float power_val;
// 函数声明
static void handle_key_input(void);
static void update_car_state(void);
static void update_display(void);
static void initialize_hardware(void);
/**
* @brief 主函数
* @param None
* @retval int32_t
*/
int32_t main(void)
{
// 硬件初始化
initialize_hardware();
// 设置初始舵机角度
Set_car_Angle5(90);
// 初始化状态变量
last_car_state = car_state;
last_speed = speed;
// 主循环
while (1)
{
// 处理按键输入
handle_key_input();
// 传感器数据更新
Hc04_val = Get_Disance(); //获取超声波
power_val = get_power_val(); //计算电压
// 发送速度到语音模块
//send_spd_to_voice();
// 避障功能
//avoidance_fun();
check_Gray_and_changeState();
// 更新小车状态
update_car_state();
// 更新显示
update_display();
IR_fun();
}
}
/**
* @brief 硬件初始化函数
* @param None
* @retval None
*/
static void initialize_hardware(void)
{
SYSCTRL_Configuration();
LED_Init();
Buz_Init();
BTIM1_Init();
key_Init();
Uart_Init(); // UART1 PA9(T) 10
AC6328A_Init(); // UART2 PA2(T) 3
Servo_car_tail_Init(); // GTIM1 PB8
IR_Init();
OLED_Init();
HC_SR04_Init();
WS2812_Init();
Motor_Init(); // 与舵机共用GTIM1 PB3 4 5 12
ADC_track_Init(); // 舵机和ADC循迹采集口共用 循迹ADC PA1 4 5 6
}
/**
* @brief 处理按键输入
* @param None
* @retval None
*/
static void handle_key_input(void)
{
key = get_keyval();
switch (key)
{
case 1:
buz_flag = 1;
car_state = 0; // 停止状态
change_car_state_flag = 1;
break;
case 2:
buz_flag = 1;
car_state = 6; // 前进状态
speed = 200;
change_car_state_flag = 1;
break;
default:
break;
}
}
/**
* @brief 更新小车状态
* @param None
* @retval None
*/
static void update_car_state(void)
{
switch (car_state)
{
case 0: // 停止
Car_Stop();
WS_shadow(2);
Send_RGB(1, 0, 0, 0);
Send_RGB(3, 0, 0, 0);
break;
case 1: // 前进
if (gray_flag == 0)
Car_Run(speed);
check_Gray_and_changeState();
Send_RGB(2, 0, 255, 0);
Send_RGB(1, 0, 0, 0);
Send_RGB(3, 0, 0, 0);
break;
case 2: // 后退
Car_Run(-speed);
Send_RGB(2, 255, 0, 0);
Send_RGB(1, 0, 0, 0);
Send_RGB(3, 0, 0, 0);
break;
case 3: // 左转
Car_Left(speed);
Send_RGB(1, 255, 0, 0);
Send_RGB(2, 0, 0, 0);
Send_RGB(3, 0, 0, 0);
break;
case 4: // 右转
Car_Right(speed);
Send_RGB(3, 255, 0, 0);
Send_RGB(1, 0, 0, 0);
Send_RGB(2, 0, 0, 0);
break;
case 5: // 摇尾巴
wagtail();
Car_Stop();
WS_shadow(2);
Send_RGB(1, 0, 0, 0);
Send_RGB(3, 0, 0, 0);
break;
case 6: // 循迹
GrayscaleSensor_fun(); // 当前被注释
break;
default:
break;
}
}
/**
* @brief 更新OLED显示
* @param None
* @retval None
*/
static void update_display(void)
{
uint8_t D1, D2, D3;
// 显示超声波距离
if (Hc04_val == 0xffff || Hc04_val == 0)
OLED_Printf(1, 8, OLED_6X8, "HC04_Error ");
else
OLED_Printf(1, 8, OLED_6X8, "Distance:%.0fcm ", Hc04_val);
// 获取循迹传感器数据
get_track_data(&D1, &D2, &D3);
// 显示系统状态信息
OLED_Printf(1, 0, OLED_6X8, "Hello");
OLED_Printf(1, 16, OLED_6X8, "%d", car_state);
OLED_Printf(1, 24, OLED_6X8, "%d", avoidance_flag);
OLED_Printf(1, 32, OLED_6X8, "Sensor:%d %d %d", D1, D2, D3);
OLED_Printf(1, 40, OLED_6X8, "Power_Voltage:%.2f", power_val);
// 更新OLED显示
OLED_Update();
}
/**
* @brief 系统时钟配置
* @param None
* @retval None
*/
void SYSCTRL_Configuration(void)
{
/* 0. HSI使能并校准 */
SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1);
/* 1. 设置HCLK和PCLK的分频系数 */
SYSCTRL_HCLKPRS_Config(SYSCTRL_HCLK_DIV1);
SYSCTRL_PCLKPRS_Config(SYSCTRL_PCLK_DIV1);
SYSCTRL_SystemCoreClockUpdate(96000000);
}
/**
* @brief 检查小车状态变化
* @param None
* @retval None
*/
void check_car_state(void)
{
if (last_car_state != car_state)
{
last_car_state = car_state;
change_car_state_flag = 1;
}
if (last_speed != speed)
{
last_speed = speed;
change_speed_flag = 1;
}
}
简单的来说,其中小车上电就是超声波避障的功能,但拥有小车的我们谁不想控制小车,让小车循迹呢。其中大致框架已经帮我们写好了,我们只需要简单的调用就能实现操作,其中主函数启动红外功能,在while循环中接收指令码,就能实现小车的移动功能。

外红功能展示。

循迹功能展示,其中使用按键1开启和按键2关闭。
因为手头没有白灯,只有蓝灯导致其中红外循迹可能有点不准。
总结
其中小车的功能性和趣味性很足,其中还有更多的功能蓝牙控制,超声波循迹等待大家探索,我也是特别喜欢小车,拥有一台属于自己的小车是多少电子人的追求,也是简单上手也体验到小车运动的快乐,大家喜欢的话,可以在CW32社区中查询灵眸小车。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !