基于开源硬件的多传感器综合创意系统设计
2020-07-26李主国陈铮
李主国 陈铮
摘 要:电子硬件界对软件以外的领域进行开源运动,開源文化又添硬件一脉,硬件设计原理图及相关软件代码完全开源共享,促成了开源硬件的诞生及其广泛使用。为大幅降低系统整体成本,体现开源硬件的灵活性,对多传感器综合创意模型系统的数据采集进行研究。采用arduino UNO开发板和传感器套件,通过GPIO的读写实现互动型创意系统,对门铃、房间灯光、户外秋千、围栏等设施进行控制,采用LCD1602液晶屏显示欢迎信息并实时刷新采集到的数据信息。系统典型数据采样及刷新率达到毫秒级别,部件可替换,便于功能升级和产品迭代,具有互动性和观赏性,易于学习和使用。
关键词:arduino单片机;开源硬件;多传感器
DOI:10. 11907/rjdk. 192391 开放科学(资源服务)标识码(OSID):
中图分类号:TP319文献标识码:A 文章编号:1672-7800(2020)007-0136-04
The Design of Multi-sensor Integrated Creativity System
Based on Open Source Hardware
LI Zhu-guo1, CHEN Zheng2
(1. Hubei Radio & TV University, Wuhan 430074, China; 2. College of Arts & Science of Jianghan University, Wuhan 430345,China)
Abstract: In the field of electronic hardware, the open-source movement has been carried out in areas other than software. The open-source culture stimulates the open-source develoment of hardware. The hardware design schematic diagram and related software code are fully open-source shared, which has contributed to the birth and wide use of open-source hardware,and has become another important branch of open source culture. This article uses Arduino UNO and sensor kits to realize interactive creative system through GPIO reading and writing, launch data collection research of multi-sensor integrated creative system, control doorbell, room lighting, outdoor swing, fence and other facilities, adopt LCD1602 screen to display the welcome message and refresh the collected real-time data information. The system components are replaceable and it is easy to upgrade and iterate. The implemented system is inexpensive, easy to learn and use, and has high interactivity and enjoyment.
Key Words: Arduino microcontroller; open source hardware; multi-sensor
0 引言
继开源软件浪潮兴起之后,电子硬件界也开始考虑对软件以外的领域开展开源运动,于是催生了开源硬件并得到广泛应用,开源文化又添硬件一脉。开源硬件与开源软件类似,是采用与自由版权及开放源代码软件类似的流程和方式设计的电子硬件,硬件设计原理图及相关软件代码完全开源共享。随着开源硬件的诞生和发展,创新理念得到了极大的拓展。电子硬件界的开源文化开始风靡全球,很大程度上归功于硬件设计原理图的公开及社区的自发支持[1-3]。
互联网的发展、3D打印技术的广泛普及和开源平台的逐渐成熟,以及各类人工智能技术的涌现、物联网的快速发展,推动全球创客运动遍地开花。在各类组织、团体和社区的组织下,面向不同要求的多样化开源硬件产品不断涌现并开始迅速迭代。开源电子硬件的出现开始冲击传统方式的创新,共享协作的创新方法快速引导创客们积极创新制造,使得创新更容易、获取工具更便宜,以开源硬件为基础开发的各种产品正改变和丰富着我们的生活,创客运动进一步促进了创客的分享精神,以更快的方式促进项目的开展和完善,越来越多的创客项目在社区呈现出来,越来越多的人加入到项目学习和拓展当中,同时也分享自己的创新作品和技术,开源硬件已经从上至下形成了完整产业链和生态圈。开源硬件是创客教育的核心支撑,是一种创新方式和创新理念的拓展,基于这种创新理念形成了强大的生态系统,以分享的方式促进创客教育,反过来创客运动又带动开源硬件的蓬勃发展。基于项目学习的STEAM教育快速变迁,以MIT等国外名校为代表的创客教育,把创新能力培养推向高潮[4-7]。以arduino、raspberry、beagle bone black等典型硬件为基础的易于学习和使用的开源电子硬件平台,正越来越多地替代传统的以51、AVR单片机或8086、ARM微处理器为核心的实验平台[8],为世界教育和创新创意创业提供更好的服务[9]。
使用arduino硬件平台,可通过各种传感器感知環境的各种状态,通过控制灯光、马达和其它装置来反馈、影响环境[10]。国内外对arduino的应用研究涵盖互动设计、智能家居[11]、教育教学[12-13]等领域,特别是在产品原型开发方面[14]。本文在已有研究基础上,考虑降低系统成本并增强系统可用性,利用价格低廉的arduino UNO开发板和传感器套件,开展多传感器综合创意模型系统的数据采集研究[15-16],拟通过GPIO的读写实现互动型创意系统,对门铃、房间灯光、户外秋千、围栏等设施进行控制;采用液晶屏LCD1602显示必要的欢迎信息并实现实时信息刷新。创意系统如图1所示。
1 系统需求分析
1.1 项目需求
考虑到直观性,本文所涉及的场景属于平面环形区域。主要限于花园范围,以围栏为外界,以房屋为内界(房屋内部只考虑安装蜂鸣器和照明灯,以三色LED模拟七彩光影)。花园内部设有秋千和灯带,房屋门外边配有门铃按钮,灯亮度旋钮放置在房屋墙边,围栏门口设置触碰开关,液晶屏位于围栏门口处。采用价格比较低廉的常用传感器实现设备控制功能。各区域功能划分及设备一览表见表1。
1.2 IO点数分布
传感器使用不同方式采集环境信息,并与主控单片机进行通信。常用传感器接线一般采用三线制,除正电源和接地外,另一根线是信号线。三色LED接线共5根,其中3根信号线分别代表红、绿、蓝3种颜色信号。内部具有芯片处理的传感器(例如串口LCD),连接方式为四线制,用两根信号线模拟串口或IIC通信。
根据表1,结合各传感器的功能和接线特征,统计得到系统的IO点数,如表2所示。数字量信号12个,模拟量信号2个,采用arduino UNO(支持数字量信号16个,模拟量信号6个),IO口数完全够用。
2 系统设计实现
2.1 功能模块设计
根据表2,结合设备功能设立5个单独模块分别完成各部分功能。门铃模块需要处理按钮的响应并驱动蜂鸣器播放一段音乐;室内灯光模块响应灯亮度旋钮的动作,调节三色LED控制室内光影效果;秋千模块根据倾斜开关控制继电器输出,随秋千摇摆,控制灯带亮灭;围栏模块根据触碰开关状态控制继电器动作,实现围栏门的开关;液晶屏模块用于显示欢迎信息、时间、环境温度等信息;温度传感器通过热敏电阻进行模数转换处理,采集环境温度,发送给arduino单片机,再由单片机控制屏幕显示正确的温度数据;按钮控制屏幕显示内容,在欢迎信息和温度信息之间可以切换。
从模拟IO口读到的数值A(0-1023)与环境温度值T(摄氏度)之间的关系如下:
2.2 系统流程
使用C/C++语言对arduino单片机编写程序,利用已有的相关库文件简化编程,只需要关注整体业务逻辑即可[17-18]。硬件的初始化等只需要执行一次的内容放入setup()函数中,而日常反复执行的任务放入loop()函数中处理。功能流程如图2所示,系统的IO定义如表3所示。
所有GPIO模式设置由setup()函数处理,其它5个模块的功能全部需要loop()函数作轮询处理。主流程需要轮询处理门铃、室内灯光、秋千摇摆、围栏状态和液晶屏显示功能。液晶屏显示要在欢迎信息和温度显示之间进行切换,切换条件由与液晶屏相连的按钮状态决定。温度信息显示处理部分除使用式(1)计算外,还需要考虑小数位数处理。C语言核心代码如下:
void setup() {//初始化
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin,INPUT);
pinMode(ledPin1,OUTPUT);
pinMode(ledPin2,OUTPUT);
pinMode(ledPin3,OUTPUT);
pinMode(tiltPin,INPUT);
pinMode(relayPin,OUTPUT);
pinMode(relayPin2,OUTPUT);
pinMode(protoshieldPin,INPUT);
pinMode(lcd_buttonPin,INPUT);
slcd.begin();
slcd.backlight();
}
void loop() {//日常事务处理
int slideValue = 0;
int saveValue = 0;
int lcd_buttonFlag = 1;
while(1) {
//1.doorbell //门铃
if(digitalRead(buttonPin) == true)
playMusic();
//2.room light 室内灯光
slideValue = analogRead(slidePin);
if(slideValue != saveValue) {
lightAdjust(slideValue);
saveValue = slideValue;
}
//3.swing //秋千摇摆
if(digitalRead(tiltPin)) {
digitalWrite(relayPin,HIGH);
delay(200);
} else {