利用 node.js 進入硬體的世界 — Johnny-Five

作者:Ryan Hu

最近在個人的心理狀態及學校課業的拿捏上,一直沒有給自己一個好的交代,導致一個較完整的專案距離現在似乎已過了一段時間;不過幸好,這些困擾許久的煩悶,最近因為自己的調適,加上已下定決心嘗試,因此有了一個較明確的方向。

在上篇【Amiccom A8106 RF 無線調光】 RF 通訊實作(下)的文末有提及一個全新專案(剛開始不久),之前也有分享過另一個很想做的專案,這些我都有記在心中,雖然不知道多久才能生出來,不過我會盡力找出時間來做,畢竟興趣才是我的動力,不為什麼只是單純開心。

雖然專案還沒有個底,原本以為不知道可以幫自己記錄點什麼,不過認真想想能寫的其實還是不少。最近幾次和 Bird 聯絡,有提到我打算用 STM32F4 來開發我的專案,加上聊到 RTOS,想要在 RPi(Raspberry Pi)玩玩 Embedded Linux(我也想搞在 STM32F4 上看看),Bird 就說要幫我淘個板子讓我玩玩,不過板子還沒來,既然還沒來也沒東西可以分享,不如就來說說近期的發現吧 — 利用 node.js 進入硬體的世界。

JavaScript 統一世界

事實上,這也不算近期的發現,隱隱約約我早就知道 Pythonjs(JavaScript)能用來寫 Arduino,不過從來沒試過,也就不知道這個東西的能耐到底在哪?

因為過去有接觸過 node.js,加上這學期在學校修了「網路服務程式設計」以及個人在外面接案,寫 js 的時間其實已經超過了 C/C++,因此突然有個想用 node 去弄 Arduino 的想法,而這一玩不得了,有種發現新大陸的感覺,也激發了我新的想法。

我算是 3/4 個 js 的愛好者,跨足 Web Programming 與後起的 Web App,還有較少人知道的 Firmware 領域;js 基本上可以說是無所不能(不論其他例如效能、穩定性的比較),網路上討論 JavaScript x IOT 的文章也不在少數,開源的 library 數目更是多到讓我有點驚訝!

Johnny-Five

早在 2010 年,網路上就有人提出 NodeBots 的概念,從 node-serial 開始往下長,長成了現在巨大的模樣,而 Johnny-Five 只是其中一個成員;目前 Johnny–Five 不論是硬體相容性、API 完整度、技術討論社群等,都是眾多 framework 中表現最亮眼的,若有興趣的同好朋友可以到其官網看看。

(圖片來源:Johnny–Five 官網

講到這裡,若是先前只有在 Arduino IDE 上寫過 C/C++ code 的朋友想必會一頭霧水,心中疑問:「蛤!那要怎麼讓電腦認得板子?」事實上這個懷疑是對的,因為板子並不是 USB 插上電腦就會動;要使用 Johnny-Five 之前,必須先做些前置動作。

以 Arduino UNO 為例(實際上 Arduino 系列支援的開發板都可以這樣操作),必須先打開 Arduino IDE,找到範例裡的 StandardFirmataPlus ,並燒錄(upload)進去,這樣 Johnny-Five 才可以被使用。

之所以需要此步驟的原因,是因為要讓電腦上(主機 host computer)的軟體能夠「認得」並「操控」開發板(MCU),這之間是透過一個叫做 Firmata 的 Communication Protocol 做溝通,也就是 StandardFirmataPlus 這份 code 做的事情。

主機上軟體的訊息(程式碼),包括使用哪個 USB port、baud rate 等就可以由 node-serial 傳給 Arduino UNO;如果說軟體的第一步是 print「Hello World!」,那 MCU(SoC)的第一步就是讓 LED 燈點亮!

將 Johnny-Five github 上的範例 clone 至電腦上執行的結果(圖片來源:Ryan 提供)

程式碼的部分應該不是什麼大問題,有趣的是下方 terminal 顯示的訊息,執行 node strobe.js 後有個 REPLRead-Eval-Print Loop),顧名思義是個「讀取求值輸出」的循環,是不是有種似曾相識的感覺?我個人覺得很像 Arduino firmware code 燒錄後,利用 serial console AT_command 的感覺,只是 node 弄得比較直觀好懂一點(註 1)。

看完軟體的部分,我們看看 UNO 板。可以看到 LED 13 的確每 1000 milliseconds 閃一次外,也可以看到 LED 13 旁的 RX LED 以一個固定的頻率在閃爍,表示電腦一直有在送訊息給 Arduino UNO,如下圖:

(圖片來源:Ryan 提供)

講到這裡,我自己其實也一直有個疑惑:「既然 REPL 得透過 node-serial 才能和板子溝通,那一旦 USB 拔了,不就什麼都沒了嗎?」確實,NodeBot 不像 Arduino,一旦燒錄進 flash,只要通電,還是執行當初被燒進去的那份程式碼,因此這也是我認為 NodeBot 一個很大的缺點,因為即便是同份程式碼,每次上電還是必須重新 setup 一次,而且還得隨時和電腦溝通,離不開電腦。

若說要做 RPi 相關的應用倒是無妨(畢竟 node.js 也可在 Linux 上運行),但像前一個專案的應用(A8106 無線調光)就不可能用 NodeBot 執行了。

小結

以上是我個人對 NodeBot 與 Johnny—Five 的理解,在 STM32F4 和 RPi 到手前,我想我會用 Johnny-Five 搭配 express(node.js web framework)做出點小東西來過過乾癮,屆時會再寫篇文章做記錄。

註 1:有興趣但不想自己 setup 的朋友,又或是沒有想法但想先玩玩看別人寫好的範例程式碼,可以參考 node-ardx(比 Johnny-Five 本身 github page 所提供的 git repo 還豐富)所提供的 package,除了在 REPL 中有自定義的變數,讓使用者能動態地和所定義的變數互動(例如LED,執行 led.on() 等等),裡面也有其他詳細的應用案例介紹,只要 git clone 下來就可以直接執行了。

(本文同步發表於自造者萊恩;責任編輯:賴佩萱)

Ryan Hu

Ryan Hu

對於 IOT 軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS 自動語音導覽系統、NTP 網路自動校時時鐘,喜歡流浪。
Ryan Hu

Author: Ryan Hu

對於 IOT 軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS 自動語音導覽系統、NTP 網路自動校時時鐘,喜歡流浪。

Share This Post On
468 ad

Submit a Comment

你的電子郵件位址並不會被公開。 必要欄位標記為 *