2013年8月2日金曜日

RaspberryPi #10 WebカメラをWeb越しに操作してみよう

第8回にてWebカメラからのキャプチャ画像を定期的にDropboxにアップするようにした。cronで10分周期にセットしたけれども、「今のタイミングのキャプチャが欲しい!」ということもある。この場合はどうするか。

自宅のブロードバンドルータに接続したRaspberryPiには当然グローバルIPアドレスなんてセットしていない。ブロードバンドルータから割り当てられたプライベートIPアドレスにネットワーク越しにアクセスする方法は簡単には実現できそうにない。
というわけで方法としてはRaspberryPi側から「なんか指示ありませんか?」と定期的にポーリングをしかける方法しかないのだ。

ここではDropboxのフォルダを10秒周期チェックして、「shot」というフォルダがあるとそのタイミングでキャプチャをアップロードする、という仕様にした。
そのシェルが以下の通り。

#!/bin/bash

while :
do
        /home/pi/Dropbox-Uploader/dropbox_uploader.sh list | grep shot
        if [ $? -eq 0 ] ; then
                fswebcam -d /dev/video0 -p YUYV -D 2 -S 16 -r 640x480 --jpeg 75 /home/pi/shoot.jpg
                /home/pi/Dropbox-Uploader/dropbox_uploader.sh upload /home/pi/shoot.jpg /shoot.jpg
                /home/pi/Dropbox-Uploader/dropbox_uploader.sh delete /shot/
        fi
        sleep 10
done

パスやファイル名は適宜読み替えてほしい。
ここでは10秒周期にしているが、最後のsleepを短くすればよりリアルタイムに近い形で反応できるだろう。Dropboxに怒られるかもしれないが。

で、起動時にこれを起動しておいてもらおう。
sudo vi /etc/rc.local
としてrc.localファイルに以下の記述を追加する。尚、ここでは上記作成スクリプトを「manual_shot.sh」としている。

sudo -u pi /home/pi/manual_shot.sh &

sudoでユーザpiとして実行していることに注意。
Dropbox-Uploaderのセットアップ時にDropboxのAppキーなどを設定したが、実行ユーザが異なると再設定が必要になるので、セットアップを実行したユーザで実行する必要がある。

2013年7月25日木曜日

RaspberryPi #9 シャットダウンボタンをつくろう

RasberryPiは電源供給源のUSBに接続すれば起動する。
終了時はコマンドからshutdownしなくちゃいけない。
イヌ用の監視カメラをこしらえて実家に設置したところで、年老いた両親に
「リモートでログインしてshutdownコマンドを、、、」
などと言えるハズもない。

というわけで押すとシャットダウンしてくれるボタンを付けてみる。
ボタンを長押しして、LEDランプが消えたら電源抜いてOK、というもの。



用意するもの。
  • ブレッドボード 1つ
  • ジャンパワイヤ 3本
  • タクトスイッチ 1つ
  • 10KΩ抵抗 1つ

配線は参考図書「RaspberryPiで遊ぼう!」に掲載されているままなので省略。

次にRaspberryPi用のGPIOプログラミングライブラリであるwiringPiをインストールする。こちらも本に掲載のままなので省略。たぶんググればある。
で、以下のようなプログラムを書く。

#include <stdio.h>
#include <wiringPi.h>

#define BTN_PORT 25

int main(void) {
        int data = 0;
        int cnt = 0;

        if(wiringPiSetupGpio() == -1) return 1;
        pinMode(BTN_PORT, INPUT);

        while(1)  {
                data = digitalRead(BTN_PORT);
                if(data == 0) cnt = 0;
                else cnt++;

                if(cnt >= 10) {
                        system("shutdown -h now");
                        return 0;
                }
                usleep(300000);

        }
        return 1;
}


300ミリ秒(300000マイクロ秒)ごとにボタンの押下状態をチェックして
10回連続で押された状態(=3秒間の長押し)ならshutdownする、というだけのもの。
これを書いたら

cc -o off_button off_button.c -lwiringPi

としてコンパイルする。
ファイル名は適宜読み替えてください。

そして起動時にデーモンとして起動するように/etc/rc.lodalに以下のような記述を追加する(exit 0の前に追加)。

/home/pi/off_button &

とすれば起動時に先ほどのプログラムがデーモンとして起動するので
いつでもボタンを押せばシャットダウンしてくれるのだ。



2013年6月30日日曜日

RaspberryPi #8 Webカメラで静止画

監視カメラとしてセットして、Ustream経由で外出先からスマホで確認しよう!
と思ったのだけどスマホのUstreamが尋常じゃない重さで使えない。
というわけで静止画を定期的にキャプチャしてドロップボックスに定期的にアップロードする、という作戦にするのだ。

静止画のキャプチャにはfswebcamを使う。
設定方法など、こちらを参考にしました。

一方、DropboxはというとARM版がないのでDropbox-Uploaderというツールを使う。
こちらを参考にしました。
次にfswebcamでキャプチャして、Dropbox-Uploaderでアップロードするスクリプトを用意する。

#!/bin/bash

fswebcam -d /dev/video0 -p YUYV -D 2 -S 16 -r 640x480 --jpeg 75 ./capture.jpg
Dropbox-Uploader/dropbox_uploader.sh upload capture.jpg /capture.jpg

パスの部分は適宜読み替えてください。
このスクリプトだとDropboxにアップロードするたびにcapture.jpgを上書きすることになるので、それが嫌な場合は連番を振るとか、時刻にするとかしないといけない。
最後にcronをセットする。

*/10 * * * * /home/pi/capture.sh

capture.shというのが先ほどつくったシェルだ。
ここでは10分おきに動くようにしている。


2013年6月25日火曜日

RaspberryPi #7 Firefox OSの画面を大きくしてみる

昨日、RaspberryPi上でFirefoxOSが動作したものの
画面の左下にチョロッと出ているだけなので大きくしてみましょう。

起動時に
--screen=x
と指定してやれば画面サイズを変更できる。
上の方、はみだしてるけど。
こちらは1366x768を指定した場合。
このサイズにするとマウスポインタがダニのような大きさで操作が困難なのだ。 

昨日は参考サイトの情報をたどっただけだったので、そもそも何をしたんだ?
というところを把握していなかったので自分なりに調べてみる。

まず「b2g」というのはFirefoxOSの別名で「boot to gecko」のコト。
最初にダウンロードしたのがB2GのデスクトップクライアントをRaspberryPi向けにビルドしたもの。

たぶん。

 これだけでも起動はするのだけど空のスクリーンが表示される。
なのでシステムアプリの指定やら何やら必要で(こちらの「プロファイルを生成する」を参照)、それも一緒にダウンロードして起動時に指定してました。 
昨日は全て出来合いのものをダウンロードしただけだったけど、
一般的には(まだ開発中ということもあり)ソースをダウンロードして自分でコンパイルするものみたい。
いずれ、そちらもチャレンジしてみるのだ。

2013年6月24日月曜日

RaspberryPi#6 firefox osを入れてみる

下記サイトの情報を参考にRaspberryPiでFirefoxOSを動かしてみようと思ったのだ。
http://www.philipp-wagner.com/ffos-for-rpi/manual/index.html

手元のMacのディスク容量が怪しいのでコンパイルはせずにビルド済みのイメージファイルをSDカードに書き込んでみた。
んが、動かない。
電源を入れてもウンともスンとも言わない。
むむぅ

さくっと諦めてこちらの情報を参考にすることにする。
こちらの手順はまずは普通にRaspbianのSDカードで起動して、FirefoxOSをダウンロードしてきて動かそう、というもの。

こんな感じになります。


2013年6月21日金曜日

RaspberryPi#5 Webカメラ接続

カメラが届いたので繋いでみる。
ちなみに買ったのはELECOM UCAM-DLA200H。
RaspberryPiを起動してUSBカメラを差し込む。
/var/log/messageを見て認識していることを確認。

本の通りに「uvccapture」「uvcdynctrl」「guvcview」をインストール。
sudo apt-get install uvccapture uvcdynctrl guvcview

Xをたちあげてメニューから先ほどインストールしたguvcviewを起動する。
しばらくするとカメラの映像が表示される。
感動。

USTREAMへの配信も一瞬できたけれど、しばらくすると落ちてしまう。
消費電力の関係かもしれない。
セルフパワーのUSBハブを買わないといけないのか。。


2013年6月19日水曜日

RaspberryPi #4 DLNA

今日も本に沿って1章だけ。
DLNAサーバをRaspberryPiにインストールして、DLNAクライアントのiPhoneアプリをインストールしてアクセスする。
昨日テレビで見た動画をiPhoneで見る。
ちょっと嬉しい。

RaspberryPiでカメラを使いたいのだけど、公式のカメラはちょっと高いし、届くのに時間がかかりそうなので、書籍内で動いたと書いてある「UCAM-DLA200H」を注文。
1500円くらい。

部屋にまた新たなAmazonのダンボールが増える。。

2013年6月18日火曜日

RaspberryPi #3 ネットワークと動画再生

今日も本に沿ってRaspberryPiを触る。
Macからsshで入ったり、ファイル送ったり。
結局のところLinuxなので普通に出来そうなことはできてしまう。

動画はomxplayerというプレーヤが最初から入っているのでこれを使って再生する。
HDMIケーブルでテレビとつないでいるので、小さなRaspberryPiからキレイな映像をテレビで再生している姿はなかなか感動的。

今日はこれだけ。

2013年6月14日金曜日

RaspberryPi#2 起動する

SDカードリーダーが届いた。

参考書は「Raspberry Piで遊ぼう!」です。
本に書いてあるとおり下記アドレスに置いてある「RPi-sd card builder」を使って書き込む。
http://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/

ちゃんとSDカード挿しているのに「挿してますか?」みたいなメッセージが出るので疑問だけれども、よく読むと「挿してなかったら挿してね」というメッセージなので「continue」を押していけば大丈夫。
書き込み先を選ぶときにPCのドライブにまでチェックがついているので気をつけて、SDカードのみにチェックが入っているようにする。

書き込みを終えたらSDカードをRasberryPiに差し込んで、HDMIケーブルをつないで、マウスとキーボードをつないで、電源をONする(コンセントに差す)。

どうやら書籍が書かれた時期とバージョンが変わっているようでメニューが違っているのでちょっと戸惑うのだけど、Overscanやsshは「8 Advanced Options」に、日本語関係は「4 Internationalisation Options」にある。

ここではSDカードの使用領域拡張、ロケールの設定、SSHを有効化(デフォルトでなっているような気がする)した。
これでリブートするとコマンドラインのLinuxが起動する。


RaspberryPiを買ったのだ

ふとRasberryPiを買ってみた。
参考書もついでに買った。
SDカードも必要だそうだから買った。
16GBのclass10。
電源はKindleに付属していたマイクロUSB経由でiPhoneの充電器に差し込めばいけるんじゃないだろうか。
とりあえずランプはついた。
HDMIケーブルはプレステにつないであるものを使おう。
USBマウスはある。
キーボードがない。
ノートPCしかない。
だから買おう。

公式サイトのダウンロードページからRasberry用のディストリビューションである
Raspbian Wheezyをダウンロードする。

http://www.raspberrypi.org/downloads

これをSDカードに書き込めばOK。
SDカードリーダーが無かった。。