基于STM32单片机智能跟随小车_红外遥控
本设计包含程序代码+原理图+PCB+设计报告,仅供学习参考使用
📚开发环境
原理图:Altium Designer
程序编译器:keil 5
编程语言:C语言
设计编号:C0021
📚功能描述
1.以STM32F103RBT6为主控芯片,实现对小车的控制,使小车能够做出前进、后退、左转、右转等基本行驶动作,通过红外遥控控制小车工作模式的转换(自由行走避障模式、跟随模式);
2.利用压力传感器测重,放在小车上物品的重量在500g范围以内,可以跟随,如果超过范围,就停止不动,蜂鸣器响提示超重。
📚原理图

📚PCB

📚程序代码
c
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "remote.h"
#include "hx711.h"
#include <string.h>
u8 Model=0; //模式
u8 PWM_WIDTH=28;
u8 RunModel=0;
void Hw_Process()
{
u8 key;
key=Remote_Scan();
if(key)
{
Beep=1;
delay_ms(100); //延时300ms
Beep=0;
printf("\r\n红外键值= %d\r\n",key);
}
if(key==224)// - :进入 自由遥控避障模式
{
RunModel=0;
}
else if(key==168)// - :进入 跟随模式
{
RunModel=1;
}
if(RunModel==0) //自由遥控避障模式,遥控控制
{
if(key==194)// 暂停 >||
{
Model=0;
printf("\r\n停止\r\n");//
}
else if(key==34)//|<<
{
Model=4;
delay_ms(500); //延时300ms
Model=1;
printf("\r\n左\r\n");//
}
else if(key==2) //>>|
{
Model=3;
delay_ms(500); //延时300ms
Model=1;
printf("\r\n右\r\n");//
}
else if(key==162) //CH-
{
Model=1;
printf("\r\n前进\r\n");//
}
else if(key==98) //CH
{
Model=2;
printf("\r\n后退\r\n");//
}
else if(key==48) // 按下键1
{
PWM_WIDTH=40;
printf("\r\n1档\r\n");//
}
else if(key==24) // 按下键2
{
PWM_WIDTH=35;
printf("\r\n2档\r\n");//
}
else if(key==122) // 按下键3
{
PWM_WIDTH=28;
printf("\r\n3档\r\n");//
}
}
}
int main(void)
{
u16 adcx;
unsigned long adtemp,adtemp1;
u16 Weight=0;
u16 temp1,temp2;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
uart_init(9600);
//uart2_init(9600);
TIM3_Int_Init(10,5199);//10Khz的计数频率,计数到10为1ms 控制小车方向及速度
CH_SR04_Init();//超声波设置初始化
Remote_Init(); //红外接收初始化
//ADInit();
Beep=1;
delay_ms(100); //延时300ms
Beep=0;
delay_ms(100); //延时300ms
Beep=1;
delay_ms(100); //延时300ms
Beep=0;
printf("\r\n-----------------------------------------------\r\n");//
adtemp=HX711_Read(); //先读取皮重对应的AD。注意:上电前 称重盘上不能放任何物品,以免造成测量不准。
Model=0;
while(1)
{
Hw_Process();//红外遥控处理
if(RunModel==0) //自由遥控避障模式,遥控控制 +超声波避障
{
temp1=Senor_Using_Left()*10;
printf("\r\n左方距离= %d cm",temp1);//串口打印出电压信息
temp2=Senor_Using_Right()*10;
printf("右方距离= %d cm\r\n",temp2);//串口打印出电压信息
if((temp1<250||temp2<250)&&Model==1)//前方障碍太近,需要避障
{
Model=0;
delay_ms(300); //延时300ms
Model=2;//后退
delay_ms(300); //延时300ms
Model=4;//右转
delay_ms(300); //延时300ms
Model=1;//前进
}
}
else if(RunModel==1) //进入自动跟随模式
{
adtemp1=HX711_Read();
if(adtemp1>adtemp) //判断检测到AD大于皮重时,认为有物体放置。
{
Weight=(adtemp1-adtemp)*0.002388; //根据串口调试该系数计算过程为:200g ÷(8494856(放置200g物体对应Ad值)-8411097(无物体放置时输出AD值))
printf("\r\n 重量=%d g\r\n",Weight);
}
if(Weight>500)//如果重物大于 500g 蜂鸣器报警。不跟随
{
Beep=1;
delay_ms(300); //延时300ms
Beep=0;
delay_ms(300); //延时300ms
}
else
{
temp1=Senor_Using_Left()*10;
printf("\r\n左方距离= %d cm",temp1);//串口打印出电压信息
temp2=Senor_Using_Right()*10;
printf("右方距离= %d cm\r\n",temp2);//串口打印出电压信息
if((temp1<200)||(temp2<200)) // 200= 20cm 左右有一方小于20cm
{
Model=0;//停止
}
else if((temp1>1000)&&(temp2>1000))
{
printf("\r\n停止\r\n");
Model=0;//
}
else if((temp1<1000)&&(temp2<1000))
{
printf("\r\n前进\r\n");
Model=1;//
delay_ms(300); //延时300ms
if(temp1>temp2) //说明此时 小车车头相对人偏左,应让小车向右拐弯
{
Model=3;//右转
printf("\r\n右转\r\n");
delay_ms(200); //延时300ms
//
}
else if(temp2>temp1)//说明此时 小车车头相对人偏右,应让小车向左拐弯
{
Model=4;//左转
printf("\r\n左转\r\n");
delay_ms(200); //延时300ms
}
}
Model=0;//
}
}
}
}

📚设计报告

📚资料清单
