一.系统概述
1. 控制器与通信:使用STM32F103C8T6单片机控制zigbee进行无线远程遥控通信。
2. 运动模式设计:通过遥控器按钮或语音指令启动,小车沿着预设的循迹线路移动。小车在正常行驶中检测到障碍物时自动避让。
3. 远程控制:遥控器提供多种控制方式,通过四个方向按钮控制小车的前进、后退、左移和右移。通过语音命令切换小车的运动模式和方向控制。
二.电路设计
电路图采用Altium Designer进行设计:
1. 通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心;
2. 使用LU-ASR01高精度语音识别模块进行语音指令检测,并通过UART串口与单片机进行通信;
3. 使用HC-SR04超声波测距模块进行前后障碍物的检测,并通过Echo(超声波接收脚)和Trig(超声波发射脚)与单片机的GPIO脚进行连接;
4. 使用L298N直流电机驱动模块进行电机驱动,模块的IN1、IN2、IN3、IN4和ENA、ENB接单片机GPIO口,OUT脚接电机的两极;
5. 使用红外对管进行黑色路径识别,红外对管输出数字信号需要接单片机GPIO口;
6. 使用Zigbee组网通信模块进行组网通信,模块与单片机之间需要通过UART串口进行连接;
7. 通过舵机转动超声波测距模块,舵机的控制线与单片机GPIO口进行连接;
8. 通过0.96寸的OLED12864进行数据显示,采用IIC总线的形式与单片机进行通信;
9. 使用独立按键控制小车运动,按键的一端接地,一端接单片机的GPIO口;
10. 使用JR6001进行语音播报,并通过UART串口与单片机进行连接。
三.程序设计
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Car.h"
#include "Tracking.h"
#include "Obstacle.h"
#include "SteeringEngine.h"
#include "NRF24L01.h"
int main(void)
{
uint8_t Buf[4] = {0}; //遥控接收到的数据 其中第一位为接收到的数据长度
float Num = 90;
/*模块初始化*/
NRF24L01_Init(); //NRF无线遥控初始化
Timer_Init(); //定时中断初始化
Tracking_Init(); //循迹初始化
Car_Motor_Init(); //小车启动初始化
Servo_Init(); //舵机初始化
HS_SR04_Init(); //超声波初始化
Servo_SetAngle(90);
Delay_ms(1000);
while (1)
{
if (NRF24L01_Get_Value_Flag() == 0) //当接收到数据
{
NRF24L01_GetRxBuf(Buf);
}
if(Buf[1] == 0x01) //循迹模式
{
Tracking_Control(29); //小车循迹速度调节
}
if(Buf[1] == 0x02) //避障模式
{
Num = Ultrasonic_Ranging(Num,40); //小车超声波避障
Prevent_Stop(Num,40); //小车避障防卡死
}
if(Buf[1] == 0x03) //无线遥控模式
{
if(Buf[2] == 0x00)
{
Car_Motor_SetSpeed(0);
}
if(Buf[2] == 0x01)
{
Car_Motor_SetSpeed(40);
}
if(Buf[2] == 0x02)
{
Car_Motor_SetSpeed(-40);
}
if(Buf[2] == 0x03)
{
Car_Turn_Left_SetSpeed(40);
}
if(Buf[2] == 0x04)
{
Car_Turn_Right_SetSpeed(40);
}
}
if(Buf[3] == 0x01)
{
Tracking_Control(29); //小车循迹速度调节
}
if(Buf[3] == 0x02)
{
Num = Ultrasonic_Ranging(Num,40); //小车超声波避障
Prevent_Stop(Num,40); //小车避障防卡死
}
if(Buf[3] == 0x03)
{
Car_Motor_SetSpeed(0);
}
if(Buf[3] == 0x04)
{
Car_Motor_SetSpeed(40);
}
if(Buf[3] == 0x05)
{
Car_Motor_SetSpeed(-40);
}
if(Buf[3] == 0x06)
{
Car_Turn_Left_SetSpeed(40);
}
if(Buf[3] == 0x07)
{
Car_Turn_Right_SetSpeed(40);
}
}
}