ラズパイゼロでドラレコもどきを作成

ラズパイゼロでドラレコもどきを作成

音声なしで動画と画像のみを撮影し
Google Drive に保存するようにする予定

なおセットアップには
microSD 以外に
HDMI と USB の変換するものがないと
microUSB しかコネクタがないので
モニターとマウスをつけれないので注意

以前はNOOBSでインストールしていたけど
最近では
Raspberry Pi Imager
を使うのが主流らしい
https://www.raspberrypi.org/software/
から各種OSに対応したものがダウンロード可能

今回は Ubuntu for x86 をダウンロード

UbuntuでのRaspberry Pi Imagerの使い方

で解説があるので
snap でもインストール可能らしい

今回は
パッケージ版をインストール

途中に必要なパッケージがないとエラーになるうえ
各種インストールしようとしてもエラーとなるため

sudo snap install rpi-imager

でインストール

これで
Imager を起動し
CHOOSE OS

Raspberry Pi OS(32-bit)
をクリックし

CHOOSE STORAGE

SD_MMC – 31.3GB
を選択

これで
WRITE
で書き込みされる
と思ったら
Cannot open storage device ‘/dev/sdc’
となる

他のmicroSD に変えても結果は同じなので

rpi image 1.6 cannot open storage device
で検索し

Raspberry Pi Imager update to v1.6

を参考に

Ctrl-Shift-X
でオプションをだしたがわからないので
NOOBSでインストールすることに
Raspberry PIのインストール方法が変わりNOOBSが使えない – 直接ダウンロードしてインストールする方法

を参考に
http://downloads.raspberrypi.org/
から
NOOBSを直接ダウンロード

http://downloads.raspberrypi.org/NOOBS/images/
からNOOBSのバージョンを選んでダウンロード可能

今回は
NOOBS_v3_7_0.zip
をダウンロード

ダウンロード完了後

unzip NOOBS_v3_7_0.zip -d /media/snowpool/0C12-788A/


microSD を指定して解凍する

次に
ラズパイゼロの準備

カメラモジュールの配線が長すぎるので
Raspberry Pi Zero Wにカメラモジュールを取り付ける

を参考に交換

部品をセットしたら
microSD を差し込んで起動するとインストール画面になるので
そのまま続ける

インストール完了したら
カメラモジュールとSSHができるように設定

sudo raspi-config


Interfacing opinion

PI Camera
P2 SSH
でyes を選ぶ

設定が終われば
Finishを選べばok

これで再起動するとカメラとSSHが使えるようになったので
ssh で ubuntu からアクセスして操作する

次にOS のアップデート

sudo apt update
sudo apt upgrade

実行すると

webkit2gtk (2.31.1-1) experimental; urgency=medium

  Starting from the 2.31.x development versions, support for NPAPI
  plugins has been completely removed from WebKitGTK. This technology is
  deprecated and has already been removed from all major web browsers.

  The last important user of this API was the Adobe Flash Player, which
  reached end of life in December 2020.

 -- Alberto Garcia <berto@igalia.com>  Fri, 15 Jan 2021 17:31:53 +0100

とでるので
とりあえず
q を押して終了させる

アップデートにかなり時間がかかる
約30分以上はかかったので
更新は時間があるときに行わないときついかも

アップデート完了したら
カメラが撮影できるかテスト

これは
raspistill コマンドでできる

オプションが色々あるけと
カメラの向きが変わってることが多々あるので
-o で出力先の変更以外に
-hf で垂直方向へ反転させたり
-hv で水平方向へ反転させることがある

とりあえず、向きに問題ないなら

raspistill -o test.jpg

撮影には5秒ほどのタイムラグがあるので注意

もし撮影できていないのなら
カメラケーブルを確認するといいかも

次に公開鍵認証にする

Ubuntu で ssh-keygenコマンドで作成

-t で暗号形式を rsa
-b で4096ビットに指定
なおデフォルトでは2048ビット

ssh-keygen -t rsa -b 4096

で作成

Enter file in which to save the key (/home/snowpool/.ssh/id_rsa): 

となったらファイル名を入力

今回は zero_camera
としておく

パスフレーズは省略するので

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 


Enter にすればパスフレーズなしとなる

次に公開鍵の登録

これは
ssh-copy-id コマンドを使う

なお接続するラズパイ3のIPは
Android ならFing で調べることが可能

ssh-copy-id -i zero_camera.pub pi@192.168.1.215

で登録

しかし

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Received disconnect from 192.168.1.215 port 22:2: Too many authentication failures
packet_write_wait: Connection to 192.168.1.215 port 22: Broken pipe

となる

このため
SSH 接続時に Too many authentication failures と表示される。
https://ez-net.jp/article/08/rJIOlRVJ/p56Xn7J2TJ13/
を参考に設定したがつながらない

Received disconnect from … : Too many authentication failures の解決案

を参考に
IdentitiesOnly=yesを指定すると解決

ssh -o IdentitiesOnly=yes pi@192.168.1.215

これでログインはできた

scp -o IdentitiesOnly=yes  .ssh/zero_camera.pub pi@192.168.1.215:/home/pi/

で作成したファイルをコピー

ssh -o IdentitiesOnly=yes pi@192.168.1.215

でラズパイにログイン

cat zero_camera.pub >> .ssh/authorized_keys
chmod 700 .ssh/
chmod 600 .ssh/authorized_keys 


一度ログアウトし

ssh -i .ssh/zero_camera pi@192.168.1.215


公開鍵認証でログインできるのを確認

sudo apt install vim


vim をインストール

sudo vim /etc/ssh/sshd_config

で設定ファイルを開き

パスワード認証を禁止

PermitEmptyPasswords no
PasswordAuthentication no

AuthorizedKeyFile .ssh/authorized_keys

を設定

sudo /usr/sbin/sshd -t

で設定の確認

sudo /etc/init.d/ssh restart


ssh の再起動

これで
次に Google Drive の設定

Google Drive のマウントに必要なものをインストール

sudo apt install opam
opam init
Do you want opam to modify ~/.profile? [N/y/f]

とでてくるので検索
opamを用いたOCamlプロジェクトのセットアップ方法

によれば
yでOK

A hook can be added to opam's init scripts to ensure that the shell remains in
sync with the opam environment when they are loaded. Set that up? [y/N] 

についても
yでOK

これは opam 設定を 更新するスクリプトをなにかに hook させるか
ということらしい

しかし

[ERROR] Solver failed: "/usr/bin/mccs -i
        /tmp/opam-pi-3186/solver-in-3186-8b8a2d -o
        /tmp/opam-pi-3186/solver-out-3186-d474c2
        -lexagregate[-removed,-count[version-lag:,true],-changed,-count[version-lag:,false],-new]"
        exited with code 255 "ERROR: Cannot read solution from lp solver."
Switch initialisation failed: clean up? ('n' will leave the switch partially
installed) [Y/n] y

となる

続いて

opam update
opam install depext

を実行すると

[ERROR] No switch is currently set. Please use 'opam switch' to set or install
        a switch

となる

OCaml の環境構築

によれば
OPAMがおかしくなったら、 ~/.opam を削除すれば初期化できる
とのことなので

rm -rf .opam/

で一度削除

opam init --solver=mccs

を実行

Do you want opam to modify ~/.profile? [N/y/f]
(default is 'no', use 'f' to choose a different file) no
A hook can be added to opam's init scripts to ensure that the shell remains in
sync with the opam environment when they are loaded. Set that up? [y/N] N

については
デフォルトが N なので
N
にしてみたが変わらないので
一度


<><> Required setup - please read <><><><><><><><><><><><><><><><><><><><><><><>

  In normal operation, opam only alters files within ~/.opam.

  However, to best integrate with your system, some environment variables
  should be set. If you allow it to, this initialisation step will update
  your bash configuration by adding the following line to ~/.profile:

    test -r /home/pi/.opam/opam-init/init.sh && . /home/pi/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true

  Otherwise, every time you want to access your opam installation, you will
  need to run:

    eval $(opam env)

  You can always re-run this setup with 'opam init' later.

Do you want opam to modify ~/.profile? [N/y/f]

で再度 y を選択

最後に

User configuration:
  ~/.profile is already up-to-date.
[NOTE] Make sure that ~/.profile is well sourced in your ~/.bashrc.

となるので

source .bashrc 

を実行

インストールしたOCamlをパスに加えるので

 eval $(opam env)

opam switch list-available

で利用可能なあっケージを調べる

Official release が公式らしい

ocaml-base-compiler                    4.12.0
          Official release 4.12.0
ocaml-variants                         4.12.0+domains
          OCaml 4.12.0, with support for multicore domains
ocaml-variants                         4.12.0+domains+effects
          OCaml 4.12.0, with support for multicore domains and effects
ocaml-variants                         4.12.0+options
          Official release of OCaml 4.12.0
ocaml-variants                         4.12.1+trunk
          Latest 4.12 development
ocaml-base-compiler                    4.13.0~alpha1
          First alpha release of OCaml 4.13.0
ocaml-variants                         4.13.0~alpha1+options
          First alpha release of OCaml 4.13.0
ocaml-base-compiler                    4.13.0~alpha2
          Second alpha release of OCaml 4.13.0
ocaml-variants                         4.13.0~alpha2+options
          Second alpha release of OCaml 4.13.0
ocaml-variants                         4.13.0+trunk
          Latest 4.13 developmet
ocaml-variants                         4.14.0+trunk
          Current trunk

となるので

 opam switch create 4.12.0

としたが

[ERROR] ocaml-base-compiler = 4.12.0 unknown package

となる

OCamlについてとりあえずメモ

を参考に

sudo apt install opam ocaml gcc make bubblewrap m4 pkg-config

をしたが変わらない

再度

rm -rf .opam

で削除し

<><> Creating initial switch (ocaml-system>=4.02.3) <><><><><><><><><><><><><><>
[ERROR] Solver failed: "/usr/bin/mccs -i
        /tmp/opam-pi-1045/solver-in-1045-8b8a2d -o
        /tmp/opam-pi-1045/solver-out-1045-d474c2
        -lexagregate[-removed,-count[version-lag:,true],-changed,-count[version-lag:,false],-new]"
        exited with code 255 "ERROR: Cannot read solution from lp solver."
Switch initialisation failed: clean up? ('n' will leave the switch partially
installed) [Y/n] y

となったので

opam init --solver=mccs

を実行

しかし
同じエラーがでる

再度

Do you want opam to modify ~/.bash_profile? [N/y/f]

のとき
N
を選択し

A hook can be added to opam's init scripts to ensure that the shell remains in
sync with the opam environment when they are loaded. Set that up? [y/N] N

もN
とした

[ERROR] Solver failed: "/usr/bin/mccs -i
        /tmp/opam-pi-1326/solver-in-1326-8b8a2d -o
        /tmp/opam-pi-1326/solver-out-1326-d474c2
        -lexagregate[-removed,-count[version-lag:,true],-changed,-count[version-lag:,false],-new]"
        exited with code 255 "ERROR: Cannot read solution from lp solver."
Switch initialisation failed: clean up? ('n' will leave the switch partially
installed) [Y/n] 

のときに
Y
とした後に

opam update

を実行

このあと

opam install depext

を実行したが

[ERROR] No switch is currently set. Please use 'opam switch' to set or install
        a switch

となる

opam switch create 4.12.0

を実行すると

[ERROR] Solver failed: "/usr/bin/mccs -i
        /home/pi/.opam/log/solver-in-1418-7afd23 -o
        /home/pi/.opam/log/solver-out-1418-5f1023
        -lexagregate[-removed,-count[version-lag:,true],-changed,-count[version-lag:,false],-new]"
        exited with code 255 "ERROR: Cannot read solution from lp solver."
Switch initialisation failed: clean up? ('n' will leave the switch partially
installed) [Y/n] Y

となる

エラーログから

Please use 'opam switch' to set or install         a switch

とあったので検索
opam not creating a switch #4023

の中の

There is some packaging issues of opam (cf. #3827), it should use builtin solver, but it packaged with aspcud.

Can you try this workaround ?

を参考に

aspcud install

で検索

How To Install “aspcud” Package on Ubuntu

を参考に

sudo apt install aspcud 

でインストール

debian testing/ubuntu disco opam packages result in solver failure on init

を参考に

opam switch create 4.12.0 --solver=mccs

としたが変わらない

このため一度以前作成したラズパイゼロとの
バージョン差分を調べることにする

opam --version 

で調べた結果
2.0.3
に対し

以前作成したものは
ver 1.2.2
だった

このため一度 Google Drive への保存を保留にして
先に Bluetooth ボタンでシャットダウン機能の実装とOpenCVを先に実験する

今回作成するものは車で走行しているときの動画の保存と解析が目的
なので
古い写真と動画を圧縮保存するようにして
自宅に帰ったときにNASに保存するようにする

まず bluetooth の設定

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

で必要なパッケージのインストール

次にgem でインストール

sudo apt install ruby
sudo gem install bluebutton

これはダイソーの300円のボタンを使う

sudo bluetoothctl
power on
scan on 


MACアドレスを表示されたら

connect FF:FF:9A:4A:49:94
pair FF:FF:9A:4A:49:94
trust FF:FF:9A:4A:49:94

とする

しかし電池が少ないため途中で接続が途切れる

このため先に opencv の設定をする

【Raspberry Pi】Raspberry Pi Zero WにOpenCVの環境を構築する

sudo apt-get install python3-pip
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig libqt4-test
pip3 install opencv-python

これでpython3 の後に

import cv2 

とすると

Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.7/site-packages/cv2/__init__.py", line 5, in <module>
    from .cv2 import *
ImportError: numpy.core.multiarray failed to import

となる

このため
import cv2 で謎の”ImportError”が出た…[OpenCV for Python3]

を参考に

pip install -U numpy

インストールはできたようだが

  The scripts f2py, f2py2 and f2py2.7 are installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

とエラーがでる

  The scripts f2py, f2py2 and f2py2.7 are installed in '/home/pi/.local/bin' which is not on PATH.


検索した結果
NumPy、pandas、Matplotlib をpipでインストールする方法

によれば
f2pyは
FORTRANのコードをPythonで使えるようにするプログラム

警告内容のようにPATHを通さなくても

py -m numpy.f2py

で呼び出せるらしいので
そのまますすめる

この状態で

import cv2

として何もエラーがでなければ成功

バージョン確認は

cv2.__version__

でOK

ctrl + d で抜ける

とりあえず
opencv の設定はできたので
次に定期的にカメラで動画撮影する

動画の撮影は
raspivid コマンド
もしくは
motion コマンド
でできる

motion の場合動体検知などができるが
今回は raspivid コマンドで実行する

出力されるファイル形式は
.h264 になる

-t でミリ秒単位で撮影時間を指定できる
なおミリ秒は0.001 秒なので
10000ミリ秒なら10秒となる

-rot で角度の指定が可能
180度回転させるなら
-rot 180
となる

カメラの向きが上下反転しているなら
-vf

左右反転なら
-hf
を指定することで解決

これについては

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

を参考に

取り付ける場所がルームミラーの裏にしたいので
横向きになるので

raspivid -o test.h264 -rot 270 -t 10000

とすることで角度調整ができた

次に
-fps でフレームノート
-b でビットレートを指定する

ファイル名がかぶらないように
date コマンドで日時を撮影した日時にして保存する

raspivid -o `date '+%Y%m%d-%H%M'`.h264 \
-rot 270 -w 1280 -h 720 -t 20000 -fps 30 -b 2000000

これをスクリプトファイルにするので

vim video.sh

でファイルを作成し

#!/bin/sh
raspivid -o `date '+%Y%m%d-%H%M'`.h264 \
-rot 270 -w 1280 -h 720 -t 20000 -fps 30 -b 2000000

として保存

なお

 `date '+%Y%m%d-%H%M'

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

‘ と似ているので注意

chmod +x video.sh

で実行権限を付与

これを cron で実行できるようにする

crontab -e

を実行

no crontab for pi - using an empty one

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

となりどのエディタを使うか聞かれる
今回はvim にしたいので
2
を選択

最終行に

*/1 * * * * /home/pi/video.sh

を追記して保存

これで1分ごとに20秒の動画が撮影される

このままだとどんどんファイルが増えていくので

mkdir drive_rec

で動画を保存するディレクトリを作成

#!/bin/sh
raspivid -o /home/pi/drive_rec/`date '+%Y%m%d-%H%M'`.h264 \
-rot 270 -w 1280 -h 720 -t 20000 -fps 30 -b 2000000

というように保存先を指定

今まで撮影したファイルについては

mv *.h264 drive_rec/

で一緒に保存しておく

これで一日おいておいたらすごい量のファイルになっているので
シャットダウンボタンを設定する

sudo pip3 install evdev


キーイベント取得のためのモジュールインストール

あと
100均Bluetoothボタンをラズパイ活用


別の機器(ラズパイやスマホ)に繋ぐ場合は、最後に繋げた機器とペアリングを確実に削除すること(デバイスの電源OFFや電池を抜いてもダメ)
とあったので
新規に電池とともに
ダイソーで購入することに

一日たってから

df -h

で容量を確認したところ
5GBほど容量をとりほぼ夜中は起動しても無駄になりそうなので
motion で撮影することに

これなら動体検知になるのでそこまで容量をとらないはず

 sudo nano /etc/modules

でファイルを開き

bcm2835-v4l2

を最終行に追記

あとは

sudo reboot

で再起動

次に motion のインストール

sudo apt update

でリポジトリを更新し

sudo apt install -y motion

で motion をインストール

次に設定ファイルの編集

sudo vim /etc/motion/motion.conf 

で設定ファイルを開き

11行めの

daemon off

daemon on

に変更

79行目あたりの

width 320 

width 640 

に変更

height 240

height 480

に変更

86行目あたりの

framerate 2

framerate 10

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

233行目あたりの

event_gap 60

event_gap 10

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

461行めの

stream_localhost on

stream_localhost off

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

次に撮影関連の設定
デフォルトだと撮影時間が無制限なので
237行目の

max_movie_time 0

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

今回は20秒に設定

max_movie_time 20

とした

これで保存

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

sudo nano /etc/default/motion 

でファイルを開き

start_motion_daemon=no

start_motion_daemon=yes

として保存

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

 sudo apt install insserv

あとは

sudo insserv motion

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

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

sudo motion

で motion を起動

しかしうまく起動していないため
深夜での撮影はしないため
撮影する時刻を
朝5時から夜9時までに変更するため

crontab -e

*/1 * * * * /home/pi/video.sh

*/1 5-21 * * * /home/pi/video.sh

として保存

設定は左から
分 時 日 月 曜日
となっている

書き方については
crontabの書き方

を参考に

次に古いファイルの削除

基本的に週1でデータ管理しようと思うので
それ以前のデータは削除するようにする

Raspberry Pi で監視カメラを作ってみた

を参考にスクリプトを設定

sudo vim /etc/cron.daily/delete_movie.sh

内容を

#!/bin/bash
find ~/drive_rec/ \( -name '*.h264' \) -mtime +7 -delete 
exit 0

として保存

sudo chmod +x /etc/cron.daily/delete_movie.sh 

で実行権限付与

これで7日間変更がないなら削除されるようになる

ボタン電池を購入したのでbluetooth ボタンの続き

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

を参考に

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

これで

vim shutdown.sh

でファイルを作成

#!/bin/bash
sudo shutdown -h now

として保存

sudo chmod +x shutdown.sh 

で実行権限付与

sudo vim ~/.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

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

このままだと使えないので
起動したら
bluetooth が使えるように設定

Crontabにシステム起動時に1度だけコマンドが実行されるように設定する方法

によれば

@reboot
で設定ができるらしい
Shutter3とRaspberry Pi Zero Wを使ったBluetoothボタンの制御まとめ

で書いてあったものを参考に

vim blbtn.sh

#!/bin/sh
command="bluebutton -d="AB Shutter3" -c /home/pi/.config/bluebutton"
eval $command

として保存

chmod +x blbtn.sh

で実行権限付与

crontab -e

で最終行に

@reboot /home/pi/blbtn.sh

を記述して保存

実際に起動しているか調べるため再起動

しかし動作しないためこれは保留
100均のBluetoothシャッターとRaspberry Piカメラでオンラインデジカメを作ってみた

を参考に

sudo vim ~/.config/bluebutton 

でファイルを編集

内容を

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

として保存

 which bluebutton 


bluebutton のパスを確認したら

/usr/local/bin/bluebutton

だったので

crohtab -e

で設定ファイルを開き

@reboot /home/pi/blbtn.sh

を削除

@reboot /usr/local/bin/bluebutton -d="AB Shutter3" -c /home/pi/.config/bluebutton

を最終行に追記

これで

sudo reboot

で再起動させて
しらばくたってから
AB Shutter3
のボタンを押すとシャットダウンが実行される

なお端末画面には
ECHO で設定した画面が表示されないので注意

またすでに他のラズパイzero で実験している場合
一度ペアリングを解除しないと他の端末で使えないので注意

bluetoothctl

でペアリング解除などが載っているので参考に

ラズパイ撮影データを Google Drive へ保存

ラズパイ撮影データを Google Drive へ保存

外付けHDDに保存するのは屋内ではできるけど
外での撮影には向かない

このためクラウドにデータを保存することに

候補としては
AmazonS3
Google Drive
iCloud

S3 は使用した分課金となるので
今回は
Google Drive へ保存

料金については
【2020年10月最新版】Google ドライブの価格を徹底調査してみた!

S3の料金をシミュレーションしました

iCloud ― 料金プラン・ストレージ容量 まとめ

を参考に

ラズベリーパイZERO-WHでカメラ画像をGoogleDriveにアップロードする(python+pydrive)

を参考に設定

python3 が必要なので

sudo apt update
sudo apt upgrade
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

で必要なパッケージのインストール

次に Github から pyenv を取得

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

次にパスを通す

sudo nano ~/.bash_profile

でファイルを作成し開く

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

を追記して保存

設定反映のため

source ~/.bash_profile

で再読み込み

pyenv --version

でバージョン確認

今回は

pyenv 1.2.21

となった

次に
【Raspberry Pi】Raspberry Piで撮影した画像をGoogle Driveにアップロードさせてみる ~PyDrive編~

を参考に

PyDrive のインストール

pip3 install google-api-python-client
pip3 install PyDrive

次に
Google Developers Console
へアクセス

ラズパイで撮影した動画をグーグルドライブにアップロードする

を参考に
プロジェクトを作成し
Google Drive API を有効化する

APIとサービスの有効化
をクリック

Drive で検索

Google Drive API
をクリック

有効にする
をクリック

次に認証情報の作成

認証情報をクリック

認証情報を作成 > OAuth クライアントIDをクリック

参考サイトではその他だったけど
見当たらないので
アプリケーションの種類を
デスクトップアプリにして
名前は任意のものにして作成をクリック

これで
OAuth クライアントが作成される

もし忘れたとしても
OAuth クライアントIDの
編集アイコンや
ダウンロードアイコンでファイルをダウンロードすれば
確認ができる

次にGoogle Drive へのアップロード

以前、ラズパイで認証しようとしたら
失敗したので
Ubuntu で行う

sudo apt install python3-pip
pip install --upgrade pip

としたが

You are using pip version 8.1.1, however version 20.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

となってしまう

【Python】pip install –upgrade pip が成功しない場合の対処法

によれば
sudo をつければよいらしいが

sudo: pip: コマンドが見つかりません

となってしまうが

python3 -m pip install --upgrade pip

で成功

ラズパイと同じように環境を整えておく

pip install --upgrade google-api-python-client
pip install PyDrive


Ubuntu にも
PyDrive のインストール

を参考に
PyDrive をインストールしておく

まず認証情報を記載したファイルの作成

vim settings.yaml

内容は

client_config_backend: settings
client_config:
  client_id: <クライアントID>
  client_secret: <クライアントシークレット>

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

次に

vim test.py

でファイル作成

ソースは

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

def main():
    #  Google Drive 
    gauth = GoogleAuth()
    gauth.CommandLineAuth()
    drive = GoogleDrive(gauth)

    #  file upload
    f = drive.CreateFile({"title": "TEST.TXT"})
    f.SetContentString("Hello Drive")
    f.Upload()

これで

python test.py

を実行したが認証画面がでない

Python, PyDriveでGoogle Driveのダウンロード、アップロード、削除など

を参考に

vim auth.py

でファイルを作成

import os

from pydrive.auth import GoogleAuth

os.chdir(os.path.dirname(os.path.abspath(__file__)))

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

で保存し

python auth.py

とすることで認証画面の表示と認証を行うことができた

次にファイルのアップロードテスト

【Python/PyDrive】Google Driveにファイルをアップロード/ダウンロード

を参考に

vim upload.py

でファイルを作成

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

filepath = 'test.jpg'
title = 'test.jpg'
file = drive.CreateFile({'title': title, 'mimeType': 'image/jpeg'})
file.SetContentFile(filepath)
file.Upload()

として保存

あとは
手持ちの画像ファイルを
test.jpg として保存し

python upload.py

とすると
Google Drive に test.jpg がアップロードされる

これで ubuntu でPyDrive が使えるようになったので
次にラズパイでも実験

必要なファイルを

mkdir zerodrive
cd zerodrive/
cp upload.py zerodrive/
cp settings.yaml zerodrive/
cp test.jpeg zerodrive/

でまとめて

scp /home/snowpool/zerodrive/* pi@192.168.1.8:/home/pi/

でまとめて転送

しかし、そのまま実行しても認証画面がでてしまい
エラーになる

ubuntu で認証した結果は
credentials.json
に保存されているので
これを転送

scp /home/snowpool/credentials.json   pi@192.168.1.9:/home/pi/

さらに python で実行しても
ラズパイのデフォルトは 2.7 系なので

python3 upload.py

というように実行しないとエラーになってしまう

これで画像をGoogle Drive に保存できたので
次は動画のアップロード

ラズパイ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を構築し
動画保存先をそちらに移す予定