|
本帖最后由 墨染宸星 于 2019-12-2 12:41 编辑
最近STM32刚刚入门,用ZET6和超声波模块做了一个避障小车,希望对初学者能有帮助;
大体思路如下:
利用定时器判断超声波的发出到接收的时间,然后通过公式计算得到距离,再在主函数里进行数据分析,控制电机进行转弯,实现避障的功能。
也可以再加上屏幕,用来显示测得的距离。
这里我们用的是HC-SR04模块,此模块性能稳定,测度距离精确,模块高精度,盲区小。采用IO口TRIG触发测距,给至少10us的高电平信号;模块自动发送8个40khz的方波,自动检测是否有信号返回;有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值
小车设计思路:
3个超声波分别安装在正前方左边和右边各一个,具体情况见下图:
在主函数里调用测距函数,分别计算出障碍物离小车前方、左边、右边的距离lenth1、lenth2、lenth3,如果前方距离大于20cm并且左边和右边的距离大于10厘米则前进(GO)负责判断左边和右边的距离。如果左边距离小于10cm(lenth2<10),则右转(YOU)。如果右边的距离小于10cm(lenth3<10),则左转(ZUO)。其它情况下则是:后退——>延时500ms——>左拐——>延时200ms。值得注意的是:小车在超声波测距时要保证小车处于静止状态为了避免小车在测距时小车依旧在运动从而增加误差。同时利用PWM调速尽量让小车速度慢下来,来减小误差
主要代码如下
#include <hcsr04.h>
#include <motor.h>
#include <delay.h>
#include <stm32f10x.h>
#include <usart.h>
#include <key.h>
#include <lcd.h>
void Car_Turn(float length1,float length2);
int main()
{
delay_init();//延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MotorDriver_Init();//电机初始化
uart_init(9600);
KEY_Init();
LCD_Init();
HC_SR04_1_Init();
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(10,70,200,16,16,"Please press wake_up to");
LCD_ShowString(10,90,200,16,16,"start the little car");
while(KEY_Scan(0) != WKUP_PRES);
LCD_Clear(WHITE);
LCD_ShowString(60,70,200,16,16,"IS WORKING...");
//TIM3_Int_Init(1999,7199);
while(1)
{
float length1 = Senor_Using_1();//超声波模块测的距离
float length2 = Senor_Using_2();
Car_Turn(length1,length2);
//printf("\n\t%f\t\n",length1);
//printf("\n\t%f\t\n",length2);
//LCD_ShowString(60,70,200,16,16,"distance: cm");
//LCD_ShowNum(80,70,length1,16,16);
if(KEY_Scan(0) == KEY0_PRES)
{
MotorDriver_L_Turn_Stop();
MotorDriver_R_Turn_Stop();
break;
}
delay_ms(50);
}
}
void Car_Turn(float length1,float length2)
{
if(length1 > 30&&length2 > 30)//前进
{
MotorDriver_L_Turn_Forward();
MotorDriver_R_Turn_Forward();
}else if(length1 <= 30&&length2 > 30)//右转
{
MotorDriver_L_Turn_Forward();
MotorDriver_R_Turn_Reverse();
}
else if(length1 > 30&&length2 <= 30)//左转
{
MotorDriver_R_Turn_Forward();
MotorDriver_L_Turn_Reverse();
}
else if(length1 <= 30&&length2 <= 30)//后退+左转
{
MotorDriver_R_Turn_Reverse();
MotorDriver_L_Turn_Reverse();
delay_ms(150);
MotorDriver_R_Turn_Forward();
MotorDriver_L_Turn_Reverse();
delay_ms(150);
}
}
|
-
-
-
避障小车.7z
229.61 KB, 下载次数: 81, 下载积分: 黑币 -5
评分
-
查看全部评分
|