【IoT美学】解决方案—扫地机器人避障系统设计与实现
主要内容
项目场景说明
距离传感器
Sharp红外传感器
项目实现
一、项目场景
自动清扫机器人是当今服务机器人领域一个热门的研究方向。从理论和技术上讲,自动清扫机器人比较具体地体现了移动机器人的多项关键技术,具有较强的代表性,从市场前景角度讲,自动清扫机器人将大大降低劳动强度、提高劳动效率,适用于宾馆、酒店、图书馆、办公场所和大众家庭。因此开发自动清扫机器人既具有科研上的挑战性又具有广阔的市场前景。
二、任务目标
某公司需要设计扫地机器人的避障系统,实现移动时能够对周围的物体距离进行检测,以及时调整位置,避免碰撞的发生的功能。请使用测距传感器对物体距离进行监测,并将检测数据发送至上位机等待使用。
三、距离传感器
距离传感器,又叫做位移传感器,是传感器的一种,用于感应其与某物体间的距离以完成预设的某种功能,目前以得到相当广泛的应用。
“飞行时间法”(flying time)是通过发射特别短的并测量此光脉冲从发射到被物体反射回来的时间,通过测时间间隔来计算与物体之间的距离。
距离传感器根据其工作原理的不同可分为光学距离传感器、红外距离传感器、超声波距离传感器等多种。
红外传感器测距原理
Sharp的红外传感器都是基于一个原理,三角测量原理。
红外发射器按照一定的角度发射红外光束,当遇到物体以后,光束 会反射回来,如图所示。反射回来的红外光线被CCD检测器检测到以后,会获得一个偏移值L,利用三角关系,在知道了发射角度a,偏移距L,中心矩X,以 及滤镜的焦距f以后,传感器到物体的距离D就可以通过几何关系计算出来了。
Sharp GP2D12的输出曲线图
图中,可以看到,当被探测物体的距离小于10cm的时候,输出电压急剧下降,也就是说从电压读数来看,物体的距离应该是越来越远了。但是实际上并不是这样的。
四、项目分析
本项目通过距离传感器GP2D12获取传感器与阻挡物之间的距离,并将集到的距离值通过串口输出到上位机程序,1S更新一次。
五、项目硬件图
距离传感器原理图
六、距离传感器程序逻辑
七、项目实现
红外测距传感器初始化
void stadiometry_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
//先初始化ADC1通道12 IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC2 通道12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不带上下拉
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); //ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); //复位结束
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
//两个采样阶段之间的延迟5个时钟
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
//DMA失能
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
ADC_CommonInit(&ADC_CommonInitStructure); //初始化
ADC_InitStructure.ADC_Resolution = ADC_Resolution_10b; //10位模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换
//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1; //1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure); //ADC初始化
ADC_Cmd(ADC1, ENABLE); //开启AD转换器
}
获取红外测距传感器状态
float get_stadiometry_data(void)
{
unsigned int value = 0;
//设置指定ADC的规则组通道,一个序列,采样时间
//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_480Cycles);
ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换结束
value = ADC_GetConversionValue(ADC1);
if ((value >= 85) && (value <= 950))
return (2547.8 / ((float)value * 0.35 - 10.41) - 0.42); //获取距离
else
return 0;
}
八、项目思考
红外测距传感器在生活中还有那些用途?
项目如何对接华为云IoT平台?
需不需要操作系统?
注:参考项目,记得在评论区回复:拯救小白
关于项目思考的问题,大家可以在评论区积极讨论!!!说不定会有额外大奖哦!
- 点赞
- 收藏
- 关注作者
评论(0)