ラズパイゼロでドラレコもどきを作成
音声なしで動画と画像のみを撮影し
Google Drive に保存するようにする予定
なおセットアップには
microSD 以外に
HDMI と USB の変換するものがないと
microUSB しかコネクタがないので
モニターとマウスをつけれないので注意
以前はNOOBSでインストールしていたけど
最近では
Raspberry Pi Imager
を使うのが主流らしい
https://www.raspberrypi.org/software/
から各種OSに対応したものがダウンロード可能
今回は Ubuntu for x86 をダウンロード
UbuntuでのRaspberry Pi Imagerの使い方
で解説があるので
snap でもインストール可能らしい
今回は
パッケージ版をインストール
途中に必要なパッケージがないとエラーになるうえ
各種インストールしようとしてもエラーとなるため
1 | 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
をダウンロード
ダウンロード完了後
1 | unzip NOOBS_v3_7_0.zip -d /media/snowpool/0C12-788A/
|
で
microSD を指定して解凍する
次に
ラズパイゼロの準備
カメラモジュールの配線が長すぎるので
Raspberry Pi Zero Wにカメラモジュールを取り付ける
を参考に交換
部品をセットしたら
microSD を差し込んで起動するとインストール画面になるので
そのまま続ける
インストール完了したら
カメラモジュールとSSHができるように設定
で
Interfacing opinion
で
PI Camera
P2 SSH
でyes を選ぶ
設定が終われば
Finishを選べばok
これで再起動するとカメラとSSHが使えるようになったので
ssh で ubuntu からアクセスして操作する
次にOS のアップデート
1 2 | sudo apt update
sudo apt upgrade
|
実行すると
1 2 3 4 5 6 7 8 9 10 | 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 で水平方向へ反転させることがある
とりあえず、向きに問題ないなら
撮影には5秒ほどのタイムラグがあるので注意
もし撮影できていないのなら
カメラケーブルを確認するといいかも
次に公開鍵認証にする
Ubuntu で ssh-keygenコマンドで作成
-t で暗号形式を rsa
-b で4096ビットに指定
なおデフォルトでは2048ビット
1 | ssh -keygen -t rsa -b 4096
|
で作成
1 | Enter file in which to save the key ( /home/snowpool/ . ssh /id_rsa ):
|
となったらファイル名を入力
今回は zero_camera
としておく
パスフレーズは省略するので
1 | Enter passphrase (empty for no passphrase):
|
と
1 | Enter same passphrase again:
|
は
Enter にすればパスフレーズなしとなる
次に公開鍵の登録
これは
ssh-copy-id コマンドを使う
なお接続するラズパイ3のIPは
Android ならFing で調べることが可能
1 | ssh -copy- id -i zero_camera.pub pi@192.168.1.215
|
で登録
しかし
1 2 3 4 | /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を指定すると解決
1 | ssh -o IdentitiesOnly= yes pi@192.168.1.215
|
これでログインはできた
1 | scp -o IdentitiesOnly= yes . ssh /zero_camera .pub pi@192.168.1.215: /home/pi/
|
で作成したファイルをコピー
1 | ssh -o IdentitiesOnly= yes pi@192.168.1.215
|
でラズパイにログイン
1 2 3 | cat zero_camera.pub >> . ssh /authorized_keys
chmod 700 . ssh /
chmod 600 . ssh /authorized_keys
|
で
一度ログアウトし
1 | ssh -i . ssh /zero_camera pi@192.168.1.215
|
で
公開鍵認証でログインできるのを確認
で
vim をインストール
1 | sudo vim /etc/ssh/sshd_config
|
で設定ファイルを開き
パスワード認証を禁止
1 2 3 4 | PermitEmptyPasswords no
PasswordAuthentication no
AuthorizedKeyFile . ssh /authorized_keys
|
を設定
で設定の確認
1 | sudo /etc/init .d /ssh restart
|
で
ssh の再起動
これで
次に Google Drive の設定
Google Drive のマウントに必要なものをインストール
1 2 | sudo apt install opam
opam init
|
1 | Do you want opam to modify ~/.profile? [N /y/f ]
|
とでてくるので検索
opamを用いたOCamlプロジェクトのセットアップ方法
によれば
yでOK
1 2 | 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 させるか
ということらしい
しかし
1 2 3 4 5 6 7 | [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
|
となる
続いて
1 2 | opam update
opam install depext
|
を実行すると
1 2 | [ERROR] No switch is currently set . Please use 'opam switch' to set or install
a switch
|
となる
OCaml の環境構築
によれば
OPAMがおかしくなったら、 ~/.opam を削除すれば初期化できる
とのことなので
で一度削除
を実行
1 2 3 4 | 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
にしてみたが変わらないので
一度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <><> 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 を選択
最後に
1 2 3 | User configuration:
~/.profile is already up-to- date .
[NOTE] Make sure that ~/.profile is well sourced in your ~/.bashrc.
|
となるので
を実行
インストールしたOCamlをパスに加えるので
1 2 3 | eval $(opam env )
opam switch list-available
|
で利用可能なあっケージを調べる
Official release が公式らしい
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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
|
となるので
1 | opam switch create 4.12.0
|
としたが
1 | [ERROR] ocaml-base-compiler = 4.12.0 unknown package
|
となる
OCamlについてとりあえずメモ
を参考に
1 | sudo apt install opam ocaml gcc make bubblewrap m4 pkg-config
|
をしたが変わらない
再度
で削除し
1 2 3 4 5 6 7 8 | <><> 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
|
となったので
を実行
しかし
同じエラーがでる
再度
1 | Do you want opam to modify ~/.bash_profile? [N /y/f ]
|
のとき
N
を選択し
1 2 | 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
とした
1 2 3 4 5 6 7 | [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
とした後に
を実行
このあと
を実行したが
1 2 | [ERROR] No switch is currently set . Please use 'opam switch' to set or install
a switch
|
となる
1 | opam switch create 4.12.0
|
を実行すると
1 2 3 4 5 6 7 | [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
|
となる
エラーログから
1 | Please use 'opam switch' to set or install a switch
|
とあったので検索
opam not creating a switch #4023
の中の
1 2 3 | There is some packaging issues of opam (cf.
Can you try this workaround ?
|
を参考に
で検索
How To Install “aspcud” Package on Ubuntu
を参考に
でインストール
debian testing/ubuntu disco opam packages result in solver failure on init
を参考に
1 | opam switch create 4.12.0 --solver=mccs
|
としたが変わらない
このため一度以前作成したラズパイゼロとの
バージョン差分を調べることにする
で調べた結果
2.0.3
に対し
以前作成したものは
ver 1.2.2
だった
このため一度 Google Drive への保存を保留にして
先に Bluetooth ボタンでシャットダウン機能の実装とOpenCVを先に実験する
今回作成するものは車で走行しているときの動画の保存と解析が目的
なので
古い写真と動画を圧縮保存するようにして
自宅に帰ったときにNASに保存するようにする
まず bluetooth の設定
1 2 | sudo apt install bluez bluetooth libbluetooth-dev build-essential
sudo apt install bluez-cups
|
で必要なパッケージのインストール
次にgem でインストール
1 2 | sudo apt install ruby
sudo gem install bluebutton
|
これはダイソーの300円のボタンを使う
1 2 3 | sudo bluetoothctl
power on
scan on
|
で
MACアドレスを表示されたら
1 2 3 | 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の環境を構築する
1 2 3 4 5 | 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 の後に
とすると
1 2 3 4 5 6 7 8 | 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]
を参考に
インストールはできたようだが
1 2 | 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.
|
とエラーがでる
1 | 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を通さなくても
で呼び出せるらしいので
そのまますすめる
この状態で
として何もエラーがでなければ成功
バージョン確認は
でOK
ctrl + d で抜ける
とりあえず
opencv の設定はできたので
次に定期的にカメラで動画撮影する
動画の撮影は
raspivid コマンド
もしくは
motion コマンド
でできる
motion の場合動体検知などができるが
今回は raspivid コマンドで実行する
出力されるファイル形式は
.h264 になる
-t でミリ秒単位で撮影時間を指定できる
なおミリ秒は0.001 秒なので
10000ミリ秒なら10秒となる
-rot で角度の指定が可能
180度回転させるなら
-rot 180
となる
カメラの向きが上下反転しているなら
-vf
左右反転なら
-hf
を指定することで解決
これについては
Raspberry Pi Zeroで簡易ドライブレコーダーを自作する
を参考に
取り付ける場所がルームミラーの裏にしたいので
横向きになるので
1 | raspivid -o test .h264 -rot 270 -t 10000
|
とすることで角度調整ができた
次に
-fps でフレームノート
-b でビットレートを指定する
ファイル名がかぶらないように
date コマンドで日時を撮影した日時にして保存する
1 2 | raspivid -o ` date '+%Y%m%d-%H%M' `.h264 \
-rot 270 -w 1280 -h 720 -t 20000 -fps 30 -b 2000000
|
これをスクリプトファイルにするので
でファイルを作成し
1 2 3 | #!/bin/sh
raspivid -o ` date '+%Y%m%d-%H%M' `.h264 \
-rot 270 -w 1280 -h 720 -t 20000 -fps 30 -b 2000000
|
として保存
なお
はバッククォートで囲っている
shift + @ でバッククォートになる
‘ と似ているので注意
で実行権限を付与
これを cron で実行できるようにする
を実行
1 2 3 4 5 6 7 | 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 | * /1 * * * * /home/pi/video .sh
|
を追記して保存
これで1分ごとに20秒の動画が撮影される
このままだとどんどんファイルが増えていくので
で動画を保存するディレクトリを作成
1 2 3 | #!/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
|
というように保存先を指定
今まで撮影したファイルについては
で一緒に保存しておく
これで一日おいておいたらすごい量のファイルになっているので
シャットダウンボタンを設定する
で
キーイベント取得のためのモジュールインストール
あと
100均Bluetoothボタンをラズパイ活用
で
別の機器(ラズパイやスマホ)に繋ぐ場合は、最後に繋げた機器とペアリングを確実に削除すること(デバイスの電源OFFや電池を抜いてもダメ)
とあったので
新規に電池とともに
ダイソーで購入することに
一日たってから
で容量を確認したところ
5GBほど容量をとりほぼ夜中は起動しても無駄になりそうなので
motion で撮影することに
これなら動体検知になるのでそこまで容量をとらないはず
でファイルを開き
を最終行に追記
あとは
で再起動
次に motion のインストール
でリポジトリを更新し
1 | sudo apt install -y motion
|
で motion をインストール
次に設定ファイルの編集
1 | sudo vim /etc/motion/motion .conf
|
で設定ファイルを開き
11行めの
を
に変更
79行目あたりの
を
に変更
を
に変更
86行目あたりの
を
に変更
framerateは
動体を検知した時に画像をキャプチャするフレームレートの最大値
大きくするとCPU負荷も上がるが
動きがなめらかになる
233行目あたりの
を
に変更
eventgap は
動体検知が収まってから再度検知するまでの秒
461行めの
を
に変更
stream_localhost は
ライブストリームへのアクセスをローカルホストからのみに制限する
on だとローカルホストのみ
次に撮影関連の設定
デフォルトだと撮影時間が無制限なので
237行目の
から任意の撮影秒数に変更
今回は20秒に設定
とした
これで保存
そして、自動的に motion を起動できるようにしたいので
1 | sudo nano /etc/default/motion
|
でファイルを開き
を
として保存
次に insserv パッケージをインストール
あとは
これで自動起動設定も完了
もし、自動起動していないのなら
で motion を起動
しかしうまく起動していないため
深夜での撮影はしないため
撮影する時刻を
朝5時から夜9時までに変更するため
crontab -e
で
1 | * /1 * * * * /home/pi/video .sh
|
を
1 | * /1 5-21 * * * /home/pi/video .sh
|
として保存
設定は左から
分 時 日 月 曜日
となっている
書き方については
crontabの書き方
を参考に
次に古いファイルの削除
基本的に週1でデータ管理しようと思うので
それ以前のデータは削除するようにする
Raspberry Pi で監視カメラを作ってみた
を参考にスクリプトを設定
1 | sudo vim /etc/cron .daily /delete_movie .sh
|
内容を
1 2 3 | #!/bin/bash
find ~ /drive_rec/ \( -name '*.h264' \) -mtime +7 -delete
exit 0
|
として保存
1 | sudo chmod +x /etc/cron .daily /delete_movie .sh
|
で実行権限付与
これで7日間変更がないなら削除されるようになる
ボタン電池を購入したのでbluetooth ボタンの続き
簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編
を参考に
1 2 | sudo apt install bluez bluetooth libbluetooth-dev build-essential
sudo apt install bluez-cups
|
これで
でファイルを作成
1 2 | #!/bin/bash
sudo shutdown -h now
|
として保存
1 | sudo chmod +x shutdown .sh
|
で実行権限付与
1 | sudo vim ~/.config /bluebutton
|
で内容を
1 2 3 4 | keyup= echo UP && ~ /shutdown .sh
keydown= echo DOWN
longup= echo LONG UP
longdown= echo LONG DOWN
|
として保存
1 | sudo bluebutton -c ~/.config /bluebutton
|
だと
1 | sh: 1: /root/shutdown .sh: not found
|
となってしまうが
1 | bluebutton -d= "AB Shutter3" -c /home/pi/ .config /bluebutton
|
として
ボタンを押すと無事にシャットダウンができた
このままだと使えないので
起動したら
bluetooth が使えるように設定
Crontabにシステム起動時に1度だけコマンドが実行されるように設定する方法
によれば
@reboot
で設定ができるらしい
Shutter3とRaspberry Pi Zero Wを使ったBluetoothボタンの制御まとめ
で書いてあったものを参考に
で
1 2 3 | #!/bin/sh
command = "bluebutton -d=" AB Shutter3 " -c /home/pi/.config/bluebutton"
eval $ command
|
として保存
で実行権限付与
で最終行に
1 | @reboot /home/pi/blbtn .sh
|
を記述して保存
実際に起動しているか調べるため再起動
しかし動作しないためこれは保留
100均のBluetoothシャッターとRaspberry Piカメラでオンラインデジカメを作ってみた
を参考に
1 | sudo vim ~/.config /bluebutton
|
でファイルを編集
内容を
1 2 3 4 | keyup= echo UP ; ~ /shutdown .sh
keydown= echo SHUTDOWN
longup= echo LONG UP
longdown= echo LONG DOWN
|
として保存
で
bluebutton のパスを確認したら
1 | /usr/local/bin/bluebutton
|
だったので
で設定ファイルを開き
1 | @reboot /home/pi/blbtn .sh
|
を削除
1 | @reboot /usr/local/bin/bluebutton -d= "AB Shutter3" -c /home/pi/ .config /bluebutton
|
を最終行に追記
これで
で再起動させて
しらばくたってから
AB Shutter3
のボタンを押すとシャットダウンが実行される
なお端末画面には
ECHO で設定した画面が表示されないので注意
またすでに他のラズパイzero で実験している場合
一度ペアリングを解除しないと他の端末で使えないので注意
bluetoothctl
でペアリング解除などが載っているので参考に