1. 系统方案
本系统主要由单片机控制模块、驱动模块、灰度识别模块,视觉模块组成下面分别论证这几个模块的选择。
1.1主控制器件的论证与选择 1.1.1控制器选用
方案一:采用传统的51系列单片机(图1-1)
采用传统的51单片机为8位机,价格便宜,控制简单,但是运算速度慢,片内资源少,存储容量小,难以存储大体积的程序和实现快速精准的反应控制[4]。并且受时钟限制,计时精度不高,外围电路也增加了系统的不可靠性。
方案二:采用STM32F103系列单片机(图1-2)
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核,32位微处理控制器的更加灵活,应用更加广泛。STM32集成外设有较为强大的功能,可扩展性强并兼有低功耗和多种省电工作模式,能够优化工业设备,物业控制设备、医疗设备和计算机外设等产品的性能。通过比较,我们选择方案二,采用STM32F103系列单片机为主控处理器。
1.1.2驱动方案的选择
方案一:采用在传统的L298N模块
L298N是ST公司生产的一种15脚封装的电机驱动芯片,该芯片的工作电压高,最高工作电压可以达到46V并且内部含有两个H桥的全桥式驱动器。我们可以利用脉冲宽度调节波来控制输入信号的极性,实现电机正反转,L298N采用标准的逻辑电平信号来控制。
方案一:采用TB6612双驱动模块
该模块相对于传统的L298N效率上提高很多,体积上也大幅度减少,在额定范围内,芯片基本不发热并且具有大电流mosfet-h桥式结构,双通道输出电路,可同时驱动2台电机。
通过比较,我们选择方案二,采用采用TB6612双驱动模块。
1.1.3循迹方法的论证与选择
方案一:采用颜色传感器
颜色传感器是一种传感装置,是将物体颜色同前面已经示较过的参考颜色进行比较来检测颜色的装置。当两个颜色在一定的误差范围内相吻合时,输出检测结果。颜色标传感器对各种标签进行检测,即使是背景颜色有着细微的差别的颜色也可以检测到,处理速度快。
方案二:采用灰度传感器
灰度传感器是模拟传感器,通过模块上的光源发射光,然后反射光回到模块上的接收设备由于不同颜色的反射光会改变光敏电阻的大小,从而可以达到简单的识别定位功能。在环境光干扰不是很严重的情况下,用于区别黑色与其它颜色。它还有比较宽的工作电压范围,在电源电压波动比较大的情况下仍能正常工作。它输出的是连续的模拟信号,因而能很容易地通过A/D转换器或简单的比较器实现对物体反射率的判断,是一种实用的巡线小车传感器。
综合以上二种方案,我们选择方案二采用灰度传感器。
1.1.4视觉模板的选择
方案一:采用Openmv模板
基于开源硬件计算机视觉摄像头模块,具有操作简单,编程高效,上手快,低成本可扩展等优点,非常适用于初学者。Openmv采用提供的视觉图像函数库,可节省大量开发成本,有效提升产品的开发效率。可以集成到任何项目中,可以将其与多种现有的处理器结合包括Arduino,树莓派,或者其他单片机。
方案二:采用K210模板
K210专为机器视觉与机器听觉多模态识别而设计,有多种外设,而且有丰富的开发资料,方便二次开发和学习,也降低了学习AI视觉技术的门槛。他使用台积电超低功耗的28纳米先进制程,具有双核64位处理器,总算力可达1TOPS,内置多种硬件加速单元,并且拥有较好的功耗性能、稳定性与可靠性。
综合考虑我们认为Openmv更简单,所以我们采用方案二Openmv模板。
2. 系统理论分析与计算
2.1路径的检测与电机的控制
角度传感器是由发光二极管和光敏电阻成的电路,将光信号转换成ADC值得电信号,单片机通过处理电信号(高低电平)来判断小车所处的路况信息,再通过PWM控制小车车轮的转速与转向,从而使小车处于走直线,转弯,加速,减速等情况,达到控制的目的。
就本题而言,信号的检测分为:
(1) 边界线的检测:
比赛场地采用黑线封闭的形式,因此小车车头两侧共装有1红外收发管和1对灰度收发管,红线出高电平,不检测到红线出低电平。当小车前进时碰到红线时单片机立调整两车的占空比之差,向相反的方向转弯。当车头两侧的灰度都输出低电平,小车则保持直线行走。红外传感器主要检测黑色虚线。
(2) 标志线的检测:
比赛场地为三个十字路口和两个T字路口,共有10处直角转弯处,因此在小车车头最前方安装1对灰度收发管和红外收发管,弯标记线采用中断计数既每对检测到一次转弯标记线标志数加一。
2.2节能
(1)智能车采用双轮行驶,TB6612全H桥式驱动双轮,比四驱的更加节能且更易控制。
(2)信号检测传感器全部用的性价比相当高、功耗小的灰度识别模块,相对于其它如:摄像头、超声波等传感器方案,性价比要高得多,功耗要低得多,节能环保
3.电路与程序设计 3.1硬件电路的设计 3.1.1最小系统设计
该电路采用STM32F103单片机作为系统的主控芯片,控制小车运动系统的整体运行。STM32F103单片机的优点为高性能、低成本、低功耗的嵌入式,应用专门设计的ARMCortex-M3内核。STM32集成外设有较为强大的功能,可扩展性强。
最小系统主要由STM32F10单片机、晶振电路、复位电路与BOOT电路构成。电源采用锂电池供电,晶振电路为8M石英晶振,并联两个电容,可以起到频率微调作用。复位电路有上电自动复位和开关复位两种复位方式。
3.1.2轨迹测试模块的设计(图3.1)
灰度传感器的OUT引脚与ADC相连,采集ADC的值,二极管发出光根据反射回来的光照到光敏电阻上,根据返回光的强度来判断ADC的值来实现。
通过stm32的串口发送某一刻的ADC采样值,返回数值越大,则说明该区域越明亮可基于此特性完成小车的循迹功能。
3.1.3电机驱动电路的设计
小车的两个前轮为直流减速电机受控于全桥驱动芯片TB6612,TB6612内部包含4通道逻辑驱动电路,可以方便的驱动两个直流电机,或一个两相步进电机。TB6612可接受标准TTL逻辑电平信号VSS,VSS可接3.3或者5V电压。TB6621的OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动两台电动机,通过调节占空比控制电机转速。
小车驱动电路的原理图如下,电机B1接OUT1,OUT2,电机B2接OUT3,OUT4。在TB6612的4脚使能信号有效(逻辑电平1)时,当5脚和5脚的电平为10时,电机正转;当2脚和3脚的电平为01时,电机反转;当5脚和6脚的电平为00或11时,电机不工作。同理可得 。
3.2软件的设计 3.2.1程序功能描述与设计思路
系统软件采用C语言开发,在keil5环境下调试并实现功能。主程序流程如图(3.2)所示,进入主程序并初始化后,判断拨码开关键值后执行相应的程序。软件程序设计采用模块化的结构,便于分析和实现功能。
当拨码开关为on时小车启动,检测到红线时,小车就会循迹执行主程序的命令,当为off的时候小车关闭。主流程图如图(3.2)所示。
3.2.2主程序流程图(图3.2)
4.系统测试方案 4.1使用的仪器和设备
计算机:笔记本Windows+WindowsXP操作系统
直流稳压稳流电源:型号SG1733SB3A
100M示波器:型号Agilentx 54622A
万用表:型号MY-65
卷尺:3M×16MM
秒表
4.2测试方法和步骤
(1)手动将小车摆放在药房处,手持数字标号纸张由小车识别病房号,将约200g药品一次性装载到送药小车上;
(2)小车检测到药品装载完成后自动开始运送;
(3)小车根据走廊上的标识信息自动识别、寻径将药品送到指定病房,点亮红色指示灯,等待卸载药品;
(4)病房处人工卸载药品后,小车自动熄灭红色指示灯,开始返回;小车自动返回到药房后,点亮绿色指示灯。
4.3测试分析与结论
单个小车运送药品到指定的近端、中断、远端病房并返回到药房。运送和返回时间均小于20s。
综上所述,本设计达到设计要求。
5.参考文献
[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2012
[2] [1]刘建业,付占稳,朱维璐,赵志广.自动送药遥控小车及视频监控系统[J].火工品,2007(01):42-44
[3] [4]王永虹,徐伟,郝立平.STM32系列ARMCortex-M3微处理器原理与实践[M].北京:北京航空航天大学出版社,2008.[4]数字电子应用
[5] 吕霞付,罗萍.基于光电传感器的智能车自动循迹系统设计[J].压电与声光,2012,33(6):939-942
[6] 李汝山,孙彦萍,孟涛.智能循迹小车在制药生产中的传送[J].机电信息,2013,( 11):45-47.
6.附录1:电路原理图
电路原理图(6.1)
7.附录2:源程序
#include "stm32f10x.h"
#include "delay.h"
#include "IIC_init.h"
#include "motor.h"
#include "usart_init.h"
#include "timer_init.h"
#include "control.h"
#define basic_speed 1500
#define wz_ratio 50
u8 RxCounter3=0;
u8 RxFlag3=0;
u8 RxBuffer3[20]={0};//串口接收用到的变量
u8 dat;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init();
TIM2_PWM_Init(7199,0);
gpio_init();
Motor_GPIO_Init();
STBY=1;
Set_Pwm(0,0);
TIM3_Int_Init(20,59999);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
USART2_init();
USART3_init();
while(1)
{;
}
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
control();
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中断标志
}
}