李主國 陳錚



摘 要:電子硬件界對軟件以外的領域進行開源運動,開源文化又添硬件一脈,硬件設計原理圖及相關軟件代碼完全開源共享,促成了開源硬件的誕生及其廣泛使用。為大幅降低系統整體成本,體現開源硬件的靈活性,對多傳感器綜合創意模型系統的數據采集進行研究。采用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 {