基于树莓派继电器实现软硬件结合自动化场景
本文仅代表个人观点
引言
目前软件测试团队,正在逐步建立软件测试的CICD自动化测试框架。期望通过无缝连接开发的版本发布,进行快速高效的验证工作。 将自动化测试做到规范化、快速化,提高团队的整体效率。为将来更多的测试用例自动化打好基础。整体的方案的思路如下:
1. 团队的版本发布包触发自动化测试框架。
2. CICD中的Pipeline自动获取和安装相应的安装包。
3. 执行团队中现有的自动化测试脚本,如Firmware, Libs等等。 (将来会扩展更多的模块)。
4. 监控脚本的执行,记录测试日志。
5. 测试结束后,收集整理测试报告。
6. 将测试报告通过邮件发送相关人员,进行问题分析和定位。
经过团队的一段时间的努力,整体框架基本完成了。 但是我们的在设计的过程中,发现遇到以下问题:
1. 安装包完成后,需要对控制柜进行物理上下点的重启。
2. 用例中一些紧急制动的后,需要手工激活控制柜,才能连接机器人本体。
这些问题会阻碍我们自动化的实际执行,必须要人工干预才能顺利执行。 为了真正实现CICD的无人值守,这两个问题必须要解决。进过讨论,我们的初步方案是使用树莓派来模拟,电源的上下电和模拟激活按钮。并将这些操作和http服务相关联,自动化框架通过API来模拟这些人为干预的操作。
一.整体方案
整体的放设计思路如下:
1. 使用继电器来控制外部电源的输入输出。
2. 使用继电器来实现模拟外部IO激活的功能。
3. 使用树莓派微型电脑,在GPIO的基础上控制继电器的行为。
4. 在树莓派上建立web服务,覆盖以上的功能。
5. 自动化框架根据需要调用web请求,实现用例的自动化执行。
接下来我们根据我们的方案设想,逐步来实现各项功能和验证工作。
1.1 什么是树莓派
树莓派由注册于英国的慈善组织“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等编程语言.
以上介绍来自百度百科:树莓派
1.2 为什么选择树莓派
在选择使用树莓派最为方案之前,我们尝试使用其他的一些解决方案如:智能插座、单片机、IO外部设备等等。但是这些方案都无法满足我的需求。如智能插座的API是封闭的,自动化框架无法通过http request来实现自由调度,单片机无法提供稳定的Web服务或者说开发代价太大,而IO需要第三方软件支持,成本较高。综合来看树莓派的整体方较为成熟:
1. 可以使用Python作为开发语言,难度低。
2. 天然支持GPIO机制,能够很好的控制硬件。
3. 自带Flask web服务框架,能够快速开发所需要的的API接口。
4. 成本低廉,整体方案不超过1200元人民币。
5. 体积小功耗低,便于和电箱等设备集成。
6. 使用Linux + Python + Flask方案开发周期短,维护简单。
二.树莓派系统安装配置
2.1 系统安装
树莓派设备是一个硬件,本身不自带系统。官方提供了一些的镜像文件,提供给使用者使用。第三方也有一些定制化的操作系统可以使用。 我们在这里使用了其官方的操作系统:Raspberry Pi OS。
1.1.1 OS 下载
访问树莓派的官方网站中的下载页面:OS下载链接
你会看到许多版本的操作系统可供选择,我们这里选择了“Raspberry Pi OS with desktop and recommended software”版本,里面不光有操作系统,一些必备的软件。
建议使用BT软件通过种子文件来下载,速度比较快。
1.1.2 OS 烧录
OS镜像下载完成后,我们需要将镜像文件烧录到SD中,提供给树莓派用。
常用的烧录工具有:
Win32 Disk Imager: 下载地址
Rufus: 下载地址
下图使我们使用Rufus工具来烧录操作系统:
1.1.3 OS 登录和配置
将SD卡插入树莓派中,连接好电源、显示器、键盘鼠标等外设。开启电源,如果OS启动成功,就会显示以下界面:
按照提示一路默认下去,语言建议大家使用默认英语,键盘布局选择US键盘。要注意的是不要选择立即更新软件,因为各种原因,更新的时间较长,而且本身已安装的软件足够大家常规使用。
1.1.4 开启root用户
树莓派的默认用户密码为: PI/raspberry,如果想要建立建立root用户,使用以下命令:
根据系统提示,输入和确认密码即可。
1.1.5 开启VNC和SSH服务
打开客户端输入下命令,开启VNC和SSH服务这样我们就可以远程登录树莓派,进行代码编写和相关得工作:
在打开的界面中,选择“interface options” 选项:
根据提示开启VNC和SSH服务:
VNC可以是我们能够使用专门的软件和remote程序,通过界面登录我们的树莓派。
SSH服务可以使我们能够使用一些SSH client工具通过命令控制树莓派。
设置完毕后,重启树莓派。尝试是否可以远程登录树莓派。
我们可以下载一个SSH客户端工具,比如 Putty,输入用户名密码查看是否可以远程控制树莓派。
1.1.6 开启ftp服务
我们需要再树莓派中建立一个ftp的服务,这样我们就可以远程上传我们的测试代码 ,进行调试验证。在Linux系统中最常用的就是“vsftpd”服务了。
打开客户端输入以下命令就可以自动安装了:
使用默认的安装和配置文件,ftp服务是可以正常使用的。我们可以下载一些开源的FTP客户端软件来使用,比如: FileZilla
使用IP地址,用户名密码,22端口,如果能够看到用户的默认文件夹则服务安装成功:
SSH服务可以使我们能够使用一些SSH client工具通过命令控制树莓派。
设置完毕后,重启树莓派。尝试是否可以远程登录树莓派
1.1.7 配置Python环境
默认在树莓派中同时存在Python2.*和Python3.*。为了避免后续编程遇到环境上的问题,我们建议卸载Python2.*,并将默认Python环境设置为Python3.7。通过以下命令来进行配置和确认:
我们可以看到系统默认的Python环境变成了Python3.7:
1.1.8 确认Flask环境
我们在方案中提及需要使用Flask Web框架,来对外提供一个web服务。树莓派中已经默认集成了相关的环境,使用以下代码来确认:
Flask的官方网站如下,我们可以通过文档快速对的开发代码:
https://flask.palletsprojects.com/en/1.1.x/
三.电源自动上下电方案
配置玩树莓派和一些准备工作后。 我们接下来要对自动上下电方案进行实现。整体的思路如下:
1. 使用树莓派GPIO操作继电器
2. 继电器来控制点触空气开关,控制电源的上下电
3. 使用Flask提供web服务,供自动化脚本调用。
在开始设计相关代码前,我们先来了解下几种通过树莓派控制继电器的方法和一些基本概念:
GPIO(General Purpose I/O Ports)
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。
GPIO是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。GPIO口的使用非常广泛。掌握了GPIO,差不多相当于掌握了操作硬件的能力。
树莓派中GPIO的布局和结构如下:
编码实现(GPIO)
通过上文对于GPIO的介绍,我们知道我们需要通过代码,对pin脚输出高低电平,来操作外部的电子元器件。对于硬件引脚的操作,有以下几种的编码格式: Wiring Pi,BCM,物理引脚Board编码。可以使用不同的开发语言和方式实现操作硬件:
【 python GPIO】
【开发语言】——python
【简单介绍】——该库更确切的名称为raspberry-gpio-python,树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作。但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。除了python GPIO之外,还有众多的python扩展库(例如webiopi),毫无疑问的说python非常适合树莓派,树莓派也非常适合python。
【 wiringPi】
【开发语言】——C语言
【简单介绍】——wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等,毫无疑问地说wiringPi功能非常强大。
【 BCM2835 C Library】
【开发语言】——C语言
【简单介绍】BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,它给我的感觉更像STM32的库函数,BCM2835 C Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。
我们可以灵活的使用这三种库或者方案来实现我们的方案。既然我们使用的是Linux + Python + Flask的开发环境,我们首选使用GPIO库 +BCM编码的形式进行开发实现:
首先使用Python脚本实现对继电器的控制,代码如下:
运行代码,能够听到继电器打开闭合的声音,并且控制柜能够上下电。证明我们的方案是有效果的。记下来将其结合Flask框架,做成web服务:
我们开启Flask服务:
就可以通过调用以下http请求,来控制上下电和当前状态的查询:
API接口 |
功能 |
http://IP地址:端口/PowerOn |
电源上电 |
http://IP地址:端口/PowerOff |
电源断电 |
http://IP地址:端口/GetStatus |
获取当前电源状态 |
三.自动激活方案
在我们当前的控制柜系统机制中,在紧急制动和断电后,需要使用一个激活按钮来物理激活控制柜,才能够使能机器人本体,这是一个安全机制。
在我们目前的实验室环境中,我们有一个激活设备来实现以上功能:
我们咨询组内的开发人员和硬件的组同事,获取这个激活按钮的内部工作原理。得到的信息是,根据硬件需要完成激活设备,并且输出的四个引脚分成两组,同时得到一个高电平,就可以激活安全驱动。我们的想法是,是不是可以使用继电器来实现双路开关的功能, 模拟激活操作。
紧急接口设备的最小接法示意图:
我们使用DUSB25的接口,按照原理图做好内部线路连接,将3,16,4,17引线接入到分成两组接入到继电器中,希望通过继电器的上下电来时实现开关的作用。
实际实现,如图:
接下来我们使用python来实现双路继电器的开关和闭合:
经过代码的验证,发现我们的方案是切实可行的。通过代码我们可以模拟人工激活控制柜的功能。接下来我们将这些代码和Flask框架相结合,实现http协议的访问和控制:
这样我们就可以访问如下的IP地址,来激活系统:
API接口 |
功能 |
http://IP地址:端口/ActiveRobot |
激活系统 |
四.方案整合
在实现了自动化上电和激活方案后,我们将其软硬件进行整合。提供给自动化测试组进行使用,经过初步的验证,完全能够满足我们的日常使用。
最终代码如下:
在启动Flask服务后,我们可以通过以下的Http请求,来实现电源上下电和激活操作:
API接口 |
功能 |
http:// IP地址:端口/PowerOn |
电源上电 |
http:// IP地址:端口/PowerOff |
电源断电 |
http:// IP地址:端口/GetStatus |
获取当前电源状态 |
http:// IP地址:端口/ActiveRobot |
激活安全系统 |
后言
后续工作中可能根据这个思路讲系统IO、外部IO、PLC相关相关设备进行集成,达到软硬件结合的自动化测试框架 。 后期我们集成了modbus接口的工业继电器,并实现了自动化代码、pipeline、CICD和硬件设备的集成,真正做到无人值守的自动化测试架构
附录:工具链列表
Raspberry Pi OS OS下载链接
Win32 Disk Imager: 下载地址
Rufus: 下载地址
SSH Client: Putty
Ftp Client: FileZilla
参考文献
[1] 树莓派实验室: https://shumeipai.nxez.com/
[2] Blog: https://blog.csdn.net/xdw1985829/article/details/39580401
[3] Flask: https://palletsprojects.com/p/flask/