SitePoint物聯網周特輯!本週我們將發表一系列關於互聯網與物理世界交彙的文章,請持續關注IoT標籤以獲取最新更新。
物聯網如今風靡一時。在物理計算領域,我們有很多可以付諸實踐的想法,很容易讓人沉迷於編程我們所生活的世界!有了樹莓派和麵包板後,下一步是什麼?
本文將探討如何使用Node.js訪問樹莓派的GPIO引腳。通過GPIO引腳,您可以直接編程硬件。 JavaScript API使此過程無縫銜接。這些API是對常用技術的抽象,並且可以從任何地方訪問。 Node.js解釋器在一個單一進程中運行,這為編寫可測試的代碼開闢了新的途徑。對我來說最令人興奮的部分是,您可以像編寫任何其他JavaScript程序一樣編寫單元測試、命中斷點並檢查代碼,所有這些都可以在您的計算機上完成。
讓我們開始吧。
關鍵要點
什麼是GPIO?
GPIO代表通用輸入/輸出。它們是樹莓派側面,黃色視頻輸出插座旁邊的引腳。以下是它們的樣子。
如果您想了解更多關於GPIO引腳的細節,這個在線圖表提供了您需要了解每個引腳用途的所有信息。有無數的輸入/輸出和接地引腳。這些引腳是物理計算的基礎。根據您的目標,您可以根據需要使用任意數量的引腳。
模擬fs!
我知道你在想什麼,fs到底是什麼,為什麼我需要關心它?在類Unix操作系統中,設備文件是一個看起來像文件的驅動程序。簡單來說,設備驅動程序就是一個文件!你猜怎麼著? GPIO API是讀取或寫入設備文件的包裝器。文件系統API可能是您已經熟悉的概念。如果您從未在Node.js中使用過文件,我建議您回顧一下Node.js中的fs模塊和文件系統。 fs是“文件系統”的縮寫,使您可以讀取或寫入普通文件。這裡沒有什麼花哨的東西,我們所做的只是例如writeFile(),讓GPIO處理其餘部分。訣竅是知道在哪個文件上寫入什麼內容。
有一個方便的npm包叫做mock-fs,它可以幫助我們進行單元測試。使用這個庫,可以模擬內存中任何文件系統上的任何文件。最重要的是我們只處理文件,這就是我們需要做的全部。在類Unix系統中,GPIO的行為與任何其他普通文件一樣。這使我們能夠自由地選擇如何處理此解決方案。
mock-fs庫的核心是mock({})函數。它接收一個參數,該參數是一個JavaScript對象。在這個參數中,您可以創建任何您想要的文件。這裡的美妙之處在於這一切都在內存中運行,因此您可以盡情進行單元測試。解釋器在一個單一進程中運行,這意味著可以在運行時覆蓋fs模塊。 JavaScript是一種動態語言,因此我們可以模擬當前進程中可用的任何模塊。
一旦您在GPIO上編寫了良好的單元測試,GPIO接口就會更有意義。我喜歡的是您可以獲得自動化的測試覆蓋率和一個乾淨的解決方案。單元測試提高了代碼的可讀性,因為它清楚地向您展示了API的用途。
所以讓我們動手吧。
單元測試所有內容
讓我們用“out”打開一個引腳並測試它:
it('opens a pin with out', function (done) { mock({ '/sys/class/gpio/gpio23/direction': '' }); gpio.open(16, 'out', function () { const direction = fs.readFileSync('/sys/class/gpio/gpio23/direction').toString(); should(direction).equal('out'); done(); }); });
此測試的實現應將物理引腳16映射到GPIO中的BCM引腳23。 BCM編號是內核在設備驅動程序中看到的Broadcom引腳編號。 GPIO設備驅動程序概述了設備文件的位置。如所示,要打開引腳,請將字符串“out”寫入/direction。這告訴GPIO我們希望寫入此引腳。完成後,檢查文件是否包含所需內容。 mock來自mock-fs庫,fs是Node.js中的標准文件系統。內核指示路徑在哪裡——3.18.x及更高版本位於/sys/class/gpio。
要寫入電路板上的引腳並測試它,可以執行以下操作:
it('writes to a pin with a high value', function (done) { mock({ '/sys/class/gpio/gpio23/value': '0' }); gpio.write(16, 5, function () { const value = fs.readFileSync('/sys/class/gpio/gpio23/value').toString(); should(value).equal('1'); done(); }); });
gpio.open()和gpio.write()之間存在相似之處。使用寫入操作,這會寫入/value文件。為了進行完整性檢查,我寫入了一個非常高的值5,但我們只期望測試結果為1。 GPIO只接收高或低值,就像二進制一樣。
我從pi-gpio獲取了實現細節。這個庫為您提供了每個引腳位置的良好概述。您也可以在內核上查找設備文件。無論哪種方式,我的目標都是讓您很好地掌握基礎知識,以便您可以獲得清晰的畫面。
讓我們瘋狂一點,如何在單元測試中命中斷點?我使用WebStorm來做到這一點,同樣,使用任何讓您感覺舒適的方法:
使用合理的編程方法,關鍵是縮短查找錯誤所需的反饋循環。單元測試是一種很好的方法,可以收緊循環並獲得即時反饋。
為簡單起見,我正在寫入單個引腳。 GPIO的其餘部分以相同的方式總結。打開一個引腳並告訴它你想用它做什麼。讀取或寫入引腳,無論你需要做什麼。低級API是設備文件,因此您可以選擇如何編程每個引腳。
閃爍演示
為了充實每個單元測試,讓我們來看一些常見的變量:
var sysFsPath = '/sys/class/gpio/gpio'; var pinMapping = { '16': 23 };
在上面,我已經定義了GPIO中的引腳映射和設備驅動程序的路徑。下面的代碼查看打開和寫入引腳的代碼:
function open(pinNumber, direction, callback) { const path = sysFsPath + pinMapping[pinNumber] + '/direction'; fs.writeFile(path, direction, (callback || noOp)); } function write(pinNumber, value, callback) { const path = sysFsPath + pinMapping[pinNumber] + '/value'; value = !!value ? '1' : '0'; fs.writeFile(path, value, 'utf8', callback); } function noOp() {}
如所示,所有操作都是將writeFile()寫入設備文件。如果沒有任何回調,noOp是一個虛擬回調。通過這個實現細節,我獲得了通過測試並確信這將有效。寫入操作中的值確保它將設置為高或低('0'或'1')。
最後,一個使用上面顯示的API的有效閃爍器演示:
gpio.open(16, 'out', function () { var on = 0; var blinker = setInterval(function () { gpio.write(16, on, function () { on = (on + 1) % 2; console.log('ON = ' + on); }); }, 1000); setTimeout(function () { clearInterval(blinker); }, 12000); });
setInterval()每秒鐘調用一次,在回調中,我告訴它使用模數切換引腳。閃爍器具有間隔,setTimeout()使用此來在12秒後清除它。 setTimeOut()中的回調完成了工作並結束程序。
要運行示例代碼,請鍵入:
sudo npm start
(您需要管理員權限才能訪問樹莓派上的GPIO)
我希望從這個演示中,GPIO看起來更直觀。它期望使用方向打開一個引腳。然後,您寫入引腳,讓GPIO處理其餘的細節。
結論
測試驅動方法非常適合物聯網。在物聯網中,您的想像力是極限。樹莓派可以部署在世界任何地方——在物理計算中,您不希望將硬件運送到世界各地去調試代碼。使用測試驅動方法,可以立即獲得反饋並確保解決方案有效。您可以提高生產力並收緊反饋循環。
我喜歡GPIO API的地方在於,可以將其簡化為圍繞fs模塊的包裝器。這使您可以完全自由地編寫乾淨且可測試的代碼。
其餘的示例演示已上傳到GitHub。
關於在樹莓派上使用Node.js和GPIO引腳的常見問題解答
什麼是Node.js,如何將其與樹莓派的GPIO引腳一起使用? Node.js是一個JavaScript運行時環境,允許您在樹莓派上運行JavaScript代碼。您可以使用它來控制和交互GPIO(通用輸入/輸出)引腳,這些引腳用於將外部硬件組件連接到樹莓派。
在樹莓派上使用Node.js和GPIO引腳是否需要任何特殊的硬件?您需要一個樹莓派電路板,以及可能的一些外部組件,例如LED、傳感器或繼電器,具體取決於您的項目。要開始,您還應該有一個麵包板和一些跳線,用於將這些組件連接到GPIO引腳。
如何在樹莓派上安裝Node.js?您可以使用apt包管理器或從Node.js網站下載並安裝它來在樹莓派上安裝Node.js。確保您為您的特定樹莓派型號使用ARM兼容版本的Node.js。
什麼是GPIO引腳,如何在樹莓派電路板上識別它們? GPIO引腳是樹莓派上可用於數字輸入或輸出的引腳。它們用數字標記,可以使用特定於您的樹莓派型號的GPIO引腳圖來識別。
如何在Node.js中訪問GPIO引腳?您可以使用rpi-gpio、onoff或pigpio等庫在Node.js中訪問GPIO引腳。這些庫提供用於在JavaScript代碼中控制和交互GPIO引腳的API。
在我的Node.js項目中,是否可以將GPIO引腳同時用於輸入和輸出?是的,您可以在Node.js項目中將GPIO引腳配置為輸入和輸出。您可以讀取連接到輸入引腳的傳感器的數 據,並控制連接到輸出引腳的LED、電機或其他設備。
是否可以使用Node.js中的GPIO引腳進行PWM(脈衝寬度調製),用於控制亮度或速度等任務?是的,您可以使用樹莓派上的某些GPIO引腳進行PWM,以控制亮度、電機速度等。 pigpio等庫提供對PWM的支持,並且與Node.js兼容。
以上是node.js中的覆盆子pi gpio引腳入門的詳細內容。更多資訊請關注PHP中文網其他相關文章!