基于CCD自动巡线智能小车设计

2019-12-05 02:37司开波吕林涛
宇航计测技术 2019年5期
关键词:黑线循迹电路设计

司开波 黄 健 吕林涛

(西京学院信息工程学院,陕西西安 710123)

1 引 言

在智能车设计中,通常要实现自动循迹功能,因此人们研究了多种方法。文献[1]采用光电传感器TCRT5000,以STC12C5A60S2为控制核心,实现了对黑白线的自动循迹。文献[2]采用新型数字式电感传感器LDC1000实现了对细铁丝构成的跑道的自动循迹。

文献[1]采用的方法,也是常用的一种循迹方法。采用光电传感器,根据白线反射光强,黑线反射光弱的原理识别黑白线,达到自动巡线的功能。但该方法对黑线的宽度和当前光照强度有要求,如果当前自然光照强度大,很难识别黑白线;如果黑线宽度较细,也较难识别;如果是弯道,由于角度变化,识别也比较困难。而本文提出的CCD线阵传感器,包含128个光电二极管的线性阵列,构成128个像素,每个像素的光敏面积是3 524.3μm2,像素之间的间隔是8μm。每个像素点具有256(8bit)级灰度输出。相比于单个或多个光电传感器TCRT5000,输出精度更高,采集的信息点更多,采集范围更宽。因此,实现的自动循迹功能更强。

2 系统设计

2.1 线性CCD工作原理

该传感器是包含128个光电二极管的线阵,光电二极管在光的照射下产生光电流。如图1所示构成了光电二极管积分电路,二极管上累积的电荷量与光强度和光照时间成正比。当开关S1在1上时,积分电容上流过的电流和光电流相等,对光电流进行积分。当S1切换到2时,释放积分电容上累积的电荷。S2采样输出,当S2切换到1上时,使得采样电容电压等于运放输出电压,切换到3时,输出电压,在2时,其它光电二极管输出电压[3-5]。CCD内部有移位寄存器和逻辑控制器,可依次输出128个像素点的电压。

图1 光电二极管积分原理图Fig.1 Photodiode Integration Principle Diagram

2.2 系统设计框图

系统设计框图如图2所示,主控采用高性能微处理器STM32F103ZET6,主频72MHz,具有丰富的资源和I/O接口。采用3.3V供电,CCD线阵首先采集黑线的信息,通过A/D接口送给主控STM32,主控对数据进行处理,用中值算法寻找黑线中心位置,并与小车中心点位置比较。当车身偏左时,控制小车右转;当车身偏右时,控制小车左转;当正在黑线的正上方时,小车直行。电机驱动采用TB6612,用编码器测速,用速度PID控制PWM波输出,使得小车行进稳定、可靠。并增加蓝牙串口模块,可将小车行进的相关数据发送给上位机,便于调试。

图2 系统框图Fig.2 System block diagram

3 硬件电路设计

3.1 CCD硬件电路设计

CCD与STM32的连接图如图3所示。STM32的PA4引脚控制数据的起始位,PA2提供读写的时钟信号,PA3作为模拟A/D输入引脚,可连续读取128个像素点的输出电压,作为软件处理中的原始数据[4-7]。

图3 CCD与STM32连接图Fig.3 Connection Chart of CCD and STM32

3.2 TB6612电机驱动电路设计

TB6612电机驱动电路图如图4所示,TB6612适合驱动小型直流电机,可同时驱动2路直流电机,峰值电流可达到2A,相比于L298具有体积小、性能高等优点。图中PF13,PF14,PC6控制1路电机,PF13,PF14控制电机的转向,PC6输出PWM波,控制电机的转速。对应的输出为OUT1和OUT2。PF15,PG0,PC7控制另外1路电机,PF15,PG0控制电机的转向,PC7输出PWM波,控制电机的转速。对应的输出为OUT3和OUT4。VM为电机驱动所需电压,要高于6V,设计中采用7V[8]。VCC为芯片工作电压,是5V。

图4 TB6612电机驱动硬件原理图Fig.4 Hardware schematic diagram of TB6612 motor drive

对电机测速时,采用编码器,每旋转1圈,输出390个脉冲,将其接入STM32F103ZET6的定时器2,测量每秒钟脉冲的个数实现测速。

3.3 串口蓝牙电路设计

图5 蓝牙接口电路设计Fig.5 Bluetooth interface circuit design

串口蓝牙电路图如图5所示,图中蓝牙连接到STM32F103ZET6的串口2上,要实现蓝牙通信,必须是一对。上位机的连接方法与图5所示相同。通信之前,首先用串口调试助手对2个蓝牙模块进行设置,设置好后2个蓝牙模块会自动配对。通过串口2的PD5(RXD)和PD6(TXD)实现数据的收发。可将CCD数据,电机测速数据等发送给上位机,方便调试。

4 软件编程

4.1 软件流程图

在KEIL MDK5.0下用C语言编程,软件流程图如图6所示。

图6 软件流程图Fig.6 Software flow chart

软件编程时,首先对定时器、串口等进行初始化,然后通过A/D循环采集128个像素点的数据。通过颜色识别找到黑线的2个边缘,记下此时像素点的位置I和J(I

K=I+(J-I)/2

(1)

PWM+=Kp[e(k)-e(k-1)]+Ki×e(k)

+Kd[e(k)-2e(k-1)+e(k-2)]

(2)

式中:Kp——比例系数;Ki——积分系数;Kd——微分系数;e(k)——当前位置误差;e(k-1)——上一次位置误差;PWM——脉冲宽度。

4.2 关键代码

以下是找到黑线并计算中心代码,该段代码在定时器Timer1中每隔100ms调用一次。对小车的控制采用动态阈值智能控制方法,当到达阈值范围内,控制小车直行,否则控制小车左转或者右转,按流程图所示进行。这样可以避免小车左右摇摆,这样就能在几秒内将小车调整到中心位置。

void Find_CCD_Zhongzhi(void)

{static u8 i,j,Left,Right,Last_CCD_Zhongzhi;static u16 value1_max,value1_min;value1_max=ADV[0];//动态阈值算法,读取最大和最小值

for(i=5;i<123;i++)//两边各去掉5个点

{if(value1_max<=ADV[i])

value1_max=ADV[i];}

value1_min=ADV[0];//最小值

for(i=5;i<123;i++)

{if(value1_min>=ADV[i])

value1_min=ADV[i];}

CCD_Yuzhi=(value1_max+value1_min)/2;//计算出本次中线提取的阈值

for(i = 5;i<118; i++)//寻找左边跳变沿

{if(ADV[i]>CCD_Yuzhi&&ADV[i+1]>CCD_Yuzhi&&ADV[i+2]>CCD_Yuzhi&&ADV[i+3]

{Left=i;

break;}

}

for(j = 118;j>5; j--)//寻找右边跳变沿

{if(ADV[j]CCD_Yuzhi&&ADV[j+4]>CCD_Yuzhi&&ADV[j+5]>CCD_Yuzhi)

{Right=j;

break;}

}

CCD_Zhongzhi=(Right+Left)/2;//计算中线位置if(myabs1(CCD_Zhongzhi-Last_CCD_Zhongzhi)>70)//计算中线的偏差,如果太大

CCD_Zhongzhi=Last_CCD_Zhongzhi;//则取上一次的值

Last_CCD_Zhongzhi=CCD_Zhongzhi;//保存上一次的偏差

}

5 测试结果处理

设计并调试好硬件电路和软件程序后,就可以进行测试了。测试时,首先对镜头进行调焦,调焦如式(3)或式(4)所示

f=v×D/V

(3)

f=h×D/H

(4)

式中:f——镜头的焦距长度;v——拍摄对象成像后的纵向尺寸;V——拍摄对象实际的纵向尺寸;D——镜头和拍摄对象之间的距离;h——拍摄对象成像后的横向尺寸;H——拍摄对象实际的横向尺寸。

测试时,所选用的镜头的成像区域为8.128mm×0.063 5mm,焦距可调。

测试时跑道如图7所示。相距最远的2条黑线的外边沿间距是25cm,即横向尺寸H为25cm。镜头与目标距离D为80cm,镜头焦距f为6mm,经过式(4)计算,可得到成像后的横向尺寸h如式(5)所示

h=f×H/D=6mm×25cm/80cm=1.875mm

图7 测试用跑道示意图Fig.7 Test Runway

而镜头的成像区域为8.128mm×0.0635mm,横向长度为8.128mm,对应128个像素点,则1.875mm对应像素点是29.5,接近于30个。

通过蓝牙发送数据给上位机,可以得到如图8所示的测试数据。

图8 测试数据1Fig.8 Test data 1

图8显示了经过软件处理后的数据,最小值是18,最大值是86,中间值是52,并显示了灰度图和二值化图。

图9显示了当焦距为8mm时测量数据,镜头与目标距离D为30cm时测得的数据。从图中可得到最小值是20,最大值是127,中间值是73,并显示了灰度图和二值化图。

在实际测量中,由于环境亮度有所不同,测量值会有所不同.因为像素的亮度与曝光时间(积分时间)和环境亮度成正比,所以当光线比较暗时,增加曝光时间;当光线比较亮时,减少曝光时间。曝光时间可用软件调整。

图9 测试数据2Fig.9 Test data 2

对图9所示数据提高曝光时间,焦距保持8mm,镜头与目标距离D不变,仍为30cm。得到测试数据如图10所示。

图10 测试数据3Fig.10 Test data 3

从图中可以看到,增大曝光时间后,最大值、最小值、中间值明显增大,中间值变为135。因此,当光线较暗时,可增加曝光时间,增强识别能力。

6 结束语

文中仔细研究了CCD识别颜色的基本工作原理。设计了硬件电路,在MDK下编写了C程序,采用中值算法得到了黑线的中线位置,通过PID算法控制了小车的行驶,实现了用摄像头循迹,为智能小车的自动循迹提供了一种新方法。测试结果表明:该方法相比于普通光电传感器,具有性能可靠、稳定、速度快等优点。

猜你喜欢
黑线循迹电路设计
LED路灯驱动电路设计研究——以宁德东湖沿岸夜景工程为例
基于离散傅里叶变换的多旋翼无人机循迹检测系统设计
黑线
浅谈基于机器视觉和姿态检测的循迹智能车
虾背黑线真的特别“脏”吗
基于单片机的自动循迹小车的设计与制作
基于实验箱和Matlab相结合的信号与系统实验的改革
这也算海鲜
七巧数独
PCI9030及其PCI总线接口电路设计