[Raspberry Pi] 樹梅派安裝Node.js用express.js Web API控制GPIO

  • 1793
  • 0
  • 2018-12-06

Node.js請找Debian體系的linux版本,按下列網址步驟安裝

1. 請至https://github.com/nodesource/distributions

參考「# Using Debian, as root」

curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs

按步驟安裝完後下「node -v」 version 指令看有無成功

>>node -v 

2. 控制GPIO的方式有很多種,其中一種是藉由讀寫raspbian裡面的GPIO檔案(需用root權限)

檔案的位置在「/sys/class/gpio/」,將要控制的pin(BCM)寫入「./export」,系統就會在「/sys/class/gpio/」底下建立GPIO結構的child folder

只要再去folder底下改寫檔案「./gpio{pin}/direction」的內容為 in/out、「./gpio{pin}/value」的內容為 0/1,這樣就可以控制GPIO了~

用完記得把pin寫入「./unexport」就會殺掉folder結束。

(搭配使用WiringPi 查詢所有GPIO狀態還不錯用)

至於要在node.js寫JavaScript讀寫檔案的話,就去npm找套件吧!就不自己造輪了

套件有很多,我選「npm install onoff」,因為指令短,也順便「npm install express」吧!

下面隨便寫(Copy)個簡單的express api,這樣就可以透過api控制gpio囉!

//file name: service.js

var express = require('express');
var app = express();
var gpioRouter = express.Router();
// you need to set mergeParams: true on the router,
// if you want to access params from the parent router
var unexportRouter = express.Router({ mergeParams: true });

// initialize gpio pin
const Gpio = require('onoff').Gpio;
const motor = new Gpio(17, 'out');
motor.write(0);

// you can nest routers by attaching them as middleware:
gpioRouter.use('/unexport', unexportRouter);

gpioRouter.route('/:onoff')
    .get(function (req, res) {
        motor.write(Number(req.params.onoff));
        res.send(req.params.onoff);
    });

unexportRouter.route('/')
    .get(function (req, res) {
        motor.unexport();
        res.send('unexported!');
    });

app.use('/gpio', gpioRouter);


app.listen(3000, function () {
    console.log('Gpio api listening on port 3000!');
});

最後下指令執行JavaScript就ok了

>> sudo node service.js

記得要加sudo用管理員權限,不然無法修改gpio path的內容

 

 

參考:

https://elinux.org/RPi_GPIO_Code_Samples#Shell