作者:Ryan Hu
本篇文章將會教大家,利用 Johnny-Five 製作小時鐘,這是教學系列文的第一集,趕快將所需的硬體軟體備齊,製作一個專屬時鐘吧!
繼上篇利用 node.js 進入硬體的世界 — Johnny-Five 所述,雖然 STM32F4 已經到我手邊(好想快點開始玩,把 Linux 弄上去架個 server 之類的來練練功,不然該忘的也差不多都忘了…),不過答應自己要做的東西就得真的做出來才行。這篇文章就是要分享利用上次提到 Johnny-Five node package 來做一個小時鐘。
這其實是我在國外網站看到的一個小專案,在沒有看到相關 C/C++ repo 或是 source code download link 的情況下,決定自己手搞一個。另外,由於之前太懶,做的東西都沒放上 github,現在也懶得整理過去的專案,因為真的太多了,不過從現在開始的專案都會丟上去(誰叫用學校帳號辦這麼爽),所以有興趣的同好朋友們,可以自己抓下來玩玩。
在此附上 github repo 連結:https://github.com/4D616B6572/Johnny-Five-clock
接下來進入主題,就先從硬體開始吧。
硬體周邊需求
- Arduino UNO x 1
- 麵包板 x 1 (非必須,也可以很霸氣的直接焊起來)
- SG90 伺服馬達 x 7 (因為我想做成 7 段顯示器的樣子 )
- 跳線 -> ∞
- 各種紙板,泡綿膠等美工用具
如標題所示,這只是本專案的 part 1,上方所列的硬體需求只是單一數字的實作,既然要變成時鐘,那少說也得準備四個數字,不過硬體方面就得再思考要怎麼準備,畢竟 UNO 腳位有限,我也不可能拿四塊板子,除非我準備用來和 UNO 溝通的主機( eg. STM32F4 )有這麼多 USB 埠,屆時想到會在下篇文章分享,若有想法的同好朋友也歡迎提出討論。
軟體執行操作
事實上,整份 code 不到 100 行,而且也不難,只是要一直嘗試,一些原先在 Arduino 上很直覺的事情,但在 nodebot 上卻不是如此,畢竟 nodebot 在操作上本身就跟一般單晶片專案的思維不太一樣,講得有點籠統,不過沒關係下方會一併說明。

NodeBots 字面上的意思,是可以通過 Node 控制的機器人;也是一個具有多面向的技術概念,更是一個共享代碼、創意的社群。(圖片來源:NodeBots官網)
在整個過程中,不知道是我 Google 能力有待加強還是真的確實如此,我在網路上並沒有找到太多有關 Johnny-Five 實作專案的文章,多數都是如何使用、起頭、點燈之類的初階分享。
因此我會針對和 Arduino 真的很不一樣的點來做說明,其他有寫過 node.js 的同好一定看得懂程式碼本身在做的事情。
Johnny-Five 最重要的兩件事,第一:new,一個 five.Board() 的物件稱之為 board,再來 board.on (“ready”, [callback]);callback function 在 「ready」後被執行;第二,REPL (read-eval-print-loop),是重點中的重點,是 Johnny-Five 能讓 nodebot 活得像一般單晶片一樣的主要媒介。
相信有看過介紹 Johnny-Five 套件相關文章的朋友,一定都對第一個重點不陌生,不然也不可能點起 UNO 版上的 LED。至於第二個,應該相對不熟悉,而這也我主要想分享的部分。

Johnny-Five 是一個 JavaScript 的機器人與 IoT 平台(圖片來源:Johnny-Five 官網)
board.on (”ready”, [callback]); 如同 Arduino 裡的 void setup(),兩者都是做些初始化以及「一次性的操作 ( eg. call function )」,那 REPL 是不是就相對應應該會是 Arduino 裡的 void loop()?目前我覺得不是,之所以說 「目前」 是因為以我現在對 Johnny-Five 的理解,我對於在此套件中要做到像一般單晶片 eg. Arduino void loop() 不斷執行定義在其內的所有 function 的可行性(包括 ISR 的註冊)打了一個大問號。
舉個簡單的例子來說明,在一般的 Arduino 環境內如果想要讓 LED 不斷閃爍,從最基礎的 Blink 範例程式可以知道,只要 HIGH 和 LOW 加個 delay 交替放在 void loop() 中執行即可,但在 nodebot 我目前並不曉得要怎麼做到這件事,這次的專案是因為剛好我要抓的是時間,所以我可以註冊一個 setInterval,讓它每秒回傳一個數字回來,但如果不是固定時距,而是一個特別的 pattern 那豈不是糟了?
另外上方提到 nodebot 可以註冊類似 ISR 的功能,這件事對於有寫 js 的同好朋友一定也不意外,畢竟 js 就是 event driven 的語言,js 的 callback function 就是在處理 “某件事觸發後”,去執行一個相對應的行為,而在 firmware 就像是 button.on(”down”, [callback]), 指button 被按下時執行 callback,非常直覺且合理。
想要解決 nodebot 不能真正做到 loop 的行為,講到這不知道有沒有人跟我一樣有一個暴力的想法:「那就寫一個 function 裡面有個 while(1) 不就得了?這樣我只要在進入REPL 後,執行某個 function 一次,他就如同 Arduino 的 loop() 一樣,能夠跑到天荒地老?」
照理來說好像可以,但直覺告訴我應該不行,感覺REPL 會直接被綁架,不能動作,待我實驗,下回揭曉!
最後就用 nodebot 時鐘單一數字成果的 GIF 作為本篇結尾吧!
(責任編輯:楊子嫻)
- 【NB-IoT】菜鳥Maker輕鬆上手DSI2598開發板 - 2019/12/13
- 【Maker電子學】Modbus over TCP 實作(上) - 2019/11/28
- 【Maker電子學】Modbus RTU的傳輸資料格式 - 2019/09/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!