読者です 読者をやめる 読者になる 読者になる

勘と経験と読経

略すとKKD。ソフトウェア開発やITプロジェクトマネジメントに関するあれこれ。

古いスマートフォンをインターバルカメラにする

機種変更をして古くなったスマートフォンを皆はどうしているのだろうか。iPhoneであればキャリアに高く下取りなどしてもらえるのかもしれないが、Androidだと二束三文にしかならない。しかし、古くなったからといってスマートフォンは立派な汎用コンピュータである。というわけで、使わなくなったスマートフォンをインターバルカメラにして再利用してみた。

やりたかった事

のような専用機を購入せず、一定間隔ごとに写真を撮影することを実現したかった。もちろん専用機では撮影した写真を自動的にムービーにしてくれたりするのだけれども、これはPCで加工などすればいい(実際、ムービー化しなくてもインターバル撮影した写真はスライドショーなどで十分に楽しめたりする)。

やった事

ちょうど手元にあった初代Xperiaを活用することにしてやったことは大体以下の感じ。もっとスマートな方法があるかもしれないし、機種が異なれば手順が違うこともあると思う。あくまで一例として手順を晒してみる。

  • Android上でスクリプト言語を動かすSL4Aを導入する。
  • 本当は「一定時間毎にイベント起動させて写真を撮影する」ことがやりたかった。けれどもSL4Aでの実現は難しそうだったので、単純に一定感覚SLEEPするプログラムをざっくりと作成した(コードは後述)
    • AlarmManagerによってイベント起動は出来るようだが、SL4Aでは現時点ではサポートをしていないようだ(APIも無い)。
    • ひょっとしたらTaskerやMicrosoftのon{x}なら実現できるのかもしれないけれども、調べる時間が惜しいのでやめた。
  • 一定時間毎にシャッターを切ることが実現したが、シャッター音がうるさい。というわけでrootを取得した上で、シャッター音をオフにした。

だいたい上記すべてで数時間の作業である。これで簡単なインターバルカメラになるのだから立派なものだと思う。
ただし、単純なループ処理なのでバッテリーはけっこう食う。現在はデスクトップPCからUSB経由で給電するようにしている。やはり効率を考えたら専用アプリを探すか自分で書いたほうが早いような気がする(そこまでやる気力は無い)。

書いたコード

動けばいいのだ。

import android
import datetime
import string
import time

droid = android.Android()

#start_check_dialog
droid.dialogCreateAlert("AutoCamera", "Path:sdcard/DCIM/AC/YYYYMMDDHHMMSS.jpg")
droid.dialogSetPositiveButtonText('YES')
droid.dialogSetNegativeButtonText('NO')
droid.dialogShow()
response = droid.dialogGetResponse()

if response.result["which"] == "positive":
    droid.dialogDismiss()
    #i:price of the number of photos
    num = 6 * ( 24 - 7 ) * 7 * 2
    #photo wait time(sec)
    wsec = 5 * 60
    i=1
    while i<=num:
        d = datetime.datetime.today()
        if d.hour >= 6:
            fpath = "/sdcard/DCIM/AC/" + str(d.year) + str(d.month).zfill(2) + str(d.day).zfill(2) + str(d.hour).zfill(2) +str(d.minute).zfill(2) + str(d.second).zfill(2)+ ".jpg"
            droid.cameraCapturePicture(fpath, False)
            i = i + 1
            time.sleep(wsec)

あとは100円で買ったミニ三脚を装着して偽インターバルカメラの出来上がり。
f:id:kent4989:20121021095632j:plain
しかし考えてみるとスマートフォンはセンサー満載だ。スクリプトによる自動監視、自動処理はもっといろいろ出来ると思う。Arduinoで専用装置を自作してもけっこうな費用と手間がかかりそうだし、中古スマフォで色々やるほうが楽しそうだ。