RaspberryPi+USBカメラで動体検知して、slackに画像を送信、Lチカ、サーボモーターを動かす

コーダー道場やおとプロでもそのうちラズパイやりたいなということで、活用例をひとつまとめてみました。

できること

RaspberryPiに繋げたUSBカメラ(右手前)で定点を観測し、変化を検知したら赤いLEDをチカチカさせて、サーボモーターを回し、写真を撮影してslackに送信します。

監視カメラ的に使うとこんな感じ。slackに通知されるので、外出先からでも簡単にチェックできます。

 

準備

手元にあった以下のパーツを使いました。

RaspberryPiにRASPBIANをインストールする

この作業はMacBookProで行いました。

1. RASPBIANのOSイメージをダウンロード

Raspbian

今回はデスクトップを使わないヘッドレスを想定しているので、RASPBIAN JESSIE LITEを使いました。

2. SDカードにOSイメージを書き込む

INSTALLING OPERATING SYSTEM IMAGES に書かれているように、Etcherを使ってOSイメージをSDカードに書き込む。

Etcherをダウンロードしてインストール。

Etcherを起動して、「Select image」にダウンロードしたRASPBIANのOSイメージファイルを指定して「Flash!」する。

書き込みが完了するとSDカードが「boot」になる。

Raspberry Pi の起動と初期設定

1. Raspberry Piの起動

RaspberryPiに

  • OSイメージを書き込んだSDカード
  • ディスプレー(HDMI)
  • キーボード(USB)
  • Wifi(USB)

をセットして電源を入れる。起動後のログイン情報はこれ。

Username : pi
Password : raspberry

Raspberry Pi の初期設定

1. 設定画面を開く

$ sudo raspi-config

2. パスワードを設定

1 Change User Password

3. 地域情報を設定

4 Localisation Options
  I1 Change Locale
  I2 Change Timezone

Change Localeは、en_GB を外して、 en_US.UTF-8, ja-JP.EUC-JP, ja-JP.UTF-8 をチェック。Default locale にen_US.ITF-8を指定。Change Timezoneは Asia > Tokyo。

4. SSH接続を許可

5 Interfacing Options
  P2 SSH > Yes

無線 LAN の設定

有線LANが使える環境であれば、有線接続でネットワークに接続する。今回は有線LANが使えない環境だったので、まずは手動でWifiにつなげる。

1. USBを確認

$ lsusb

2. Wifi設定を書き込む

$ sudo sh -c 'wpa_passphrase {SSID} {PASSPHRASE} >> /etc/wpa_supplicant/wpa_supplicant.conf'

3. 書き込まれたパスワードは消す

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

4. 設定を反映

$ sudo /etc/init.d/networking restart

5. IP アドレスを確認

$ ip addr

6. 取得できてなかったら再起動

$ sudo reboot

固定IPなどは後でwicd-cursesを使って改めて設定する。

OSを更新

ネットに繋がったら、諸々アップデートする。

$ sudo apt-get update *リポジトリの更新
$ sudo apt-get upgrade *パッケージの更新
$ sudo apt-get dist-upgrade *メジャーパッケージの更新

ファームウェアを更新

$ sudo rpi-update

rpi-update が無い場合はインストールする。

$ sudo apt-get install rpi-update
$ sudo reboot

ファームウェアの確認。

$ vcgencmd version
May 4 2017 15:55:49 
Copyright (c) 2012 Broadcom
version 809412fa5f5f7d88833e076d71dc329367441601 (clean) (release)

エディターをインストール

$ sudo apt-get install vim

Wifi設定(wicd-curses)

wicd-cursesを使うと、自動再接続や固定IPなどの設定ができる。

1. wicd-cursesをインストール

$ sudo apt-get install wicd-curses

エラーが出たので、そのとおりにする。

> E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.
$ sudo dpkg --configure -a

再度インストール。

$ sudo apt-get install wicd-curses

2. wicd-cursesを実行

$ sudo wicd-curses

3. Wifi設定

「Use Static IPs」で固定IPを設定、「Use Static DNS」にGoogle Public DNSを設定。

Wicd Curses Interface
 Configuring preferences for wireless network "******" (**:**:**:**:**:**)
[X] Use Static IPs
IP: {固定IP}
Netmask:255.255.255.0
Gateway:192.168.128.1

[X] Use Static DNS [ ] Use global DNS servers
DNS domain: 
Search domain:google.com
DNS server 1: 8.8.8.8
DNS server 2: 8.8.4.4
DNS server 3:

[ ] Use DHCP Hostname
DHCP Hostname: raspberrypi

[ ] Use these settings for all networks sharing this essid
[X] Automatically connect to this network
[X] Use Encryption
WPA 1/2 (Hex [0-9/A-F]) vvv
Key: ********

4. 再起動して、ネット接続を確認

$ sudo service networking restart
$ sudo reboot
:
$ ip addr
$ ping yahoo.com

/tmp/motion のオンメモリ化

SDカードには書き込み回数に上限が有るということなので、カメラで検知した画像の保存先(/tmp/motion)をオンメモリにする。(ついでに、/tmpごと)

$ sudo vim /etc/fstab

以下の行を追加する。

tmpfs /tmp tmpfs defaults,size=64m,noatime,mode=1777 0 0

再起動時も /tmp/motion のフォルダを作る。

$ sudo vim /etc/rc.local

以下の行を追加する。

mkdir -m 0777 /tmp/motion

フォルダを削除して再起動する。

$ sudo rm -fr /tmp
$ sudo reboot

USBカメラを接続

挿して認識していることを確認する。

$ lsusb
Bus 001 Device 007: ID 046d:0825 Logitech, Inc. Webcam C270
:

動体検知ソフトmotion

1. motionをインストール

$ sudo apt-get install motion

2. motionを設定

$ sudo vim /etc/motion/motion.conf

諸々設定する。

event_gap 5 *動体検知の間隔
ffmpeg_output_movies off *動画不要
target_dir /tmp/motion *保存先変更
threshold 1500 *検知の際のしきい値
output_pictures center *書き出す画像の位置
webcontrol_localhost off *外部アクセスを許可しない
stream_localhost off *映像画面の外部アクセスを許可

3. motionを起動

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

http://raspberrypi.local:8081/ で接続確認

4. MOTIONの再起動と停止

$ sudo service motion restart
$ sudo service motion stop

slack の設定

1. Tokenを取得

slackにログインして、Legacy tokens | Slack のページを開き、

Legacy tokens – Legacy token generator > Create token

でTokenを生成する。

2. channel idを取得

slackにポストする際のchannelを作成してidを取得。

https://{team}.slack.com/messages/{channel id}/files/

3. PythonのSlackライブラリ Slackerをインストール

pipをインストールする。

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py

Slackerをインストール

$ sudo pip install slacker

4. slackにメッセージを送る

$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from slacker import Slacker
>>> token = "{slack token}"
>>> slacker = Slacker(token)
>>> channel_name = "{channel name}"
>>> message = 'hello! I am raspi'
>>> slacker.chat.post_message(channel_name, message, username='RasPi2')
<slacker.Response object at 0x76401850>

きた!

5. slackに画像を送る

$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from slacker import Slacker
>>> token = "{slack token}"
>>> slacker = Slacker(token)
>>> channel_name = "{channel name}"
>>> result = slacker.files.upload('{image filename}', channels=['{channel id}'])
>>> slacker.pins.add(channel='{channel id}', file_=result.body['file']['id'])

動体検知後にslackに画像を送る

1. pythonのプログラム

# -*- coding: utf-8 -*-
import sys
from slacker import Slacker

class Slack(object):

__slacker = None

def __init__(self, token):
 self.__slacker = Slacker(token)

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("{slack token}")
slack.post_to_file(file_path, '{slack channel id}')

2. motionの設定

$ sudo vim /etc/motion/motion.conf

動体検知→画像保存後の動きは on_picture_save で設定できる。

on_picture_save python /home/pi/slackbot/slack_bot.py %f

パーミッションも適当に設定。

$ chmod a+x slackbot/slack_bot.py

デーモン起動を設定

1. motionのrun level2,3,4,5をONにする

$ sudo apt-get install sysv-rc-conf
$ sudo sysv-rc-conf

2. MOTIONをデーモンで起動

$ sudo vim /etc/default/motion
start_motion_daemon=yes

サーボモーターを回してLチカする

1. RPi.GPIOパッケージのインストール

RPi.GPIOパッケージはRaspberry PiのGPIO操作に使います。

$ sudo apt-get install python-rpi.gpio

2. GPIO

ピンの配置

Simple Guide to the RPi GPIO Header and Pins

GPIOのピンを指定する方法

  • GPIO.setmode(GPIO.BOARD) : ピン番号
  • GPIO.setmode(GPIO.BCM): GPIO番号

今回使ったサーボモーターSG90のデータシートはこちら

SG90への電源は1.2vのエネループ3本から供給し、オレンジ色のPWMにGPIOから信号を送って、モーターを制御する。

3. pythonスクリプト

$ sudo vim servo.py

ピン番号11にSG90のPWM信号、ピン番号39と40でLEDを制御する。

#!/usr/bin/env python
# coding: utf-8

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(40, GPIO.OUT)
GPIO.output(40, GPIO.HIGH)

GPIO.setup(11, GPIO.OUT)
servo = GPIO.PWM(11, 50)

servo.start(0.0)

servo.ChangeDutyCycle(2.5)
time.sleep(0.5)

servo.ChangeDutyCycle(12.0)
time.sleep(0.5)

servo.ChangeDutyCycle(2.5)
time.sleep(0.5)

GPIO.output(40, GPIO.LOW)
GPIO.cleanup()

4. GPIOを操作する場合はroot権限が必要

ユーザーmotionに権限を付与。

$ vim /etc/sudoers

以下の行を追加する。

motion ALL=(ALL) NOPASSWD: /home/pi/slackbot/servo.py

5. MOTIONの設定

$ sudo vim /etc/motion/motion.conf

動体検知開始時の動きはon_event_start で設定できる。

on_event_start sudo /home/pi/slackbot/servo.py

その他必要な作業

主に、SDカードへの書き込みを減らすために以下の設定をした方がいい。

  •  /var/log のオンメモリ化
  • ログファイルを制限する
  • swapの無効化
  • ext4ファイルシステムのジャーナルを廃止

参考サイト

 

ラズパイ楽しい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です