E-TTL2-通信の解析1を踏まえてESP32でデコーダーを作ってみた。
ESP32との接続
カメラーストロボ間は5V、ESP32は3.3V駆動なので、そのままでは繋げないため、とりあえず降圧させるための検討を行った。
初めは、以前購入していたレベル変換用のICを使ったもの。
双方向なので使えるのかな、と思ったのだが駄目だった。
今回はESP32への入力のみなので、手元に8KΩの抵抗があったので分圧して3.3Vへ変換した。
抵抗を使った場合、波形がなまるという話も聞いたのだが、100kHzぐらいではあまり問題ないようなので、これでとりあえず回路を作ってつなげてみた。
プログラム的なもの
クロックが100kHzで、X接点をCSにしてSPI用のAPIが使えるかなとは思ったのだが、プリフラッシュでCLKのトグルが入るため、自前ソフトで対応することにした。
今回得たい情報としては、以下のもとしている。
- デコードした8ビットデータをバイトの配列情報として取得する
- X接点が動作している時間とどのタイミングで動作開始だったのかを計測する
- 上の2つの情報を、シリアル経由でPC側に出力する
上記を実現するため、またシリアルでのデータ出力を行うため通信が行われていない状態というのを認識するため、以下のように、状態管理をして見た。
- Start
プログラムの開始タイミング - Deep Sleep/None
CLKがLOWの場合 - Latch/NotDetectNextLatch
CLKが立上り、データの送受信の準備が整った場合 - Latch1
CLKが立上り、カメラ、ストロボからのデータを読み込み、8ビットで1バイトの情報として貯める - Latch/DetectSleep
CLKがHIGHの状態で100μ秒経過した時で、データの送受信がないため、そのままCLKがLOWになりスリープ状態になるかどうかを検出する状態 - Sleep/DetectDeepSleep
CLKがLOWになり一定時間が経過した時
これをもとにしたプログラムが以下になる。
データがある状態でDeep Sleepになった場合、貯められたデータをシリアル出力するようにしている。
シリアルデータ出力に関して
シリアルでのデータ出力は、いくつか段階を踏んで実装している。
当初は、貯められたデータをそのまま出力していた。
ただ、これだとデータの解析などがしづらいので、同じようなデータをまとめるようにしたのが次の段階。
これにより、どのデータがコマンドなのかそしてデータなのかが分かるようになったので、次はコマンドをキーとしてブロック化していった。
最後に、ブロック化したデータでもさらにそのデータ群が連続して出力されていたので、それら同一データを無視するようにした。
これをもとに、カメラを操作し、その時のコマンド/データをまとめることができるようになった。
コメント