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度という顛末に (1 of 4)


360度カメラの自作デモに感化される

Arduino Panorama Photography with ArduCAM」という記事に感化され、360度カメラを自分でも作ってみようと思いました。

とはいえ、記事をそのままなぞっても面白くありません。純粋に360度カメラが欲しいなら、THETA買えばいいじゃん!とも思ってしまいます。

せっかく自作するなら、360度カメラの入力をリアルタイムに画像認識させたり、動画撮影できるように拡張したり、VRヘッドセットの出力に直結させたりといった、応用的な使い方を開拓したいのです。しかし、そういう重い処理は、記事どおりの作り方では実現できません。Arduino UNOのAVRマイコンにはそこまでのスペックがないのです。

軽い気持ちで、Edison Kit for Arduinoを選択する

そうなると、超小型でありながらデスクトップLinuxと同じように使えて、スペックも申し分ない、「Raspberry Pi」と「Intel Edison」のどちらかを選ぶ事になります。(他の競合製品を知りません。完全に独断です)
ラズパイとArduCAMカメラモジュールの組み合わせは動作実績があるようですが、EdisonとArduCAMの組み合わせは、いくらググっても何も出てきません。誰も試していないのでしょうか?
Edisonについてさらに調べてみると、Arduino互換ボードが発売されている事が分かりました。Arduino UNOの代替としてはうってつけだと思い、今回はEdisonを使うことにしました。

Arduino UNOをEdison Kit for Arduinoに置き換える以外は、記事通りのやり方で自作します。ArduCAMの提供元はEdisonで動くなんて一言も言っていませんが、Arduino互換ボードなのだから、問題なく動く筈です。(程なくして、この目論見の甘さを痛感する事になりました)

数々の困難を乗り越えて、ようやく完成
完成写真(横から) 完成写真(上から)

当初は、前後左右に4台のカメラモジュールつける予定だったのですが、作成途中に2台が壊れてしまい、このような形になってしまいました(泣)。

壊れたと言っても、カメラモジュールが不良品だった訳ではなく、私が、カメラと本体(Edison)の結線を間違えてしまった為、内部回路が焼き切れてしまった事が原因だと思います。(動くようになるまでに数百回とI/Oピンを抜き差ししていたので、2、3回間違えても不思議ではない・・・と自分を慰めてみる)

本当は動作デモをお見せしたかったのですが、今回は動くようになったところで力尽きてしまいました。後日、改めてアップします。