查看: 31777|回复: 10

[8月赛] [开源盛世]物联网管家机器人零入门设计

  [复制链接]

26

主题

256

帖子

873

积分

高级会员

Rank: 4

积分
873
发表于 2017-8-25 13:43:18 | 显示全部楼层 |阅读模式
本帖最后由 chenguang3312 于 2017-8-25 13:43 编辑
                                                                                                                      物联网智能管家设计指南
设计思路:
在科技迅速发展的今天,生活压力的增加,人们渴望追求更优越的生活条件,所以加班的现象越来越普遍。那么当你不在家并且家里没人的时候,如果家里失火、煤气忘关,或者说管道漏水等。如何能够实时的了解家中的情况,并且能够在最短速度内报警,把损失降低到最小,显得尤为重要。因此,萌发了做一款可移动侦测采集室内数据的智能小车。

功能介绍:
室内环境复杂,为了保证小车不撞到障碍。使用单片机控制超声波测距,对环境障碍进行180度探测,寻找最优路径实现避障功能。假如需要小车实现多点定点检测,那么只需规划出特殊的路线,利用红外检测路线,实现自动巡航功能。传感器采集回来的数据,由MCU简单处理后,通过网络设备无线上传到“云”服务器,用户可以在电脑端,手机端查看小车移动采集的数据。当采集回来的数据,超出正常值时,可以触发“报警”功能。搭载害气体传感器接口,烟雾粉尘传感器,可实现有害气体(煤气)泄露报警,室内粉尘检测。小车采用wifi联网,为了解决大多数非专业用户在不懂编程的情况下依然能正常使用,小车采用Airkiss技术,用户可以在手机端通过微信或者特定APP就可以实现正常配网。第三方API接入展示

功能设计:
鉴于智能小车行动灵活的特点,在车上搭载功能外设(如温湿度计,烟雾粉尘检测模块,有害气体传感器等设备),就可以实现灵活多点数据采集,实现多点测温,火灾预警,PM2.5空气质量分析,有害气体泄露报警等功能。 本指南以嵌入式常用传感器为例,目的为初学者提供一个较为全面开发例程。

硬件介绍:



     1.   智能小车主控以stm32f103系列MCU为例(其他芯片参考移植),这里使用中国移动麒麟座开发板进行设计(感谢中移硬件赞助)。
          IMG_20170514_185911.jpg.JPG

      麒麟座采用stm32f103ret6芯片为主控芯片,搭载了GSM模块 WiFi模块和温湿度传感器,角度传感器等部件,是一款功能较为齐全的硬件开发平台,出于尽可能丰富外设,做一款较完善的教程的考虑,使用麒麟开发板可以节约空间,方便添加跟多外设。
    2.使用E18-D80NK 红外接近开关,用于对障碍物进行检测,触发中断执行避障机制。

T1NvKmFd4fXXXXXXXX_!!0-item_pic.jpg
  E18-D80NK红外接近开关,工作原理:当模块发射出去的红外照射在物体上,在物体表面发生漫反射现象,如果模块自身接收到反射回来的红外光,信号线会输出高电平,未收到反射光,会保持低电平(具体何时高何时低电平,模块不同可能有所差异,使用前最好测量下。注: 如若你的模块不论何时都保持高,或者低 ,尝试调节模块背后的灵敏度旋钮)。
3.使用PM2.5传感器 GP2Y1014AU粉尘传感器,用于对空气中大于0.8um的颗粒物浓度进行检测。
TB2.sjYsShlpuFjSspkXXa1ApXa_!!0-saturn_solar.jpg_230x230.jpg_.webp.jpg

夏普光学灰尘传感器(GP2Y1014AU0F)在检测非常细的颗粒,如香烟烟雾,是特别有效的,并且是常用的空气净化器系统。
      该装置中,一个红外发光二极管和光电晶体管,对角布置成允许其检测到在空气中的灰尘反射光。传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。
       这里通过读取输出脚的模拟电压来判读颗粒浓度,用到stm32 内部ADC转换
      ******************************************************************************************************************************************************************
      ADC1初始化程序  PB1口用于LED信号触发
      ******************************************************************************************************************************************************************
     
  1. void Adc_Init(void)
  2. {
  3. ADC_InitTypeDef ADC_InitStructure;
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB  , ENABLE );
  6. RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  7. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//
  9. GPIO_Init(GPIOA, &GPIO_InitStructure); //
  10. ADC_DeInit(ADC1); //
  11. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //
  12. ADC_InitStructure.ADC_ScanConvMode = ENABLE;  //
  13. ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //
  14. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//

  15. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC
  16. ADC_InitStructure.ADC_NbrOfChannel = 1;  //
  17. ADC_Init(ADC1, &ADC_InitStructure);  //
  18. ADC_Cmd(ADC1, ENABLE);  //
  19. ADC_ResetCalibration(ADC1);  //
  20. while(ADC_GetResetCalibrationStatus(ADC1)); //
  21. ADC_StartCalibration(ADC1);  //
  22. while(ADC_GetCalibrationStatus(ADC1)); //

  23. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  24. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  26. GPIO_Init(GPIOB, &GPIO_InitStructure);
  27. GPIO_SetBits(GPIOB, GPIO_Pin_1 );

  28. }
复制代码
  1. //*******************************************************************
  2. //读取adc值  ch=通道  s=规则序列
复制代码
//*******************************************************************
//得到 ADC单通道多次平均值
//ch=通道 S为规则序列 time=n次读取求平均值
//*******************************************************************
  1. u16 Get_Adc_Average(u8 ch,u8 s,u8 times)
  2. {
  3.         float temp_val=0;
  4.         float pm;
  5.         u8 t;
  6.         u8 z=0;
  7.         for(t=0;t<times+z;t++)
  8.         {
  9.                 GPIO_SetBits(GPIOB, GPIO_Pin_1 );        
  10.                 GPIO_ResetBits(GPIOB, GPIO_Pin_1);        

  11.                 delay_us(40);        
  12.                 if(Get_Adc(ch,s)>300)
  13.                 {
  14.                         temp_val+=Get_Adc(ch,s);
  15.            }
  16.                 else
  17.                 {
  18.                         z++;
  19.                         if(z>100)
  20.                         return 0;
  21.     }
  22.         delay_us(280);
  23.   GPIO_SetBits(GPIOB, GPIO_Pin_1 );        
  24.         delay_us(9680);
  25.         }
  26. temp_val=temp_val/times;
  27. return temp_val;
  28. }
复制代码

4. 模块 MQ-5液化气天然气 城市煤气传感器模块:检测燃气是否泄露 TB2QUODmYlmpuFjSZFlXXbdQXXa_!!0-saturn_solar.jpg_230x230.jpg_.webp.jpg
MQ-5有两个输出信号脚,一个是数字输(0,1)另一个是模拟输出,数字输出可以通过调节灵敏度来设置物理阀值,相对模拟输出来说 数字输出简单,可直接通过MCU端口检测,但数字输出不精确不直观,本次仍然以模拟信号进行ADC转化,通过程序判断具体燃气浓度,具体ADC配置思路同上。通过串口调试得到的数据如下:
`7DQNB)NIUE$Z4JY%8S(SM7.png
5. 火焰传感器模块 火源探测模块 :用于检测室内是否有明火
TB2wuQVXBPzQeBjSZFlXXccIVXa_!!2207691322.jpg_430x430q90.jpg
该模块也有数字信号输出脚和模拟信号输出脚,但由于stm32f103只有3个ADC,火焰检测采集模拟量意义不大,所以直接用的是数字信号输出脚,将其配置成外部中断。也可以不用中断直接检测引脚电压来判断是否有明火。
6.SPI接口的 oled液晶显示屏
TB1qKj_PVXXXXXLXFXXXXXXXXXX_!!0-item_pic.jpg_230x230.jpg_.webp.jpg
Oled显示屏直接使用厂家提供的官方驱动源码就行,没必要去研究它具体寄存器操作方式。我们只需学会使用IIC协议 或SPI协议能给屏幕发送指令就可以了。具有协议不在赘述,网上有很多,而且协议是固定通用的。
7. RCWL-0516 微波雷达感应开关模块:用来进行人体感应,在设备开启离家模式时,如果感应到人,则会触发报警。
TB10XN4RVXXXXXSaXXXXXXXXXXX_!!0-item_pic.jpg_230x230.jpg_.webp.jpg    QQ截图20170817170217.png
  管脚定义如上所示,输出信号为数字信号,数字信号处理不在多说
8. 串口控制插卡SD卡语音模块:用于语音播报
TB2ojwXb4aK.eBjSZFAXXczFXXa_!!2750388435.jpg_400x400.jpg

QQ截图20170817171721.png
  模块采用串口协议进行传输,外接4欧3瓦的喇叭,语音文件通过软件合成后存在SD卡中,通过串口指令实现模块控制。        通信格式如下:(模块厂家不同格式也不同)

QQ截图20170817171848.png
Stm32串口1配置代码如下:
  1. void Usart1_Init(unsigned int baud)
  2. {
  3.          GPIO_InitTypeDef gpioInitStruct;
  4.         USART_InitTypeDef usartInitStruct;
  5.         NVIC_InitTypeDef nvicInitStruct;
复制代码
定义:
            uint8_t stop[]={0x7e,0x03,0x1e,0x1d,0xef,0x00};  //停止命令
   
     串口输出: printf(stop);

    注:前提是串口重定义过,才能使用printf函数。(网上搜索串口重定义的相关知识,)    否则 直接使用stm32f10x标准库里面的
USART_SendData();函数进行逐个字节输出.


9.舵机:一种角度电机,可以精确控制转动角度
TB1w4o2JVXXXXbbXFXXXXXXXXXX_!!0-item_pic.jpg
舵机通过控制器发送不同占空比的PWM来改变它转动的角度,每个角度对于一个特定的频率的PWM,关于stm32  pwm的配置如下:

*************************************************************
初始化定时器4 PWM模式

************************************************************
  1. void TIM4_PWM_Init(u16 arr,u16 psc)
  2. {                                                          
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  
  5.         TIM_TimeBaseStructure;
  6.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  7.        

  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);       
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  |      RCC_APB2Periph_AFIO, ENABLE);  
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  13.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  14.             TIM_TimeBaseStructure.TIM_Period = arr;
  15.         TIM_TimeBaseStructure.TIM_Prescaler =psc;
  16.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  17.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  18.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  19.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  20.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  21.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  22.         TIM_OC3Init(TIM4, &TIM_OCInitStructure);  

  23.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  24.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  25.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  26.          TIM_OC4Init(TIM4, &TIM_OCInitStructure);
  27.         TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
  28.         TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
复制代码
通过库标准函数改变舵机转动角度:        TIM_SetCompare3(TIM4,1870);

                                                               TIM_SetCompare4(TIM4,1880)

10.直流电机驱动模块:模块用于驱动TT马达,输入信号同样是PWM  配置方式与舵机相同,操作方式如上图所示。选用这块模块优点 是芯片模块比晶体管模块发热小,缺点是占用控制芯片管脚多(4路PWM)
TB25vVDaHBmpuFjSZFAXXaQ0pXa_!!2207691322.jpg
TB2JPFCaHxmpuFjSZJiXXXauVXa_!!2207691322.jpg

11.超声波测距模块
                                
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是
  超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

超声波测距用到stm32定时器输入捕获功能配置过程如下:
*********************************************************
初始化定时器2为捕获模式
********************************************************
  1. void TIM2_Cap_Init(u16 arr,u16 psc)
  2. {               
  3.         TIM_ICInitTypeDef  TIM2_ICInitStructure;
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  6.           NVIC_InitTypeDef NVIC_InitStructure;
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  
  9.        
  10.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0 ;  
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 ÊäÈë  
  12.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  13.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                               
  14.         TIM_TimeBaseStructure.TIM_Period = arr;
  15.         TIM_TimeBaseStructure.TIM_Prescaler =psc;          
  16.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  17.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  18.           TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1;
  19.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  20.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  21.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         
  22.           TIM2_ICInitStructure.TIM_ICFilter =0x00;
  23.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  24.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
  25.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  26.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  27.         NVIC_Init(&NVIC_InitStructure);  
  28.         TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//ÔÊÐí¸üÐ
  29.         TIM_Cmd(TIM2,ENABLE );          
  30. }
复制代码
*************************************************************
       定时器2中断服务程序

*************************************************************
  1. void TIM2_IRQHandler(void)
  2.         {                     
  3. if((TIM2CH1_CAPTURE_STA&0X80)==0)
  4.                 {       
  5.                         if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  6.                         {            
  7.                                 if(TIM2CH1_CAPTURE_STA&0X40)
  8.                                 {
  9.                                         if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)
  10.                                         {
  11.                                                 TIM2CH1_CAPTURE_STA|=0X80;
  12.                                                 TIM2CH1_CAPTURE_VAL=0XFFFF;
  13.                                         }else TIM2CH1_CAPTURE_STA++;
  14.                                 }         
  15.                         }
  16.                         if(TIM_GetITStatus(TIM2, TIM_IT_CC1) !=
  17.                         {       
  18.                                 if(TIM2CH1_CAPTURE_STA&0X40)               
  19.                              {                                 
  20.                                 TIM2CH1_CAPTURE_STA|=0X80;               
  21.                                  TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
  22.                                                          TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);  
  23.                                 }else                                                         
  24.                                 {
  25.                                         TIM2CH1_CAPTURE_STA=0;               
  26.                                         TIM2CH1_CAPTURE_VAL=0;
  27.                                         TIM2CH1_CAPTURE_STA|=0X40;       
  28.                                          TIM_SetCounter(TIM2,0);
  29.                                          TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);               
  30.                                 }                    
  31.                         }                                                                                   
  32.                 }

  33.        
  34.                 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update);
  35.                 TIM2_1CAP();
  36.         }
复制代码
***********************************************************
       距离转化函数
***********************************************************
  1. void TIM2_1CAP()
  2.         {
  3.       if(TIM2CH1_CAPTURE_STA&0X80)
  4.     {
  5.     temp=TIM2CH1_CAPTURE_STA&0X3F;
  6.     temp*=65536;
  7.     temp+=TIM2CH1_CAPTURE_VAL;
  8.     temp=temp*17;
  9.    z=temp/1000;
  10.    TIM2CH1_CAPTURE_STA=0;
  11.    }
  12.         }
复制代码

12.外围材料:
IMG_20170701_174745.jpg.JPG    

自制稳压电源板,稳压3.3V和5V(注意区分不同模块的供电电压)
   TB2gP2AnVXXXXasXpXXXXXXXXXX_!!63928017.jpg_400x400.jpg


用于将5V升压到7V  供电机驱动部分使用

TB2e7zgg3xlpuFjy0FoXXa.lXXa_!!353490717.jpg TB2hFMsidBopuFjSZPcXXc9EpXa_!!353490717.jpg


接下来就是枯燥的硬件组装 调试 软件测试

IMG_20170401_003222.jpg.JPG

IMG_20170401_003236.jpg.JPG

IMG_20170701_001649_HHT.jpg.JPG

IMG_20170701_002201.jpg.JPG




硬件部分介绍完毕,程序部分也穿插在其中一并说了。现在,来看下onenet web应用部分,具体onenet web应用部分如何设计,我就不在多说,论坛里都能找到,我只说论坛里没用的
Screenshot_2017-08-24-16-26-32-224_com.chinamobil.png
本次设计用stm32f103接入onenet  EDP服务器 和第三方服务器,这是结构简图
za_副本.png

这是室内可燃气体泄露触发的报警:
2B6W{U~F)UYA2VD2K{KP$ZO.png
5M[V[}3IYK{%0}CBTIAFDG.png

这是获取第三方网站本地气象数据效果:
IMG_20170817_211241.jpg

由于时间,字数限制,本次展示到此结束。
如果你在设计过程中存在疑问,也许会在下面找到答案,请点赞+关注 ,下图内容会陆续跟新。
QQ截图20170825132851.png





视频在包内 设计指南.rar (14.52 MB, 下载次数: 1163)
回复

举报

26

主题

256

帖子

873

积分

高级会员

Rank: 4

积分
873
 楼主| 发表于 2017-9-13 17:12:55 来自手机 | 显示全部楼层
梁肖 发表于 2017-9-8 11:01
假如需要小车实现多点定点检测,那么只需规划出特殊的路线,利用红外检测路线,实现自动巡航功能。这个是怎 ...

红外循迹  或者ccd循迹

1

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2017-9-8 11:01:15 | 显示全部楼层
假如需要小车实现多点定点检测,那么只需规划出特殊的路线,利用红外检测路线,实现自动巡航功能。这个是怎么回事

0

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2017-9-7 09:06:59 | 显示全部楼层
哎呀,我也想做一个呢,正在准备材料中,谢谢楼主的资料

26

主题

256

帖子

873

积分

高级会员

Rank: 4

积分
873
 楼主| 发表于 2017-8-31 12:36:13 来自手机 | 显示全部楼层
pkaosss211 发表于 2017-8-30 09:36
厉害!!!!!

????????大杂烩

95

主题

575

帖子

2201

积分

金牌会员

Rank: 5Rank: 5

积分
2201
发表于 2017-8-25 16:17:18 | 显示全部楼层
这么好的作品,帮忙贴个高清大图和视频



视频:版权属于郭同学,不妥立删
https://v.qq.com/x/page/p05429byjfx.html
1、OneNET交流群6:887624121
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~

26

主题

256

帖子

873

积分

高级会员

Rank: 4

积分
873
 楼主| 发表于 2017-8-25 14:55:26 | 显示全部楼层
cdd 发表于 2017-8-25 14:25
内容很详细哦,楼主这么用心真是超感动

冬冬姐 我马上要霸屏了哇

26

主题

256

帖子

873

积分

高级会员

Rank: 4

积分
873
 楼主| 发表于 2017-8-25 14:54:27 | 显示全部楼层
listen 发表于 2017-8-25 14:30
市场产品级作品,功能集合很强大哇!

谢谢支持

4

主题

17

帖子

17

积分

内部员工

积分
17

青铜小One

发表于 2017-8-25 14:30:32 | 显示全部楼层
市场产品级作品,功能集合很强大哇!

95

主题

575

帖子

2201

积分

金牌会员

Rank: 5Rank: 5

积分
2201
发表于 2017-8-25 14:25:07 | 显示全部楼层
内容很详细哦,楼主这么用心真是超感动
1、OneNET交流群6:887624121
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~

5

主题

38

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2017-8-30 09:36:23 | 显示全部楼层
厉害!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表