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

日記

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

  1. できること
  2. 準備
  3. RaspberryPiにRASPBIANをインストールする
    1. 1. RASPBIANのOSイメージをダウンロード
    2. 2. SDカードにOSイメージを書き込む
  4. Raspberry Pi の起動と初期設定
    1. 1. Raspberry Piの起動
  5. Raspberry Pi の初期設定
    1. 1. 設定画面を開く
    2. 2. パスワードを設定
    3. 3. 地域情報を設定
    4. 4. SSH接続を許可
  6. 無線 LAN の設定
    1. 1. USBを確認
    2. 2. Wifi設定を書き込む
    3. 3. 書き込まれたパスワードは消す
    4. 4. 設定を反映
    5. 5. IP アドレスを確認
    6. 6. 取得できてなかったら再起動
  7. OSを更新
  8. ファームウェアを更新
  9. エディターをインストール
  10. Wifi設定(wicd-curses)
    1. 1. wicd-cursesをインストール
    2. 2. wicd-cursesを実行
    3. 3. Wifi設定
    4. 4. 再起動して、ネット接続を確認
  11. /tmp/motion のオンメモリ化
  12. USBカメラを接続
  13. 動体検知ソフトmotion
    1. 1. motionをインストール
    2. 2. motionを設定
    3. 3. motionを起動
    4. 4. MOTIONの再起動と停止
  14. slack の設定
    1. 1. Tokenを取得
    2. 2. channel idを取得
    3. 3. PythonのSlackライブラリ Slackerをインストール
    4. 4. slackにメッセージを送る
    5. 5. slackに画像を送る
  15. 動体検知後にslackに画像を送る
    1. 1. pythonのプログラム
    2. 2. motionの設定
  16. デーモン起動を設定
    1. 1. motionのrun level2,3,4,5をONにする
    2. 2. MOTIONをデーモンで起動
  17. サーボモーターを回してLチカする
    1. 1. RPi.GPIOパッケージのインストール
    2. 2. GPIO
    3. 3. pythonスクリプト
    4. 4. GPIOを操作する場合はroot権限が必要
    5. 5. MOTIONの設定
  18. その他必要な作業
  19. 参考サイト

できること

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

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

 

準備

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

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

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

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

Raspberry Pi OS – Raspberry Pi
From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.

今回はデスクトップを使わないヘッドレスを想定しているので、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ファイルシステムのジャーナルを廃止

参考サイト

 

ラズパイ楽しい!

コメント

タイトルとURLをコピーしました