360度カメラを自作しようとして、180度という顛末に (2 of 4)

 

前回からの続きです。

待ち受けていた困難の数々

ここから先は、電子工作する方以外全く興味のない話になりますが、完成させるまでの苦労話をつらつらと書いてみます。同じ轍を踏む人が一人でも減ってくれることを祈りつつ。

部品の購入からLチカまでは順調

まずは、自作に必要な部品を購入します。

ハード一式

左がEdison for Arduinoボード、右がArduCAMカメラモジュール、中央がArducam4台を前後左右に接続するために使用する拡張ボードです。

組み立て後

これらを組み立てると、上の写真のようになります。後の説明で明らかになりますが、結局、Arducamを接続する拡張ボードは使うことができず、同サイズのブレッドボードに置き換わりました。

記事で使用されているデモプログラムはArduino用のソースコードなので、Arduino IDEを開発環境として使用します。これを自機のMacOS Xにインストール後、LEDを点滅させるだけの簡単なテストプログラム(通称、Lチカ)を動かしてみます。

Lチカ(ソース)Lチカ(Edison本体)

緑色に光っている部分がLEDです。写真では分かりませんが、ちゃんと点滅しています。ここまでは比較的スムーズに辿り着きました。

コンパイルできないデモプログラム

これで、デモプログラムを動かす準備が整いました。

GitHubからデモプログラムのソースコード(ArduCAM_Mini_2MP_4Cams_TimeElapse2SD.ino)をダウンロードして、Arduino IDEでビルドします。ところが、ここでコンパイルエラーになってしまいます。デモプログラムの動作ターゲットにEdisonが含まれておらず、ArduinoやRaspberry Piでのみ動作する書き方で実装されていたことが原因でした。
そこで、処理内容を変えることなくEdisonのコンパイラにも納得してもらえるよう、以下の点を修正しました。

  • itoa関数が見つからないというエラーが発生したので、snprintf関数で置き換え
  • パフォーマンス向上のためにArduino(AVRマイコン)のレジスタを直接操作してGPIO入出力を実装している箇所を、EdisonのArduino互換ライブラリに含まれているdigitalRead()/digitalWrite()呼び出しに置き換え
  • グローバル変数のオブジェクトポインタを宣言と同時に初期化している箇所でコンパイルエラーになったので、初期化処理をsetup関数の中に移動

これらの対策により、Edisonでもビルドが通るようになりました。

動かないデモプログラム

ビルドが通ったので、実機上で動かしてみました。うまく動いていれば、Edisonに装着したmicroSDカードへJPEG画像が出力されている筈です。期待と不安を胸に、SDカードを抜いて中身を確認しましたが、残念ながら何も出力されていません。

デモプログラムにSerial.print()を挟みまくって原因調査した結果、I2C通信に失敗していることが分かりました。

Edisonとカメラモジュールの結線は、電源(VCC, GNDの2本)、I2C通信用(SCL, SDAの2本)、SPI通信用(CS, MISO, MOSI, SCLKの4本)の3種類(8本)で構成されています。I2Cを使ってカメラのパラメーター(出力画像サイズなど)を設定し、SPIを使って撮影した画像データを読み取ります。

このような仕組みなので、I2C通信に問題があると、適切なパラメーター設定ができず、カメラ画像を取得できません。

「360度カメラを自作しようとして、180度という顛末に (2 of 4)」への1件のフィードバック

コメントは受け付けていません。