省三【F题—成都大学】凤奎队—智能送药小车
本次设计的智能送药小车使用基于 STM32 单片机作为核心控制。在小车上设置光敏电阻传感器感知运送和卸载药品。通过 K210 芯片建立目标模型,完成指定病房数字的智能识别。
标签
2021电赛
F题
成都大学
更新2021-12-23
成都大学
4454

摘要:本次设计的智能送药小车使用基于 STM32 单片机作为核心控制。在小车上设置光敏电阻传感器感知运送和卸载药品。通过 K210 芯片建立目标模型,完成指定病房数字的智能识别。采用驱动芯片 L289N 驱动两个霍尔编码电机,利用 STM32产生周期性的 PWM 波,实现小车运动速度和转向的精确控制,利用 S500 系列型号为 S578 的灰度巡线传感器,信号通过 STM32 单片机分析与处理后,控制小车行驶轨迹。

关键词:STM32 单片机 智能数字识别 K210 芯片 S578 灰度巡线传感器

1 系统方案

本系统的主控芯片为 STM32F103C8T6,主要由药品识别模块、数字识别模块、自动循迹模块、驱动调速模块、电源模块组成,下面分别论证这几个模块的选择。

1.1 药品识别模块选择

方案 1:使用反射式红外光电传感器 ST188,在黑线检测的测试中,若检测到白色区域,发射管发射的红外线没有反射到接收管,测量接收管的电压为 4.8,若检测到黑色区域,接收管接收到发射管发射的红外线,电阻发生变化,所分得的电压也就随之发生变化,测得的接收管的电压为 0.5。

方案 2:使用 TK-20 黑白线检测传感器,有效探测距离达 5cm。通过调节电位器,最远可以达到 10cm(该距离下,探测黑白线的精度降低)。这款黑白线传感器继承了 TK-10的受可见光干扰小,输出信号为开关量,信号处理简单,使用非常方便。

方案 3: S578 巡线传感器,主要用于智能巡线小车的传感器。该型号的传感器 灵敏度高,抗千扰能力强,阳光下可用,普通照明灯影响不大,并稳定识别场地中的线。使用抗干扰较强的光电管,每一路发光源均采用 2 个高亮白色 LED,比普通红外传感器抗干扰能力和稳定性都要强很多。全部采用单片机处理数据,内部软件滤波算法等,优化检测结果,使输出更加稳定。出厂每一路默认为数字高低电平输出,每一路都可改动一个电阻焊接位置改为模拟电压输出。每一路对应一个输出口,直接接到单片机 IO 即可,3.3V 电平,可兼容 5V 电平。

由于场地光照的的强度,场地可能与平时测试不同,综合考虑,选择方案 3。

1.2 电机驱动模块选择

方案 1:MOS 管。MOS 管在电压控制方面其控制方式比较方便;输入电阻高,噪声低,热稳定性好。但对静电比较敏感,容易被静电击穿。

方案 2:L298N。1.298N 可直接接至 12v,它有较强的驱动能力。

方案 3:BTS7960。它是半桥驱动芯片,需要 2 个芯片来驱动一个电机,电流最高可达 43A,其内阻很小,散热好,实用性好。

综合以上三种方案,选择方案 3。

1.3 微处理器模块的选择

方案 1:采用 ATMEL 公司的 AT89C51 作为系统控制器,控制方便,性能稳定,使用简单,但是程序存储器只有 4K,程序长度受限制,不利于程序的编写和系统 的执行

方案 2:MSP430 单片机∶经济:16 位 MSP430 微控制器(MCU)经济实惠。功耗:MSP430单片机可作为低功耗嵌入式设备使用,其静态电流可小于 1 微安。MSP430 系列单片机的CPU 的最高频率为 25MHz,但也可以降低频率以降低功耗。MSP430 有 6 种不同的低功耗模式,在不同的模式下可以禁用不需要的时钟或 CPU。此外,MSP430 还可在 1 微秒内被唤醒,这可使它在睡眠模式下可以维持更长的时间,让其平均功耗最小化。功能:MSP43系列单片机采用矢量中断,支持十多个中断源,并可以任意嵌套。用中断请求将 CPU 唤醒只要 6us,通过合理编程,既以降低系统功耗,又可以对外部事件请求作出快速响应。

方案 3:STM32 单片机:融高性能、实时性、数字信号处理、低功耗、低电压于一身,同时保持高集成度和开发简易的特点。业内最强大的产品阵容,基于工业标准的处理器,大量的软硬件开发工基于上述考虑,相对于 MSP430,c51 单片机,STM32 各项指标更符合本次小车的功能,而且完全可以实现该题目小车的所有功能。所有我们选择方案 3。

1.4 循迹模块的论证与选择

方案 1:使用 TCRT5000 红外反射式接近开关传感器,可以实现寻迹、壁障等功能,TCRT5000 光电传感器模块是基于 TCRT5000 红外光电传感器设计的一款红外反射式光电开关。传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管纽成,输出信号经施密特电路整形,稳定可靠。

方案 2:S578 巡线传感器,主要用于智能巡线小车的传感器。该型号的传感器 灵敏度高,抗千扰能力强,阳光下可用,普通照明灯对其无影响,并稳定识别场地中的线。使用抗干扰较强的光电管,每一路发光源均采用 2 个高亮白色 LED,比普通红外传感器抗干扰能力和稳定性都要强很多。全部采用单片机处理数据,内部软件滤波算法等,优化检测结果,使输出更加稳定。出厂每一路默认为数字高低电平输出,每一路都可改动一个电阻焊接位置改为模拟电压输出。每一路对应一个输出口,直接接到单片机 IO 即可,3.3V 电平,可兼容 5V 电平。

综合考虑,本系统方案 2。

1.5 电源选择

使用 12 锂电池,这种电池容量大,电压稳定,占据空间相对较小,重点是相对市面上的电池较轻,价格相对较贵。

2 系统理论分析与计算

2.1 数字识别方法的分析

基于 K210 的数字识别模块,利用了嘉楠公司生产的 K210 芯片,K210 芯片架构中包含了自研神经网络加速器 KPU,可以高性能进行卷积神经网络运算,算力高达 1TOPs,在 Mx-yolov3 配置软件环境下根据题目要求对 1 至 8 八位进行本地模型训练,爬虫获取目标图片集,通过标注软件标注形成验证集,最终在 Mx-yolov3 完成训练得到训练模型,经过模型转换后烧录到 K210 上,通过脚本运行,实现数字识别功能。

Fp0TYEsOueFsJBGueUU_8xxmnL_L

2.2 自动巡径算法分析

使用 S500 巡线传感器配置工具,S578 型号的每一路默认为数字高低电平输出,每一路都可改动一个电阻焊接位置改为模拟电压输出。使用并行数字高低电平输出时,输出接到单片机的普通 IO 即可,IO 设置成上拉输入。程序里读取对应 I0 的 0 或 1。输出高电平为 3.3V,可兼容 5V 工作的单片机。在不配置反向输出时,以白地黑线为例,探头照到黑线时对应输出为高,指示灯灭。若将数字输出改为模拟输出后,对应输出的最大电压值范围为 0-3.3V。输出要接到单片机的 ADC,或者其它模拟电压处理电路。以白地黑线为例,探头照到黑线返回的电压比白地高,即探头接收到的反射光越强,输出的电压越低。在些工作模式下,指示灯仍正常工作,亮或灭。使用单模拟电压输出时,输出需要接到 ADC 上。传感器没有照到线时,输出为 OV。线从传感器左侧向右移动时,输出电压慢慢升高到 3.3V。

FgaCMBFDRPJO7APrC20qCm1-jGAz

3 电路与程序设计

3.1 电路的设计

  3.1.1 系统总体框图

本系统的芯片为 STM32F103C8T6 主控,主要由药品识别模块、数字识别模块、自动循迹模块、驱动调速模块、电源模块组成,下面分别论证这几个模块的选择。

Fp-TFEGPqUQLQvMTx3kvh21VDF6L

  3.1.2 直流电流降压稳压电路原理图

FmcVk3DaE9a7zrdao9N5GdKXXwy9

  3.1.3 s578 灰度传感器原理图

使用并行数字高低电平输出时,输出接到单片机的普通 IO 即可,IO 设置成上拉输入。程序里读取对应 IO 的 0 或 1。输出高电平为 3.3V,可兼容 5V 工作的单片机。在不配置反向输出时,以白地黑线为例,探头照到黑线时对应输出为高,指示灯灭。

FhfTX01ezPEXRR4DNpENgPfQD6IB

  3.1.4 其他模块原理图

STM32F103C8T6 原理图、K210 原理图、编码电机驱动原理图在附录 1

  3.1.5 电源

电源由电池、稳压部分组成。为整个系统提供 3.3V、5V、10V 电压,确保电路的正常稳定工作。这部分电路比较简单,都采用三端稳压管实现,故不作详述。

3.2 程序的设计

系统采用语言编程实现各项功能。语言本身带有各种库函数,运算能力较强,而本系统的软件中算数运算比较多,利用语言编程可以体现出一定优势。程序是在环境下采用软件编写的,可实现对小车的精确控制,对 K210、传感器等输入信号进行处理。

  3.2.1 程序功能描述与设计思路

(1)程序功能描述

根据题目要求,软件部分实现小车的速度和转向角,数字识别功能,控制调节系统,路线切换。

(2)程序设计思路

1、首先进去外设初始化,如按键、编码电机、灰度传感器、红外传感器

2、进入巡线模式,往左偏,往右偏

3、速度选择模式

4、进行 PWM 控制电流,

5、利用 PID 进行调速,利用标志进行特定的转换

6、小车沿着红线走,让直流电流降压稳压模块工作。

  3.2.2 程序流程图

1、主程序流程图

附录 1(图 10)

2、循迹算法程序流程图

附录 1(图 11)

3、数字识别算法程序流程图

附录 1(图 12)

4 测试方案与测试结果

4.1 测试方案

1、硬件测试

运用万用表、示波器测试当前的电压值和占空比,

2、软件仿真测试

用软件编码处输入所需的占空比,仿真出小车走的路径和速度。

3、硬件软件联调

把软件仿真得出的结果和实际小车场地所需的时间进行对比,从而进行及时的调整

4.2 测试条件与仪器

测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊,池供电,符合系统要求的跑道。

测试仪器:高精度的数字毫伏表,模拟示波器,数字示波器,数字万用表,指针式万用表,秒表等。

4.3 测试结果及分析

  4.3.1 测试结果(数据):

基本要求(1):单个小车运送药品到指定的近端病房并返回到药房。要求运送和返回 时间均小于 20s,超时扣分。测试结果如下表所示:……单位(s)

测试 1 号病房:

Fg4XyYa_RHlVbjIES0GK-8NJiO8o

测试 2 号病房:

FlVw5ow4ZFNlu3ek7mPhcY97e99h

基本要求(2):单个小车运送药品到指定的中部病房并返回到药房。要求运送和返回时间均小于 20s,超时扣分。测试结果好下表所示:

随机摆放测试 3 号病房:

FhIBaWZrKoBWbG8dP3V7e_mmPG-w

随机摆放测试 4 号病房:

FsewtSCYoweexrxKBavi7dfIB_sA

  4.3.2 测试分析与结论

根据上述测试数据,该系统可以在不超过规定时间完成 2 个基本要求,并且完成说明的要求完成,本设计可以很好地完成各项要求,而且稳定性良好!

4 参考文献

[1]童诗白,华程英.模拟电子技术基础(第四版)[MJ.北京:高等教育出版社,2009.

[2]诸静等.智能预测控制及其应用[M].上海:浙江大学出版社,2002.

[3]董涛,刘进英,蒋苏.基于单片机的智能小车的设计与制作[J]计算机测量与控制, 2009,Vol.17,No.2:380-382.

[4]周学毛,新编 C 语言程序设计教程,西安电子科技大学出版社,2004.11

[5]叶湘滨,传感器与测试技术,国防工业出版社,2007.4

附录 1:电路原理图

FpPED-hq6LhSdml1RBT9X5afOYSK

FqChSHvWW2r-mKjKhiYzkN5JUdGW

Fkh5v7YhFHdLFrDIQZmlengJhGSb

Fji1xfs8bWJ0Li8J-LBSkS2lD0y7

FqVKZH2S-hZZqqugTwHc8ElA_5Ef

附录 2:源程序

1、主程序:

#include "dianji.h"
#include "common.h"
#include "string.h"
#include "bsp_usart.h"
#include "stdint.h"
//#include "delay.h"
#define GET_LOW_BYTE(A) ((uint8)(A))
#define GET_HIGH_BYTE(A) ((uint8)((A) >> 8))
extern uint8 flag_uart2_rev;
extern unsigned char u2_rev[50];
unsigned int rpm = 0;
unsigned int Motor_Num=0;
unsigned int MAX_MOTOR_NUM = 6;
unsigned char Read_num = 0;
uint8 Zx_MotorCheckSum(uint8 buf[])
{
uint8 i;
uint32 sum=0;
for(i=2;i<8;i++)
{
sum +=buf[i];
}
if(sum>255)sum&=0x00FF;
return sum;
}
void Zx_MotorSetID(uint8 oldID,uint8 newID)
{
uint8 buf[10];
buf[0]=Zx_Motor_FRAME_HEADER1;
buf[1]=Zx_Motor_FRAME_HEADER2;
buf[2]=oldID;
buf[3]=Zx_Motor_ID_WRITE;
buf[4]=0x00;
buf[5]=newID;
buf[6]=0x00;
buf[7]=0x00;
buf[8]=Zx_MotorCheckSum(buf);
buf[9]= Zx_Motor_FRAME_END;
uartWriteBuf(buf,10 );//将指令发送出去
//UB_ServoMsgHandle();
}
/*功能对应 ID 舵机转动角度以及转动时间 其中 Position 范围为 0--180(对应舵机 0-180 度)
时间为 ms 比如说 1000 就表示 1000ms 最大范围为 5100
*/
void Zx_MotorMove(uint8 id,uint32 position,uint32 time)
{
uint8 buf[10];
buf[0]=Zx_Motor_FRAME_HEADER1;
buf[1]=Zx_Motor_FRAME_HEADER2;
buf[2]=id;
buf[3]=Zx_Motor_MOVE_ANGLE ;
buf[4]=position;
buf[5]=time/20;
buf[6]=0x00;
buf[7]=time/20;
buf[8]=Zx_MotorCheckSum(buf);
buf[9]= Zx_Motor_FRAME_END;
Usart_SendByte(USART1,buf[0]);
Usart_SendByte(USART1,buf[1]);
Usart_SendByte(USART1,buf[2]);
Usart_SendByte(USART1,buf[3]);
Usart_SendByte(USART1,buf[4]);
Usart_SendByte(USART1,buf[5]);
Usart_SendByte(USART1,buf[6]);
Usart_SendByte(USART1,buf[7]);
Usart_SendByte(USART1,buf[8]);
Usart_SendByte(USART1,buf[9]);//将指令发送出去
//Delay_ms(10);
}
/*
电机正转 其中 id 为电机 id 号 ,rpm 为给定电机转数
*/
void Zx_MotorRunS(uint8 id,uint32 rpm)
{
uint8 buf[10];
buf[0]=Zx_Motor_FRAME_HEADER1;
buf[1]=Zx_Motor_FRAME_HEADER2;
buf[2]=id;
buf[3]=0x01 ;
buf[4]=Zx_Motor_RUNS;
buf[5]=0x00;
buf[6]=GET_HIGH_BYTE(rpm);
buf[7]=GET_LOW_BYTE(rpm);
buf[8]=Zx_MotorCheckSum(buf);
buf[9]= Zx_Motor_FRAME_END;
Usart_SendByte(USART1,buf[0]);
Usart_SendByte(USART1,buf[1]);
Usart_SendByte(USART1,buf[2]);
Usart_SendByte(USART1,buf[3]);
Usart_SendByte(USART1,buf[4]);
Usart_SendByte(USART1,buf[5]);
Usart_SendByte(USART1,buf[6]);
Usart_SendByte(USART1,buf[7]);
Usart_SendByte(USART1,buf[8]);
Usart_SendByte(USART1,buf[9]);
}
/*
电机反转 其中 id 为电机 id 号 ,rpm 为给定电机转数
*/
void Zx_MotorRunN(uint8 id,uint32 rpm)
{
uint8 buf[10];
buf[0]=Zx_Motor_FRAME_HEADER1;
buf[1]=Zx_Motor_FRAME_HEADER2;
buf[2]=id;
buf[3]=0x01 ;
buf[4]=Zx_Motor_RUNN;
buf[5]=0x00;
buf[6]=GET_HIGH_BYTE(rpm);
buf[7]=GET_LOW_BYTE(rpm);
buf[8]=Zx_MotorCheckSum(buf);
buf[9]= Zx_Motor_FRAME_END;
Usart_SendByte(USART1,buf[0]);
Usart_SendByte(USART1,buf[1]);
Usart_SendByte(USART1,buf[2]);
Usart_SendByte(USART1,buf[3]);
Usart_SendByte(USART1,buf[4]);
Usart_SendByte(USART1,buf[5]);
Usart_SendByte(USART1,buf[6]);
Usart_SendByte(USART1,buf[7]);
Usart_SendByte(USART1,buf[8]);
Usart_SendByte(USART1,buf[9]);
}

2、寻迹程序:

#include "xunji.h"
extern u8 zuosudu;
extern u8 yousudu;
void Control_GPIOB_Config(void)
{
GPIO_InitTypeDef GPIOB_InitStructure; //定义 GPIOB 管脚结构体变量
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);//开启 GPIOB 外设时钟
GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_5|GPIO_Pin_6;
GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入采用浮空输入
GPIO_Init(GPIOB,&GPIOB_InitStructure);
}
void delay_ms(unsigned int time)
{
unsigned char n;
while(time>0)
{
for(n=0;n<187;++n)
{
__nop();
}
time--; }}
uint8_t a,b,c,d;
void xunji( uint8_t xunji)
{
while(xunji){
a = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
delay_ms(100); 
b = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);
delay_ms(100);
c = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
delay_ms(100);
d = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6); 
if(a==0)//右 2 
{
yousudu = yousudu +10;
zuosudu = zuosudu -10;
}
else if (b == 0)//左 1 {
yousudu = yousudu +40;
zuosudu = zuosudu -40;
}
else if (c == 0)//左 2 {
zuosudu = zuosudu+10;
yousudu = yousudu-10;
}
else if (d == 0)//右 1 {
zuosudu = zuosudu+40;
yousudu = yousudu-40;
}
else{
yousudu=yousudu;
zuosudu= zuosudu;
}
delay_ms(500);
}
}
团队介绍
成都大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号