こんにちは。おもちゃ係の hideya です。4つローターのラジコン・ヘリ、Quadcopter(クワッドヘリ)をPCで操作しようという試みのつづきです。前回は、ヘリのリモコン(プロポ)を分解して、操縦レバーについている可変抵抗器をデジタルポテンショメータ「AD5206」で置き換える方向で進めることにして、これを注文したところで終わりました。で、その注文していたAD5206が届きました! そこで早速、このサンプルにしたがってArduinoとAD5206を結線して、動作を確認することにしました。
が、例のごとく、動かない。。 このサンプルプログラムは、AD5206に入っている6つのデジタルポテンショメータの値を1つずつ順番に増減し、それぞれに接続されたLEDを順に明滅させるはずなのですが、実行しても何も変化がありません。配線を何度も見直したのですが、間違いが見つからない。プログラムはサンプルからのコピペで、念のため内容もチェックしましたが、間違いっぽいところは見当たらない。。
小一時間迷った末に、ちょっと不意打ちチックな間違いを2つ見つけました。1つ目は、サンプルのこの回路図が微妙に間違っていたこと。回路図ではAD5206のSDIピン(7ピン)はArduinoのデジタルI/Oの12pinにつながっていますが、その下のSchematicな回路図やサンプルコード内のコメントによると、これは11pinにつなぐのが正しいです。まずこれを修正しました(回路図の間違いはサイトに連絡したのですが、8月20日現在、まだ修正されていませんでした)。
でも、それでも動かない。。 発見した2つ目の間違いの原因は、不注意なArduinoのバージョン選択にありました。Arduinoのハードウェアにはいくつかの異なるバージョンがあります。手近に「Leonardo」というバージョンがあったので、あまり考えずにそれを使っていました。ですがこのサンプル、調べてみるとLeonardoでは動かないんです。AD5206を制御するためには、SPIと呼ばれるデバイス同士を接続するインターフェースを使うのですが、サンプルコードはSPI用のピンがデジタルI/Oピンにつながっていることを前提に書かれています。しかしながら、LeonardoではSPI用のピンは別出しとのこと。サンプルの説明ページには、ハードウェアのバージョンに関する記述は何もなかったので油断してしまってました… 調べたところ「Uno」と呼ばれるバージョンでは動きそうです。遠い目をしながらLeonardoをUnoに差し替えました(上の写真は差し替えた後のものです)。
これら2つの間違いを修正したら、あっけなくサンプルプログラムが動きLEDが点滅しだしました。やれやれ。
次のステップは、リモコンの可変抵抗が入っていたところにAD5206のデジタルポテンショメータを入れ込むことです。可変抵抗4つ全部を一気に置き換えて成功する自信はもちろんないので、まずは、クワッドヘリの上下操作で使う、リモコン左側のスティックのY軸方向の操作量を読むための可変抵抗だけを、デジタルポテンショメータで置き換えてみました。くわえて、サンプルではポテンショメータ6個の値を1つずつ順に増減していましたが、これを、リモコンにつなげたポテンショメータだけが増減するように変更しました。こうすれば、LEDが明滅する代わりに、リモコンの左のスティックを上下に繰り返し操作したのと同じ挙動をする、つまりクワッドヘリは離着陸を繰り返すはずです。
これは難なく動きました。実際の回路では、上の写真のように、可変抵抗を取り外したままになっていた部分に4.7kΩの抵抗を付けて、レバーがニュートラルになっているのと同じ状態にしました。
ここまでくると、もうひと遊びしたくなります。そこで、Arduinoのアナログ・ピンに可変抵抗をつなげて、その値を読んで、デジタルポテンショメータを操作するようにしてみました。つまり「可変抵抗 ⇒ Arduino ⇒ デジタルポテンショメータ ⇒ リモコンの左のスティックの上下の模倣」という、なんとも回りくどいことをしてみました。注意が必要だったのは1点だけ。アナログ入力の値域とAD5206が受け付ける値域のレンジが、それぞれ0〜1023と0〜255で異なるということ。これはmap関数で対処しました。具体的には、サンプルのコードのloopを、以下のもので置き換えました(コードを書くまでもないですが、ご参考まで)。
void loop() {
int potValue = analogRead(A0);
potValue = map(potValue, 0, 1023, 0, 255);
digitalPotWrite(0, potValue);
}
下の写真は、この極めて回りくどい方法で、クワッドヘリの上下操作をしている様子です。
このアプローチを使うと、操縦レバーの付いたリモコンで操作できるおもちゃは、概ねArduinoを介して操作できそうで、その点で色々と応用がききそうです。
「クワッドヘリのPC制御」を実現するための次のステップは、PCとArduinoが通信するようにして、PCからクワッドヘリを操作できるようにすること。さらにその次は、クワッドヘリの位置と姿勢情報を何らかの手段で取得して、それをもとにPCでヘリの制御をすることになると思います。
そこで、PCからArduinoを操作する方法なのですが、一般的な場合で最も簡単なのはFirmataを使う方法。これを使うと、PCとArduinoの間の通信のプロトコルなど煩雑な部分は隠蔽されて、PCからは単純な関数呼び出しでArduinoのピンの入出力などを制御できるようになります。ProcessingやopenFrameworksからも直接Arduinoを操作できます。ArduinoにはFirmataをインストールするだけ。それ以上Arduino側では何のプログラムの改変も必要ありません。楽ちんです。
ところがところが、通常のFirmataはSPIをサポートしておらず、SPIのための拡張は現時点ではまだ提案段階でした。であれば、PCとArduino間でのシリアル通信用の簡単なプロトコルを決めて、それでAD5206を制御することにしようかなぁ、というところで、一旦終了。次回からはヘリの位置と姿勢情報を獲得するために使うカメラまわりの実験を進めていこうかと思います。実装を考えるとマーカーを使う手が簡単なのですが、今回は3Dカメラで少し遊んでみることにしました。カメラは大きさがお手頃な、Intel Interactive Gesture Cameraを発注しました。Creativeブランドで発売されています(一時期品薄でしたが、今は注文できます)。これが届き次第、実験してまたレポートします!
P.S.
ほんとうにしょうもないことなのですが、ヤラレタ感満載だったので一筆…
下の写真、リモコンのアンテナの付け根の部分を裏から写したものと、リモコン内の基板の一部の写真なのですが、よくよく見てみると「あれれ?」と思うところ、ありませんか?
アンテナの根本の部分、どう見ても金属製の部品がありません。導電性の素材? いやいや、右の写真の液晶画面のすぐ右横にある角ばった波形のパターン、これってアンテナじゃないですか。まさに2.4GHz用の。Bluetoothデバイスとか分解すると出てくるヤツ。じゃ、リモコン本体のプラスチックのアンテナ風のモノってば一体… たぶん、それがないと、売れ行きに影響するんじゃないかと思ったり。類似商品と見比べられたときに、無いと性能が低く見られると判断したのでは、とか。。うむむむむ。クワッドヘリのテスト飛行の時、律儀に「アンテナ」を立てて「よしよし」と思っていた自分が可愛く思えた、ある夏の日の黄昏でした…。