李主國(guó) 陳錚
摘 要:電子硬件界對(duì)軟件以外的領(lǐng)域進(jìn)行開源運(yùn)動(dòng),開源文化又添硬件一脈,硬件設(shè)計(jì)原理圖及相關(guān)軟件代碼完全開源共享,促成了開源硬件的誕生及其廣泛使用。為大幅降低系統(tǒng)整體成本,體現(xiàn)開源硬件的靈活性,對(duì)多傳感器綜合創(chuàng)意模型系統(tǒng)的數(shù)據(jù)采集進(jìn)行研究。采用arduino UNO開發(fā)板和傳感器套件,通過GPIO的讀寫實(shí)現(xiàn)互動(dòng)型創(chuàng)意系統(tǒng),對(duì)門鈴、房間燈光、戶外秋千、圍欄等設(shè)施進(jìn)行控制,采用LCD1602液晶屏顯示歡迎信息并實(shí)時(shí)刷新采集到的數(shù)據(jù)信息。系統(tǒng)典型數(shù)據(jù)采樣及刷新率達(dá)到毫秒級(jí)別,部件可替換,便于功能升級(jí)和產(chǎn)品迭代,具有互動(dòng)性和觀賞性,易于學(xué)習(xí)和使用。
關(guān)鍵詞:arduino單片機(jī);開源硬件;多傳感器
DOI:10. 11907/rjdk. 192391 開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
中圖分類號(hào):TP319文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 引言
繼開源軟件浪潮興起之后,電子硬件界也開始考慮對(duì)軟件以外的領(lǐng)域開展開源運(yùn)動(dòng),于是催生了開源硬件并得到廣泛應(yīng)用,開源文化又添硬件一脈。開源硬件與開源軟件類似,是采用與自由版權(quán)及開放源代碼軟件類似的流程和方式設(shè)計(jì)的電子硬件,硬件設(shè)計(jì)原理圖及相關(guān)軟件代碼完全開源共享。隨著開源硬件的誕生和發(fā)展,創(chuàng)新理念得到了極大的拓展。電子硬件界的開源文化開始風(fēng)靡全球,很大程度上歸功于硬件設(shè)計(jì)原理圖的公開及社區(qū)的自發(fā)支持[1-3]。
互聯(lián)網(wǎng)的發(fā)展、3D打印技術(shù)的廣泛普及和開源平臺(tái)的逐漸成熟,以及各類人工智能技術(shù)的涌現(xiàn)、物聯(lián)網(wǎng)的快速發(fā)展,推動(dòng)全球創(chuàng)客運(yùn)動(dòng)遍地開花。在各類組織、團(tuán)體和社區(qū)的組織下,面向不同要求的多樣化開源硬件產(chǎn)品不斷涌現(xiàn)并開始迅速迭代。開源電子硬件的出現(xiàn)開始沖擊傳統(tǒng)方式的創(chuàng)新,共享協(xié)作的創(chuàng)新方法快速引導(dǎo)創(chuàng)客們積極創(chuàng)新制造,使得創(chuàng)新更容易、獲取工具更便宜,以開源硬件為基礎(chǔ)開發(fā)的各種產(chǎn)品正改變和豐富著我們的生活,創(chuàng)客運(yùn)動(dòng)進(jìn)一步促進(jìn)了創(chuàng)客的分享精神,以更快的方式促進(jìn)項(xiàng)目的開展和完善,越來越多的創(chuàng)客項(xiàng)目在社區(qū)呈現(xiàn)出來,越來越多的人加入到項(xiàng)目學(xué)習(xí)和拓展當(dāng)中,同時(shí)也分享自己的創(chuàng)新作品和技術(shù),開源硬件已經(jīng)從上至下形成了完整產(chǎn)業(yè)鏈和生態(tài)圈。開源硬件是創(chuàng)客教育的核心支撐,是一種創(chuàng)新方式和創(chuàng)新理念的拓展,基于這種創(chuàng)新理念形成了強(qiáng)大的生態(tài)系統(tǒng),以分享的方式促進(jìn)創(chuàng)客教育,反過來創(chuàng)客運(yùn)動(dòng)又帶動(dòng)開源硬件的蓬勃發(fā)展。基于項(xiàng)目學(xué)習(xí)的STEAM教育快速變遷,以MIT等國(guó)外名校為代表的創(chuàng)客教育,把創(chuàng)新能力培養(yǎng)推向高潮[4-7]。以arduino、raspberry、beagle bone black等典型硬件為基礎(chǔ)的易于學(xué)習(xí)和使用的開源電子硬件平臺(tái),正越來越多地替代傳統(tǒng)的以51、AVR單片機(jī)或8086、ARM微處理器為核心的實(shí)驗(yàn)平臺(tái)[8],為世界教育和創(chuàng)新創(chuàng)意創(chuàng)業(yè)提供更好的服務(wù)[9]。
使用arduino硬件平臺(tái),可通過各種傳感器感知環(huán)境的各種狀態(tài),通過控制燈光、馬達(dá)和其它裝置來反饋、影響環(huán)境[10]。國(guó)內(nèi)外對(duì)arduino的應(yīng)用研究涵蓋互動(dòng)設(shè)計(jì)、智能家居[11]、教育教學(xué)[12-13]等領(lǐng)域,特別是在產(chǎn)品原型開發(fā)方面[14]。本文在已有研究基礎(chǔ)上,考慮降低系統(tǒng)成本并增強(qiáng)系統(tǒng)可用性,利用價(jià)格低廉的arduino UNO開發(fā)板和傳感器套件,開展多傳感器綜合創(chuàng)意模型系統(tǒng)的數(shù)據(jù)采集研究[15-16],擬通過GPIO的讀寫實(shí)現(xiàn)互動(dòng)型創(chuàng)意系統(tǒng),對(duì)門鈴、房間燈光、戶外秋千、圍欄等設(shè)施進(jìn)行控制;采用液晶屏LCD1602顯示必要的歡迎信息并實(shí)現(xiàn)實(shí)時(shí)信息刷新。創(chuàng)意系統(tǒng)如圖1所示。
1 系統(tǒng)需求分析
1.1 項(xiàng)目需求
考慮到直觀性,本文所涉及的場(chǎng)景屬于平面環(huán)形區(qū)域。主要限于花園范圍,以圍欄為外界,以房屋為內(nèi)界(房屋內(nèi)部只考慮安裝蜂鳴器和照明燈,以三色LED模擬七彩光影)。花園內(nèi)部設(shè)有秋千和燈帶,房屋門外邊配有門鈴按鈕,燈亮度旋鈕放置在房屋墻邊,圍欄門口設(shè)置觸碰開關(guān),液晶屏位于圍欄門口處。采用價(jià)格比較低廉的常用傳感器實(shí)現(xiàn)設(shè)備控制功能。各區(qū)域功能劃分及設(shè)備一覽表見表1。
1.2 IO點(diǎn)數(shù)分布
傳感器使用不同方式采集環(huán)境信息,并與主控單片機(jī)進(jìn)行通信。常用傳感器接線一般采用三線制,除正電源和接地外,另一根線是信號(hào)線。三色LED接線共5根,其中3根信號(hào)線分別代表紅、綠、藍(lán)3種顏色信號(hào)。內(nèi)部具有芯片處理的傳感器(例如串口LCD),連接方式為四線制,用兩根信號(hào)線模擬串口或IIC通信。
根據(jù)表1,結(jié)合各傳感器的功能和接線特征,統(tǒng)計(jì)得到系統(tǒng)的IO點(diǎn)數(shù),如表2所示。數(shù)字量信號(hào)12個(gè),模擬量信號(hào)2個(gè),采用arduino UNO(支持?jǐn)?shù)字量信號(hào)16個(gè),模擬量信號(hào)6個(gè)),IO口數(shù)完全夠用。
2 系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
2.1 功能模塊設(shè)計(jì)
根據(jù)表2,結(jié)合設(shè)備功能設(shè)立5個(gè)單獨(dú)模塊分別完成各部分功能。門鈴模塊需要處理按鈕的響應(yīng)并驅(qū)動(dòng)蜂鳴器播放一段音樂;室內(nèi)燈光模塊響應(yīng)燈亮度旋鈕的動(dòng)作,調(diào)節(jié)三色LED控制室內(nèi)光影效果;秋千模塊根據(jù)傾斜開關(guān)控制繼電器輸出,隨秋千搖擺,控制燈帶亮滅;圍欄模塊根據(jù)觸碰開關(guān)狀態(tài)控制繼電器動(dòng)作,實(shí)現(xiàn)圍欄門的開關(guān);液晶屏模塊用于顯示歡迎信息、時(shí)間、環(huán)境溫度等信息;溫度傳感器通過熱敏電阻進(jìn)行模數(shù)轉(zhuǎn)換處理,采集環(huán)境溫度,發(fā)送給arduino單片機(jī),再由單片機(jī)控制屏幕顯示正確的溫度數(shù)據(jù);按鈕控制屏幕顯示內(nèi)容,在歡迎信息和溫度信息之間可以切換。
從模擬IO口讀到的數(shù)值A(chǔ)(0-1023)與環(huán)境溫度值T(攝氏度)之間的關(guān)系如下:
2.2 系統(tǒng)流程
使用C/C++語言對(duì)arduino單片機(jī)編寫程序,利用已有的相關(guān)庫文件簡(jiǎn)化編程,只需要關(guān)注整體業(yè)務(wù)邏輯即可[17-18]。硬件的初始化等只需要執(zhí)行一次的內(nèi)容放入setup()函數(shù)中,而日常反復(fù)執(zhí)行的任務(wù)放入loop()函數(shù)中處理。功能流程如圖2所示,系統(tǒng)的IO定義如表3所示。
所有GPIO模式設(shè)置由setup()函數(shù)處理,其它5個(gè)模塊的功能全部需要loop()函數(shù)作輪詢處理。主流程需要輪詢處理門鈴、室內(nèi)燈光、秋千搖擺、圍欄狀態(tài)和液晶屏顯示功能。液晶屏顯示要在歡迎信息和溫度顯示之間進(jìn)行切換,切換條件由與液晶屏相連的按鈕狀態(tài)決定。溫度信息顯示處理部分除使用式(1)計(jì)算外,還需要考慮小數(shù)位數(shù)處理。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() {//日常事務(wù)處理
int slideValue = 0;
int saveValue = 0;
int lcd_buttonFlag = 1;
while(1) {
//1.doorbell //門鈴
if(digitalRead(buttonPin) == true)
playMusic();
//2.room light 室內(nèi)燈光
slideValue = analogRead(slidePin);
if(slideValue != saveValue) {
lightAdjust(slideValue);
saveValue = slideValue;
}
//3.swing //秋千搖擺
if(digitalRead(tiltPin)) {
digitalWrite(relayPin,HIGH);
delay(200);
} else {