Node.js でLチカします。

Raspberry pi 3B+でなんかしようシリーズです。
先日は shell コマンドで L チカをしたんですが、
今回は node.js で L チカします。

目次

node.js で L チカ

とりあえずコードから、
lchika.js として以下を保存します。

lchika.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
let fs = require("fs");
let path = require("path");

//使用するgpioピンナンバー
let pinnum = 21;
//使用する仮想ファイルのパスを定義
let pathstr = "/sys/class/gpio/";
let gpio21 = path.join(pathstr, "gpio" + pinnum);
//LED点滅のステータス
let state = 1;

//gpio使用の準備
fs.writeFileSync(path.join(pathstr, "export"), pinnum);
fs.writeFileSync(path.join(gpio21, "direction"), "out");
fs.writeFileSync(path.join(gpio21, "value"), state);

//明滅関数を定義
let chika = setInterval(() => {
state = state == 0 ? 1 : 0;
fs.writeFileSync(path.join(gpio21, "value"), state);
}, 200);

//明滅関数の終了を定義
setTimeout(() => {
clearInterval(chika);
}, 10000);

//gpioの使用終了処理を定義
setTimeout(() => {
fs.writeFileSync(path.join(pathstr, "unexport"), pinnum);
}, 11000);

実行時はsudo node lchika.jsで実行します。
流れは

  1. GPIO の使用の宣言
  2. 使って
  3. GPIO の解放

のままで shell で L チカさせる時とは変わりません。
ただし、非同期関数を使用するので

  • 200 ミリ秒間隔で実行される点滅用非同期関数
  • 10 秒後に点滅用非同期関数をリセットする非同期関数
  • 11 秒後に GPIO を解放する非同期関数

の三つを用意しました。

ややわかりにくい気もします。
async await を使ったものも作ってみました。

node.js で L チカ(async await)

lchikla-async.js として以下を保存します。

lchikla-async.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
let fs = require("fs");
let path = require("path");

//使用するgpioピンナンバー
let pinnum = 21;
//使用する仮想ファイルのパスを定義
let pathstr = "/sys/class/gpio/";
let gpio21 = path.join(pathstr, "gpio" + pinnum);
//LED点滅のステータス
let state = 1;

//gpio使用の準備
fs.writeFileSync(path.join(pathstr, "export"), pinnum);
fs.writeFileSync(path.join(gpio21, "direction"), "out");
fs.writeFileSync(path.join(gpio21, "value"), state);

//明滅関数を定義
function chika() {
state = state == 0 ? 1 : 0;
fs.writeFileSync(path.join(gpio21, "value"), state);
}

//待ち時間用スリープ関数定義
let sleep = async (time) => {
return new Promise((resolve) =>
setTimeout(() => {
resolve();
}, time)
);
};

//gpioの使用終了処理を定義
let releasegpio = () => {
fs.writeFileSync(path.join(pathstr, "unexport"), pinnum);
};

//点滅実行
(async function () {
for (let i = 0; i < 50; i++) {
chika();
await sleep(200);
}
releasegpio();
})();

実行は実行時はsudo node lchikla-async.jsで実行します。

どうでしょうか?
点滅実行部分が async await を使用することでわかりやすくなっていると思います。

次回は
今度は GPIO の読み取りをしてみたいと思います。