本节书摘来异步社区《仿人机器人原理与实战》一书中的第3章 ,第3.3节,作者布莱恩·伯杰伦(Bryan Bergeron) 托马斯B. 塔尔博特(Thomas B. Talbot) 王伟 魏洪兴 刘斐 译, 更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.3 热平衡模拟器
接下来的一组实验将教会你在热动态平衡中如何利用上述控制模型。在这里所学到的原则适用于多种控制系统,不管控制目标是仿人机器人还是其他机械电子设备。
3.3.1 初级热平衡模拟器
我们首先使用一个类似于图3-3所示的简易热交换系统。假设你手头没有可以安装热水储槽的仿人机器人躯干,我们就用分散的零件做形式上的模拟。这种方法的好处是能够对初始设置进行快速修改,并且使热平衡过程的可视化。
3.3.2 器材清单
为了建立基础的热平衡模拟器,你将要用到以下器材:
- 6~12V直流水泵
- 10英尺长、直径3/16英寸的鱼缸用硅树脂水管,或直径1/8英寸的铜管
- 硅树脂密封胶管
- 热水(来自水龙头)或浸入式加热器
- 接头或者密封胶,用来将管子连接到泵上
- 绝热的1加仑储槽
- Arduino Uno或等效控制器
- Arduino的USB连接线
- 水泵电源
- 运动控制扩展板或者多通道的额定电流2A的MOSFET管
- 防水的10kΩ热电偶
- 10kΩ、1/4W电阻
- 人体模型的头部或者其他平台
- 压缩空气罐或散热片
与之前的项目类似,你可以随意更换更便宜和更容易获得的器材。例如,用浸入式加热器加热储槽中的热水是一种方便的方法,但是来自于水龙头的热水同样可以。同时,对1加仑储槽也没有特殊要求。对于我们的实验目的,用毛巾或者气泡包裹的不锈钢或者铝合金的罐子跟实验室中那种带玻璃纤维的烧杯效果是一样的。在调试系统时,密封的油漆桶可以作为廉价的替代储槽。
在上述清单中,最关键的是低压直流水泵、水管和相关接头。低压直流电源既安全又便于控制。检查可用的直流水泵,可采用浸没于水中的水泵,或者是带输入输出连接头的、用于船底排水和小喷泉的那种水泵。如图3-8所示,我们使用浸入式、12Vdc、额定1.2A、350gal/h的船底排水泵,大概16美元。尽管350gal/h的输出量对我们的实验来说可能偏大不少,但是你至少要每分钟从10英尺长、3/16英寸粗的管子中抽走1~2L水。
如图3-8所示,器材包括直径3/16英寸的硅橡胶管、一个带接线柱的MOSFET扩展板、一个通用管径适配器和两个热电偶探头,其中一个是自制的,另一个是采购的。铜管可以用来替代硅橡胶水管,红外温度计最好有,尽管不是必需的。温度计能够帮助你快速了解各器件的温度,而不需要直接接触器件。
我们用硅橡胶管制作热辐射器。诚然,硅橡胶不是热交换的最佳材料,但是它很便宜且比铜管更容易制作。除非知道怎么做,否则你将会在制作间里为寻找合适的铜接头而花费整个下午。然而,如果你已经有铜管或者铝管,并且知道怎么使用,那就不用硅橡胶管了,这样系统的响应时间会更快。
因为Arduino接口的驱动能力只有40mA,所以我们需要一个更大功率的晶体管或者H桥来驱动水泵。图3-9展示了一些基于MOSFET管和集成桥电路的可选方案。位于左边的Sparkfun电机扩展板采用6个MOSFET提供6个大电流通道,位于右边的Grove扩展板利用L298N双桥驱动。单个带内部二极管保护的多通道MOSFET(比如FairChild公司的RFP30N06LE),与散热片、PCB和输入输出接头组合在一起是最紧凑且最容易获得的单个电机驱动方案,如图3-9中部所示。如果你决定使用单个MOSFET管,请使用PCB和大负载的接头。如果使用面包板,那么你可能会烧坏线路。
3.3.3 电路
如图3-10所示,电路由Arduino控制器(带多通道MOSFET、12Vdc泵驱动接口)和热电偶探头(提供模拟信号输入)组成。热电偶与10kΩ阻值电阻R1串联分压,使得当温度上升时,端口A0的输入电压更高。回想一下,热电偶的温度系数是负的,所以阻值随温度增加而下降。因此,随着温度上升,R1两端的电压增加,从而引起Arduino读数增加。
3.3.4 构造
从原理图中就可以看出,连接电子器件的工作量不大。如果选用10kΩ热电偶作为温度探头,那么你需要做防水安装。将热电偶插入1英尺的管子中,用硅胶密封确保电路连接干燥。采用足够的热缩管包住线头和焊接接头,避免因水和蒸气的原因造成短路。图3-11展示了用于制造防水热电偶探头的主要材料。
橡胶或者塑料帽的密封性更好,但是会牺牲响应时间,灵敏的温度传感器对于精确控制系统非常关键。用防水且不导电的材料包裹热电偶,其温度变化会滞后于水温,这与包裹材料的质量和热传导特性有关。如果不自己制作温度探头,那么可以买预先标定好的防水探头,探头带有薄的热传导帽,响应时间短。完整的自制热电偶探头和商用热电偶探头如图3-8所示。
真正的挑战在于管路制作,包括支撑平台制作。理想情况下,管子是埋在皮肤薄膜下的,以模拟突起的静脉。为了达到说明问题的目的,我们采用廉价的服装模特头部,并将硅橡胶管像发带一样缠绕起来,如图3-12所示。管子上可覆盖一些假发,使得外观更加自然。
另一种可选方案是利用铜管缠绕在服装模特头部或其他平台上,这样导热和辐射效果更好。例如,如图3-13所示,将铜管缠绕在运动辊上。注意连接到泵上的是弹性气管。不管采用什么形式的管子和支撑平台,你都将发现,构造工作最困难的部分就是把水管连接到水泵上。例如,如果泵的出口外径(OD)与管子的内径(ID)不匹配,那么你可能需要管径变换器,如同本章开始展示的那种。
3.3.5 编程
如程序清单3-1所示,我们首先建立最基本的代码,实施闭环和负反馈开关控制器。
清单3-1 Arduino代码,用于泵速开关控制的热平衡
这个例子主要依赖于通过Serial.println()函数送到串口监视器中的数据。如果热电偶的读数显示温度高于setPoint的温度,那么泵就会打开,将水送到热辐射器中循环,在那里水的热量被释放到环境中。当热电偶显示温度达到setPoint或者更低时,泵停止工作。
setPoint和pumpSpeed的最佳值取决于初始设定。在我们的实验中,setPoint取值600,大约位于冷水管和热水管中水温的中间值。pumpSpeed的最佳值取决于系统设计和预期响应时间。如果选用的是大流量的泵,那么选用较小的pumpSpeed值将会更加安全。
假设连接正常,泵可以在全速下工作,那么核心温度应快速下降。然而,也很有可能会出现setPoint温度超调。相反,如果将泵速调到很小,热量从储槽中散失就需要更长的时间,setPoint温度超调的可能性也更小一些。显然,多次尝试和失败是必不可少的。
3.3.6 操作
接下来要做的事情是,要么用热水装满储槽,要么用浸入式电加热器把水加热。不管用哪种方法,储槽中水的温度必须要比设定值高一点儿。另外,你应该赋给变量setPoint一个合理的温度值,例如,一方面你当然不想融化泵上的塑料零件;另一方面你要把水温设定得比外部温度高一大截,否则热辐射器就辐射不了多少热量。
如果使用浸入式电加热器而不是热水,那么红外温度计或者直接接触式温度计都有助于确定何时拔掉加热器。你当然不想让水泵都“沸腾”起来。除了防止过度高温,没有必要测量绝对温度。我们的目的是突出热电偶读数的变化趋势,以便与其他更先进的控制算法的结果相比较。
如果系统遇到这样或那样的困难,你可以在空气中而不是在水中调试,从而节省时间。将热电偶从储槽中拔出,待其干燥。接着,修改变量setPoint的值,使其刚好比外界温度高一点儿。用手挤压探头,将探头的温度升到高于变量setPoint的值,并用压缩空气降温。检查泵的连接和热电偶的完整性。如果你没有做好热电偶的密封,那么线头上的水可能会造成不正常的实验结果。
确定探头和相关电路都工作正常后,再把变量setPoint改为原来的值。如果仍然有问题,那么请检查泵和相关电路。注意:如果你在调试水泵,那么某些浸入式器件必须与水长期接触,便于润滑和带走热量。