Arduino開發板與電路模組,延伸了軟體應用,隨著物聯網受到關注,相關技術也擴大發展空間 | 林信良 因在網路上經營「良葛格學習筆記」(openhome.cc)而聞名,曾任昇陽教育訓練中心技術顧問、甲骨文教育訓練中心授權講師,目前為自由工作者,專長為技術寫作、翻譯與教育訓練。喜好研究程式語言、框架、社群,從中學習設計、典範及文化。閒暇之餘記錄所學,技術文件涵蓋C/C++、Java、Ruby/Rails、Python、JavaScript、Haskell等多個領域。 |
從程式人角度看Arduino這類開發板與相關電路模組,實際上可視為軟體的延伸,它們使得開發者可以與實體世界的資訊做連結,近來IoT概念興起,開啟了這類連結更多可能性。
姑且不論IoT背後一些被炒作的概念,網路應用程式開發,本就是程式人擅長之領域,若可以透過網路控制開發板,實際上就給了軟體開發者更多的可能性,而在實現這些可能性時,現階段無論軟硬體,都有非常多的資源可供選擇。
Arduino與Web伺服器 如果想透過瀏覽器來控制Arduino,基本上要有個Web伺服器進行請求處理與回應,若Arduino硬體上沒有網路支援(例如單純使用Arduion Uno),可透過電腦來運行Web伺服器,再由Web伺服器與Arduino進行溝通。
目前來說,有現成的一些軟體具有這類功能,像是為了降低孩子們接觸Arduino困難的S4A(Scratch for Arduino),就內建有Web伺服器(命名為遠端感應器),可透過瀏覽器傳送請求給Web伺服器,訊息在Scratch中以廣播方式,讓訂閱對應訊息的程式積木可以進行相關流程,例如,讓Arduino角色的積木,可以控制LED的開與關。
透過S4A內建的Web伺服器作代理,解決了自行撰寫伺服器的問題,不過,在網頁操作時的使用者介面設計上,必須自行處理,在網路上有幾個名稱同為WebDuino的專案,其中node-webduino是基於node.js實現,它使用http模組來建立Web伺服器,並使用socketstream作為Web框架,實現了現成的網頁操作介面,當然,因為操作介面本身就是HTML、JavaScript、CSS組成,讓前端工程師,可以只使用前端技術,就作出讓網頁(以及行動裝置)與Arduino互動的應用程式。
實際上,電腦上建立的Web伺服器是作為代理(Proxy),當接收到瀏覽器請求時,處理並轉發訊息給Arduino,在Arduino官方網站最新的〈Interfacing with Other Software〉文件中,提供了各種軟體與Arduino互動的方式,而電腦與Arduino的溝通方式,基本上是透過serial頻道,如果開發者熟悉某個語言,可以基於該語言,實現自己的Web伺服器。
比方說,在Arduino官方網站〈Arduino + Python〉文件中,提供了Python如何透過pySerial從Arduino讀取資料,以及如何將資料傳送給Arduino的範例,因而,開發者可以使用Python建立一個簡單的Web伺服器,結合pySerial,就可以實現一個透過瀏覽器,讀取相關感應器資訊,或者是設定Arduino相關腳位的應用程式。
當然,並不是每個語言,都能提供與serial頻道溝通的功能(像是Flash),這時可以透過現成的代理伺服器程式,例如在Arduino官方網站上的〈Serial-to-Network Proxies〉,就提供各種代理程式,有些本身很簡單並提供原始碼,像是〈JavaProxy〉,如果開發者熟悉Java,可以基於它來做與Arduino的進一步整合;實際上,若從不懂node.js的前端工程師角度來看,方才介紹的node-webduino,就是一種代理伺服器程式。
硬體上的網路支援 顯然地,無論透過以上何種方式,都得有個電腦執行Web伺服器,而Arduino板子必須與電腦銜接,如果想要獨立地運行Arduino,那麼Arduino板子就必須有硬體上的網路功能支援,這可以透過外接網路模組,或者使用內建網路連線能力的Arduino板子來達成。
舉例來說,在Arduino官方網站〈Web Server〉文件中,介紹了如何在Arduino Uno加上Arduino Ethernet Shield這塊板子之後,以Ethernet程式庫建立網路伺服器,Arduino Ethernet Shield必須透過有線網路連結,如果要透過無線網路,可以在Arduino Uno加上Arduino WiFi Shield,在Arduino官方網站〈WiFi Web Server〉文件中,就有如何透過Wifi程式庫建立網路伺服器的相關介紹;另一個也常見的ESP8266 WiFi模組,也有對應方式建立伺服器。
如果想在Wiznet-based Ethernet shields(像是Arduino Ethernet Shield)上頭,建立功能更豐富的Web伺服器,可以使用GitHub上sirleech/Webduino,這是個名稱同為WebDuino的專案,它進一步提供了JSON/RESTful介面,以及HTTP Basic Authentication等功能。
如果想要同時具備有線與無線功能,可以使用Arduino Yún這塊板子,除了提供有線與無線網路之外,這塊版子本身具有兩個微控制器,其中一個運行Linux發行套件Linino,這表示開發者可以在上頭運行Linux的各種功能,像是用Python寫好程式,在Linino上安裝,然後使用Arduino官方語言來呼叫。
使用Arduino Yún的話,可以透過YunServer程式庫建立Web伺服器,開發者基於這個伺服器設計REST API,比方說,可以設計為透過瀏覽器直接呼叫arduino.local/arduino/digital/13/1時,在Arduino執行digitalWrite(13, HIGH),或是呼叫arduino.local/arduino/robot/turnright時,讓Arduino機器人右轉。
閱讀全文
沒有留言:
張貼留言