首頁 web前端 js教程 node.js中的覆盆子pi gpio引腳入門

node.js中的覆盆子pi gpio引腳入門

Feb 17, 2025 pm 12:58 PM

Getting Started with the Raspberry Pi GPIO Pins in Node.js

Getting Started with the Raspberry Pi GPIO Pins in Node.js

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代表通用輸入/輸出。它們是樹莓派側面,黃色視頻輸出插座旁邊的引腳。以下是它們的樣子。

Getting Started with the Raspberry Pi GPIO Pins in Node.js

來源:樹莓派
可以將它們視為從樹莓派連接到外部世界的方式。這使您可以編寫不在計算機屏幕上運行的程序。每個引腳都像一個可以打開或關閉的開關。您可以接收來自物理世界的輸入,或發送輸出。基本電路板有26個引腳,其中9個引腳是電源或接地引腳。接地引腳位於電流必須流過的每個電路的末端。更新的樹莓派電路板還額外增加了一組14個引腳。

如果您想了解更多關於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來做到這一點,同樣,使用任何讓您感覺舒適的方法:

Getting Started with the Raspberry Pi GPIO Pins in Node.js

使用合理的編程方法,關鍵是縮短查找錯誤所需的反饋循環。單元測試是一種很好的方法,可以收緊循環並獲得即時反饋。

為簡單起見,我正在寫入單個引腳。 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python vs. JavaScript:比較用例和應用程序 Python vs. JavaScript:比較用例和應用程序 Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

See all articles