25
图 4.8 OLED 屏显示效果
图 4.9 按键及拨码原理图
26
第五章 程序设计
5.1 阈值计算
我们采用的方法是对像素电压处理,创建灰度值数组。灰度值最大的为白 不稳定,往往波形会出现很多的毛刺,如果不对这些数据进行处理,小车会受
本届光电组采用线性 CCD 作为检测跑道传感器,其内部的 128 个光电二
枀管采的象素电压经 AD 转换后存储在一维数组里,赛道的黑线部分 AD 电压值
较低,赛道的白色部分 AD 电压值较高。在小车实际跑动过程中,由于光线的
到较大的干扰,甚至完全算出错误的偏差。
色,灰度值最小的为黑色。每次比较连续的三个灰度值的像素点,仍灰度值最
处开始,找到像素点最多的灰度值,为黑色灰度值,记录下来。白色灰度与黑 大处开始,找到像素点最多的灰度值,为白色灰度,记录下来;仍灰度值最小
色灰度的平均值即为黑白阈值。这种动态阈值算法不仅能算出阈值,并且能够
随环境的变化自适应的改变分割值,弥补静态阈值法的不足。 灰度值数组的处理
for (i=8;i<120;i++)
{ line_latch[pic[i]/10]++; int
mid=(pic[i+1]+pic[i])/2; line_latch[mid/10]++;
line_latch[(pic[i]+mid)/20]++;
??line_latch[(pic[i+1]+mid)/20]++;//插值法四倍超分辨率
}
寻找白色灰度
for(i=LATCH_LINE-1;i>1;i--) //找连续三组和最大的地方 {if(line_latch[i]+line_latch[i-1]+line_latch[i-2]>=total||total<15)
{total=total+line_latch[i-2]-line_latch[i+1];}//向暗处 移动,找白
色的最大分布点
else{ccd_white_latch=i;break;}//此处为白线灰度 }
27
得到一条较为完整的道路。
扫描赛道边线:
int8 findroad(u16 *ccd,u16 latch,u8 x)//找路
{ int i,j,find=0; i=j=0;
while(j<127)
{
for(i=j;i<127;i++) {if(ccd[i]>=latch)break;} for(j=i;j<127;j++) {if(ccd[j]
{ road[0][find]=j-i; road[1][find]=j+i; rule_L[find]=i; rule_R[find]=j; find++;}
}
return find; }
同理可以寻找黑色灰度。 有了阈值,小车就能看清前方道路,控制器再对道路信息进行处理,就能
5.2 赛道判别 人字弯
虽然 CCD 在人字弯的调头区域看不到赛道信息,但能判别方向,在调头区 域,舵机强制打到一定角度,使小车通过调头区域,但是需要确定是否已经退 出调头区域。我们用陀螺仪在调头区域的水平方向角速度的积分值来判别,如 果积分差值大于设定值,即认为已经转过。
Direction+=0.500*(double)gyz[gypoint]/32768;
坡道
CCD 在入坡道时,由于仰视,CCD 看不到坡道信息,且 CCD 检测不出是否 处于坡道。我们利用陀螺仪在垂直水平面的方向上的角速度积分来判别,当积 分值大于设定值,即认为,处于上坡阶段。同样也能判别下坡。