愛する人を見守りたい

09/27

見守りの重要性

目次

ギニーピッグって名前が可愛そう

モルモットって名前がネガティブな使われ方をされる。
アメリカではどうなのかと思ったら、同じ使われ方で悲しい限り。

「モルモットはお嫌?」

今回モルモットが新しい家族として仲間入りしたので、そのモル吉の在宅状況を見守りたいというのが今回の趣旨。

モルパイを作る

モル吉を監視するためのラズベリーパイを使ったシステム、名付けてモルパイを構築する
用意したものは以下の通り。

購入したもの

品名 金額
Raspberry Pi Zero WH 2,630円
Buffalo BSWHD06M USB Camerahttps://images-na.ssl-images-amazon.com/images/I/516sIbSvCIL._AC_SL1000_.jpg 1,390円
SanDisk SDSQUAR-032G-GN6MN 32GB https://images-na.ssl-images-amazon.com/images/I/61%2BhTHXdUvL._AC_SL1500_.jpg 480円
合計 4,500円

監視サーバ立てるのに5,000円切る時代。
すごい時代になったもんだ。

「人類の科学は、技術は、こんな小さなものを作ることが出来るというのか」(逆)

家にあったもの

  • 電源用USBケーブル(かなり大事)
  • マイクロUSB type B <-> USB type A 変換ケーブル(かなり大事)
  • マイクロSD <-> SD変換アダプタ(大事)

この3つは重要パーツで、特に電源ケーブルは経験上絶対にケチってはいけない。絶対に。
安いの使うのはラズパイにおいて(てか、全ての電子機器に言えることだけど)致命的なのでここはちゃんとしたのを用意するべき。
100均とかの安いほっそいケーブルは絶対やめるべき。
USBカメラはUSB type Aケーブルで、ラズパイがマイクロUSB type Bなので変換アダプタが必要。
こんなの。

そして、マイクロSDカードを母艦PCでマウントして操作する必要があるので変換アダプタが必要である。
こんなの。

ただしマイクロSDカードを直接挿すことができるのなら必要はない。

モルパイ構成

ラズパイにUSBカメラを接続して、定期的に静止画を保存しておく。
そのリソースをWeb経由で見せる。
1日前の古い写真は一つに集約してタイムラプス動画にする。
ここらへんまではちゃちゃっと構築したい。
ま、簡単簡単。
お安い御用だ、キャプテン。

graph TD
  sv1[Raspberry Pi Zero WH]
  dev1[/USB Camera\]
  nw1((WiFi Access Point))
  sv1---|usb|dev1
  sv1-.-|WiFi|nw1
  style sv1 fill:#efb
  style dev1 fill:#9ee
  style nw1 fill:#faa
graph LR
  srv1[fswebcam]
  dev1[/USB Cam\]
  srv2[express]
  srv3[ffmpeg]
  dev2[/SD card/]
  dev3[[Smart Phone]]

  srv1-->|Request JPG|dev1
  dev1-->|Response JPG|srv1
  srv1-->|JPG file|dev2
  srv3-->|Request JPG files|dev2
  dev2-->|Response JPG files|srv3
  srv3-->|MPG file|dev2
  dev3-->|Request Resources|srv2
  srv2-->|Request Web Resources|dev2
  dev2-->|Response Web Resources|srv2
  srv2-->|Response Web Resources|dev3

  style srv1 fill:#bfa
  style srv2 fill:#bfa
  style srv3 fill:#bfa
  style dev1 fill:#ffa
  style dev2 fill:#aaf
  style dev3 fill:#333,color:#eee

構成はこんな感じ。
Webは直接見せるのではなく、間接的にみせようかなと。
そこらへんの紹介は割愛。

構築

では、今回ラズパイをヘッドレス(モニタやキーボードを接続しない)でセットアップしていく。
家にはLinuxとMac Bookしかないが、メインPCはLinuxなのでここではDebian GNU/Linux 10 (buster)を前提に説明していく。

バスターは2のときは可愛かったが、3では立派な(?)大人に様変わり。

OSインストール

ヘッドレスではここからが非常に大事。
これをミスすると、追加でminiHDMIのケーブルを買ったりなんなりと面倒。
ここではSDカードにRaspberry Pi OSをSDカードにインストールするのにRaspberry Pi Imagerというツールを使用する。
今まではddコマンドなどを使用して直接SDカードに書き込んでいたりしてたけど、このツールによってそこらへんの面倒なことは一切考えなくて良くなった。
ま、ヘッドレスでのインストールはそのあとが面倒なのだが。

さて、私はdebファイルをダウンロードして以下とした。

$ sudo apt install ./Downloads/imager_1.4_amd64.deb

xfce4あたりを使っているとメニューに自動的に入っているので、そこから起動する。
ここからはかんたん3ステップで終了する。

ホップ、ステップ、、、しかしてないか。

  1. OSを選ぶ(CHOOSE OSから選ぶ)
  2. SDカードを選ぶ(CHOOSE SD CARDから選ぶ)
  3. WRITE!(WRITEボタンを押す)

こんなに簡単ならもっとRaspberry Pi OSが広まりそう。
今回はRaspberry Pi OS(32bit)を選んだ。
SDカードは適当にdmesgコマンドで認識しているデバイスファイルを検索してもらえればよい。

OSカスタマイズ(非常に大事)

さて、必要なデータはSDカードにコピーされたので、ここからは家で動かすために必要な情報を入れていく。

WiFiセットアップ

最初に必要なのはまずはネットワーク。
これがつながらないと何も始まらない。
There’s nothing to start any longer, but we can be chatting and netflixing.

さて、家のWiFi環境をつなぐためにはまずは接続するためのCredentialなファイルを作成する必要がある。
PC側で以下のコマンドを実行する。

$ sudo dmesg |grep sd
....
$ sudo mount -t vfat /dev/sdb1 /media/boot
$ vi wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
$ wpa_passphrase ssid passphrase
network={
        ssid="ssid"
        #psk="passphrase"
        psk=2b1d17284c5410ee5eaae7151290e9744af2182b0eb8af20dd4ebb415928f726
}
$ wpa_passphrase ssid passphrase |grep -v "#psk" >>wpa_supplicant.conf
$ mv wpa_supplicant.conf /media/boot/

何をしているかというと、まずPCに挿したSDカードを探して第一パーティションを/media/bootにマウント。
次にWiFi接続情報を作成し、先程の/media/bootにコピーしている。
ssidとpassphraseってところは適宜読み替えてほしい。
アクセスポイントが複数あれば、その回数分wpa_passphraseコマンドを繰り返す。
大事なのはpskのところに生パスフレーズがあるので除外すべきと思う。
一応コピーされるファイルはownerは0:0でfilemodeは0600なのでそんなに恐れるものでもないとは思うが。

SSHサーバを起動

初回起動ではSSHが有効になっていないため自動起動するように。

$ touch /media/boot/ssh
$ sudo umount /media/boot

これもやっておかないと、ラズパイはただの箸置きと一緒。
it’ll come a chopstick rest if you didn’t do this.

これでラズパイ起動時に/bootにwpa_supplicant.confを探して、存在したら/etc/wpa_supplicantの下にコピーしてくれて、wlan0でネットワーク接続を試みてくれる。
また、/bootにsshも探して、存在したらsshdを起動してくれる。

パワー、オンヌッ

それでは、電源を投入する。
それぽちっとな。

※電源ボタンではない。

WiFiアクセスポイントの管理画面とDHCPサーバのIPのリース状況とにらめっこしてたら、それらしい接続を発見。

そうそうだそう。

接続

IPが分かったので、SSH接続してみる。

$ ssh [email protected]

パスワード認証が有効なっているので、piユーザでアクセス。
パスワードはraspberry。
接続を確認できたところで、パスワードを変更しておく。
次はカメラを接続する。

ハイ、チーズ!

アンアン!

買ってきたWebカメラを接続する。
dmesgを使って/dev/videoNに登録されていればOK。
次にキャプチャコマンドを用意して写真をパチリと撮ってみる。

$ sudo apt-get install fswebcam
$ fswebcam -r 1280x720 -F 1 -S 0 ./test.jpg

このJPGファイルをPCにダウンロードして見れることを確認する。

見える!見えるぞ!

これを1分に一回撮るように設定しておく。
私の場合はShell ScriptとCronのお世話になって年月日時分秒のファイル名で保存させることにした。
ここらへんはいくらでもやり方はあると思うので割愛。

あ、写真の右下に日付を入れているのだが、それが文字化けしていたので、以下のフォントを入れています。

$ sudo apt-get install fonts-noto

これで文字化けが解消された。

外部からも見えるように

このファイルを見るために、Webサーバを用意する。
以前のスマートスピーカのやつと同様ラズパイ=Node.jsって感じがするので、今回もそうする。
ってことで、expressを入れることにして、まそこらへんの情報もどこにでも転がっているので割愛。

タイムラプス動画にする

次に、1時間に60ファイルできるJPGファイルをタイムラプス動画にしたら面白いなぁってことでモル吉が目まぐるしく動く様を見てみたいと思いそれを入れてみる。
で、JPG連結させるのにffmpegコマンドを使う。
あとで動体検知もやってみたかったので、motionを入れて根こそぎ必要なものを入れてみる。

$ sudo apt-get install motion

で、私は以下の通りにしてみた。
当初1日分のファイルを対象にしたかったのだが、1,440ファイルの数をエンコードするのにかなりの時間がかかりそうだったので1時間単位にしてみた。

$ dquery=$(date +%Y%m%d%H); cnt=1; for i in $SAVEDIR/$dquery????.jpg; \
do \
  ln $i $TMPDIR/$(printf %04d ${cnt}).jpg; \
  cnt=$(expr ${cnt} + 1); \
done && \
ffmpeg -f image2 -r 10 -an -i $TMPDIR/%04d.jpg -vcodec libx264 -pix_fmt yuv420p $TMPDIR/$dquery.mp4; && \
mv $TMPDIR/$dquery.mp4 $SAVEDIR/; \
rm -f $TMPDIR/$dquery.mp4 $TMPDIR/*.jpg; \
rm -f $SAVEDIR/$dquery*.jpg

長ったらしいコマンドだが、まず動画用のJPGファイルをテンポラリのディレクトリにハードリンクを作る。そのときにファイル名は数字の連番としている。
そのファイルを基にH264コーデックで10fpsの動画を作成している。60ファイルで10fpsなので6秒ということに。
コマンドが成功したらファイルを削除するってことをしている。
細かい制御はShell Scriptにてブラシアップさせることにして動作確認は完了できたので、実際にその6秒ファイルを見てみた。

ほとんど動かない、、、。

満足ではある

最後は、結構端折った。
本当は外部に公開させるために、ドメインを取得し、ApacheからRe-Proxyさせ、認証機能をつけたりしたし、Node.js側でも写真を効率よく見せるためにlightgallery.jsを使ってみたりと、試行錯誤をしてみた。
苦労した分、ちゃんと見守りができているので満足している。

次は

YouTubeにモル吉アカウントを作って、ライブ配信をしてみたいと思う。


コメント: