前回からの続きです。
複数のカメラを繋ぐと上手くいかない
I2C通信に問題があることが判明しました。次は、それがデモプログラムの組み方の問題なのか、もっとハードウェア寄りの問題なのかを見極める必要があります。
そこで、Edison上のLinuxに同梱されている、i2c-toolsというI2C通信用コマンドセットを使って、現象の再現を試みました。再現しないならデモプログラムの問題で、再現するならハードの問題という事になります。
まず、i2cdetectコマンドを使って、接続されているI2C機器(今回の場合はカメラモジュール)のアドレスを取得できるか確認しました。1台のカメラを接続した状態であれば100%取得できます。(”30″というのが、ArduCAMのアドレスです)
2台繋ぐと少し取得の成功率が下がり、3台を超えると全く取得できなくなりました。
i2cdumpコマンドによるパラメーターの読み出しも試みましたが、同じ傾向が見られます。
EdisonのI2CバスにArduCAMを複数台繋げると、通信障害が起きるようです。結局、ハードの問題でした。(プログラムの問題なら対処も簡単だったのに・・・現実は厳しい)
とはいえ、手元のArduCAMカメラモジュールがJPEG画像を出力したところを一度も見たことがない自分としては、そもそも初期不良なのでは?という不安も払拭しきれません。
Arduino UNO なら問題なし
そこで、初期不良かどうかはっきりさせる為に、Arduino UNOも購入することにしました。
現品の到着後、早速、Edison for ArduinoをArduino UNOに差し替えてリトライしました。1台でも複数台でも、ちゃんと動きます。これで、初期不良ではないことがはっきりしました。
余談ですが、実はArduino UNO上で動かす時に、少々ハマりました。Arduino UNOは、Edisonと違ってメモリ領域の制限が厳しい為、デバッグ用にSerial.print(“xxx”)を挟みすぎると、文字列定数(“xxx”の部分)が貴重なメモリ領域を圧迫してしまいます。これが一定量を超えると、変数の読み書きが正しく行えず、プログラムの挙動が不安定になります。(本家サイトにも注意書きがありました)
結局、1台だけでも上手く行かない
この自作カメラは、1本のI2Cバス上に、同じI2Cアドレスを持つArduCAMカメラモジュールを複数台繋げる構成になっています。普通は、複数の機器を同一バスに繋ぐのであれば、それぞれが異なるアドレスを持つべきです。しかし、開発者本人は、「確かに良い設計とは言えない。でも、動くよ。」という見解のようです。実際、Arduino UNOで動くことは私も確認しました。でも、EdisonのI2Cバスにはその力技が通用しないという事なのかもしれません。
そこで、一旦複数台のカメラを繋ぐ事は先送りして、1台だけつないだ状態で動かしてみる事にしました。1台のみであれば、I2C通信に問題がないことは前述のi2c-toolsで確認済みです。
ところが・・・デモプログラムは動きません。
デモプログラムを動かす為には数十個のパラメーターを設定する必要があるのですが、ある特定のパラメーターに書き込みすると、それ以降、どのパラメーター書き込みもエラーになるのです。しかも、動作電圧(3.3V / 5V)によって、エラーの引き金となるパラメーターが異なります。加えて、3.3Vなら、同じパラメーター書き込みを何度も繰り返しているうちにいずれ成功するのですが、5Vだと、どれだけリトライしても失敗し続けます。
もはや説明がつきません。EdisonとArducamは相性が悪いのでしょうか?
デジアナを買って、原因を追求
それでも、ここまで来たら諦めきれません。I2C通信の波形を見れば、何かヒントが得られるかも知れないと思い、Analog Discovery 2 というデジタルアナライザを購入しました。(今回の自作は、結構な額を出費しています(泣))
早速、波形を観測してみました。
I2C通信のプロトコルシーケンス自体に問題はなく、Arducamがエラー応答(NAK)を返しているように見えます。
ちなみに、書き込みに成功した場合は以下のシーケンスになります。
残念ながら、カメラセンサーの内部構造を知らない私には、NAKを返す原因を調べる術がありません。
通信速度を落としてみるも効果なし
実は、デジアナであれこれ調べている時に、NAKとは別にもう1つ気になる点がありました。EdisonとArduino UNOの波形が少し違うのです。
Arduinoと比べると、Edisonの方はクロックのHI電圧が上がりきっていないように見えます。これが問題の原因とは考えにくいものの、他にやれることも見当たらないので、ここに対策を打ちます。
いろいろ調べた結果、Arduino UNOは100kHzのスタンダードモードがデフォルト設定で、一方のEdisonは400kHzのファーストモードがデフォルト設定だと知りました。
そこで、Edisonをスタンダードモードに落とした状態で、再度波形を観測してみます。
理想的な波形になりました。なったのですが・・・やはり、NAKを返す問題は解消されませんでした。
もう、打てる手がありません。
「360度カメラを自作しようとして、180度という顛末に (3 of 4)」への1件のフィードバック
コメントは受け付けていません。