【STM32F405+Gokit】之智能楼宇服务机器人
本帖最后由 Genius 于 2016-8-31 11:25 编辑【开源硬件】机智云智能硬件创新大赛http://club.gizwits.com/thread-2646-1-1.html
第一章项目总体介绍
目前,机器人的用途已经渗入到社会生活的方方面面,在工业生产中,机器人可以代替人类完成恶劣环境下的货物搬运以及设备检测等任务。而在人们的日常生活中,智能机器人也发挥了越来越重要的作用。因此,我们设计了基于STM32和Gokit的智能楼宇服务机器人。
本设计是由以STM32F405为主控的底盘控制系统和STM32F103+ESP8266构成的WiFi控制系统组成的智能楼宇安防机器人。其运动底盘采用四轮驱动的麦克纳姆轮,实现全方位移动的零转角控制,可以迅速调整机器人的运动状态。底盘控制系统主要包括:电源模块、微控制器模块、电机驱动模块、DBUS通讯控制模块等。通过无线遥控器的摇杆可以直接控制机器人前进、后退、左平移、右平移、向左旋转和向右旋转,安保人员坐在室内即可轻松地控制机器人完成安防工作,减轻了安保人员的工作负担,增加了工作乐趣,同时降低了安防工作的成本。
Wifi服务系统由主控部分、传感器部分和显示部分构成,主控部分采用STM32103c8t6+ESP8266构成,传感器部分有3色灯、夏普PM2.5粉尘传感器、雨量传感器、温湿度传感器DHT11和TCRT5000光电传感器构成。MCU主控把采集到的传感器信息上传到机智云的云端,然后云端将信息发送到楼宇内人员的手机端,保安和楼宇内工作人员通过手机APP即可实时获取楼宇外的温湿度、空气质量和雨量。能够判断是否下雨和是否有人在机器人旁通过屏幕查询信息。显示部分使用串口屏显示传感器的信息,并且给来找人和咨询事情的人提供查询信息。通触摸屏设计的多级式菜单设定外来人员的需求信息,增进了人机交互的灵活性。
最后,本设计实现了一款具有安防功能、能给外来办事人员和楼宇内人员提供帮助的智能楼宇安防服务机器人。它可以直接应用到高校办公大楼,公司楼宇、写字楼和机关办公大楼等,具有很好的实际意义,实现了我们最初的设计目标。
参赛团队:理工ROOT战队(3人)
功能演示:
http://player.youku.com/player.php/sid/XMTY2NTM0MzE0OA==/v.swf
回帖可见:WiFi服务系统程序**** Hidden Message *****
本帖最后由 努力的人 于 2016-8-23 21:06 编辑
第二章 系统硬件设计2.1 车体结构设计 移动底盘的运行结构有多种,目前常用的有轮式、履带式、腿式以及上述几种结构的结合。轮式以及履带式底盘主要适用于地理环境较为平坦、少有坑洼的地面。具有控制方式简单、运行速度快、运行平稳以及噪音小等优点。而腿式步行式的底盘适用的地理环境就较为复杂多样,但是由于控制算法复杂,对机械结构有着较高的要求,并且移动速度较为缓慢,目前的实际应用还不是特别广泛。综合考量本文系统的使用环境以及使用条件,本文中系统的底盘选择轮式运行方式,为了实现全方位移动方式的零度转角,本文底盘采用四轮驱动的麦克纳姆轮如图2-1所示。采用麦克纳姆轮的优点是可以实现底盘前行、横移、斜行、旋转及其组合等运动方式。由此底盘非常适合转运空间有限、作业通道狭窄的楼宇、船舱以及机舱等环境。图2-1 麦克纳姆轮 麦克纳姆轮设计车轮旋转时成45度排列的自由滚子与地面接触,地面会给予车轮与转轴夹45度的摩擦力,此摩擦力可分为X分量与Y分量,籍由车轮的正反转或停止,改变XY分量力的方向,可以调整底盘做各种方式的移动。而单独的麦克纳姆轮无法实现全方位移动,需要至少四个才能组成全方位移动平台,本文所采用的四个麦克纳姆轮全方位移动平台如图2-2所示,图中车轮斜线表示车轮轮缘与地面接触滚子的偏置角度。图2-2 底盘车轮配置图
2.2 底盘控制系统设计
2.2.1 主控单元 本系统选用STM32F405RGT6芯片作为底盘移动平台的中央控制器,完成传感器信息收集、电机控制、外部通信扩展等任务。STM32F405RGT6是ST公司推出的以高性能的ARM Cortex-M3内核的32位RISC的内核的芯片。工作最高频率可达84MHz,能实现高速运算。处理器具有3种低功耗模式和灵活的时钟控制机制,可根据系统设计要求对其进行合理的优化。工作电压可以在2.0-3.3V之间,在3.3V的供电电压下,其典型的小号电流仅为1.4µA。
2.2.2 电机驱动模块
2.2.2.1 底盘驱动电机的选择 本设计中为了保证全方位移动方式的零度转角,采用四轮单独驱动,可以灵活调节任意一个麦克纳姆轮的运行方式,从而可以灵活控制移动平台的任意角度位移。移动平台的驱动电机有步进电机和直流电机两种。本设计中选用直流电机作为底盘移动平台的驱动电机,直流电机具有优良的速度控制性能,具体来说,它有以下几点优点:具有较大的转矩,从而能够克服传动装置的摩擦转矩和负载转矩;具有较快的响应能力,可以适应复杂的速度变化和控制信号的变换;电机的负载特性硬,有较大的过载能力,确保运行速度不受负载冲击的影响,增加系统的可靠性;直流电机空载力矩大,在控制系统发出停转的同时可以立即响应,并且可以产生相当大的力矩阻止移动平台由于惯性继续移动;直流电机相对其他电机来说运动起来平稳,而且噪音小。2.2.2.2电机控制方式 直流电机的转速控制方法可以分为两类:调节励磁磁通的励磁控制方式和调节电枢电压的电枢控制方法。而由于励 磁控制方法在低速模式时磁极极易饱和,所以调速范围有限,而在高速模式下,由于经常换向,换向火花较大,造成控制时动态响应较差。本文采用的电机驱动方式是电枢控制方式,通过输出PWM脉宽调制PWM电平来控制电动机的电枢电压,实现调速功能。由于一般的微控制器都可以输出PWM脉冲电平,所以容易在微控制器上实现此种控制方式。2.2.2.3电机驱动模块 本文中移动平台使用直流电机实现其运动的能力,需要进行前进、后退、横向以及斜向的移动方式。直流电机在此运行的状态下工作所消耗的电压和电流都比较大,其正反转的改变需要通过改变所加电压的极性实现。在实际使用中,本设计中采用的是AQMH3615NS直流电机驱动模块来实现电机的驱动。AQMH3615NS的功能特点是:支持电机电压9-36V,有欠压保护功能;最大持续负载电流12A(不加散热);拥有类似L298的驱动逻辑,可三线控制调速、正反转以及刹车;支持满PWM输出,还可直接使用按键控制正反转,PWM的有效范围0.1%-100.0%;接口具有ESD防护。如图2-3所示为电机驱动模块的各个部分的功能。(a)模块正面 (b)模块背面图2-3 电机驱动模块各个部分功能电机驱动模块电源接口、电机接口以及控制信号接口的连接方式如图2-4所示,当使用外部PWM调速时,IO2/IO3分别控制电机的正反转和刹车,PWM引脚接微控制器的PWM输出,用于电机的调速。而控制电机正反转及刹车的电平逻辑如表2-1所示。表2-1 控制信号逻辑
IO2IO3PWMOUT1/OUT2输出
00X刹车
11X悬空
101全速正转
011全速反转
10PWM正转调速
01PWM反转调速
在PWM为100%时需要先刹车0.1S以上再给反转信号,否则电机的反向电动势可能导致电源电压突变使驱动芯片进入保护状态而导致错误运行,对于非满PWM状态,如果要改变电机的转动方向,最好也先刹车0.1S以上再给反转信号,以免导致电源电压有较大波动。图2-4 电机驱动模块接线图
11楼和13楼更新完成程序 本帖最后由 Genius 于 2016-8-31 11:24 编辑
Gokit main函数流程图
温湿度处理流程图
PM2.5传感器处理流程图
雨量传感器处理流程图
关键程序
void PM25_Read(uint8_t *dust,uint8_t *temp1,uint8_t *yuliang)
{
float temp,pm25,rainval;
//*temp1=Get_Adc(5);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
Delay_us(280);
temp=(float)Get_Adc(5)*(3.3/4096);
Delay_us(40);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
Delay_us(9680);
rainval=(float)Get_Adc(4)*(3.3/4096);
//temp=(float)Get_Adc(5)*(3.3/4096);
pm25=temp*344-99;
*temp1=pm25;
//PM2.5计算空气质量AQI,分为0-5一共6个等级
if(pm25<35)
*dust=0;
if(pm25>=35 && pm25<75)
*dust=1;
if(pm25>=75 && pm25<150)
*dust=2;
if(pm25>=150 && pm25<250)
*dust=3;
if(pm25>=250&& pm25<500)
*dust=4;
if(pm25>=500)
*dust=5;
//雨量等级计算
if(rainval>=3)
*yuliang=0;//没有雨
if(rainval>=1.6 && rainval<3)
*yuliang=1;//小雨
if(rainval>=1 && rainval<1.6)
*yuliang=2;//中雨
if(rainval>=0 && rainval<1)
*yuliang=3;//大雨
//*dust=temp*344-99;
//*dust=temp;
//*yuliang=temp2;
}void GizWits_GatherSensorData(void)
{
ReadTypeDef.Infrared = IR_Handle();
//ReadTypeDef.rain = RAIN_Handle();
//ReadTypeDef.rain=0;
printf("rain=%d \r\n",ReadTypeDef.rain);
DHT11_Read_Data(&curTem, &curHum);
ReadTypeDef.Temperature = (curTem + lastTem) /2;
ReadTypeDef.Humidity = (curHum + lastHum)/2;
ReadTypeDef.Temperature = ReadTypeDef.Temperature + 13;//Temperature Data Correction
lastTem = curTem;
lastHum = curHum;
printf("Temperature=%d \r\n",ReadTypeDef.Temperature);
printf("Humidity=%d \r\n",ReadTypeDef.Humidity);
//ReadTypeDef.test = 0;
//ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
//iol_temp = ADC_ConvertedValueLocal*344-99;
//PM_25_handle();
//ReadTypeDef.dustVal = 3;
PM25_Read(&ceshiVal,&ceshi11,&ceshi22);
Delay_ms(10);
printf("zhi=%d \r\n",ceshi11);
printf("dianya=%d \r\n",ceshiVal);
printf("rain11=%d \r\n",ceshi22);
ReadTypeDef.dustVal=ceshiVal;
ReadTypeDef.rain=ceshi22;
//printf("shangchuan=%d \r\n",ReadTypeDef.dustVal);
//xintianjia
chuanshu_buf=0xFF;
//chuanshu_buf=0xFF;
chuanshu_buf=curTem;
chuanshu_buf=curHum;
chuanshu_buf=ReadTypeDef.rain;
chuanshu_buf=ceshi11;
}int main(void)
{
uint8_t p0_control_buf;
//uint8_t flag=0;
uint8_t t=0;
SystemInit();
HW_Init();
Printf_SystemRccClocks();
SW_Init();
while(1)
{
KEY_Handle();
GizWits_MessageHandle(p0_control_buf, sizeof(WirteTypeDef_t));
if(p0Flag == 1)
{
memcpy((uint8_t *)&WirteTypeDef, p0_control_buf, sizeof(WirteTypeDef_t));
GizWits_ControlDeviceHandle();
GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1);
p0Flag =0;
}
if(gaterSensorFlag != 0)
{
GizWits_GatherSensorData();
printf("shangchuan=%d \r\n",ReadTypeDef.dustVal);
gaterSensorFlag = 0;
}
for(t=0;t<5;t++)
{
UART1_Send_DATA(chuanshu_buf);
}
GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 0);
}
}
WiFi服务系统程序完整下载
本帖最后由 努力的人 于 2016-8-23 21:02 编辑
void UpdateUI()
{
if(current_screen_id==0)//Îı¾ÉèÖúÍÏÔʾ
{
uint8 k1,k2,k4;
k1 = jieshou_buffer;
k2 = jieshou_buffer;
k4 = jieshou_buffer;
SetTextValueInt32(0,1,k1);//µ±Ç°µçÁ÷
SetTextValueInt32(0,3,k2);//ζÈ
if(jieshou_buffer == 0)
{
SetTextValue(0,4,"ûÓê");
}
else if(jieshou_buffer == 1)
{
SetTextValue(0,4,"СÓê");
}
else if(jieshou_buffer == 2)
{
SetTextValue(0,4,"ÖÐÓê");
}
else if(jieshou_buffer == 3)
{
SetTextValue(0,4,"´óÓê");
}
SetTextValueInt32(0,5,k4);
++test_value;
}
}int main()
{
qsizesize = 0;
uint32 timer_tick_last_update = 0; //上一次更新的时间
/*配置时钟*/
Set_System();
/*配置串口中断*/
Interrupts_Config();
/*配置时钟节拍*/
systicket_init();
/*串口初始化,波特率设置为115200*/
UartInit(115200);
/*清空串口接收缓冲区*/
queue_reset();
/*延时等待串口屏初始化完毕,必须等待300ms*/
delay_ms(300);
while(1)
{
size = queue_find_cmd(cmd_buffer,CMD_MAX_SIZE); //从缓冲区中获取一条指令
if(size>0)//接收到指令
{
ProcessMessage((PCTRL_MSG)cmd_buffer, size);//指令处理
}
if(update_en&&timer_tick_count-timer_tick_last_update>=TIME_100MS)
{
update_en = 0;
timer_tick_last_update = timer_tick_count;
UpdateUI();
}
}
}extern uint8 jieshou_buffer;
void USART2_IRQHandler(void)
{
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
if(isFramestart == 1)
{
jieshou_buffer= USART_ReceiveData(USART2);
if(bianliang>3)
{
bianliang=0;
isFramestart = 0;
}
}
else
{
if(USART_ReceiveData(USART2) == 0xFF)
{
isFramestart = 1;
}
}
}
}STM32F103驱动串口屏完整程序上传
好帖。顶一个! 务实的想法 值得期待 admin 发表于 2016-7-22 15:50
务实的想法 值得期待
我报名参加比赛 好贴,持续关注 本帖最后由 努力的人 于 2016-9-6 09:30 编辑
2.2.3 速度检测模块
电机作为运动控制系统的动力源,转速控制是实现系统高性能伺服驱动的关键,因此,电机转速的控制精度是控制系统首要考虑的问题。而控制系统要想获得高精度的控制效果,就必须采用基于反馈信号的闭环控制系统,即增加测量电机转速的传感器。此类测速传感器按测速传感器按测速原理来分类,主要有电磁式和光电式两类,其典型的代表分别是霍尔传感器和光电编码器。
由于光电式测速系统具有低惯量、低噪声、高分辨率和高精度等优点,常用于高精度力矩电机的转速测量与反馈。光电式编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。光电编码器根据其刻度方法及信号输出形式,可分为增量式光电编码器、绝对式光电编码器和本文选用增量式光电编码器,它具有结构简单、机械平均寿命可达几万小时以上、抗干扰能力强、可靠性高、适合长距离传输等优点。四个底盘驱动电机编码器的接口如图2-8所示。
图2-8 底盘电机编码器接口
由上可知本文采用的是增量式光电编码器作为电机转速测量装置,测速原理是通过对单位时间脉冲进行计数。但实际中用于测量的方法,分为以下三种:第一种方法是测量在规定时间内的脉冲个数,即测量频率来计算得到转速值,此方法称为法测频法,它在转速为高速的情况下精度较高。第二种是测量连续二个脉冲之间的时间差从来计算得到实时转速,此方法被称为法周期法,此方法在转速为低速情况下精度较高。第三种是同时测量时间和此时间内脉冲个数来计算得到转速,此方法被称为法频率周期法。此方法结合了以上测频法和测周期法的优点,在实际中较为常用。而本文正是采用第三种测速方法。
设光电码盘每转一圈输出P个脉冲,在T1(单位为S)时间内,编码器输入m1脉冲,则电机的转速Ns(单位为r/min)可由公式(2-1)计算:
(2-1)
在T2(T2=T1+∆T,单位为S)时间内,设此时主控制器内部计数频率为fc,计数值为m2,使用周期法计算T2,可以由以下公式(2-2)得到:
(2-2)
将公式1-2代入公式1-1中,就可以得到电机转速的计算公式(2-3)如下:
(2-3)
由上式可以得出,这种测速方法的原理是:在T2时间内,可得到的外部输入脉冲个数为m1,由主控芯片内部计时频率fc得到的脉冲数m2。实际中使用主控制器内部的定时器编码器输入接口得到m1,内部计数模式得到fc和m2,使用公式(2-3)即可得到移动平台各个驱动电机的实时转速。2.2.4 无线通信模块通过无线接收模块,小车操作人员可通过上位机发出相关运动指令,可在复杂环境中保证其行进的安全性。而在通信时无线数据传输的高速性、稳定性和准确性,直接关系到整个控制系统在远程无线控制下的工作可靠性。故无线模块的选择尤为重要,图2-10是无线通信模块的串口接口。
拿毕业设计的作品参赛,一物多用啊 oustar 发表于 2016-7-27 08:42
拿毕业设计的作品参赛,一物多用啊
如果觉得讲的繁琐了,可以简化呀,就是我觉得那样不负责任 本帖最后由 努力的人 于 2016-7-31 14:36 编辑
第三章 软件设计
1.串口屏界面设计
本帖最后由 努力的人 于 2016-7-31 14:37 编辑
2.WiFi服务系统设计
夏普pm2.5传感器
传感器与MCU的接线方式如图所示,使用PA7作为输出引脚接传感器的LED引脚,使用PA5作为ADC1的chanel_5接传感器的VO引脚。
传感器的工作过程如下:传感器的工作周期为10ms,首先通过LED引脚启动传感器,然后等待0.28ms,使得传感器将粉尘浓度转换为电压,并利用STM32的PA5引脚对处理过的输出信号VO采样,接着等待0.04ms,最后关闭LED并且等待9.680ms。GP2Y1010AU0F传感器的输出电压与粉尘浓度的关系如图2-14所示,由于对VO进行了分压处理,计算粉尘浓度选择ug/m3,所以计算公式为粉尘浓度=344*(AD转换后的电压)-99。
雨量传感器
将传感器的AO引脚接STM32的PA4引脚,通过ADC读取传感器的电压值判断雨量的的大小。
本帖最后由 努力的人 于 2016-7-31 14:38 编辑
BOM清单
STM32F405X 1
AQMH3615NSX4
直流减速电机(带编码器) X4
麦克纳姆轮X4
底板X1
机智云gokit2X1
PM2.5模块X1
雨量传感器 X1
串口屏X1
STM32F103C8T6核心板X1
无线遥控器+接收模块X1
本帖最后由 努力的人 于 2016-7-31 14:38 编辑
数据点
第一版视频链接:http://v.youku.com/v_show/id_XMTY2NTM0MzE0OA==.html admin 发表于 2016-7-22 15:50
务实的想法 值得期待
帖子更新差不多了,你看一下 好详细,点赞:) 之前上传的都是第二版
发一些第一版的照片
我对智能机器人安防系统很感兴趣!
楼主这东东有套件供应吗?