【Nodebot #1】 Johnny Five node小時鐘教學

作者: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

接下來進入主題,就先從硬體開始吧。

硬體周邊需求

  1. Arduino UNO x 1
  2. 麵包板 x 1 (非必須,也可以很霸氣的直接焊起來)
  3. SG90 伺服馬達 x 7 (因為我想做成 7 段顯示器的樣子 )
  4. 跳線 -> ∞
  5. 各種紙板,泡綿膠等美工用具

如標題所示,這只是本專案的 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 作為本篇結尾吧!

(責任編輯:楊子嫻)

 

Ryan Hu

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

Author: Ryan Hu

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

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *