はじめに
デジカメで撮影した写真をPCに取り込む作業は、以下のように何かと手順が多く面倒です。
- SDカードをカメラから取り出す
- SDカードをPCに接続する
- エクスプローラー等で取り込む写真を選択する
- どこかのディレクトリに保存する
- SDカードをPCから取り外す
- SDカードをカメラに戻す
この面倒さ故に取り込み作業をサボってしまい、せっかく撮った写真がSDカードの中で眠った状態になってしまうことがあります。そこでFlashAirを用いて、写真の取り込み作業を自動化してみました。写真撮影後にカメラの電源を入れるだけで、撮影した写真が自動的にPCに転送されます。
FlashAirとは
概要
FlashAirは、東芝が生産している無線LAN機能付きのSDカードです。SDカード自体が無線LANの親機として動作し、スマホ等がそれに接続することで、SDカード中のデータをダウンロード出来ます。CM等では、デジカメで撮った写真を周囲の人とシェア出来ることをアピールしています。32GBの容量でヨドバシ等では4,500円ぐらい、Amazonの並行輸入品だと3,500円ぐらいで買えます。
FlashAirに秘められたポテンシャル
このようなFlashAirですが、実は非常に開発者フレンドリーな製品です。FlashAir Developersという開発者向けの情報サイトも開設されており、開発者向けの様々な情報が公開されています。これはSDカードなのか…?という機能が盛りだくさんであり、例えば次のようなことが出来ます。
- 無線LAN親機と子機、それぞれに役割を切り替えて動作する(同時動作も可能)
- インターネット上からファイルをダウンロードする
- FlashAirがWebサーバとして振る舞う
- GPIO制御によりSDカードの端子を操作する
- Luaスクリプトにより、FlashAirの動作を制御する
今回は主にLuaスクリプト実行機能を用いて、カメラで撮影した写真をPCに転送してみます。
写真自動取り込みシステムの概要
今回構築したシステムは、以下の要素から成り立ちます。
- FlashAir:カメラに挿入。撮影した写真データの保存先であるとともに、写真の転送処理を行う。無線LAN子機として動作。
- FTPサーバ:写真の保存先であり、今回はPC上に構築。無線LAN子機として動作。
- 無線LANルータ:FlashAirとFTPサーバを接続するためのネットワークを構成する。無線LAN親機として動作。
そしてこのような構成の上で、写真の取り込み作業を次のように行います。
- 無線LANのネットワーク圏内でカメラの電源をONにする(手動)。
- FlashAirの電源がONとなる。
- FlashAirが無線LANネットワークに接続する。
- SDカードに保存されている写真データを、FTPサーバに対して転送する。
- 転送が終わるまでカメラを放置し、転送が終了次第カメラの電源をOFFにする(手動)。
2~4の動作は自動で行われるため、実際に手を動かすのはカメラの電源のON/OFF作業のみとなります。転送が終わるのを見極めてカメラの電源をOFFにするのが面倒ですが、妥協することとします。
実装手順
実装手順は以下の通りです。
- FTPサーバの構築
- FlashAirのCONFIG設定
- Luaスクリプトの作成と配置
1. FTPサーバの構築
まず写真を受け取るためのFTPサーバを構築します。今回はお試し用として、Windows 10 Homeの環境で構築しました。Windowsには標準でFTPサーバの機能が付いているため、比較的簡単に構築が出来ます。構築にはWindows 10/8/7/Vista に FTP サービス をインストールを参考にしました。Homeエディションの場合、"管理ツール"からのユーザの追加が制限されていますが、"設定>アカウント>家族とその他のユーザー"から、他のユーザとしてローカルアカウントを作れば大丈夫です。
2. FlashAirのCONFIG設定
FlashAir中の/SD_WLAN/CONFIG
を書き換え、次のように設定します。
- 無線LANモードをSTAモード(FlashAirが無線LAN子機となるステーションモード)に変更:
APPMODE
- 接続先無線LANネットワークの設定:
APPSSID, APPNETWORKKEY
- アップロード機能の有効化:
UPLOAD
- 起動時に実行するLuaスクリプトのパス:
LUA_RUN_SCRIPT
実際のCONFIGファイルを以下に示します。
[Vendor]
CIPATH=/DCIM/100__TSB/FA000001.JPG
VERSION=F15DBW3BW4.00.02
CID=12345678901234567890123456789012
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=AAAAAAAAAAAA
APPMODE=5
APPSSID=接続先のSSID
APPNETWORKKEY=接続先のセキュリティキー
UPLOAD=1
LUA_RUN_SCRIPT=/UploadPhotos.lua
これらの設定により、FlashAirは電源が入ると、APPSSID
で指定した無線LANネットワークに接続し、LUN_RUA_SCRIPT
で指定されたLuaスクリプトを実行します。
3. Luaスクリプトの作成と配置
作成したスクリプトを以下に示します。FlashAir Developers中のFTPを使ったファイルのアップロードを参考とし、カメラの保存ディレクトリ内のファイルを、順次アップロードします。今回用いたカメラはRICOHのGR IIであり、/DCIM/458RICOH
中に撮影写真が保存されるため、そのディレクトリ中のファイルを順次アップロードします。アップロードを終えたデータは、再アップロードされないよう別のディレクトリ(/DCIM/AlreadyUploaded
)に移動します(削除しても良いですが、何らかの要因でデータを紛失した場合に備えておきます)。server, serverDir, user, passwd
には、FTPサーバのIPアドレス、アップロード先ディレクトリ、ユーザ名、パスワードを指定します。
local photosFolder = "/DCIM/458RICOH"
local destinationFolder = "/DCIM/AlreadyUploaded"
local server = "192.168.11.3" -- IP address of FTP server
local serverDir = "/wwwroot" -- FTP server upload folder
local user = "flashair" -- FTP user name
local passwd = "password" -- FTP password
local ftpstring = "ftp://"..user..":"..passwd.."@"..server..serverDir
for file in lfs.dir(photosFolder) do
attr = lfs.attributes(photosFolder .. "/" .. file)
if attr.mode == "file" then
response = fa.ftp("put", ftpstring .. "/" .. file, photosFolder .. "/" .. file)
if response ~= nil then
fa.rename(photosFolder .. "/" .. file, destinationFolder .. "/" .. file)
end
end
end
このプログラムをUploadPhotos.lua
としてSDカードのルートディレクトリ中に保存することで、電源投入後に写真の転送処理が行われます。
おわりに
このシステムにより、帰宅後にカメラの電源を入れて放置するだけで、写真が自動で取り込まれます。気がつけば取り込みが完了しているため、写真の選定や現像作業にスムーズに移行できます。似たようなシステムを作りたい方の参考になれば幸いです。
注意点など
- カメラの設定によっては、一定時間後に電源が切れるため、設定を変更し、起動時間を伸ばした方が良いかもしれません
- SDカードの電源はカメラから供給されるため、写真転送時はカメラのバッテリーの消費が早くなります。
- 環境にもよると思いますが、転送にはそこそこの時間がかかります(1MBあたり1秒程度)。そのため数百枚のRAWデータを転送する場合などは、素直にSDカードリーダで読み込んだ方が早いです。
- 現状のプログラムは、ファイル送信後にファイルの場所を移動する動作であるため、SDカードの空き容量がどんどんと減っていきます。そのため適度なタイミングでデータを削除する必要があります。
- FlashAirのデバッグ作業はかなり辛いです。有志の方がFlashTools Lua Editor(FTLE)というすごいツールを公開しているので、開発を行う際には利用することをおすすめします。デバッグ時に本当に役立ちました!