kimagre inrash

感想を書きます

Raspberry Pi 3 と LOGICOOL C270 でネコ観察カメラを作る

time 2018/03/02

Raspberry Pi 3

rp3.jpg
前回は
で「パケット遅延器」作ってました。
それによる検証は終わったのでしばらく特に使っていませんでしたが、「ネコ観察カメラ」が作りたくなりました。
「ネコ観察カメラ」のイメージとしては
  • 一定時間ごとにカメラで静止画を撮影し、それをLINEで通知
する感じです。

ブリッジ接続・アクセスポイントを辞める

パケットを経由させる関係上、【有線-無線でブリッジ接続】【無線アクセスポイント化】してましたが、まずはこれらを戻す必要があります。
やりかたとしては設定方法と逆手順をすればいいハズです。
◆ブリッジ接続の無効化
$ sudo nano /etc/network/interfaces

# auto br0
# iface br0 inet dhcp
# bridge_ports eth0 wlan0
◆アクセスポイントの無効化
$ sudo nano /etc/hostapd/hostapd.conf
#interface=wlan0#bridge=br0#driver=nl80211
#
#ssid=[SSID]
#country_code=JP
#hw_mode=g
#channel=7
#auth_algs=1
#ieee80211n=1
#
#wpa=2
#wpa_passphrase=[PASS]
#wpa_key_mgmt=WPA-PSK
#rsn_pairwise=CCMP
◆デーモンの無効化
$ sudo nano /etc/default/hostapd

#DAEMON_CONF=”/etc/hostapd/hostapd.conf”
◆再起動
$ sudo reboot
これでOK。

WiFi接続

Raspberry Pi 3 を使ってみる Wi-Fi設定

ちょっとだけハマった。上記ページ参照して解決。
WiFiのカントリーコードを正しく設定しないとダメでした。
ついでにIPも固定。

カメラを接続

LOGICOOL ウェブカム HD画質 120万画素 C270
ロジクール (2010-08-20)
売り上げランキング: 66
ヨドバシで1300円くらいで購入。
性能的にはアレだけど、ちょっと試すのにいい値段だったので。
上記を参考に設定していきます。
◆USBにカメラを接続
$ lsusb
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
無事認識している。
◆fswebcamをインストール
$ sudo apt-get install fswebcam
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
E: パッケージ fswebcam が見つかりません
あれ?インストールできない??
$sudo apt-get update
パッケージリストを更新して、再び試す。
$ sudo apt-get install fswebcam
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  fswebcam
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 141 個。
44.0 kB のアーカイブを取得する必要があります。
この操作後に追加で 105 kB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian stretch/main armhf fswebcam armhf 20140113-1 [44.0 kB]
44.0 kB を 1秒 で取得しました (27.1 kB/s)
以前に未選択のパッケージ fswebcam を選択しています。
(データベースを読み込んでいます ... 現在 123041 個のファイルとディレクトリがインストールされています。)
.../fswebcam_20140113-1_armhf.deb を展開する準備をしています ...
fswebcam (20140113-1) を展開しています...
fswebcam (20140113-1) を設定しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
出来たっぽい。
◆試しに撮影してみる
$ fswebcam webcam.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'webcam.jpg'.
webcam.jpg
初期設定だと解像度が低い模様。
$ fswebcam -r 1280x720 webcam2.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'webcam2.jpg'.
webcam2.jpg
撮れた。
(※画像右下の□は文字化け。日本語フォントが正しく入っていなかったのが原因。入れれば解消される)
たまに
$ fswebcam -r 640x360 webcam6.jpg
--- Opening /dev/video0...
Trying source module v4l2...
Error opening device: /dev/video0
open: Permission denied
Trying source module v4l1...
Error opening device: /dev/video0
open: Permission denied
Unable to find a source module that can read /dev/video0.
こうなって撮影できない場合があるみたい。
具体的に解決方法がよくわからない。

GoogleDriveにアップロード

撮影してLINEにそれが通知できればそれで完了なのですが、せっかくなので撮影した静止画をGoogleDriveにアップロードするようにしてみます。
gdriveインストール先は /usr/bin にしました。
# ファイル、フォルダの一覧表示
$ gdrive list
image.jpgをアップロードする場合
# アップロード
$ gdrive upload image.jpg
そのままアップロードするとルートに大量の画像が増えていくことになるのでディレクトリに格納するようにする。
# ディレクトリを作成
$ gdrive mkdir raspi
Directory [コード] created
ディレクトリを作成するとコードが発行されるのでそれを指定することで格納することが出来る。
(※既に作ってあるディレクトリに入れたければ、gdrive list などで該当のコードが判明すれば入れることが可能)
# ディレクトリにアップロード
$ gdrive upload --parent [コード] image.jpg

シェル作成

一定時間ごとに実行するために以下のシェルを作成。
webcam.sh

#!/bin/bash

# 時刻取得
DATE=$(date +"%Y-%m-%d_%H%M%S")

# 撮影
fswebcam -r 1280x720 /home/pi/webcam/$DATE.jpg

# GoogleDriveにアップロード
gdrive upload --parent [コード] /home/pi/webcam/$DATE.jpg

# 該当ファイルを削除
rm /home/pi/webcam/$DATE.jpg
撮影ファイルは一定期間残しておいて溜まってきたら消す、でも良さそう。
次はそのシェルを自動実行させる。
上記サイトの「4.cronの設定」を参考に設定。
cronについてはコチラを参考にしました。
$ crontab -e
# 1分毎に実行
*/1 * * * * /home/pi/webcam/webcam.sh
※注意点は【絶対パス】で指定する必要があること。

IFTTTを使ってLINEに通知

IFTTTは何かのサービスをトリガーにして様々なことができるサービス。
最近使うのにハマってます。
【GoogleDriveの特定のフォルダに新しいファイルがアップロードされるたびにLINEに通知】
というので目的を達成してみます。
capture1497.jpg
capture1495.jpgcapture1496.jpg
無事LINEに通知が来たけれど、URLをタップしないと画像が見れない・・・!これでは意味がない!
別の方法を考える。

Twitterに投稿する

色々探してみたけれど、一番簡単に出来そうなのが、Twitter。
やってる人も多いので・・と思いましたが、私の環境ではうまく行かず。
(composerまわりでうまくTwitterOAuthが導入できなかった。curl周りで問題発生)
よって別の方法を考える。
コチラを参考にPythonで。
シェルからpythonの関数呼び出し、引数渡しが分からなかったので画像ファイル名を統一にして渡さなくても問題ないように修正。
しかし、LINE上には画像が送られてこない・・・!
(URLが飛んできて開くと画像が見れる形。望んでいた形ではない)
しかも、チェック間隔は1時間。うーん・・

IFTTTの設定を変えてみる

capture1498.jpg
Twitterとかいろいろやってみたけど、GoogleDrive側でなんか出来ないか考える。
IFTTTのGoogleDrive設定で
【Photo URL (optional)】に{{FileUrl}}をいれれば、LINE上にもそのまま画像が届くことが判明。
(※Messageに何も設定しないというのはダメみたいです。)
随分遠回りしたけれど、これにて解決!

まとめ

2018-03-02_205701.jpg
元々「ボーダーブレイク」や「ラブプラス」の情報を集めるために調べていたら以下のような流れでIFTTTに辿り着きました。
  1. Googleアラートで指定したトピック(ボーダーブレイク、ラブプラスなど)が来た際にRSS発行
  2. feedly無料版だとGoogleアラートが受け取れないことが判明
  3. 別のRSSリーダー使う方法もあったけど、せっかくだからLINE通知してくれるモノを探す
  4. IFTTTでRSS更新をトリガーにしてLINE通知出来ることを知る
  5. 同様についったーで特定語がツイートされるとLINE通知する仕組みも導入
  6. それっぽい情報は集まってくるけど、これだけだとノイズが多すぎる
  7. 一旦IFTTTによるニュース収集を断念
  8. しかし、IFTTT自体は面白い仕組み。何かに使えないか考える
  9. RaspberryPiとの組み合わせでネコ定点カメラを作ってみることに
ここまで作っておいて【結局ネコは寝てる】てことに気が付きました。
LINEで通知は来るけど、動きがないので全然楽しくない、ていう。
妻にも通知いくようにしましたが、速攻で通知OFFにされました・・
でも、ついったーに画像が溜まっていくのは楽しいのでこれはちょっとだけ継続するかもしれません。
これの発展でディスプレイに映った映像を一定間隔ごとに貯めてくとかも楽しそう。
(テレビで見た画像とかゲームの画面とかを自動で)
もっと発展させて冷蔵庫の中身をついったーに投稿するとか作りたいけど、なかなか難しそう。
元々やろうとしていたニュース集めるやつはノイズの中にも使えそうな情報があったのでそれを抽出する仕組みを検討中。

追記(2018.03.03)

一日動かしてみてわかったことがあるのでこの記事でまとめ。
◆ついったーが投稿エラーになる
同じツイートを投稿し続けていたのでそれで引っかかった?
調べてみると発行したトークンがなくなってた。
とりあえず再発行して時刻などの変化する文字列をツイートに仕込んでみて現在お試し中。
◆やっぱりカメラがエラーになる
GoogleDriveにたまった写真を見てみると2分毎のものしか残っていなかった。
cronは1分間隔にしていたのでおそらく2回に1回、カメラがエラーになっている模様。
現在2分間隔にして試していますが、4分間隔で写真が届いている模様。
やっぱりエラーになってるぽいなあ・・安定感にかける。
エラーのこと考えると間隔は1分でついったーへの投稿を2分間隔にする、とかかなあ

追記(2018.03.16)

2週間使ってみたまとめ。
◆ついったー
投稿頻度下げたり、時刻などの文字列を入れたツイートに変えてみましたが、凍結されたりしました。
鍵掛けしたり、フォロワーがいないのも影響してたかもしれません。
毎回凍結解除手続きするのが手間なので使うのを辞めました。
◆googleDrive
ドライブの容量がガリガリ減っていくけれど、IFTTTのgoogleDrive->googlePhotoのレシピ使うことで容量消費なしで写真を貯めていくことが出来ました。
レシピ的には
googleDriveの特定フォルダに入った写真をgooglePhotoの特定のアルバムに入れる、というもの。
これだけだとgoogleDriveのフォルダ内に容量消費したままのものが残るのでそれは手動で削除してます(現状は)。
自動で消して新しいモノ作って・・・というところまで出来ますが、フォルダのコードを自動で入手する手段がないのと、
googlePhotoの1アルバムに入れることが出来る上限が2000枚ということもあって結局定期的にメンテする必要があることから、現在は手動にしてます。
もうちょっと考えればできそうな気もするんですが、一旦保留。
◆LINE
外にいて様子が見たくなったら、googlePhotoを見るかIFTTTのレシピ(googleDrive -> LINE)を有効にしてLINEに届くようにしてます。
◆やっぱりカメラがエラーになる
もう諦めてます。
ついったー辞めたこともあって間隔を1分にしてなるべく多くの枚数が残るように方針変更してます。

前後記事

Raspberry Pi 3 でパケット遅延器を作る(有線-無線ブリッジ)
Raspberry Pi Zero W + カメラモジュール でネコ観察カメラ2代目を作る