SitePoint物聯網周特輯!本週我們將發表一系列關於互聯網與物理世界交彙的文章,請持續關注IoT標籤以獲取最新更新。
物聯網如今風靡一時。在物理計算領域,我們有很多可以付諸實踐的想法,很容易讓人沉迷於編程我們所生活的世界!有了樹莓派和麵包板後,下一步是什麼?
本文將探討如何使用Node.js訪問樹莓派的GPIO引腳。通過GPIO引腳,您可以直接編程硬件。 JavaScript API使此過程無縫銜接。這些API是對常用技術的抽象,並且可以從任何地方訪問。 Node.js解釋器在一個單一進程中運行,這為編寫可測試的代碼開闢了新的途徑。對我來說最令人興奮的部分是,您可以像編寫任何其他JavaScript程序一樣編寫單元測試、命中斷點並檢查代碼,所有這些都可以在您的計算機上完成。
讓我們開始吧。
關鍵要點
- 可以使用Node.js訪問樹莓派的通用輸入/輸出(GPIO)引腳,從而可以直接對硬件進行編程。這些引腳就像開關一樣,接收輸入或向物理世界發送輸出,JavaScript API使這個過程變得無縫。
- GPIO API是讀取或寫入設備文件的包裝器,文件系統API可能是您已經熟悉的概念。在類Unix系統中,GPIO的行為與任何其他普通文件一樣,這為如何處理解決方案提供了自由。
- 測試驅動方法非常適合物聯網。在物理計算中,您不希望將硬件運送到世界各地去調試代碼。使用測試驅動方法,可以立即獲得反饋並確保解決方案有效。
- 使用GPIO API,可以將其簡化為圍繞fs模塊的包裝器,從而創建乾淨且可測試的代碼。本文通過使用所示API的有效閃爍器演示來演示這一點。
什麼是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中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver Mac版
視覺化網頁開發工具