ラズパイ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 シャッターボタンで撮影できるようにする予定

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

ラズパイzero で音声つき動画撮影
Raspberry Piで音声付き動画を撮影する

Raspberry PIとffmpegとWebカメラ、USBマイクを利用して動画を取得

を参考に実践

raspivid コマンド
motion コマンド
ともに実行しても音声は入っていないため

カメラから画像を取得
マイクから音声を取得

これらをエンコードして保存
という流れになる

MKV もしくは MP4 で保存しているが
違いについては
【5分で分かる】mkvとmp4の違いは?変換する方法は?

に載っている

高品質なら mkv
いろいろなデバイスで再生させたいなら mp4
というかんじ

参考サイトをみながらコマンドのオプションを調べてみた

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 16000 -d 0 test.wav;
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv


撮影と録音を同時に行いそれぞれをファイルに保存して、後から結合する

raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv


映像、音声を取得しながらエンコードする

これらは室内なので
raspividのawbオプションで光源の設定している

動画のエンコーディングにはffmpegを使用

20 November 2016 raspivid コマンド表


raspivid コマンドのオプションが載っているので
これを参考に
-t キャプチャする時間をミリ秒で指定

-t 0 なら0秒

-w で動画幅
デフォルトは 1920
-h 動画の高さ
デフォルトは 1080

-b ビットレート
10MBits/secは-b 10000000

-fps は記録するフレーム数
今回は30

-awb でAWBモードを設定
fluorescent で蛍光

-o - で出力ファイル名
今回はパイプで指定

次にffmpeg のオプション
最新ffmpegのオプションまとめ †

を参考に

-y で確認なしでファイル上書き

-ac で音声チャンネル数を指定
今回は2

-f 指定したフォーマットで出力

-i 入力ファイルのパス
-i plughw:1 でマイクを指定

-r でフレームレートの指定

フレームレートは動画の滑らかさの設定
フレームレート(FPS)って何?どのくらいの値にすればいいの?

に詳細が載っている
動画の撮影なら30でOK

-vcodec
でコーデック指定
copy を指定すれば直接コピーになる
copy test.mkv
とすれば test.mkv となる

raspivid -t 10000 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv

もうひとつは

ffmpeg -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 

録画の終了はqキー

オプションは
-f で
ファイルフォーマット
マイクやカメラから取得するなら必須
今回はマイクが alsa ビデオが v412

-thread_queue_size データを読むときのキュー
高フレームレートの動画ストリームとかだと
処理が追い付かずに捨てられてしまうデータがあったりするのだが
キューサイズを大きくすると、それを防げる
今回は 8192

-s は動画サイズ
640×480 にしている

-i で入力デバイスの指定
今回はマイクとUSBカメラのパスを指定

-c でエンコードのコーデック指定
-c:v h264_omx
でビデオ v がビデオの意味
-c:a aac
でa がオーディオコーデック

-b:v 768k
でビデオのビットレート
大きくすれば画質がきれいになる

実行したときに終了時間の指定ができなかったので
timeout コマンドを使うことにした

このコマンドに関しては
timeout コマンド

を参考に

 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 test.mkv

というように
timeout コマンドを使うことで指定の時間で停止させることができる

ここまでできたら
あとは bluetooth などで撮影ボタンを作成する予定

ラズパイzero マイク設定

ラズパイzero マイク設定

以前、ラズパイzero で動画を撮影したが
音声がなかったので

ラズパイZeroWで作る簡単アクションカメラ——バイク編

Raspberry Pi Zeroで簡易ドライブレコーダーを自作する

を参考に設定

micro USB 変換アダプターを使うことで
ラズパイzero でも usb マイクを使用することが可能に

今回は

を使用

まずUSBマイクが認識されているか確認

lsusb

結果は

Bus 001 Device 002: ID 8086:0808 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

次にモジュール確認

cat /proc/asound/modules 

結果は

 0 snd_bcm2835
 1 snd_usb_audio

次にサウンドカードを調べる

arecord -l

結果は

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

ここまでできたら録音テスト

arecord -D plughw:1,0 ~/test1.wav

これで
test1.wav という音声ファイルができるので
これを scp コマンドで転送

しかし再生してみるとノイズがおおく音量が小さい

マイクの集音量と感度の調整 ラズパイ
で検索し
raspberry Pi3(ラズパイ)でマイクを使う

を参考に

[^shell]
amixer sget Mic
[/shell]
としたが

amixer: Unable to find simple control 'Mic',0

となってしまう

このため
amixer コマンドを調べる

Linux の Audio 機能をコマンドラインで設定

によれば

amixer -c1

でサウンドカード1の情報がみれる

結果は

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]

また
Linuxでマイクの音量が小さいときに、それを上げる方法

amixer -D hw:1

でも同じ結果がでる

Mono: Capture 0 [0%] [0.00dB] [on]

となっているので
これだとマイクボリュームが0

これを100%にする

amixer -D hw:1 sset Mic 100%

を実行すると

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]

これで録音の音は改良されたけど
ノイズがまだ残っている

原因は録音したときのレートの Hz の数値

arecord -D plughw:1,0 ~/test3.wav

を実行すると

録音中 WAVE '/home/pi/test3.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
^Cシグナル 割り込み で中断...

となり 8000Hz となる

arecord -Vmono -D hw:1 -f S16_LE -c1 -r48000 test4.wav

とすると

録音中 WAVE 'test4.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル

となり
48000Hz になる

これだと少しトトトトトと音が入っている

Raspberry Pi3で音声録音

を参考に

arecord -D plughw:1,0 -f cd  mic.wav

を実行すると

録音中 WAVE 'mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

となり
44100 Hz となる

-f cd の設定で 44100Hz となる

acreclrd コマンドのオプションについては

8.1. ALSAによるサウンド機能の実現

を参考に

aplay と arecord のオプションは同じとのこと

arecord -D plughw:1,0 -f cd  mic.wav

を実行したときが一番聴きやすいかんじ

しかしノイズのような音は残るので
あとはマイクの性能によるのかもしれない

ラズパイZeroW の画像を NAS へ保存

ラズパイZeroW の画像を NAS へ保存

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

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


でラズパイ3で構築したNASの外付けHDDをマウントできるようになったので
motion やシェルスクリプトで撮影している画像の保存先を
NAS に変更します

なお
ラズパイ3に外付けHDDでNAS 構築


外付けHDDでNASを構築する方法を記載しましたので
興味があれば参考に

まずは motion の動画と静止画の保存先を変更

なお、各種パラメータに関しては
motionのオプションについて

を参考に

今回は保存先の変更なので

target_dir
の項目を変更

デフォルトでは
/var/lib/motion

現在、NASをマウントしていて

df -h

ファイルシス                 サイズ  使用  残り 使用% マウント位置
/dev/root                      5.7G  4.3G  1.2G   80% /
devtmpfs                       181M     0  181M    0% /dev
tmpfs                          186M     0  186M    0% /dev/shm
tmpfs                          186M  5.1M  180M    3% /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
//192.168.1.208/pizero_photo   916G   47G  870G    6% /mnt/nas
tmpfs                           37M     0   37M    0% /run/user/1000
/dev/mmcblk0p5                  30M  398K   28M    2% /media/pi/SETTINGS1

となっているので
/mnt/nas
に保存するように変更する

motion の設定は

sudo nano /etc/motion/motion.conf 

で設定ファイルを開いて変更

nano エディタの場合
ctrl + w で検索できるので
target_dir
で検索し

#target_dir /var/lib/motion
target_dir /mnt/nas      

というように
もともとの設定を # でコメントアウトしておき
その下へNASの保存先を記述

#でコメントアウトしておけばミスしても修正が簡単になります

これで ctrl + x で終了し
Y で保存
そのまま Enter にすればファイルを上書き保存できるので
これで設定ファイルの変更はOK

次に撮影スクリプトの変更

nano rscamera.sh 

でファイルを開き

#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H-%M")
#raspistill -o /home/pi/rscamera/$DATE.jpg
raspistill -o /mnt/nas/$DATE.jpg

として保存

これで実際に保存ができるかを

raspistill -o /mnt/nas/$DATE.jpg

としてみると
少しの時間差のあと撮影した画像が保存されるのが確認できる

なお、WiFi 経由となるため
撮影してもすぐには反映されないので注意

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

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

ラズパイZeroW で撮影ができなくなっていたので
原因が容量不足と思われるため
SSH でアクセスし
ls コマンドでファイルとかをみようとすると

デバイスに空き領域がありません
-bash: ヒアドキュメント用一時ファイルを作成できません: デバイスに空き領域がありません

となってしまっていた

df -h

で確認してみると

ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        5.7G  5.7G     0  100% /
devtmpfs         181M     0  181M    0% /dev
tmpfs            186M     0  186M    0% /dev/shm
tmpfs            186M  5.0M  181M    3% /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

まずはこれをどうにかしないと無理なので
Ubuntu 側で

mkdir raspi_camera_bak
cd raspi_camera_bak/
scp pi@192.168.1.9:/home/pi/rscamera/* .

で静止画のバックアップをとり

次に motion で撮影されたものは
保存場所は
/var/lib/motion
に記録されるので
こちらも同様に

scp pi@192.168.1.9:/var/lib/motion/* .

でバックアップ

このままだとディスクがいっぱいで何もできないので

sudo rm -f /var/lib/motion/*

で一度削除しようとしたが処理に時間がかかりすぎたため

sudo su
 cd /var/lib/motion
rm -f *.jpg
rm -f *.avi

でそれぞれの拡張子ごとに削除

次に
Raspberry Pi Zeroから自宅のNASにアクセスしてみよう

を参考に
NASへアクセスできるように設定

なおNASは購入すると高かったため
Raspberry Pi3 で構築したものを使用

まずラズパイZero W で
SMB でNASをマウントするツールのインストール

sudo apt install cifs-utils

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

sudo mkdir /mnt/nas

これで NAS へアクセスしようとしたけど
エラーになるので
一度NASの確認

【Raspberry Pi 3】sambaサーバーが接続できないときのハマリポイントまとめチェック

を参考に

まず samba が起動しているか確認

sudo /etc/init.d/samba restart

結果

[ ok ] Restarting nmbd (via systemctl): nmbd.service.
[ ok ] Restarting smbd (via systemctl): smbd.service.

なので問題なし

次にパスワードの設定確認

sudo pdbedit -L

で何も表示されないので

sudo smbpasswd -a pi

で任意のパスワードを入力し設定

再度

 sudo pdbedit -L

を実行すると

pi:1000:

となるが、Ubuntu からアクセスしてファイルの作成などができない

原因を調べるためいろいろやってみたら
Windowsへの接続

を参考に
Nautilusを起動し、Ctrl + Lで
smb://NASのIPアドレス
としたら簡単にアクセスできた

接続が Ubuntu からはできたので
ラズパイZeroWから

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

としたけど

mount error(2): No such file or directory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

となってしまう

NASの設定を

sudo vim /etc/samba/smb.conf 

で確認したら

[ファミリー]
        path = /mnt/hdd/share/family
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

となっていたので

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

を追記して保存

これは motion で撮影した画像がすごい量になるので
専用のフォルダで補完するため

あとは

sudo service smbd restart

で再起動

あとはディレクトリも用意するので

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

でディレクトリ作成とパーミッション変更

これで再度 ubuntu で
smb://192.168.1.208/
と Nautilus で検索すると表示されるようになりました

次に ラズパイZeroW で

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

とすると
無事にマウントできました

確認のため

df -h

とすると

ファイルシス                 サイズ  使用  残り 使用% マウント位置
/dev/root                      5.7G  4.3G  1.2G   79% /
devtmpfs                       181M     0  181M    0% /dev
tmpfs                          186M     0  186M    0% /dev/shm
tmpfs                          186M  5.1M  180M    3% /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.208/pizero_photo   916G   47G  870G    6% /mnt/nas

となりマウント成功が確認できます

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

sudo nano /etc/fstab

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

//192.168.1.208/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

を追記

長いけど1行で書き込みます

最初は行をわけるかわからなかったので
ラズパイZeroで自宅のNASをマウントする

も参考にしました

このとき
username はユーザ名
password はユーザパスワード
ですがNASのものを使います

//192.168.1.208/pizero_photo
はNASのマウント先

/mnt/nas
はラズパイZeroWのマウントする場所
となります

次に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

ファイルシス                 サイズ  使用  残り 使用% マウント位置
/dev/root                      5.7G  4.3G  1.2G   80% /
devtmpfs                       181M     0  181M    0% /dev
tmpfs                          186M     0  186M    0% /dev/shm
tmpfs                          186M  7.4M  178M    4% /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
//192.168.1.208/pizero_photo   916G   47G  870G    6% /mnt/nas
tmpfs                           37M     0   37M    0% /run/user/1000
/dev/mmcblk0p5                  30M  398K   28M    2% /media/pi/SETTINGS1

というように
NASがマウントされていれば成功

ラズパイ Zero W で動画保存の設定変更

ラズパイ Zero W で動画保存の設定変更

今回も参考書籍はラズパイマガジン

motion では
動きを検知したときに動画と静止画が保存される

保存場所は
/var/lib/motion
に記録される

なお、デフォルトだと撮影時間が無制限なので

sudo  nano /etc/motion/motion.conf 

でファイルを開き

ctrl + w で検索モードにして
max_movie_time
で検索し

max_movie_time 0

から任意の撮影秒数に変更

保存するには
ctrl + x で Y のあと Enter

今回は20秒にするので

max_movie_time 20

そして、自動的に motion を起動できるようにしたいので

sudo nano /etc/default/motion 

でファイルを開き

start_motion_daemon=no

start_motion_daemon=yes

次に insserv パッケージをインストール

 sudo apt-get install insserv

あとは

sudo insserv motion

これで自動起動設定も完了

もし、自動起動していないのなら

sudo motion

で motion を起動

あとは電源をモバイルバッテリーにすることで
コンセントがない場所でも撮影が可能に

これで撮影ができるようにはなったけど
容量が8GBの microSD のため容量不足により
motion が停止してしまうので
Raspberry Pi3 でNASを構築し
動画保存先をそちらに移す予定

ラズパイ Zero W で動画保存

ラズパイ Zero W で動画保存

今回も参考書籍はラズパイマガジン

動画撮影には
motion というソフトを使うけど
デフォルトでは使えないようなので
設定を変更

 sudo nano /etc/modules

でファイルを開き

bcm2835-v4l2

を最終行に追記

保存するときには
ctrl + x で
Y
あとは Enter で保存されます

nano エディタの使い方は
nano 使い方
で検索してもでてくるけど
ファイルの作成と編集、保存ぐらいなら
nano (テキストエディター) について

のほうがまとまっていておすすめ

あとは

sudo reboot

で再起動

次に motion のインストール

sudo apt update

でリポジトリを更新し

sudo apt install -y motion

で motion をインストール

次に設定ファイルの編集

sudo nano /etc/motion/motion.conf 

で設定ファイルを開き

ctrl + w で検索できるので
daemon で検索し

daemon off

daemon on

に変更

ctrl +x で width で検索し

width 320 

width 640 

に変更

height 240

height 480

に変更

ctrl +x で framerate で検索し

framerate 2

framerate 10

に変更
framerateは
動体を検知した時に画像をキャプチャするフレームレートの最大値
大きくするとCPU負荷も上がるが
動きがなめらかになる

ctrl +x でevent_gap で検索し

event_gap 60

event_gap 10

に変更
eventgap は
動体検知が収まってから再度検知するまでの秒

ctrl +x で stream_localhost で検索し

stream_localhost on

stream_localhost off

に変更
stream_localhost は
ライブストリームへのアクセスをローカルホストからのみに制限する
on だとローカルホストのみ

ここまでできたら
ctrl + x で Y を押して保存ファイルを聞かれるので
Enter で上書き保存

なお
motion の各種設定については
motionのオプションについて

を参考に

ここまでできたら

sudo motion

で motion を起動

これでブラウザから
http://ラズパイZeroWのIPアドレス:8081/
にアクセスするとリアルタイムの動画を見れます

なお motion の停止は

sudo service motion stop

でできます

停止方法がラズパイマガジンになかったので
Raspberry Pi でカメラ

を参考にしました

ラズパイ Zero W でカメラの実験 その2

ラズパイ Zero W でカメラの実験 その2

撮影はできたけど
そのままだとファイル名が同じなので
上書きしていってしまうため
写真を保存するディレクトリを作成

今回も ラズパイマガジンを参考に実践

mkdir rscamera

次に写真を保存するスクリプトを作成

nano rscamera.sh

でファイルを作成

内容は

#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H-%M")
raspistill -o /home/pi/rscamera/$DATE.jpg

として保存

保存するときには
ctrl + x で
Y
あとは Enter で保存されます

nano エディタの使い方は
nano 使い方
で検索してもでてくるけど
ファイルの作成と編集、保存ぐらいなら
nano (テキストエディター) について

のほうがまとまっていておすすめ

このスクリプトでは
DATE という変数に
date コマンドと現在の日時を保存して
それをコマンド実行時につけて行っているというもの

なおシェルスクリプトでは
変数は
$変数名
という書き方をする

ドットインストールの
シェルスクリプトの講座をみるとわかりやすいかも
シェルスクリプト入門

保存したら権限変更

chmod +x rscamera.sh 

chmodなど権限については
chmod? chown? よくわからんって人のための、ファイル権限系まとめ

を参考に

なお +x をつけているのは
スクリプト書いただけでは実行できないので
実行権限を付与するため

あとは

./rscamera.sh 

で実行

スクリプトは
./スクリプトファイル
で実行できる

撮影された写真は
rscamera というディレクトリにあるので

ls rscamera

で確認できる

ここまでできたら
次に毎回コマンドをうつのではなく
crontab で自動で指定した時間に撮影するようにする

sudo crontab -e

実行すると

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 

となって
どのエディタを使うか聞かれる

とりあえず nano でいいなら
そのままEnter

あとはファイルの最終行に

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

を追記して
ctrl + x で保存

なおcron の設定時間は
分 時 日 月 曜日
となっているので
今回の
*/10 という設定だと
毎分10分
ということになる

10だけだと
時刻が10分をさしたときだけ実行なので注意

詳しくは
cronの設定方法

を参考に