コーダー道場やおとプロでもそのうちラズパイやりたいなということで、活用例をひとつまとめてみました。
できること
RaspberryPiに繋げたUSBカメラ(右手前)で定点を観測し、変化を検知したら赤いLEDをチカチカさせて、サーボモーターを回し、写真を撮影してslackに送信します。
監視カメラ的に使うとこんな感じ。slackに通知されるので、外出先からでも簡単にチェックできます。
準備
手元にあった以下のパーツを使いました。
- Raspberry Pi 2 Model B V1.1
- マイクロSDカード(8GB)
- BUFFALO Air Station NFINITI 11n/g/b USB用 無線子機 WLI-UC-GN
- LOGICOOL ウェブカム HD画質 120万画素 C270
- SG90 マイクロサーボ
- ブレッドボード
- ジャンパーワイヤ(オスーオス、オスーメス)
- LED
- 抵抗(1.0K)
- 電池ボックス(単4×3)
RaspberryPiにRASPBIANをインストールする
この作業はMacBookProで行いました。
1. RASPBIANのOSイメージをダウンロード
https://www.raspberrypi.org/downloads/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ファイルシステムのジャーナルを廃止
参考サイト
- 猫とDIY :: RaspberryPi 2で監視カメラ(その1:セットアップ編)
- Raspberry PiでPythonのRPi.GPIOを使ってLチカする
- サーボモーター(SG-90)を試す – Raspberry Pi 備忘録 / Mbedもあるよ!
- Raspberry Piでサーボモータ(SG90)を制御する|Buffer Overruns
- Raspberry Pi LESSON 28: Controlling a Servo on Raspberry Pi with Python | Technology Tutorials
ラズパイ楽しい!
コメントを残す