タイムラプスやって見ました

WiFiのみのインストールとAP/STAの作成”で説明したAP接続の例として、タイムラプスをやって見ました。時間を掛けて写真を撮影し、短時間の動画にするやつです。

使用部品と必要ソフト

  • Raspberry PI 3 model B+
    • 本体です。
    • マイクロSDは32Gを使用しています。ここに画像を保存します。
  • ロジクール ウェブカメラ C270 ブラック HD 720P ウェブカム
    • 撮影用のUSBカメラです。
    • USBカメラであれば特にこれにこだわりません。
  • モバイルバッテリー(12000mAh 5.1V)
    • 野外撮影の為に使用。
    • 昔に買ったバッテリーの為、型番は分かりません。(”mi”とマークは有りますが)
    • 容量は、12000mAh 5.1Vと有ります。
  • 4kΩ抵抗と接続用線
    • 撮影間隔にRaspberry PIの割り込みを使っています。
    • Pythonのブログラムで発生させた信号をGPIOに入力させて割り込みを実現しています。
    • 4KΩの抵抗はピン同士の接続に使います。
  • USBケーブル
    • バッテリーと本体をつなぐケーブル
  • RPi.GPIOとPIP3
    • RPi.GPIO:GPIO関係のライブラリ。
    • PIP3: RPi.GPIOのインストール用アプリ
  • fswebcam
    • CUIで写真の撮影が出来るソフトです。

製作

  1. WiFiのみのインストールとAP/STAの作成”の状態にして下さい。
    • AP/STA接続出来る状態にして下さい。
  2. fswebcamのインストール
    • ターミナルで、”sudo apt-get install fswebcam”と入力するとインストール出来ます。
    • インストール後ターミナルで、”fswebcam data.jpg”と入力して下さい。
    • ”data.jpg”というファイルで写真が保存されていればOKです。
  3. 今回作成したソフトは、
    • camera.py  : 本体。PythonのHttpServerを使ってfswebcamを管理して写真を撮っています。
    • camera.html: HPのHTMLファイル。
    • camera.css : HPのCSSファイル。
    • p_timer.py : 割り込み発生プログラム。Python で書いています。
    • favicon.ico : faviconファイル
    • ここに上記にソフトを保存しています。解凍するとCameraというフォルダーが出来ますからホームディレクトリにコピーして下さい。
  4. RPi.GPIO、PIP3のインストール
    • 先ずPIP3をインストール ー> sudo apt-get install python3-pip
    • その後、RPi.GPIOをインストール ー> sudo pip3 install RPi.GPIO

ソフトの動作は、”定期的に温度を測る(6)”と殆ど同じです。リンク先では一定時間で温度を測定していましたが、今回は、温度の測定の変わりに写真を撮っているだけです。だた、一定時間のカウントが前回と大きく違います。前回はRTCを使用していましたが、今回はPytnonで書いたソフトを元に時間をカウントしています。”p_timer.py” がそのソフトです。

p_timer.py

import sys
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)      
GPIO.setup(17, GPIO.OUT)   
GPIO.output(17,1)        
a = int(sys.argv[1])
while a != 0:
    time.sleep(60)
    a -= 1
GPIO.output(17,0)
time.sleep(0.01)
GPIO.output(17,1)
GPIO.cleanup()

プログラムの動作は、以下の通り。

  1. 本体で割り込みを有効にします。今回はGPOI04の立ち下りで割り込みが有効になる様に指定してます。
  2. GPIO04は4kΩの抵抗を介してGPIO17接続さています。
  3. 撮影間隔は時と分で指定するのですが、それを分に換算し、引数とし subprocess.Popen()を用いてこの関数を呼びます。
  4. この関数は指定された時間をカウントし、0になった時にGPIO17を一瞬LOWにセットします。この時割り込みがかかります。
  5. 割り込みがかかると写真を撮影し、SDに保存。その後また、待ち時間を引数にsubprocess.Popen()を用いてこの関数を呼びます。
  6. 4と5を繰り返しながら写真を保存して行きます。

最後に電源投入時に自動起動する様に、”/etc/rc.local”を編集します。26,27行の2行を追加しています。

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd
sudo iw dev wlan0 interface add uap0 type __ap
sudo ifconfig uap0 up
sudo systemctl restart hostapd
sudo systemctl restart dnsmasq

cd /home/pi/Camera
python3 camera.py
exit 0

部品をつなぐと

UBS Web Camera、割り込み用ジャンパー、モバイルバッテリーをつなぐとこんな感じになります。

この状態で電源をつなげばアプリが自動で起動します。

HPはこんな画面

今回はパイロットランプが無いので、電源をいれたら本体の緑のLEDの点滅からレディーを予測します。大体3分位でレディーになります。”WiFiのみのインストールとAP/STAの作成”と同様にAP接続します。スマホで、

  • アクセスポイント、”raspi-ap” を探す。
  • パスワード、”12345678”を入力して接続する。
  • スマホでブラウザ(今回は、FireFox)を上げる。
  • URLに、”192.168.2.1:8080″ と入力して下さい。HPが上がります。

HPの画面と操作は以下の通り。

  • Takeボタン: 
    • 写真を撮影します。
    • Takeボタンを押すと、fswebcam が立ち上がり写真を撮影するのですが、その動作に時間がかかり終了を待つsubprocess.run() では、サーバがタイムアウトする事が分かりました。
    • そこで今回は、subprocess.Popen()で撮影を行っています。
  • Flashボタン: 
    • 撮影に、時間がかかるのでTake ボタンを押してしばらくしてこのFlashボタンを押すと撮影された写真が画面に表示されます。
  • 撮影間隔 時 と 分
    • この2つを使って撮影間隔を指定します。
    • 分単位の指定になります。
  • 撮影開始ボタン
    • 撮影を開始します。
  • 撮影停止ボタン
    • 撮影を停止します。

実際の操作は、TakeボタンとFlashボタンで被写体を確認し、被写体が決まったら時間を設定してStartボタンを押す。時間が来たらStopボタンを押して終了。となります。

実際の撮影

撮影はこんな感じ

  • Raspberry PIとモバイルバッテリーをつないで外に行く。
  • 撮影場所についたらスマホでアクセスポイント、”raspi-ap”に接続
  • ブラウザ、”192.168.2.1:8080”と入力するとHP画面が表示される。
  • TakeとFlashボタンで撮影対象を確認する。
  • 確認後、撮影間隔を指定してStartボタンで撮影開始して一旦帰宅。
  • 撮影終了時間になったら再び、スマホをつないでHP画面を表示し、Stopボタンを押す。

今回は2分間隔で景色を撮影しました。撮影された写真は、”Camera”ディレクトリの下の、”data”ディレクトリに保存されます。撮影された写真をffmpegで編集したものが下記の動画です。画面中央下の家の影が次第に無くなって行く所がタイムラプスっぽいです。