シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

初心者がラズベリーパイで監視カメラを作る方法【まとめ】

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

初心者の自分がラズベリーパイで監視カメラを安価で作ったのでそれについて詳しく書いていこうと思う。幾つかこういうサイトやブログはあるが、どこもその通りだけではなぜか作れず、とても苦労をしたので、初心者にもわかりやすくなるべく書いていこうと思う。

今回の内容

今回の内容は、Slackというアプリに監視カメラで取った映像を自動的にラズベリーパイに直接送ってもらうという内容にしてある。

必要なもの

ラズベリーパイ、ウェブカメラ、ソフトウェアはmotion、pipである。

準備ーラズベリーパイ編

sudo apt-get upgrade 
sudo apt-get update 
sudo apt-get dist-upgrade 
sudo rpi-update
sudo apt-get install motion
sudo apt-get install python-pip
sudo pip install slacker

Do you want to continue [Y/n]?という質問がそれぞれ出てきた場合

Yと押してエンターを押す。

準備ーウェブ編

https://slack.comでアカウント登録をする。

アカウント左側から新しいグループを作る

slack

チャンネルネームは英語で、何でも好きなやつでいいが、cameraupがわかりやすいのでいいのではないだろうか?

スクリーンショット 2016-05-02 3.01.09

APIトークンを取得する。

APIトークン設定ページに行き、左側のTokens for Testingからテストトークンを取得する。

下の画像の赤い枠のところにCREATEというボタンが最初の人は出るだろう。

Tokenのところにある下のxoxp-3920〜〜というのがトークンでこのすご~く長いやつがこれから重要になる。Re-issuetokenというボタンを押すと新しいトークンに変わってしまうので押さないように。

https://api.slack.com/web

slack2

準備がすべて終わったら!

次はmotionの設定

下準備でモーションのインストールも終わっていると思うので、以下のコマンドをうち色々と編集していく。

sudo vi  /etc/motion/motion.conf
# Start in daemon (background) mode and release terminal (default: off)
daemon on
offからonに変える。
# Image width (pixels). Valid range: Camera dependent, default: 352
width 1280

# Image height (pixels). Valid range: Camera dependent, default: 288
height 720

キャプチャ解像度を指定します。ウェブカメラによって最大サイズ等は変わるのでカメラの解像度をググッて、自分で設定します。上手く認識しない場合は width 640、hight 480やwidth 640、height 352を指定します。
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 2
1秒間にキャプチャする最大フレーム数を指定します。(2-100:デフォルト 100 )
自分の場合は2に設定しました。

# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 150000
動体検知が検出するしきい値を設定します。映像の記録を開始するトリガーとなるので、この値が大きければ大きいほど鈍感になり、小さければ小さいほど敏感になります。
これは結構カメラの性能によって変わるので、自分は一番合ってる150000にしました。
少しの検知でも写真を取って欲しい場合は小さい値にします。

# Gap is the seconds of no motion detection that triggers the end of an event
# An event is defined as a series of motion images taken within a short timeframe.
# Recommended value is 60 seconds (Default). The value 0 is allowed and disables
# events causing all Motion to be written to one single mpeg file and no pre_capture.
gap 180

短時間で映像に変化があった場合、次の動体検知で記録するまでの感覚を指定します。
例えば、少し動いて止まる、を繰り返した場合、その都度動体検知が動くとバラバラの映像で記録されます。
この感覚を難病か指定します。gap 60とした場合は60秒以内にこのような変化があっても、一本の連続したイベントとみなし1つの映像として記録されます。
これは正直何秒でもいいです。
#Locate and draw a box around the moving object.
# Valid values: on, off and preview (default: off)
# Set to 'preview' will only draw a box in preview_shot pictures.
locate on

動体検知が作動している際に、映像に変化があった場合白いフレームを付けます。
これは必ずonにしとくべきかな?

# Restrict webcam connections to localhost only (default: on)
webcam_localhost off
# Restrict control connections to localhost only (default: on)
control_localhost off

それぞれ別のところに有りますが内容はほぼ同じです。ラズベリーパイ以外のパソコンからmotionの設定や映像を見たいときは両方ともをoffにしておきます。

# Command to be executed when a picture (.ppm|.jpg) is saved (default: none)
# To give the filename as an argument to a command append it with %f
#; on_picture_save value
on_picture_save python /home/pi/slack_bot.py %f
ここはとりあえず、これと全く同じにしておいてください。


on_event_start
動体検知時に起動するスクリプトを指定できます
on_event_end
動体検知終了時に起動するスクリプトを指定できます
on_picture_save
写真をsaveする度に起動するスクリプトを指定できます
on_movie_start
動画の撮影開始時に起動するスクリプトを指定できます
on_movie_end
動画の撮影終了時に起動するスクリプトを指定できます

以上のように色々あり、後ろに書いたコマンドを撮影等が終わったリはじまったりした時に動くようすることができます。

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp/motion
写真の保存場所を指定します。今回は/tmp/motionに設定

sudo vi /etc/default/motion
このファイルの中身の start_motion_daemon=no を yes にかえる

# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

最後に

sudo service motion stop
sudo service motion start
sudo reboot

とコマンドを打ち念のためすべてを再起動させます。

編集が終わったらちゃんと画像が取れているか確認

まず、画像が/tmp/motionに保存されているか確認します。

sudo motion -c /etc/motion/motion.conf

のコマンドをうち、/tmp/motionに画像が保存されているか確認します。

SSH等でraspberrypiを設定している場合は、この際いちいちラズベリーパイまで行って画面を見て確認しなければならないけどsamba等を予め入れておくと捗るでしょう・・・

ただ、そこは今回は省くので、ラズベリーパイのデスクトップが表示されてない人はstartxとコマンドでうち、デスクトップを起動させます。

motionの設定が終わったらslackerの設定

まずはpythonを起動します。

python

とコマンドを打ちます。

自分の場合はこのように表示されました

root@raspberrypi:/home/pi# python
Python 2.7.3 (default, Jan 13 2013, 11:20:46) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

上から順番にこのようにコマンドを打っていきます。

>>> from slacker import Slacker
>>> token = "xxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx"
>>> slacker = Slacker(token)
>>> channel_name = "#" + "general"
>>> message = 'テストだよ!!!'
>>> slacker.chat.post_message(channel_name, message)
<slacker.Response object at 0xb64aca50>

tokenというところは下準備で手に入れたAPIトークンをコピペしましょう。

後はすべておなじままで大丈夫ですが、赤くしているチャンネルネームのところは自分のチャンネルの名前、例えばcameraupとかにしておくとそっちのチャンネルに文字が打たれます。

自分が行ったらこんな感じででました。

>>> from slacker import Slacker
>>> token = "++++++"
>>> slacker = Slacker(token)
>>> channel_name = "#" + "camera"
>>> message= 'テストだよー'
>>> slacker.chat.post_message(channel_name, message)
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
<slacker.Response object at ++++++>
>>>

スクリーンショット 2016-05-02 4.15.08

文字も打たれているので成功でしょう。

ローマ字ででているのは二度やったのでです。

次に作ったチャンネルを確認します。

最初のウェブでの準備で作ったチャンネルのIDを確認します。

>>> slacker.channels.list().body

すると自分の場合こんな感じで長々と色々出てきました。

幾つか個人情報保護のため☓に置き換えてますが実際はすべて英語と数字です。

>>> slacker.channels.list().body

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

  InsecurePlatformWarning

{u'channels': [{u'is_general': False, u'name': u'cameraup', u'is_channel': True, u'created': 14☓☓☓☓☓☓9, u'is_member': True, u'is_archived': False, u'creator': u'U☓☓☓☓☓E', u'topic': {u'last_set': 0, u'value': u'', u'creator': u''}, u'num_members': 2, u'purpose': {u'last_set': 14☓☓☓☓☓☓9, u'value': u'☓☓☓☓@me.com', u'creator': u'U☓☓☓☓☓E'}, u'members': [u'U☓☓☓☓☓E', u'U☓☓☓☓☓☓☓8'], u'id': u'C☓☓☓☓☓☓7'}, {もっと長いけど省略

重要なところはこのcameraupという赤文字とcreatorの次のCから続く9文字の英数字です。

これがグループのチャンネルIDなので覚えておきましょう。

チャンネルを指定して画像をアップロードしていきます。

>>> result = slacker.files.upload('/var/lib/motion/test.jpg', channels=['C0G0XXXXX'])
>>> slacker.pins.add(channel='C0G0XXXXX', file_=result.body['file']['id'])
<slacker.Response object at 0xb64ee6b0>

自分で変える必要があるのは赤文字のところだけです。

Cから始まるやつは先程のチャンネルIDを入力します。

アップロードする画像ファイルはなんでもいいので、一番わかり易いのは/tmp/motionに入っている画像の名前をいれるのがわかりやすいのかなと

その場合は/tmp/motion/画像名.jpgになります。

Scriptを作成します。

Pythonスクリプト

ここのスクリプトからちゃんとダウンロードしてくること

他の人が作ったスクリプトですがこちらの中身をすべてコピーしてきます。

sudo su vi /home/pi/slack_bot.py

と打ち込み今度はスクリプをコピーして貼り付けます。

以下のとおりです。

# -*- coding: utf-8 -*-
import sys
from private import TOKEN
from slacker import Slacker
class Slack(object):
 __slacker = None
def __init__(self, token):
self.__slacker = Slacker(token)
def get_channnel_list(self):

raw_data = self.__slacker.channels.list().body
 channnels = []
for data in raw_data["channels"]:
 channnels.append(dict(channel_id=data["id"], channel_name=data["name"]))
return channnels
def post_to_file(self, file_path, channel):
 result = self.__slacker.files.upload(file_path, channels=[channel])
self.__slacker.pins.add(channel=channel, file_=result.body['file']['id'])
if __name__ == "__main__":
 param = sys.argv
 file_path = param[1]
 slack = Slack(TOKEN)
 channnels = slack.get_channnel_list()
 slack.post_to_file(file_path, channnels[0]["channel_id"])

次に実行権限の付与を行います。

chmod a+x /home/pi/slack_bot.py

次にトークンを入力します。

sudo vi /home/pi/private.py

と新しく入力し、

中身にAPIトークンを入力します。

TOKEN="xxxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx"

次に、コマンドを1つ打ちます。

python home/pi/slack_bot.py "file/to/path"

最後に

sudo motion -c /etc/motion/motion.conf

として、モーションを起動したら、後は勝手に写真がアップロードされるはず。

ここまでで写真はアップロードされるようになっているはず、

ただ、同じアカウントからだとアップロードされてもiPhoneにポップアップが来ないので、そこは新しいアカウントを追加して、そっちのアカウントで同じチャンネルに入り見るようにしました。

参考リンク

http://qiita.com/kinpira/items/bf1df2c1983ba79ba455

終わりに

参考リンクだけだと結構厳しかったです。

なので、色々調べて・・・

とりあえず、色々躓いたりしました。pinをインストールしたり

そんなこと書いてないじゃん!とか

あとはmotionの設定どこでやるんだっけ・・・とか

とにかく沢山

9時間ぐらい作るのにかかりましたとさ・・・。

ただこれでいつでも写真が送られてくるので安心

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

フォローする

スポンサーリンク

コメント

  1. JamesTwelp より:

    Праздники и дни рождения, которые мы переживаем, обычно не обходятся без цветов. Они оставляют красочные воспоминания о любой дате. У каждого человека есть цветок, ему он отдаёт предпочтение из общего разнообразия. В нашем широком цветочном ассортименте можно найти цветы на самый изысканный вкус.
    Если вы не уверены в точных предпочтениях человека, которому предназначаются цветы, можете остановить выбор на красивых букетах. Наши букеты сделаны опытными флористами. Букет из алых роз, красивых орхидей, прекрасных хризантем и других, удивляющих особой красотой цветов, будет чудесным подарком, как даме, так и джентльмену. Если вы желаете доставить радость женщине, то добавьте к букетунапример мягкую игрушку. Данный сюрприз станет по душе любой представительнице женского пола.
    Розы считаются самыми покупаемыми цветами. Даря розы, вы конечно же угодите любому человеку. Эти красивые цветы имеют уникальный аромат, который сможет радовать длительное время. У нас на складе имеется огромный выбор сортов роз различной длины и цветовой гаммы.

    цветы в санкт-петербурге

    На вопросы относительно выбора букета или создания его по индивидуальному заказу могут ответить наши специалисты.