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

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

Lisa Kudrow
發布: 2025-02-17 12:58:10
原創
320 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板