今回も Raspberry pi 3B+でなんかしようシリーズです。 今まで shellNode.js で L チカをする中で出力を操作してきましたが、 今回は入力情報を取得してみます。
目次
一回だけ入力をとってみよう 今回は gpio21 番ピンの入力を取得してみます。 回路は以下のようになります。
(相変わらず画像だとわかりにくいなぁ。) 結線だけ示すと以下のようになります。
[1番ピン(3.3V)]->[トグルスイッチ]-->[抵抗(1kΩ)]->[39番ピン(GND)]
|->[40番ピン(GPIO21番)]
gpioread.js として以下を保存します。
gpioread.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let fs = require ("fs" );let path = require ("path" );let pinnum = 21 ;let pathstr = "/sys/class/gpio/" ;let gpio21 = path.join (pathstr, "gpio" + pinnum);fs.writeFileSync (path.join (pathstr, "export" ), pinnum); fs.writeFileSync (path.join (gpio21, "direction" ), "in" ); let state = fs.readFileSync (path.join (gpio21, "value" ), "utf8" );console .log (state);fs.writeFileSync (path.join (pathstr, "unexport" ), pinnum);
sudo node gpioread.js
で実行すると/sys/class/gpio/gpio21/value
を読み取りして、表示します。 表示の内容は、0 か 1 です。
今度は gpio21 を継続してチェックしてみます。
gpio の入力を監視してみよう 監視といっても、何度も対象の GPIO にアクセスして値の変化を認識するだけです。 gpioread-loop.js として以下を保存します。
gpioread-loop.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 let fs = require ("fs" );let path = require ("path" );let pinnum = 21 ;let pathstr = "/sys/class/gpio/" ;let gpio21 = path.join (pathstr, "gpio" + pinnum);let state = "" ;let count = 0 ;let init = false ;fs.writeFileSync (path.join (pathstr, "export" ), pinnum); fs.writeFileSync (path.join (gpio21, "direction" ), "in" ); while (true ) { let buf = fs.readFileSync (path.join (gpio21, "value" ), "utf8" ); if (!init) { state = buf; init = true ; continue ; } if (state != buf) { state = buf; if (state == 1 ) { console .log (`${gpio21} がONになりました` ); } else { console .log (`${gpio21} がOFFになりました` ); } count++; } if (count > 3 ) { break ; } } fs.writeFileSync (path.join (pathstr, "unexport" ), pinnum);
sudo node gpioread-loop.js
で実行してスイッチを切り替えると以下のように表示されます。
1 2 3 4 /sys/class/gpio/gpio21がONになりました /sys/class/gpio/gpio21がOFFになりました /sys/class/gpio/gpio21がONになりました /sys/class/gpio/gpio21がOFFになりました
gpio の状況を監視できるようになりました。 しかし、せっかく Node.js を使用しているので、非同期関数で実装してみたいところです。
何回も入力をとってみよう(非同期関数) 今度は非同期関数を使用して gpio の情報を取ってみたいと思います。 gpioread-async.js として以下を保存します。
gpioread-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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 let fs = require ("fs" );let path = require ("path" );let pinnum = 21 ;let pathstr = "/sys/class/gpio/" ;let gpio21 = path.join (pathstr, "gpio" + pinnum);let state = "" ;let count = 0 ;let init = false ;fs.writeFileSync (path.join (pathstr, "export" ), pinnum); fs.writeFileSync (path.join (gpio21, "direction" ), "in" ); let gpioread = async ( ) => { return new Promise ((resolve, reject ) => { fs.readFile (path.join (gpio21, "value" ), "utf8" , function (err, text ) { if (err) { reject ("0" ); } else { resolve (text); } }); }); }; (async () => { while (true ) { let buf = await gpioread (); if (!init) { state = buf; init = true ; continue ; } if (state != buf) { state = buf; if (state == 1 ) { console .log (`${gpio21} がONになりました` ); } else { console .log (`${gpio21} がOFFになりました` ); } count++; } if (count > 5 ) { break ; } } fs.writeFileSync (path.join (pathstr, "unexport" ), pinnum); })();
sudo node gpioread-async.js
で実行します。
今までは、同期実行されるfs.readFileSync
を使用してきましたが、 今回は非同期な関数のfs.readFile
を使用してみました。 非同期関数を使用しても GPIO の取得ができました。
これまでの記事で入出力の操作に関してつかめました。 Node.js をコアにしたアプリにしてみたいところです。
ではでは。