ラズパイzero で音声つき動画の自動撮影

ラズパイzero で音声つき動画の自動撮影

ダイソーの300円で販売されているAB Shutter3 で
撮影とシャットダウンボタンを作成する予定だったが
ボタンが1つしか認識しないため
撮影については cron で行い
シャットダウンについては
AB Shutter3 で担当することに

motion の自動起動を停止

これは
insservの使い方

を参考に

insserv -r motion
で停止

sudo service motion stop
も実行

これをしないとどんどん静止画が増えてしまう

次に

nano bluebutton.sh

でファイルを作成

#!/bin/sh
command="sudo bluebutton -d="Shutter3" -c ~/.config/bluebutton"
eval $command

として保存

sudo crontab -e

でファイルを開き

以前

#*/10 * * * * /home/pi/rscamera.sh

としていたのでこれをコメントアウト

@reboot /home/pi/bluebutton.sh
を追記

これで再起動したときに
AB Shutter3 が有効化される

これを行ったため
マイクの情報が変わっていた

arecord -l

**** ハードウェアデバイス CAPTURE のリスト ****
カード 2: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 0/1
サブデバイス #0: subdevice #0

amixer -c2
Simple mixer control ‘Mic’,0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 – 16
Mono: Capture 16 [100%] [23.81dB] [on]
Simple mixer control ‘Auto Gain Control’,0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [on]

このため音声つき動画撮影コマンドも変更され
timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav -r 30 -i test.h264 -vcodec copy /mnt/nas/test.mk
となる

このままだと同じファイルになってしまうので
dateコマンドを使って作成するファイルに日時と時間をつける

ファイル名に日時情報を追加

にdate コマンドの解説があるのでこちらを参考に

timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

とすれば
ファイル名が
20200913_21-01-32.mkv
というように
秒数まで入るので上書きされることがなくなる

%Yで西暦
%m で月
%d で日
%H が時間
%M が分
%S で秒
となっている

なお

`date +%Y%m%d_%H-%M-%S`

はバッククォートで囲っている
shift + @ でバッククォートになる

‘ と似ているので注意

あとはラズパイzero の時間がずれているので
Raspberry Pi のシステム時刻を変更する
によれば初期状態だと世界標準になっているとのこと

sudo timedatectl set-timezone Asia/Tokyo

を実行すれば再起動するまで一時的に合わせることができるので

起動時にこれを実行するようにする

cd /etc/init.d/
sudo nano autorun_date

でスクリプトファイルを作成

]
#!/bin/sh
### BEGIN INIT INFO
# Provides: mathkernel
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: mathkernel
### END INIT INFO

#システム時刻を日本に合わせる
sudo timedatectl set-timezone Asia/Tokyo

として保存

sudo chmod 755 autorun_date

で実行権限付与

本来ならこれをスクリプトとして登録するところだったけど
現在では
【CentOS7】timedatectlコマンドでタイムゾーンをJSTへ変更する

にあるように
一度コマンドを実行すれば設定はそのままになるようになっていた

なお

sudo timedatectl 

を実行すると
現在設定されているタイムゾーンを確認できる

今回は

      Local time: 金 2020-09-18 05:51:10 JST
  Universal time: 木 2020-09-17 20:51:10 UTC
        RTC time: n/a
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

となっていた

次に音声つき動画撮影のスクリプトを用意
とはいってもこれをスクリプトファイルにするだけ

nano homevideo.sh

でファイルを作成

#!/bin/bash
timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

として保存

chmod +x homevideo.sh

で実行権限付与

./homevideo.sh 

としたが
timeout コマンドが動作しない

タイムアウト付きのシェル関数を実行する


bashのtimeoutコマンドをshellスクリプトから実行すると終了ステータスが正しく取得できない

をみたところ

スクリプトファイルを timeout コマンドで実行すればよさそう

なおワンライナーでの書き方については
(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い

を参考に

そのままワンライナーを書き込んでも失敗するため

#!/bin/bash
raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h26$
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_$

として保存

変更点は ; による1行の部分を
; を削除して2行にしている

timeout 15 ./homevideo.sh

としたが
timeout コマンドにより変換する前に停止してしまう

とりあえずcrontab に直接コマンドを書き込むことにしたが
これもダメ

タイムアウト付きのシェル関数を実行する

を元に考えてみると

timeoutはコマンドであるため
bashシェルのサブプロセスで実行される

timeoutコマンドは
タイムアウトのサブプロセス(シェルの孫プロセス)として実行さる

つまり timeout コマンドをシェルスクリプトでそのまま使うことは無理そう

timeoutをシェルスクリプトで実現する

を参考に
同じ機能をもったシェル関数を作成し
それを実行

ラズパイzero にexpect コマンドがなかったので

sudo apt-get install expect

でインストール

あとは
homevideo.sh の内容を

#!/bin/bash
limittime() {

    time=$1

    # start the command in a subshell to avoid problem with pipes
    # (spawn accepts one command)
    command="/bin/sh -c \"${@:2}\""

    expect -c "set timeout $time; spawn -noecho $command; expect timeout { exit 124 } eof; catch wait result; exit [lindex \$result 3]"
}

limittime 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | limittime 15 arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

として
raspivid と arecord を
15秒後に終わるように指定

コマンドのときには raspivid のみ timeoutコマンドを実行すれば
成功したけど
シェルスクリプトで実行するときには
arecord コマンドも設定しないとオーバーランになってしまい
ctrl+c で止めるまで動画変換されなかった

シェルスクリプトで音声つき動画がとれるようになったので
これを cron で実行

crontab -e

を実行

最終行に

*/2 * * * * /home/pi/homevideo.sh

を追記して保存

これで2分ごとに15秒の音声つき動画が撮影されるようになる

間隔をおいてのcron 実行については

cron を10分おき 2時間おきに実行する方法

を参考に

ラズパイzero を bluetoothボタンで操作

ラズパイzero を bluetoothボタンで操作

ラズパイzero にはボタンなどがないので
コマンドから実行になるけど
毎回シャットダウンや撮影のたびにコマンド実行は
ターミナル環境がないとできないので

簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

Bluetoothシャットダウンボタンを作る #300円でIoTボタン

を参考に

bluetoothボタンで操作できるよう設定

あといらないものを削除

Raspberry Pi 不要パッケージの削除

を参考に

Wolframとmathematica
libreoffice
Scratch

sudo apt-get remove --purge libreoffice*
sudo apt-get purge scratch
sudo apt-get purge wolfram-engine
sudo apt-get purge sonic-pi
sudo apt-get clean
sudo apt-get autoremove

で容量を確保

しかし
Waiting to connect to bluetoothd…
となりそのまま止まってしまう

raspberry pi3 をbluetooth接続するときのエラー

を元に

sudo apt-get update 
sudo apt-get upgrade -y 
sudo apt-get dist-upgrade -y 
sudo apt-get install pi-bluetooth 
sudo apt-get install raspberrypi-sys-mods

を実行したが変わらず

ラズベリーパイでbluetooth機能が使えません

を参考に

sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 

次にbluetooth の接続

bluetoothctl
power on
scan on

で周辺デバイスを検索

[NEW] Device 2A:07:98:10:34:99 CW Shutter

となるので

pair 2A:07:98:10:34:99

でペアリング

しかし

trust 2A:07:98:10:34:99

のあと

Failed to pair: org.freedesktop.DBus.Error.NoReply
Waiting to connect to bluetoothd...

となってしまう

sudo apt-get install pi-bluetooth pulseaudio-module-bluetooth pavucontrol bluez

を実行し再起動

しかし途中で途切れるため

Raspberry Pi3 の Bluetooth を Ubuntu Mate 16.04 LTS で使えるようにする

を参考に

sudo apt-get install rpi-update -y
sudo rpi-update
sudo reboot

でファームウェアのアップデート

これで再度

bluetoothctl

としたら接続できた

次に
簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

を参考に

sudo apt install ruby
sudo gem install bluebutton

で bluebutton のインストール

イベント検知設定ファイルを作成

sudo nano ~/.config/bluebutton

でファイル作成し

keyup=echo UP
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

を記述して保存

しかし、このプログラムは
CW shutter では機能しない

Raspberry Pi + Bluetooth リモコンシャッター + Google Home で「こっちに来て!」メッセージ

を参考に

sudo apt-get install evtest

でインストール
evtest を使うことでデバイスが発行するイベントを拾う

しかしなぜか evtest での検出はできなかったため
ダイソーの
AB Shutter3 ボタン
を購入することに

sudo bluetoothctl 
power on
scan on

として

AB Shutter3 ボタンの電源をONにすると

[NEW] Device FF:FF:00:26:F2:FF AB Shutter3       

が検出される

これでMACアドレスがわかったので

scan off

でスキャン停止

connect FF:FF:00:26:F2:FF
pair with FF:FF:00:26:F2:FF
trust FF:FF:00:26:F2:FF

で接続して次回からも自動認識するように信頼させる

しかしうまくいかないので

sudo apt install bluez bluetooth libbluetooth-dev build-essential
sudo apt install bluez-cups

を実行

しかし結果は変わらない

raspberry pi と AB Shutter3(bluetoothボタン) の連携

によれば最初についている電池はお試しなので
ペアリングはできるがボタンを押したときのイベントが拾えない
という状況があるらしい

このため新しく電池を購入し再度実験

しかし結果は変わらず

Try to find device AB Shutter3...
Device AB Shutter3 find at /dev/input/event2
Unable to connect to X server
Reading events from /dev/input/event2...

のまま

他の手段を探し
100均Bluetoothボタンをラズパイに活用

を参考に

disconnect FF:FF:9A:4A:49:94
remove FF:FF:9A:4A:49:94
power on
power off
pair FF:FF:9A:4A:49:94
connect FF:FF:9A:4A:49:94

と繰り返していたら繋がるようになった

bluetoothctlコマンドについては
bluetoothctl

を参考に

ただ
ラズパイで300円のリモートシャッターをIoTボタン化する方法

にあるように複数台購入しても1台しか動かないケースもあり
ペアリングできても動作しない
電池交換しても改善されない
ということもあるらしい

問題点としては長押ししても
longup
longudown
を検出しないので
1つの動作しかできてない

とりあえずシャットダウン機能を実行してみる

sudo nano shutdown.sh

でファイルを作成

#!/bin/bash
sudo shutdown -h now

として保存

sudo chmod +x shutdown.sh 

で実行権限付与

sudo nano ~/.config/bluebutton

で内容を

keyup=echo UP && ~/shutdown.sh
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

として保存

sudo bluebutton -c ~/.config/bluebutton

だと

sh: 1: /root/shutdown.sh: not found

となってしまうが

bluebutton -d="AB Shutter3" -c /home/pi/.config/bluebutton

として
ボタンを押すと無事にシャットダウンができた

なお2つのボタンの認識もできるようだが
残念ながらこちらも実行できなかったため
実質的に1つの動作のみになっている
当面はシャットダウンボタンの活用になりそう

ラズパイzero 動画をNASへ保存

ラズパイzero 動画をNASへ保存

本体に録画データを保存すると容量がすぐにいっぱいになる

このため Nas へ保存するようにする

まず起動時に NAS をマウントするようにする

過去に
ラズパイZeroW から NAS へアクセス

ですでに zero には設定がある程度できている

行っているのは
ラズパイZero W で
SMB でNASをマウントするツールのインストール

sudo apt install cifs-utils

次にマウントするためのディレクトリを作成

sudo mkdir /mnt/nas

次にNAS の設定
NASを構築しているラズパイ3へログインし

sudo vim /etc/samba/smb.conf 

でファイルを開き
最終行に

[pizero_photo]
        path = /mnt/hdd/share/pizero
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

を追記し保存

sudo service smbd restart

で設定反映

外付けHDDは過去に

mkdir /mnt/hdd/share/pizero
 sudo chmod -R 777 /mnt/hdd/share/

でディレクトリを作成していたので今回は省略

ここまでできたら

sudo mount -t cifs //192.168.1.6/pizero_photo /mnt/nas -o username=pi,password=raspberry,iocharset=utf8

でマウント

df -h

でNASの容量が表示されれば成功

ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/root                    5.7G  4.5G  903M   84% /
devtmpfs                     181M     0  181M    0% /dev
tmpfs                        186M     0  186M    0% /dev/shm
tmpfs                        186M  2.8M  183M    2% /run
tmpfs                        5.0M  4.0K  5.0M    1% /run/lock
tmpfs                        186M     0  186M    0% /sys/fs/cgroup
/dev/mmcblk0p6                68M   23M   46M   33% /boot
tmpfs                         37M     0   37M    0% /run/user/1000
/dev/mmcblk0p5                30M  398K   28M    2% /media/pi/SETTINGS1
//192.168.1.6/pizero_photo   916G   47G  870G    6% /mnt/nas

というかんじ

次にOS起動したら自動的にNASをマウントするように
/etc/fstab にマウントに必要な情報を記述

sudo nano /etc/fstab

でファイルをひらき
最終行を

//192.168.1.6/pizero_photo /mnt/nas cifs username=pi,password=raspberry,file_mode=0755,dir_mode=0755,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,_netdev 0 0

を追記

次にOS起動後にNASが自動マウントするように
ブートオプションを変更
これはネットワークサービスが
起動してからブートしないとNASのマウントが失敗するから

 sudo raspi-config 

で設定画面を開き

3の
Boot Options を選びSelect にしてEnter

次に
B2 Wait for Network at Boot Choose whether to waito for n
で Select にして Enter

次に
Would you like boot to wait until a network connection is established?
となっているので
はい
にしてEnter

Waiting for network on boot is enabled
となるので
了解で Enter

あとは Finish で Enter することで設定画面を抜けます

設定確認のため

sudo reboot

で再起動して

df -h

でNASがマウントされていれば成功

次に音声つき動画の保存場所の指定

ffmpegで出力先の指定は出来なのでしょうか。

を参考に ffmpeg の出力先をNASに指定し実行

timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/test.mkv

とすればNASへ保存される

今後の予定では
bluetooth シャッターボタンで撮影できるようにする予定