【计算机控制系统课程设计】基于树莓派的智能家居系统

1、 需求分析

智能家居作为一个新生产业,处于一个导入期与成长期的临界点,市场消费观念还未形成,但随着智能家居市场推广普及的进一步落实,培育起消费者的使用习惯,智能家居市场的消费潜力必然是巨大的,产业前景光明。 正因为如此,国内优秀的智能家居生产企业愈来愈重视对行业市场的研究,特别是对企业发展环境和客户需求趋势变化的深入研究,一大批国内优秀的智能家居品牌迅速崛起,逐渐成为智能家居产业中的翘楚! 智能家居至今在中国已经历了近12年的发展,从人们最初的梦想,到今天真实的走进我们的生活,经历了一个艰难的过程。

智能家居在中国的发展经历的四个阶段,分别是萌芽期、开创期、徘徊期、融合演变期

1.1萌芽期/智能小区期(1994年-1999年)

这是智能家居在中国的第一个发展阶段,整个行业还处在一个概念熟悉、产品认知的阶段,这时没有出现专业的智能家居生产厂商,只有深圳有一两家从事美国X-10智能家居代理销售的公司从事进口零售业务,产品多销售给居住国内的欧美用户。

1.2开创期(2000年-2005年)

国内先后成立了五十多家智能家居研发生产企业,主要集中在深圳、上海、天津、北京、杭州、厦门等地。智能家居的市场营销、技术培训体系逐渐完善起来,此阶段,国外智能家居产品基本没有进入国内市场。

1.3徘徊期(2006-2010年)

2005年以后,由于上一阶段智能家居企业的野蛮成长和恶性竞争,给智能家居行业带来了极大的负面影响:包括过分夸大智能家居的功能而实际上无法达到这个效果、厂商只顾发展代理商却忽略了对代理商的培训和扶持导致代理商经营困难、产品不稳定导致用户高投诉率。行业用户、媒体开始质疑智能家居的实际效果,由原来的鼓吹变得谨慎,市场销售也几年出来增长减缓甚至部分区域出现了销售额下降的现象。2005年-2007年,大约有20多家智能家居生产企业退出了这一市场,各地代理商结业转行的也不在少数。许多坚持下来的智能家居企业,在这几年也经历了缩减规模的痛苦。正在这一时期,国外的智能家居品牌却暗中布局进入了中国市场,而活跃在市场上的国外主要智能家居品牌都是这一时期进入中国市场的,如罗格朗、霍尼韦尔、施耐德、Control4等。国内部分存活下来的企业也逐渐找到自己的发展方向,例如天津瑞朗,青岛爱尔豪斯,海尔,科道等,用X10,深圳索科特做了空调远程控制,成为工业智控的厂家。

1.4 融合演变期(2011-2020年)

进入2011年以来,市场明显看到了增长的势头,而且大的行业背景是房地产受到调控。智能家居的放量增长说明智能家居行业进入了一个拐点,由徘徊期进入了新一轮的融合演变期。  接下来的三到五年,智能家居一方面进入一个相对快速的发展阶段,另一方面协议与技术标准开始主动互通和融合,行业并购现象开始出来甚至成为主流。  接下来的五到十年,将是智能家居行业发展极为快速,但也是最不可琢磨的时期,由于住宅家庭成为各行业争夺的焦点市场,智能家居作为一个承接平台成为各方力量首先争夺的目标。谁能最终胜出,我们可以作种种分析,但最终结果,也许只有到时才知。但不管如何发展,这个阶段国内将诞生多家年销售额上百亿元的智能家居企业。

1.5 爆发期

进入到2014年以来,各大厂商已开始密集布局智能家居,尽管从产业来看,业内还没有特别成功的案例显现,这预示着行业发展仍处于探索阶段,但越来越多的厂商开始介入和参与已使得外界意识到,智能家居未来已不可逆转。

目前来看,智能家居经过一年多产业磨合,已正处爆发前夜。业内人士认为,2015年随着合作企业已普遍进入到出成果时刻,智能家居新品将会层出不穷,业内涌现的新案例也会越来越多。

1.6 智能家居现状:

智能家居领域在国内仍存在诸多瓶颈,如:缺乏杀手级应用;标准不统一,包括网络传输标准的不统一以及家电产品之间无法融合;仍然存在技术性问题(包括人机交互技术、云计算、大数据等)、缺乏各家电之间的互联互通;产品价格太高;企业各自为政;产品功能相对单一,产品同质化很严重,功能雷同,创新不足;产品实用性差、用户体验差;安全隐私等问题。

在中国当前的智能家居市场上,已经有一大批国内互联网公司,先后推出了机顶盒、路由器、WIFI插座、智能开关等智能家居产品。但纵观市场,无论是智能化单品,还是构筑智能家居平台和系统,大多数的所谓智能化产品,还停留在“为智能化而智能化”、“为了连接而连接”的层面,一些功能很明显是为了傍上“智能产品”之名而设计,没有找正用户真正的“痛点”,营销噱头远远大于实用性,加上智能家居产品应用场景较为固定,这也导致真正被消费者接受和使用的少之又少。要解决智能家居普及的两个问题,一个是如何让每个家电智能化,二是如何让每个家电互联互通,形成更智能的场景。

当然,不可否认的是,智能家居将成为家电企业下一个竞争的新战场。在智能家居这个新硬件领域,真正可以实现产品市场规模化发展和引领市场潮流的或许还是传统家电企业。目前传统家电行业也正在逐步深入拥抱互联网,产业的繁荣与发展最终也将为用户带来更好的体验。

1.7 国内相关政策

截止2013年,全球范围内信息技术创新不断加快,信息领域新产品、新服务、新业态大量涌现,不断激发新的消费需求,成为日益活跃的消费热点。我国市场规模庞大,正处于居民消费升级和信息化、工业化、城镇化、农业现代化加快融合发展的阶段,信息消费具有良好发展基础和巨大发展潜力。我国政府为了推动信息化、智能化城市发展也在2013年8月14日发表了关于促进信息消费扩大内需的若干意见,大力测发展宽带普及、宽带提速,加快推动信息消费持续增长,这都为智能家居、物联网行业的发展打下了坚实的基础。

政策摘要:增强信息产品供给能力

鼓励智能终端产品创新发展。面向移动互联网、云计算、大数据等热点,加快实施智能终端产业化工程,支持研发智能手机、智能电视等终端产品,促进终端与服务一体化发展。支持数字家庭智能终端研发及产业化,大力推进数字家庭示范应用和数字家庭产业基地建设。鼓励整机企业与芯片、器件、软件企业协作,研发各类新型信息消费电子产品。支持电信、广电运营单位和制造企业通过定制、集中采购等方式开展合作,带动智能终端产品竞争力提升,夯实信息消费的产业基础。

1.8 发展机遇

智慧家居是今后家居领域发展的必然趋势,虽然市场推广才刚刚开始,但行业的竞争已经很激烈,光是宁波就有不下5家企业专门从事这方面开发。

制造企业在产业调整和转型中,都需要运用到大数据。今后,数据将成为推进社会进步的第四生产力。市场潜力巨大,同时,智慧家居所依托的大数据分析,也是传统制造企业转型升级的重要途径。

1.9发展

智能家居最初的发展主要以灯光遥控控制、电器远程控制和电动窗帘控制为主,随着行业的发展,智能控制的功能越来越多,控制的对象不断扩展,控制的联动场景要求更高,其不断延伸到家庭安防报警、背景音乐、可视对讲、门禁指纹控制等领域,可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景诱人,因此和其产业相关的各路品牌不约而同加大力度争夺智能家居业务,市场渐成春秋争霸之势。

图1 智能家居市场规模

据《2015-2020年中国智能家居设备行业发展前景预测与投资机会分析报告》指出,我国目前共有1亿数量智能家居潜在用户,预计2020年智能家居产业规模将突破1万亿元,硬件领域产业规模将占6000亿,软件规模将占4000亿元。

1.10 树莓派在智能家居中的分析

随着智能家居市场的迅猛发展,智能家居需求猛增,树莓派在智能家居中得到了广泛的应用。

Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派。
自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。

树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,Eben·Upton/埃·厄普顿为项目带头人。2012年3月,英国剑桥大学埃本·阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名"树莓派"。这一基金会以提升学校计算机科学及相关学科的教育,让计算机变得有趣为宗旨。基金会期望这 一款电脑无论是在发展中国家还是在发达国家,会有更多的其它应用不断被开发出来,并应用到更多领域。在2006年树莓派早期概念是基于Atmel的 ATmega644单片机,首批上市的10000“台”树莓派的“板子”,由中国台湾和大陆厂家制造。

它是一款基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100 以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC的基本功能只需接通电视机和键盘,就能执行如电子表格、文字处理、玩游戏、播放高清视频等诸多功能。 Raspberry Pi B款只提供电脑板,无内存、电源、键盘、机箱或连线。

树莓派的生产是通过有生产许可的三家公司Element 14/Premier Farnell、RS Components及Egoman。这三家公司都在网上出售树莓派。现在,你可以在诸如京东、淘宝等国内网站购买到你所想要的树莓派。

树莓派基金会提供了基于ARM的Debian和Arch Linux的发行版供大众下载。还计划提供支持Python作为主要编程语言,支持Java、BBC BASIC (通过 RISC OS 映像或者Linux的"Brandy Basic"克隆)、C 和Perl等编程语言.

树莓派早期有A和B两个型号,主要区别:A型:1个USB、无有线网络接口、功率2.5W,500mA、256MB RAM;B型:2个USB、支持有线网络、功率3.5W,700mA、512MB RAM。

2014年7月和11月树莓派分别推出B+和A+两个型号 ,主要区别:Model A没有网络接口,将4个USB端口缩小到1个。另外,相对于Model B来讲,Model A内存容量有所缩小,并具备了更小的尺寸设计。Model A可以说是Model B廉价版本。虽说是廉价版本,但新型号Model A也支持同Model B一样的MicroSD卡读卡器、40-pin的GPI连接端口、博通BCM2385 ARM11处理器、256MB的内存和HDMI输出端口。[树莓派model B+ 和A+两个型号 ,主要区别:Model A没有网络接口,将4个USB端口缩小到1个。另外,相对于Model B来讲,Model A内存容量有所缩小,并具备了更小的尺寸设计。Model A可以说是Model B廉价版本。虽说是廉价版本,但新型号Model A也支持同Model B一样的MicroSD卡读卡器、40-pin的GPI连接端口、博通BCM2385 ARM11处理器、256MB的内存和HDMI输出端口。
从配置上来说,model B+使用了和model B相同的BCM2835芯片和512MB内存,但和前代产品相比较,B+版本的功耗更低,接口也更丰富。model B+将通用输入输出引脚增加到了40个,USB接口也从B版本的2个增加到了4个,除此之外,model B+的功耗降低了约0.5W到1W,旧款的SD卡插槽被换成了更美观的推入式microSD卡槽,音频部分则采用了低噪供电。从外形上来看,USB接口被移到了主板的一边,复合视频移到了3.5mm音频口的位置,此外还增加了四个独立的安装孔。

就像其他任何一台运行Linux 系统的台式计算机或者便携式计算机那样,利用Raspberry Pi 可以做很多事情。当然,也难免有一点点不同。普通的计算机主板都是依靠硬盘来存储数据,但是Raspberry Pi 来说使用SD 卡作为“硬盘”,你也可以外接USB 硬盘。利用Raspberry Pi 可以编辑Office 文档、浏览网页、玩游戏—即使玩需要强大的图形加速器支持的游戏也没有问题。

Raspberry Pi 的低价意味着其用途更加广泛,将其打造成卓越的多媒体中心也是一个不错的选择。利用Raspberry Pi 可以播放视频,甚至可以通过电视机的USB 接口供电。

基于树莓派的智能家居以其方便编程、容易改造、能发挥创造力、价格低廉的优势扮演着及其重要的角色。

2、 项目内容

本项目完全基于树莓派,Raspberry Pi 3 的硬件接口通过开发板上的 40 排针 J8 公开。功能包括:

2.1 超声波测距,检测是否有人

2.1.1 硬件准备

HC-SR04超声波模块

2.1.2 管脚介绍

VCC,超声波模块电源脚,接5V电源即可
Trig,超声波发送脚,高电平时发送出40KHZ出超声波
Echo,超声波接收检测脚,当接收到返回的超声波时,输出高电平
GND,超声波模块GND

2.1.3 接线
  • 树莓派第2只脚为5V,给超声波模块供电,接VCC
  • 树莓派第39只脚为GND,与超声波模块共地接GND
  • 树莓派第1、3只脚分别为GPIO2和GPIO3,分别作发送和接收用,分别与Trig和Echo相连接。
2.1.4 控制代码(Python2)
1.  #! /usr/bin/python
2.  # -*- coding:utf-8 -*-
3.  import RPi.GPIO as GPIO
4.  import time
5.  def checkdist():
6.          #发出触发信号
7.          GPIO.output(2,GPIO.HIGH)
8.          #保持15us的超声波发射,避免能量太低无法返回
9.          time.sleep(0.000015)
10.         #然后置位2号管脚低电平,即停止发射超声波
11.         GPIO.output(2,GPIO.LOW)
12.         while not GPIO.input(3):
13.                pass
14.         #发现高电平时开时计时
15.         t1 = time.time()
16.         #如果有检测到反射返回的超声波,那么就持续计时,否则就跳出循环,计时结束
17.         while GPIO.input(3):
18.                 pass
19.         #高电平结束停止计时
20.         t2 = time.time()
21.         #返回距离,单位为米
22.         return (t2-t1)*340/2
23. GPIO.setmode(GPIO.BCM)
24. #第3号针,GPIO2
25. GPIO.setup(2,GPIO.OUT,initial=GPIO.LOW)
26. #第5号针,GPIO3
27. GPIO.setup(3,GPIO.IN)
28. time.sleep(2)
29. try:
30.         while True:
31.                 print 'Distance: %0.2f m' %checkdist()
32.                 time.sleep(0.5)
33. except KeyboardInterrupt:
34.         GPIO.cleanup()
2.1.5 效果展示

在实际应用中,我们通过将超声波模块固定于房门口顶部的墙壁上,因为顶部到底部的距离一定,所以当有人来的时候就会阻碍超声波的传输,从而使得测得的距离产生极大的变化。通过下面建立的控制模型进行开关门的执行动作。

2.2 树莓派温度控制

如果树莓派运行负载较高,那么CPU可能会存在过热的风险,为了延长设备寿命,我们需要对树莓派的CPU及其周边设备进行温度控制,方法是通过风控。即通过检测树莓派的温度,然后经由PID算法调节散热风扇电机的输出功率来调节CPU的温度至一个较“健康的”范围。

2.2.1 硬件准备

RK-380PH-4733高速微型直流电机,L298N电机驱动板模块、18650 4800mA锂电池


2.2.2 布线分析
  • 电源部分:
    12v power : 接 7~ 12 v 直流电源,4 节干电池组就可以。接 5v (如树莓派 GPIO口 输出的5v)不知道能不能带动。
    Power GND : 接直流电源地,和树莓派的 GPIO 地。
    5v power: 这个 5v 是输出的,给树莓派供电用的。不推荐使用,因为树莓派和 L298n 最好分开供电。分开供电的话这个脚悬空就行了!

  • 输入部分
    A Enable : 接 GPIO 口 。 电机 A 使能和 PWM 调速。
    Logic Input : 接 4 个 GPIO 口。 上面两个脚 Input1 、Input2 (靠近 A Enable )控制电机 A ; 下面两个脚 Input## 3、Input4 (靠近 B Enable)控制电机 B。
    B Enable : 接 GPIO口。 电机 B 使能和 PWM 调速。

  • 输出部分:
    Output A : 接电机 A 。
    Output B : 接电机 B 。

把 L289N 的直流电源接好,然后把树莓派的 GND 与 L298N 的 GND 连在一起,因为共地后 L298N 才能识别树莓派发送的 IN## 1、IN2 到底是高电平还是低电平。 树莓派的 ## 2、## 3、4 脚分别连到 A Enable、IN1 、IN2 。由控制表可知给 2 脚高电平,3 脚高电平,4 脚低电平,电机就会正转。通过电机带动风扇,用PWM来调节风速,改善树莓派的CPU温度,从而能够实现对温度的定性调节。

2.2.3 控制代码

控制代码分三种,一种改变Kp,在确定Kp的最佳参数为0.192左右之后,调至0.83倍,令Kp=0.16,然后调节Ki从0.01-0.2改变,最后调节至0.05附近最佳,最后确定Kd,

####    Just_Changed_Kp.py   ####
1.    #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys
5.  
6.  GPIO.setmode(GPIO.BCM)
7.  GPIO.setup(2,GPIO.OUT)
8.  GPIO.setup(3,GPIO.OUT)
9.  GPIO.setup(4,GPIO.OUT)
10. pwm=GPIO.PWM(2,80)
11. pwm.start(20)
12. GPIO.output(3,True)
13. GPIO.output(4,False)
14. file=open("/sys/class/thermal/thermal_zone0/temp")
15. Real_T=float(file.read())/1000
16. file.close()
17. Ideal_T=float(sys.argv[2])
18. Delta=[0.6]
19. Kp=float(sys.argv[1])
20. Ti=100000
21. Td=0
22. Output_PWM=5
23. # times=0
24. def All_of_List(a):
25.     s=0
26.     for i in range(len(a)):
27.         s=s+a[i]
28.     return s
29. 
30. def Real_Temp():
31.     file=open("/sys/class/thermal/thermal_zone0/temp")
32.     global Real_T
33.     Real_T=float(file.read())/1000
34.     file.close()
35. 
36. def Init(): 
37.     Real_Temp()
38.     # global Ideal_T
39.     # Ideal_T=33
40.     global Delta
41.     Delta=[0.5]
42.     global Output_PWM
43.     Output_PWM=5
44. 
45. def update_Output(Time_Gap,Kp):
46.     global Ideal_T
47.     global Delta
48.     global Ti
49.     global Td
50.     global Output_PWM
51.     global Real_T
52.     P=Kp
53.     I=Time_Gap/Ti
54.     D=Td/Time_Gap
55.     Increase=0
56.     Real_Temp()
57.     Delta.append(Real_T-Ideal_T)
58.     # if Delta[-1]>-0.5 and Delta[-1]<0.5:
59.     Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
60.     Output_PWM=Output_PWM+Increase
61.     if Output_PWM>100:
62.         Output_PWM=100
63.     elif Output_PWM<10:
64.         Output_PWM=10
65. 
66. Usage_time=[]
67. # times=0
68. 
69. def Find_Kp(Kp):
70.     times=0
71.     while True:
72.         times=times+1
73.         # if(times>100):
74.         # times=0
75.         # Init()
76.         Time_Gap=1
77.         time.sleep(Time_Gap)
78.         if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>100:
79.             Usage_time.append(times)
80.             print times
81.             break
82.         update_Output(Time_Gap,Kp)
83.         global Output_PWM
84.         pwm.ChangeDutyCycle(Output_PWM)
85.         print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
86.     pwm.ChangeDutyCycle(10)
87. # delay=0
88. 
89.     # pwm.ChangeDutyCycle(0)
90. #TryTime=10
91. #while TryTime>0:
92. #    Real_Temp()
93.  #   while Real_T<32:
94.   #      pass
95.     # time.sleep(1)
96. #for i in range(2,6):
97. #   Kp=float(i/10)
98. print "Now the Kp:%f0.3"%Kp
99.  #   Init()
100.    #   while True:
101.    #   Real_Temp()
102.    #   while Real_T<32:
103.    #       pass
104.    
105.    Find_Kp(Kp)
106.        #break
107.    print "\n"
108.      #  Kp=1.2*Kp
109.      #  TryTime=TryTime-1
####    Just_Changed_Ki.py   ####
1.   #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys
5.  
6.  GPIO.setmode(GPIO.BCM)
7.  GPIO.setup(2,GPIO.OUT)
8.  GPIO.setup(3,GPIO.OUT)
9.  GPIO.setup(4,GPIO.OUT)
10. pwm=GPIO.PWM(2,80)
11. pwm.start(20)
12. GPIO.output(3,True)
13. GPIO.output(4,False)
14. file=open("/sys/class/thermal/thermal_zone0/temp")
15. Real_T=float(file.read())/1000
16. file.close()
17. Ideal_T=float(sys.argv[2])
18. Delta=[0.6]
19. Kp=0.16
20. Ti=float(sys.argv[1])
21. Td=0
22. Output_PWM=5
23. # times=0
24. def All_of_List(a):
25.     s=0
26.     for i in range(len(a)):
27.         s=s+a[i]
28.     return s
29. 
30. def Real_Temp():
31.     file=open("/sys/class/thermal/thermal_zone0/temp")
32.     global Real_T
33.     Real_T=float(file.read())/1000
34.     file.close()
35. 
36. def Init(): 
37.     Real_Temp()
38.     # global Ideal_T
39.     # Ideal_T=33
40.     global Delta
41.     Delta=[0.5]
42.     global Output_PWM
43.     Output_PWM=5
44. 
45. def update_Output(Time_Gap,Kp):
46.     global Ideal_T
47.     global Delta
48.     global Ti
49.     global Td
50.     global Output_PWM
51.     global Real_T
52.     P=Kp
53.     I=Time_Gap/Ti
54.     D=Td/Time_Gap
55.     Increase=0
56.     Real_Temp()
57.     Delta.append(Real_T-Ideal_T)
58.     # if Delta[-1]>-0.5 and Delta[-1]<0.5:
59.     Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
60.     Output_PWM=Output_PWM+Increase
61.     if Output_PWM>100:
62.         Output_PWM=100
63.     elif Output_PWM<10:
64.         Output_PWM=10
65. 
66. Usage_time=[]
67. # times=0
68. 
69. def Find_Ki(Kp):
70.     times=0
71.     while True:
72.         times=times+1
73.         # if(times>100):
74.         # times=0
75.         # Init()
76.         Time_Gap=1
77.         time.sleep(Time_Gap)
78.         if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>150:
79.             Usage_time.append(times)
80.             print times
81.             break
82.         update_Output(Time_Gap,Kp)
83.         global Output_PWM
84.         pwm.ChangeDutyCycle(Output_PWM)
85.         print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
86.     pwm.ChangeDutyCycle(10)
87. # delay=0
88. 
89.     # pwm.ChangeDutyCycle(0)
90. #TryTime=10
91. #while TryTime>0:
92. #    Real_Temp()
93.  #   while Real_T<32:
94.   #      pass
95.     # time.sleep(1)
96. #for i in range(2,6):
97. #   Kp=float(i/10)
98. print "Now the Ki:%0.3f"%(1/Ti)
99.  #   Init()
100.    #   while True:
101.    #   Real_Temp()
102.    #   while Real_T<32:
103.    #       pass
104.    
105.    Find_Ki(Kp)
106.        #break
107.    print "\n"
108.      #  Kp=1.2*Kp
109.      #  TryTime=TryTime-1
####    Just_Changed_Kd.py   ####
1.  #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys

5.  GPIO.setmode(GPIO.BCM)
6.  GPIO.setup(2,GPIO.OUT)
7.  GPIO.setup(3,GPIO.OUT)
8.  GPIO.setup(4,GPIO.OUT)
9.  pwm=GPIO.PWM(2,80)
10. pwm.start(20)
11. GPIO.output(3,True)
12. GPIO.output(4,False)
13. file=open("/sys/class/thermal/thermal_zone0/temp")
14. Real_T=float(file.read())/1000
15. file.close()
16. Ideal_T=float(sys.argv[2])
17. Delta=[0.6]
18. Kp=0.16
19. Ti=0.05
20. Td=float(sys.argv[1])
21. Output_PWM=5
22. # times=0
23. def All_of_List(a):
24. s=0
25. for i in range(len(a)):
26. s=s+a[i]
27. return s

28. def Real_Temp():
29. file=open("/sys/class/thermal/thermal_zone0/temp")
30. global Real_T
31. Real_T=float(file.read())/1000
32. file.close()

33. def Init():
34. Real_Temp()
35. # global Ideal_T
36. # Ideal_T=33
37. global Delta
38. Delta=[0.5]
39. global Output_PWM
40. Output_PWM=5

41. def update_Output(Time_Gap,Kp):
42. global Ideal_T
43. global Delta
44. global Ti
45. global Td
46. global Output_PWM
47. global Real_T
48. P=Kp
49. I=Time_Gap/Ti
50. D=Td/Time_Gap
51. Increase=0
52. Real_Temp()
53. Delta.append(Real_T-Ideal_T)
54. # if Delta[-1]>-0.5 and Delta[-1]<0.5:
55. Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
56. Output_PWM=Output_PWM+Increase
57. if Output_PWM>100:
58. Output_PWM=100
59. elif Output_PWM<10:
60. Output_PWM=10

61. Usage_time=[]
62. # times=0

63. def Find_Kp(Kp):
64. times=0
65. while True:
66. times=times+1
67. # if(times>100):
68. # times=0
69. # Init()
70. Time_Gap=1
71. time.sleep(Time_Gap)
72. if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>150:
73. Usage_time.append(times)
74. print times
75. break
76. update_Output(Time_Gap,Kp)
77. global Output_PWM
78. pwm.ChangeDutyCycle(Output_PWM)
79. print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
80. pwm.ChangeDutyCycle(10)
81. # delay=0

82. # pwm.ChangeDutyCycle(0)
83. #TryTime=10
84. #while TryTime>0:
85. #    Real_Temp()
86. #   while Real_T<32:
87. #      pass
88. # time.sleep(1)
89. #for i in range(2,6):
90. #   Kp=float(i/10)
91. print "Now the Ki:%0.3f"%(1/Ti)
92. #   Init()
93. #   while True:
94. #   Real_Temp()
95. #   while Real_T<32:
96. #       pass

97. Find_Kp(Kp)
98. #break
99. print "\n"
100.    #  Kp=1.2*Kp
101.    #  TryTime=TryTime-1
2.2.4 获取的数据和图像及数据处理

数据见附件,log可以直接查看,mat后缀文件为Matlab变量空间形式。下面是图片附图:

第一组:改变Kp


第二组:改变Ki

上图为后来补测的,电池电压较低,数据不是很准确,应该丢弃!

第三组:改变Kd

在实验过程中使用18650锂电池会随着时间的推移而逐渐降低电压。所以后面的数据相对前面没那么准确。因为电机同样的占空比下输出的功率是不一样的。不过我们可以大致看出一个趋势,因为相同的一组数据,基本上都是在差不多同一个时间范围内测试的。

首先我们分析Kp也就是比例系数。从上面的数据我们可以看到,其接近平稳的程度是随着从0.15到0.6的过程中先上后下的。最终稳定下的风速占空比应该是30%到40%之间。所以我们可以很清晰的看到Kp在0.2左右的时候有比较好的效果,而且其最大超调量变比较小。

而对于积分系数Ki由于其电量不是非常足。所以稍有波动。但是也大概看出在0.05左右有对静差调节的最好效果。

而对于微分系数Kd的调节,由于是第二天进行的实验,环境温度变化较大,并且电池经过一晚的充电,相同占空比的输出功率产生了变化。所以仅参考趋势,不对具体的数据做过多要求,另外由于树莓派CPU的温度变化稍有延迟,所以没法精确地读出细微的温度变化趋势。不过仍然可以看到,在Kd=0.2附近,即将形成第三个波峰,说明其稳定速度是所有的参数中最快的。所以我们简单取Kd=0.2。
最后的结果是:Kp=0.192,Ki=0.05,Kd=0.2。图像本来应该最后的输出风速趋于稳定的,但是因为电池电量有限,如果等到最后输出稳定,进行试验的时间会延长太多,所以请老师见谅了。

3、 技术难点(PID控制过程)

3.1 目的:

树莓派工作过程中温度会升高,为了保持正常的工作温度:如34℃,需要根据温度调节散热风扇的转速加强或减弱散热作用以保证恒定的温度。

3.2原理:

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。PID是比例、积分、微分的缩写,将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。

通过PID算法进行负反馈调节,输入当前温度,通过PID算法得出所需转速,然后进行实时调控,确保温度恒定在一定值。
PID控制器的控制规律为:

比例环节的作用是对偏差瞬间做出快速反应。偏差一旦产生,控制器立即产生控制作用,使控制量向减少偏差的方向变化。控制作用的强弱取决于比例系数KP, KP越大,控制越强,但过大的KP会导致系统震荡,破坏系统的稳定性。

积分环节的作用是把偏差的积累作为输出。在控制过程中,只要有偏差存在,积分环节的输出就会不断增大。直到偏差e(t)=0,输出的u(t)才可能维持在某一常量,使系统在给定值r(t)不变的条件下趋于稳态。积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数T I 越大,积分的积累作用越弱。增大积分常数T I 会减慢静态误差的消除过程,但可以减少超调量,提高系统的稳定性。所以,必须根据实际控制的具体要求来确定TI 。

微分环节的作用是阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化得越快,微分控制器的输出越大,并能在偏差值变大之前进行修正。微分作用的引入,将有助于减小超调量,克服震荡,使系统趋于稳定。但微分的作用对输入信号的噪声很敏感,对那些噪声大的系统一般不用微分,或在微分起作用之前先对输入信号进行滤波。适当地选择微分常数TD ,可以使微分的作用达到最优。

由于计算机的出现,计算机进入了控制领域。人们将模拟PID 控制规律引入到计算机中来。由于计算机控制是一种采样控制,它只能根据采样许可的偏差计算控制量,而不能象模拟控制那样连续输出控制量,进行连续控制。由于这一特点,公式中的积分和微分项不能直接使用,必须进行离散化处理。离散化处理的方法为:以T 作为采样周期,k 作为采样序号,则离散采样时间kT 对应着连续时间 t,用求和的形式代替积分,用增量的形式代替微分,可将其写成如下形式:

如果采样周期取得足够小,则以上近似计算可获得足够精确的结果,离散控制过程与连续控制过程十分接近。三个参数要综合考虑,一般先将K I, KD设为0,调好KP,达到基本的响应速度和误差,再加上K I,,使误差为0,这时再加入KD,三个参数要反复调试,最终达到较好的结果。

在实际的应用中,更多的是通过凑试法来确定PID的参数。增大比例系数KP,一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。增大积分时间K I,有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。增大微分时间KD有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。

PID参数的设定可按如下确定:
参数整定找最佳,从小到大顺序查;先是比例后积分,最后再把微分加;曲线振荡很频繁,比例度盘要放大;曲线漂浮绕大湾,比例度盘往小扳;曲线偏离回复慢,积分时间往下降;曲线波动周期长,积分时间再加长;曲线振荡频率快,先把微分降下来;动差大来波动慢。微分时间应加长;理想曲线两个波,前高后低;一看二调多分析,调节质量不会低。
具体该温度控制系统的参数确定方法如下:

  • ⑴ 让调节器参数积分系数S0=0,实际微分系数k=0,控制系统投入闭环运行,由小到大改变比例系数S1,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。
  • ⑵ 取比例系数S1为当前的值乘以0.83,由小到大增加积分系数S0,同样让扰动信号作阶跃变化,直至求得满意的控制过程。
  • (3) 积分系数S0保持不变,改变比例系数S1,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数S1增大一些,再调整积分系数S0,力求改善控制过程。如此反复试凑,直到找到满意的比例系数S1和积分系数S0为止。
  • ⑷ 引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止

注意:仿真系统所采用的PID调节器与传统的工业 PID调节器有所不同,各个参数之间相互隔离,互不影响,因而用其观察调节规律十分方便。

PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右。小惯量如:一个小电机带 一水泵进行压力闭环控制,一般只用PI控制。P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的。 本控制对象属于小惯量,故选择时根据小惯量的参数选择开始选择调试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容