BLE露出計ガジェットをMFT2022に出展しました

こんにちはムウラです。
普段はGoogleCloudパートナー企業でバックエンドエンジニアをやっております。

本業とは別に、去年の終わりごろから、趣味のクラシックカメラ関係のガジェットを開発していたため、そのネタで[Maker Faire Tokyo 2022](https://makezine.jp/event/mft2022/)に出展させて頂きました。
今回初出展でしたが、色々と学ぶことがあったので投稿します。

- 当日見に来てくださった方々へ
開催時点では準備できていなかった、メイキングエピソードも公開しましたので、是非見ていってくださいませー

## 作品について
純粋な機械式フィルムカメラに取り付けることで、撮った日時や場所、そしてF値・シャッター速度などのメタ情報を記録できるガジェットを開発しました。
デジカメのメタデータ記録機能`Exif`と二眼レフの`Reflex`の掛け合わせて、<b>ExiFlex</b>と命名しました。

### メインコンセプト
- ベースはスマホアプリ、フィジカル部はBLEマイコンで対応 ※
  - セントラルがiPhoneアプリ、ペリフェラルがESP32からなるシステムを採用
- ストロボシンクロ端子をトリガーして、シャッター押下を検出する
  - クラシックカメラに搭載されている唯一の電子インタフェースを活用（大袈裟）
- 光量を測定して適正露出を計算する
  - 市販されている露出計の動作を、ガジェットに組み込む

※ これについては出展を経て、若干考えが変わりつつあるため後述します

#### システム構成
~~気付いたらこうなっていた~~ 　以下のような構成で設計を行いました。
![concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/7945828c-60a7-76b9-f502-41a9950c84b4.png)

#### 参考にした露出計
通常、露出なんてカメラが勝手に調整してくれるので、こんな器具使う機会はまず無いと思うのですが、クラシックカメラでは必需品のため、簡単に説明します。
露出計は以下のような測定器具で、右上LED<font color="#66EE00">●</font>が点灯すると、適正露出を意味します。
<img width="300" alt="IMG_8016.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/039cb518-9942-d66f-4bef-04c4d2b1d085.jpeg">
下部にあるダイアルで目標とするF値またはシャッター速度を設定し、適正露出よりも明るい場合は<font color="#FF0000">▶︎</font>が、反対に暗い場合は<font color="#FF0000">◀︎</font>が点灯します。
その場合は、目標としない側（目標がF値ならシャッター速度、シャッター速度ならF値）を増減して、適正露出を探っていくという使い方をします。

#### ガジェットへの組み込み
この露出計と同じ機能をiPhoneアプリに組み込むことで、撮影時のF値、シャッター速度をアプリに記録する設計としました。
鋭い方ならお気付きかもしれませんが、実際のカメラのF値、シャッター速度がどうなっているのかは<b>全くお構いなし</b>です！（笑）
露出計通りにカメラを調整して撮影した、という前提での機能となります。

### 技術的な課題
BLE (Bluetooth Low Energy)によるIoTガジェットを開発する上で、以下の課題に取り組みました。
- セントラルをiPhoneアプリで開発
    - Core Bluetoothを用いたSwiftネイティブアプリ
    - UIはSwiftUIで作成
    - フィルムカメラのメタファーをアプリに取り入れる
    - 露出計を作る
    - 環境光測定機能を作る
    - アルバム整理機能を作る
    - GPS情報を取得してGoogleMapにピンを立てる
- ペリフェラルをESP32マイコンで開発
    - 開発言語はArduino(C/C++)
    - シャッターシンクロ端子の信号を検出する
    - Luxセンサー、三刺激(XYZ)センサーを搭載する
      - これらを搭載した基板を作成
      - センサーの値を読み取ってBLEでiPhoneへ飛ばす

Core Bluetoothは初挑戦でしたが、定番のこのサイトは大変参考になりました。

https://zenn.dev/kndoshn/articles/31bf75064b9d05

https://blog.reinforce-lab.com/post/2013-09-19-blebook-ch3-corebluetooth/

ESP32側は、こちらのライブラリを使用しました。

https://github.com/nkolban/ESP32_BLE_Arduino/blob/master/examples/BLE_notify/BLE_notify.ino


## 完成までの道のり

### 計画・検証 （2021年）

- 10月〜
ハロウィンにて、クラシックカメラで色々写真を撮ったが、現像後に当時撮影時の露出、シャッター速度を知りたくなり、ExiFlexの構想を考える。

- 12月〜
ESP32のBLEサンプルプログラムを作成し、ESP32からの通知をBluetoothスキャンアプリで受けられることに感動する。

### 初期構築
- 1月〜
ちゃんとしたiOSアプリを作るために、SwiftUIの学習を始める。こちらの本が大変役立った。

https://www.amazon.co.jp/dp/4844378678/ref=cm_sw_r_tw_dp_6P7A5CBPVSHQ84MW0CRZ

- 2月〜
Core Bluetoothの学習を始め、状態遷移の設計を行う。また、iPhoneアプリにBLEペリフェラル選択画面を作成する。

- 3月〜
iOSアプリにBLEマイコンと連動した撮影機能を作成する。
メイン基板にシンクロケーブル及び照度センサーを実装し、現在の撮影機能の原型を作る。

### MFT2022応募〜選考結果
MFT2022応募締め切りの4月末当時、バックエンド畑の僕はiOSアプリ開発に苦戦してましたが、何とかESP32とiOSアプリをBLE連動できる状態になったため、意を決して応募することとしました。
当初、ESP32 Dev Moduleをブレッドボードに載せただけのへっぽこな状態でしたが、6月中旬、当選のメールが来ました。
応募当初の完成状態から厳しいと思っていただけに、本当に嬉しかったです！
以下、紹介頂いた記事となります。

https://makezine.jp/event/makers-mft2022/m0181/

### 当選後の開発状況

- 環境光測定モード
DigiKeyを物色していたら、三刺激センサー[TCS3430](https://ams.com/ja/tcs3430)なるものを発見しました。
これ使えば、現像データ化後にオートホワイトバランスを実現できるのでは？と思い立ち、1ヶ月がかりで部品調達＆アプリ実装。
アプリ上にCIE1931の馬蹄図が表示できて喜んでいたのも束の間、無補正でのセンサ出力値は実際値とのずれが大きく、[キャリブレーション](https://ams.com/documents/20143/36005/TCS3430%20calibration_AN000571_1-00.pdf)が大変でした。
  -  校正機材
写真左の測色計 (SEKONIC C-700) を新宿のマップレンタルで借りてきました。
ガジェット左上に貼ってあるシールは、測色計の積分球と同じ役割を果たすための拡散フィルムです。
![IMG_7591 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/b8ef2d07-63d5-5e7d-7a31-237b64916e07.jpeg)
  - 重回帰分析による校正行列の同定
測色計で色度座標x, yを測定できると思っていましたが、まさかの非対応（上位機種のみの搭載機能）でしたorz
辛うじて試験光源の色温度は測定できたため、色温度に対応した色度座標の理論値を教師データとして計算しました。
![スクリーンショット 2022-09-12 10.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/738bca0c-6a90-7a46-b9ae-d0977b31296b.png)

- GoogleMapを組み込む
本業がGCPパートナーということもあり、学習も兼ねてGoogle Mapを組み込んでみました。

- CoreDataによるデータ保存
データの保存機能がありませんでしたので作成しました。
記録されるデータの特性として、フィルムとカット(撮影の1コマ)のリレーション関係があるため、CoreDataを使用したリポジトリを実装しました。
![スクリーンショット 2022-09-10 16.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/ff135e61-90da-363c-1b09-bcca40f34a6b.png)

### 完成した作品

開発はまだ続いているため、MFT2022出展バージョンとなります。

#### アプリ
以下の3画面からなるアプリを開発しました。
左から順に、撮影画面、環境光測定画面、アルバム整理画面（開発中）となります。
![IMG_8025.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/f2acae19-0fc1-5604-33c1-16d4d697c983.png) ![IMG_8026.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/fe392ccb-5dfc-cd55-dded-3a61d207d2b1.png) ![IMG_8027.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/7a1d7896-c5ba-e919-4f7d-2a8fd75f7e14.png)

#### ハード
試作品ということで、秋月のユニバーサル基板にESP32Dev Moduleおよびセンサー類を実装してあります。
それらを固定アームで接続して、台座を介して三脚ネジでカメラに固定しました。
![hardware.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/865e36c4-17a1-60b2-f0a9-07db32300c1c.jpeg)

## 出展当日
開発開始から10ヶ月程度経ちましたが、あっと言う間に当日が来てしまった感じでした。

### ブースの様子
全体の様子です。思っていたよりもスペースが広い！！スカスカな展示スペースが少し寂しいですね。。。
メイキングビデオを流すディスプレイを置いたり、リーフレット等も作りたかったですが、開発だけで精一杯で断念しました。
そして周りの先輩方Makerの展示には圧倒されました。Σ(ﾟДﾟ)

![IMG_8002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/26ac90f2-031a-6a9a-2132-8cd3734d2a04.jpeg)
作品のアップ
![IMG_8001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/91fc8828-c7d6-8398-3369-59b4d55c7c23.jpeg)

### 良かった点とイマイチだった点
シャッターシンクロ端子をトリガーしてiPhoneアプリが反応する仕掛けは、良い反応を頂き嬉しかったです。
シャッターを切った後に、フィルムが巻き取られるアニメーションが良い、という反応もありました。
一方、環境光測定モードのCIE1931馬蹄図については時間をかけた割にはあまり反応がなかったため、改善の余地ありです。
ただ、色温度が分かるのは嬉しいという意見もあったため、表示方法をもう一捻りしたいところです。

### 説明の仕方について
まず初めに、何の装置なのかを説明するのが大事だと思いました。
1日目の最初の頃は、「これはセンサーです」みたいな感じで正しく説明できておらず、初見殺しな説明をしておりました。。。

そしてこの作品の場合、露出計という市販されている製品の機能があるため、それについて簡単に説明した上で比較することで、正しく作品のコンセプトを伝えられると感じました。

### お客さんとの交流
色々な方に見ていただくことで、感想や意見が得られるMakerFaireは素晴らしいと思いました。作った本人なので「完全に理解した」と思っていましたが、自分でも気付かないことも、往々にしてあるものだと思いました。

- F値やシャッター速度はフィルムに記録しているのか？
  - 撮影情報はiOSアプリに記録しています。
  - フィルムに焼き込みが出来たら、それはそれで凄すぎますね（アフレコ機能？！）
  - その昔、フィルムのコマの間に、撮影情報を書き込んでくれるカメラもあったらしい
- 現像されたデータにどうやってExif情報を埋め込むのか？
  - 仕様が決まっていませんorz
  - 主題にデカデカとExifと謳っているが、まだまだ「Exifみたいな」というレベルで、Exif規格に準拠している代物では無いです。。。
  - とは言え、今後対応したい機能ではある。
- カメラのボディからF値とシャッター速度を引き出している？
  - いいえ、カメラではなく露出計の測定値を記録しているだけです。
  - 露出計の値通りにカメラを調整して撮影すれば、結果的にF値とシャッター速度が記録されるというトリックです。
- 友人が大学の同好会で、似たような露出計自作してましたw
   - マジですか！　てか東大きらら同好会、って何すか？！
- 懐かしいカメラですねー　某メーカーで設計してました
   - 神降臨ｷﾀ (ﾟ∀ﾟ) !!

### 頂いたアイディア
数々のアイディアをいただきました。この場を借りてお礼いたします！

- 筐体関係
    - 3Dプリンターで筐体製作
- 小型化
    - より小さなBLEモジュールを使用する
      - [LILYGO](http://www.lilygo.cn/claprod_view.aspx?TypeId=62&Id=1126&FId=t28:62:28)の存在を知る
      - [Seeed Studio](https://akizukidenshi.com/catalog/g/gM-17341/)の存在を知る
    - バッテリーなどが統合されたESPモジュールを使う
      - M5Stackを使う
    - 脱ユニバーサル基板
      - 導電インクで基板製作
- F値、シャッター速度の自動取得
    - カメラボディのF値、シャッター速度をOCRで検出
    - ストロボ端子のTTL信号をハックして撮影情報を取得する

## 出展を終えて
出展を経て、さまざまな意見を頂き、今後取り組むへき課題が見えてきました。

### 今後の課題
当初は、「ベースはスマホアプリ、フィジカル部はBLEマイコンで対応」というシステムで検討してきましたが、実際の利用シーンを考えると、片方の手でカメラを持ち、もう片方の手でスマホを持つというのは無理ゲーすぎます。
出展を経て、この部分が最大の問題であることに気付かされました。

`スマホは常にポケットに入れておき、勝手に撮影情報が記録されていくようなもの`が、一つの落とし所なのかなと思えてきました。
今後も改良を重ねていきますのでよろしくお願いします(*_ _)ペコリ

### おまけ
出展の合間、いくつかブースに遊びに行ったのですが、千葉大学教育学部 MAKERS-EDUさんのブースでなんとExiFlexのオリジナルストラップを作っていただきました。
皆さん素晴らしい先生になれることを期待してます！
![IMG_8031 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2828500/40297248-3359-868f-58f6-8d3e0b7ed49d.jpeg)