素人が自分でライフログカメラを組んでみた

ライフログカメラの歴史?

以前私はNarrative Clipというライフログカメラを使っていました。ライフログカメラの先陣を切った製品です。

3cm四方の小さいクリップで、洋服の胸の辺りに固定しておくと、30秒おきに写真を一枚撮ってくれます。ディスプレイがついていないので、どんな写真が撮れているかは帰ってからのお楽しみですが、これがなかなか面白く、重宝していました。あの小ささで、バッテリーやストレージは余裕で1日持つ優れものでした。

ところが運営元が突然倒産。現在も画像のアップロードができるサブスクリプションのサービスは辛うじて生きているようですが、スマートフォンのアプリは2017年から一切メンテナンスがされていません。公式サイトは壊れたままで、また商品の在庫が復活することも結局ありませんでした。倒産直後にFacebookでNarrative clip loungeを立ち上げ、ユーザーのデータの保護に尽力してくれたアームストロング氏も2017年を最後に沈黙しています。

フリマアプリやヤフオクでたまにNarrative clipが出品されているのを見かけますが、このような状況では購入はお勧めできません。というのも、写真に付加される撮影日時とGPSの位置情報が記録されているJSONファイルが暗号化されており、不安定な状況におかれているサブスクリプションを有料で契約してアップロードしないと復元できないのです。

写真のEXIFには2000/1/1などと記録されており、大量の写真のEXIFを自分で修正してやらないと、撮影日時で写真を並べたときにぐちゃぐちゃになってしまうので、大変面倒です。

しかも後になって、Narrative clip は、バッテリーが劣化するとパンパンに膨らんでケースを飛び出して壊れてしまう代物であることが分かってきました。ですから私は事実上使えなくなったものとしてあきらめて処分しました。

Narrative clip loungeでは皆、代替品を探していました。Google Clips、Frontrow、Shonin、roader、canon ivy rec、Insta360 goなど。しかしすべてNarrative clipとは似て非なるものだったし、クラウドファンディングから卒業したらそれっきり販売しない製品もありました。

Insta360 go が出てきたときは「ついに後継者が現れた!」と思い購入しましたが、動画撮影が主な機能であり、電池は全然持たなくて数時間の使用が限界だし、タイムラプス機能があれど一枚一枚の写真として保存することはできず、操作性もなんだかいまいちで期待はずれでした。

そういうわけでずっとNarrative clipの後継機のことは頭の片隅にあったのです。

誰も作ってくれないから自分で作ろう

最近車のバックカメラを物色していたら、ふとNarrative clipのことを思い出しました。 それから近頃pythonを少し齧っていたので、マイコン素人ですが、ラズベリーパイを用いればなんとか似たようなことができるんじゃないかという気分になりました。

調べてみるとラズベリーパイ用のカメラモジュールというのがあるということと、ラズベリーパイゼロという小型の基盤もあるのだということを知りました。そして、ラズベリーパイゼロの公式ケースにはカメラ用の穴が開いていて、簡単に組み立てられるようになっているではありませんか! しかしながらラズベリーパイゼロシリーズは現在ほとんど新品は売っていないに等しく、メルカリには新古品が出ていたものの、かなり割高でした。また欠点として公式ケースはダサいデカい。カメラ感丸出しの穴。USBポートはmicroUSBなので、手持ちの有線キーボードや有線マウスがセットアップに使えない。miniHDMIとかいう中途半端な出力。

電源も問題でした。結構電気を食うらしく、3A出力のバッテリーが必要になるということで、身に着けるにはかなり野暮ったい。ゼロ用のバッテリーモジュールもあったのですが、さらに分厚くなるので、「ケースは3Dプリンターで作ってね!」とのこと。

ラズベリーパイピコにすると単三電池駆動も余裕らしいですが、こちらはそのままではSDカードが入りませんし、ネットにもデータを飛ばせません。SDカード用のモジュールなどを使うと結局持ち運びには不便な形状になっていきます。

私の技術力では限界なのでスイッチサイエンスのページを途方に暮れて適当に見ていたら、あったんです。面白そうなカメラ。

www.switch-science.com

この大きさで、Linuxを積んでてスタンドアロンで動き、画像認識機能盛りだくさんの「M5Stack UnitV2 AI カメラ」でございます(もうちょっと良いレンズがつけられる上位モジュールもあったのですが、サイズが大きくなるのでやめました。それにカメラのレンズっぽくないほうがライフログカメラにとっては都合がいいのです)

欠点としては、バッテリーは積んでない。M5Stackのほかのモジュールはバッテリー搭載してるのに、こいつには搭載していない。なんでだよ...。なんでだよっていうか、積んでも消費電力との釣り合いがとれないから積まなかったんだろうけれど。 これについては小型のモバイルバッテリーを探して何とかするしかありません。リチウムポリマー電池は素人なので、怖いので却下。

本当はロボットなどに搭載して、センサーとして活用するものであって、撮影用のものではないのでしょうけれども、高度な機能は一切無視して写真撮影を頑張らせようと思います。

それホントにマイコンでやる必要ある?っていう作品が多い中で、ライフログカメラはやる意味があると確信しているからです。

セットアップしていきましょう(ハード編)

まずは下ごしらえに、不要になったカードを探してきます。今回の犠牲者はこちら!

ワールドプレミアムクラブです。いつどこで作ってもらった何のためのカードなのか全然思い出せません。そこでググってみるとサジェストに...

あははw誰も知らないんだw

パンチで適当に穴をあけて落下防止用の紐を括り付けます。それから磁石を用意します。

しっかりしたケースに入っていました。

磁石6個に両面テープ7個、思いやりで予備を入れたのか、単にうっかりなのか。

これらを貼り付けていき、世界のプレミアムなクラブにします。

それからこうしておきます。で、バッテリーを準備します。

期待していなかったバッテリーだが意外としっかりしている。

厚さ4㎜ということだが、かなり薄く感じる。それを

こうします。やったーネオジムバーガーの完成だ!

ですがこのままだとへんてこりんで目立ちますし触り心地も悪いので、カモフラージュしていきましょう

それぞれ適当に巻きます。 これで服を挟んで胸元に固定しようというわけです。

ちょっとでかいけどまあいっか。なにか変なものが付いてるがそれが何であるかはわかりませんからね!

とやかくしているうちに無限大のアイディアが届きました。

おや、付属品のリストには無かったSDカードが付いてきていますね、ラッキー。

ブルーは綺麗だけど目立つのでマッキーでカモフラージュしていきましょう。迷彩柄の包帯は、巻くとSDカードスロットなどのインターフェースにアクセスできないので諦めました。

モバイルバッテリーにくっつけてとりあえず完成ということにします。

セットアップしていきましょう(ソフト編)

まずは素人なりに写真を撮るプログラムを作りましょう。

import cv2
import time
import datetime

time.sleep(60)

while True:
    camera = cv2.VideoCapture(0)
    camera.set(cv2.CAP_PROP_FPS, 30)
    camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1600) 
    camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1200) 

    ret, frame = camera.read()
    d = datetime.datetime.now()
    filename = d.strftime('%Y-%m-%d %H-%M-%S')
    cv2.imwrite('/media/sdcard/'+filename+'.jpg', frame)
    camera.release()
    time.sleep(30)

これが最適解かどうかは知りませんがSDカードに30秒おきに、電池が切れるまで写真を保存し続けます。 では試しにやってみましょう。

うわあ、大変ですタイムスリップしています。ネットにつなげてサーバーから時刻を持ってきましょう。

/etc/dhcpcd.conf

denyinterfaces eth0 wlan1 br0

interface wlan0
static ip_address=192.168.0.222
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

カメラのIPアドレスを固定してルーターDNSIPアドレスを書き込む

/etc/wpa_supplicant.conf

network={
        ssid="xxxxx_nomap"
        psk="password"
        }

皆さんもおうちのWi-FiSSIDには_nomapを付けていきましょう

/tmp/resolv.conf

# Generated by dhcpcd from wlan0.dhcp
# /etc/resolv.conf.head can replace this line
nameserver 192.168.0.1
# /etc/resolv.conf.tail can replace this line

ネームサーバのアドレスを書き込む

/etc/ntp.conf

server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp

# Allow only time queries, at a limited rate, sending KoD when in excess.
# Allow all local queries (IPv4, IPv6)
restrict default nomodify nopeer noquery limited kod
restrict 127.0.0.1
restrict [::1]

NTPサーバーを変えておく

    ┌──────────────────────────────────────────────────────────────────────┐
    │                 • MobaXterm Personal Edition v22.0 •                 │
    │               (SSH client, X server and network tools)               │
    │                                                                      │
    │ ➤ SSH session to root@192.168.0.222                                  │
    │   • Direct SSH      :  ✔                                             │
    │   • SSH compression :  ✔                                             │
    │   • SSH-browser     :  ✔                                             │
    │   • X11-forwarding  :  ✘  (disabled or not supported by server)      │
    │                                                                      │
    │ ➤ For more info, ctrl+click on help or visit our website.            │
    └──────────────────────────────────────────────────────────────────────┘

Wi-Fiにつながったようです。どうだ?

unitv2# date
Wed Apr 20 09:28:12 UTC 2022

JSTにしたいですね。ところが調べた通りにやってもどうもうまくいかず、そもそも指定されたファイルが存在しなかったりして苦戦しました。なので不格好ですがシェルスクリプトで起動時に写真を撮るコードと一緒に毎回コマンドを呼び出すことにしました。

/etc/init.d/S97camera

export TZ=JST-9
python /media/sdcard/camera.py

ファイル名はうまく時刻通りになっていますがExifUTCのままです、面倒くさくなってきました。 あとこのカメラ、画角がかなり狭いですね(narrative clip 比)

おっと熱々です。今日はつかれたのでここまで。詳しい人いろいろ教えろください

続き

domain.hatenadiary.jp

参考

futuremix.org

qiita.com

qiita.com

qiita.com

docs.m5stack.com