作成日: 2017/12/19

ねこ(の画像)あつめ(ただし飼い猫のみ)

飼い猫の画像を集めたい

うちには、人間怖いー!(元野良なので)と、人間大好き!(元野良なのに)と、 お嬢ちゃん(ちょいぽちゃ)な3匹の猫がいます。 先日、飼い猫が3匹に増えているのを友人に知られ、呆れられたのですが、 これには色々と事情が…ブツブツ…。

と、それは置いといて、季節の挨拶状に使いたいから、飼い猫の画像を集めたい、、、 という時に、手作業で撮影するのは時間もかかるし、「人間怖いー」な子がいると苦労します。 ということで、Raspberry Pi、使ってみました。

材料
  • Raspberry Pi 3 Model B: 1 個
  • Raspberry Pi 用 カメラモジュール Rev 1.3: 1 個(バージョンは古いですがお手頃価格でした)
  • 赤外線センサーモジュール(HC-SR501): 1 個
  • A/D コンバーター(MCP3008): 1 個
  • フォトレジスタ: 1 個
  • LED: 1 個
  • 抵抗 510 Ω、10 kΩ:各 1 個
  • 線付きクリップ(両側にクリップの付いたものを半分に切り、片側をブレッドボードに差せるよう加工しました):2 個
  • ジャンパーワイヤー:少々

HC-SR501、MCP3008、フォトレジスタ、LED は、Raspberry Pi 3 Model B と OSOYOO 初心者キットの温湿度センサー (DHT11) のサンプル で使った、「OSOYOO(オソヨー)」の初心者向け電子工作キット「オソヨー電子工作キット(改良版) for Raspberry Pi 3 2 Model B」に付いていたものです。

接続

上記材料をブレッドボードに差して、Raspberry Pi とつなぎます。

飼い猫画像撮影機(ブレッドボード図)

ブレッドボードの真ん中の黒いのは MCP3008 です。抵抗はブレッドボードの左側(LED につながっている)が 510 Ω、右側(フォトレジスタおよび MCP3008 の CH0 につながっている)が10 kΩです。

飼い猫画像撮影機(接続の図)

接続が済んだので、猫にいたずらされないよう、箱に納めました。 25 枚入りフロッピーディスクのケース(プラスチック)があれば、収まりそうだし、おしゃれだねー、と探したのですが、はるか昔に捨ててしまったようで…。仕方なく何かの箱です。 手作り感満載ですが。。。

飼い猫画像撮影機(箱入り)

飼い猫画像撮影機(箱の中)

画像を保存するマシンの準備

Raspberry Pi のディスク容量が心配だったので、撮影した画像は他のマシンにアップロード・保存するようにしました。 保存するマシンは、撮影中は起動したままにしておきます。

以下の環境および設定が必要です。

マシンに アップローダのソース一式 をダウンロードし、コマンドラインから実行します。

python3 uploader.py

Raspberry Pi からアップロードされた画像は files ディレクトリ下に格納されます。

アドレス・ポートを変更する場合、uploader.py の host='0.0.0.0' および port=8080 を変更します。

run(host='0.0.0.0', port=8080, debug=True, reloader=False)

Raspberry Pi の準備

pi camera の設定と以下の環境が必要です。

Raspberry Pi に 撮影のソース一式 をダウンロードし、take_picture.py の IMG_UPLOAD_URL(画像ファイルのアップロード先)を、画像を保存するマシンに変更します。

IMG_UPLOAD_URL = 'http://192.168.1.4:8080/upload'

コマンドラインから実行します。

python3 take_picture.py

赤外線センサーが何かを感知した時、一定の明るさがあれば撮影を行い、画像を保存するマシンにアップロードします。

撮影するかどうかの明るさのしきい値の変更は、take_picture.py の PVALUE_THRESHOLD を調整します。

PVALUE_THRESHOLD = 850

PVALUE_THRESHOLD とフォトレジスタから取得した値を比較し 「フォトレジスタから取得した値 < PVALUE_THRESHOLD」 の場合に、撮影が行われます。

    def enough(self):
        pvalue = self.read_pvalue()
        ##print('enough(): pvalue: [%d]' % (pvalue))

        if pvalue < PVALUE_THRESHOLD:
            return True

上記の接続方法では、フォトレジスタから取得した値は、明るいと値が小さくなり、暗いと大きくなるため、 PVALUE_THRESHOLD を大きくすると比較的暗くても撮影が行われ、PVALUE_THRESHOLD を小さくすると暗いと撮影が行われません。
※take_picture.py 記載の 850 だと比較的暗くても撮影されます。

メモ(screen)

プログラムを実行したまま、ターミナルからログアウトしたい時は screen を使うと便利です。

例えば Ubuntu の場合、以下のコマンドでインストールできます。

 sudo apt-get install screen

ねこ(の画像)あつめ(ただし飼い猫のみ)

あとは待っているだけで、画像を保存するマシンに画像が貯まっていきます。

人がいる時といない時では、猫の行動も少し変わるようで、特に「人間怖いー」な子が、のびのび遊んでるのを見て、安心しました。

なお、、、当然、猫だけでなく人間も撮影されてしまいます。振る舞いに気をつけなければ…。 また、赤外線センサーが感知した時だけ撮影するようにはしたのですが、 部屋に差し込む陽の光が明るくなった時など、誰もいないのに撮影されることがありました。 幽霊ではないようで(たぶん)、、、ちょと残念。

じゃれあう猫ズ

※画像は一部加工済み(部屋が汚いので隠しました)です。

参考にさせていただいたページ

以下のページを参考にさせていただきました。

Raspberry Pi 側のプログラムは OSOYOO 様のサイトのサンプルをベースにさせていただいたのですが、 MCP3008 から値を取得する際、C と Python とでは事前の設定や値の取得方法が若干違うため、なんでかなぁ、、、と思っていました。 すごく勉強になりました!。どうもありがとうございます。