ラズパイ4デジカメ計画②〜NodejsとGPIOでラズパイの起動・シャットダウンを操作する
※ 当ページには【広告/PR】を含む場合があります。
2024/02/10
2024/02/15
ラズパイをデジカメ化する上で気にしたい電源管理の注意点
1. ラズパイには休止機能がないので、
電源投入からアプリケーション起動までに時間がかかる
2. ラズパイ本体の電源を切っても、
通電していたら割と電力を消費してしまう
ラズパイへNode.js(v16)環境を準備する
ESModule
Commonjs
node16
ラズパイに特定のバージョンのNodejsを導入
https://deb.nodesource.com
$ curl -s https://deb.nodesource.com/setup_16.x | sudo bash
This script, located at https://deb.nodesource.com/setup_X, used to
install Node.js is deprecated now and will eventually be made inactive.
Please visit the NodeSource distributions Github and follow the
instructions to migrate your repo.
https://github.com/nodesource/distributions
The NodeSource Node.js Linux distributions GitHub repository contains
information about which versions of Node.js and which Linux distributions
are supported and how to install it.
https://github.com/nodesource/distributions
SCRIPT DEPRECATION WARNING
================================================================================
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
================================================================================
TO AVOID THIS WAIT MIGRATE THE SCRIPT
Continuing in 60 seconds (press Ctrl-C to abort) ...
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
.bashrc
#...
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ source ~/.bashrc
$ nvm --version
0.39.7
$ nvm list-remote | grep v16
v16.0.0
v16.1.0
v16.2.0
#...中略
v16.20.1 (LTS: Gallium)
v16.20.2 (Latest LTS: Gallium)
$ nvm install v16
$ node --version
v16.20.2
$ npm --version
8.19.4
yarn
$ npm install -g yarn
$ yarn --version
1.22.21
「sudo node ...」では"command not found"になってしまう問題
node
sudo node
sudo
$ sudo node --version
sudo: node: command not found
node
#👇現在のユーザーのパス変数
$ printenv PATH | sed -r 's/:/\n/g'
/home/user/.nvm/versions/node/v16.20.2/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/local/games
/usr/games
#👇ルートユーザーのパス変数
$ sudo printenv PATH | sed -r 's/:/\n/g'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/home/user/.nvm/versions/node/v16.20.2/bin
which
$ sudo $(which node) --version
v16.20.2
which
/usr/bin/
node
$ ln -s $(which node) /usr/bin/
ピンレイアウトの確認
1-26
pinout
$ pinout
#...
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
27-40
GPIO操作系ライブラリを使う上での注意点
「WiringPi」
GPIOピンからソフトウェアシャットダウン
shutdown
GPIO20(38番ピン)
pigpiodのインストール
$ sudo apt update
$ sudo apt install pigpio
$ pigpiod -v
79
$ wget https://github.com/joan2937/pigpio/archive/master.zip
$ unzip master.zip
$ cd pigpio-master
$ sed -i 's,ldconfig,,' Makefile
$ make
$ sudo make install
$ pigpiod -v
79
nodejsプロジェクトの新規作成
package.json
{
"name": "raspi-toy-camera",
"version": "1.0.0",
"description": "RPi camera app for armhf built in x64 OS",
"main": "main.js",
"private": true,
"dependencies": {
"pigpio": "^3.3.1"
}
}
$ yarn install
main.js
const { execSync } = require('node:child_process');
const Gpio = require('pigpio').Gpio;
//👇GPIO20(38番ピン)をプルアップ入力モードに設定
const button = new Gpio(20, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
process.on('SIGINT', () => {
console.log('Ctrl+Cでプロセス終了します...');
process.exit(0);
});
const sleep = (_ms) => {
return new Promise(resolve => {setTimeout(() => resolve(), _ms)});
}
(async () => {
//👇試しに0.5秒間隔でポーリング
while(true) {
console.log("Listening...");
if (button.digitalRead() === 0) {
console.log("シャットダウンボタンが押されました!");
//👇シャットダウンコマンドを呼び出す
execSync(`/sbin/shutdown -h now 'Turn off by GPIO'`);
}
await sleep(500);
}
})();
Ctrlキー+Cキー
プルアップモードでスイッチを配線
pigpio
- スイッチを押さない ... <PIN#>.digitalRead() --> 1
- スイッチを押す ... <PIN#>.digitalRead() --> 0
nodeでmain.jsプログラムを起動してみる
main.js
node
$ node main.js
2024-02-08 13:50:11 initCheckPermitted:
+---------------------------------------------------------+
|Sorry, you don't have permission to run this program. |
|Try running as root, e.g. precede the command with sudo. |
+---------------------------------------------------------+
/home/*********/*********/node_modules/pigpio/pigpio.js:54
pigpio.gpioInitialise();
^
Error: pigpio error -1 in gpioInitialise
at initializePigpio (/home/*********/*********/node_modules/pigpio/pigpio.js:54:12)
at new Gpio (/home/*********/*********/node_modules/pigpio/pigpio.js:158:5)
at Object.<anonymous> (/home/*********/*********/main.js:10:16)
at Module._compile (node:internal/modules/cjs/loader:1198:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1252:10)
at Module.load (node:internal/modules/cjs/loader:1076:32)
at Function.Module._load (node:internal/modules/cjs/loader:911:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47
実行権限
sudo
node
$ sudo $(which node) main.js
2024-02-08 13:52:43 initCheckPermitted:
+---------------------------------------------------------+
|Sorry, you don't have permission to run this program. |
|Try running as root, e.g. precede the command with sudo. |
+---------------------------------------------------------+
/home/*********/*********/node_modules/pigpio/pigpio.js:54
pigpio.gpioInitialise();
^
Error: pigpio error -1 in gpioInitialise
#...
$ ls -la $(which node)
#...
-rwsr-xr-x 1 user user 74174792 Aug 9 2023 node
"s"
user
755
$ sudo chmod 755 $(which node)
$ ls -la $(which node)
...
-rwxr-xr-- 1 user user 74174792 Aug 9 2023 node
$ sudo $(which node) main.js
Listening...
Listening...
Listening...
...
#👇スイッチを押すとラズパイがシャットダウン
シャットダウンボタンが押されました!
オーバーレイによるシャットダウンピンの書き換え
shutdown
DT(デバイスツリー)オーバーレイ
/boot/config.txt
sudo nano /boot/config.txt
#...中略
#40番ピン(GPIO21)に「シャットダウンボタン」を設定
dtoverlay=gpio-shutdown,gpio_pin=21
起動用物理ピン(GPIO3)を使う
GPIO3(5番ピン)
「起動」
まとめ
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー