FlashAirを用いてカメラで撮影した写真を自動取り込みする

# はじめに
デジカメで撮影した写真をPCに取り込む作業は、以下のように何かと手順が多く面倒です。

1. SDカードをカメラから取り出す
2. SDカードをPCに接続する
3. エクスプローラー等で取り込む写真を選択する
4. どこかのディレクトリに保存する
5. SDカードをPCから取り外す
6. SDカードをカメラに戻す

この面倒さ故に取り込み作業をサボってしまい、せっかく撮った写真がSDカードの中で眠った状態になってしまうことがあります。そこで[FlashAir](http://www.flashair.info/)を用いて、写真の取り込み作業を自動化してみました。写真撮影後にカメラの電源を入れるだけで、撮影した写真が自動的にPCに転送されます。

![IMG_3267-セグメント 1.gif](https://qiita-image-store.s3.amazonaws.com/0/61029/b5145630-012e-9583-4219-73141a72fd3e.gif)


# FlashAirとは
## 概要
[FlashAir](http://www.flashair.info/)は、東芝が生産している無線LAN機能付きのSDカードです。SDカード自体が無線LANの親機として動作し、スマホ等がそれに接続することで、SDカード中のデータをダウンロード出来ます。CM等では、デジカメで撮った写真を周囲の人とシェア出来ることをアピールしています。32GBの容量でヨドバシ等では4,500円ぐらい、Amazonの並行輸入品だと3,500円ぐらいで買えます。

## FlashAirに秘められたポテンシャル
このようなFlashAirですが、実は非常に開発者フレンドリーな製品です。[FlashAir Developers](https://flashair-developers.com/ja/)という開発者向けの情報サイトも開設されており、開発者向けの様々な情報が公開されています。これはSDカードなのか…?という機能が盛りだくさんであり、例えば次のようなことが出来ます。

- 無線LAN親機と子機、それぞれに役割を切り替えて動作する(同時動作も可能)
- インターネット上からファイルをダウンロードする
- FlashAirがWebサーバとして振る舞う
- GPIO制御によりSDカードの端子を操作する
- Luaスクリプトにより、FlashAirの動作を制御する

今回は主にLuaスクリプト実行機能を用いて、カメラで撮影した写真をPCに転送してみます。

# 写真自動取り込みシステムの概要
今回構築したシステムは、以下の要素から成り立ちます。

- FlashAir：カメラに挿入。撮影した写真データの保存先であるとともに、写真の転送処理を行う。無線LAN子機として動作。
- FTPサーバ：写真の保存先であり、今回はPC上に構築。無線LAN子機として動作。
- 無線LANルータ：FlashAirとFTPサーバを接続するためのネットワークを構成する。無線LAN親機として動作。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/61029/766e2ede-b872-2646-c839-656f36b23091.png)

そしてこのような構成の上で、写真の取り込み作業を次のように行います。

1. 無線LANのネットワーク圏内でカメラの電源をONにする(手動)。
2. FlashAirの電源がONとなる。
3. FlashAirが無線LANネットワークに接続する。
4. SDカードに保存されている写真データを、FTPサーバに対して転送する。
5. 転送が終わるまでカメラを放置し、転送が終了次第カメラの電源をOFFにする(手動)。

2~4の動作は自動で行われるため、実際に手を動かすのはカメラの電源のON/OFF作業のみとなります。転送が終わるのを見極めてカメラの電源をOFFにするのが面倒ですが、妥協することとします。

# 実装手順
実装手順は以下の通りです。

1. FTPサーバの構築
2. FlashAirのCONFIG設定
3. Luaスクリプトの作成と配置

## 1. FTPサーバの構築
まず写真を受け取るためのFTPサーバを構築します。今回はお試し用として、Windows 10 Homeの環境で構築しました。Windowsには標準でFTPサーバの機能が付いているため、比較的簡単に構築が出来ます。構築には[Windows 10/8/7/Vista に FTP サービス をインストール](https://creativeweb.jp/personal-site/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を使ったファイルのアップロード](https://www.flashair-developers.com/ja/documents/tutorials/lua/4/)を参考とし、カメラの保存ディレクトリ内のファイルを、順次アップロードします。今回用いたカメラはRICOHのGR IIであり、`/DCIM/458RICOH`中に撮影写真が保存されるため、そのディレクトリ中のファイルを順次アップロードします。アップロードを終えたデータは、再アップロードされないよう別のディレクトリ(`/DCIM/AlreadyUploaded`)に移動します(削除しても良いですが、何らかの要因でデータを紛失した場合に備えておきます)。`server, serverDir, user, passwd`には、FTPサーバのIPアドレス、アップロード先ディレクトリ、ユーザ名、パスワードを指定します。

``` lua
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)](https://seesaawiki.jp/flashair-dev/d/Tool%3aFlashTools%20Lua%20Editor%20%28FTLE%29)というすごいツールを公開しているので、開発を行う際には利用することをおすすめします。デバッグ時に本当に役立ちました！