まず、ドキュメントのハテナ箇所から整理。
参照したドキュメントは「LinkSprite JPEG Color Camera Serial UART Interface」との表題がついたものでJanuary 2010と日付が記載してあります。
まぁ、この手のドキュメントは見れば見るほど?になるものもあるようで。
まず、シャッタを切った後、コンテンツをカメラから読みだすわけですが・・・。
これでプロトコルの説明だというのだから大変です。
「え?どれがマーカー?」、「ちょ、ちょっと。Returnの枠内にCommandの内容書かないでよ。」といちいちドキュメントに突っ込みたくなります。
そして、思わず苦笑いしてしまうのがフローチャート。
もうこの辺りから「あぁ、このドキュメント信用できねー。」となります。
肝心の撮影後のコンテンツ吸い出しのフローに至っては、意味不明な条件分岐記述のおかげで処理がさっぱりわかりません。
一体どこでどういう判定をするんだ・・・。
で、実はこのドキュメントの品質もさることながら・・・、
実はファームウェアバージョンによってプロトコルの仕様が異なるのでは?
というのが本日の本題なのです。
ドキュメントがこんな状態でしたので、参考までにSparkFunが提供しているArduino用コード眺めると読み出しは以下のような記述になっていました。
- 読み出しリクエストをカメラに送る。(16bytes)
- カメラからレスポンスヘッダを読み取る。(5bytes)
- カメラからデータを読み取る。(32bytes)
- 上記を繰り返す。
暫くして同じような問題に遭遇している人がいないかどうかを調べてみるとArduinoのフォーラム上で気になる発言を見つけました。
「Then after you've read the returned data (42 bytes with the 5 header and 5 footer bytes)」
なんと、5バイトのフッターがあると書いてあります。
先ほどのドキュメントのフローチャートを無理矢理そのように読もうとしても・・・はっきり言って違う。
こちらからカメラへの5バイト送信はないわけだし。
ということで試しに5バイトのフッターがある仮定でコードを修正してみると・・・。
動きました。要するに
- 読み出しリクエストをカメラに送る。(16bytes)
- カメラからデータヘッダを読み取る。(5bytes)
- カメラからデータを読み取る。(32bytes)
- カメラからデータフッタを読み取る。(5bytes)
- 上記を繰り返す。
ですが、気になるのはArduino用のコード。
どうも過去にはこのコードで動作確認をしている方もいるようです。
これのヒントは起動時のファームウェアバージョン出力にあるかもしれません。
ちなみに私の所有するカメラは以下のような出力をしてきます。
VC0703 1.00
3o ctrl in
Init end
これはファームウェアのバージョンによって異なるようで、ドキュメントにはInit endを見て処理しろと書いてあります。その部分だけは固定されているのでしょう。
これははっきり言ってハマります。
あのドキュメントとメーカが供給しているArduino用サンプル。
この二つがあれば完全に「何で動かないんだ?」モードに突入です。
今回ひとまず動作確認したmbedライブラリを以下に公開しておきました。
- http://mbed.org/users/shintamainjp/libraries/Camera_LS_Y201/lig5jr
- http://mbed.org/users/shintamainjp/programs/Camera_LS_Y201_TestProgram/lifvd3
あ、ちなみに上記の640x480の画像サイズでボーレート38400の場合、SDカードにテコテコ書きながらですと約25秒・・・。
追記1:@arms22さんから「ボーレートコマンドを送信するとカメラが動作しなくなった。」との報告を受けました。これは先日の私のブログにも書いた現象に相当するものかもしれません。それでもボーレート変更を試したいという方はワーストケース(ROMを書き直さないと復活できない)も考慮して試行したほうが良いかもしれません。