製作編

そもそもの発端編はこちら

その6 まずは検討する

 まあ何でもそうなんですが、この段階がもっとも時間を要する部分です。そしてこれほど大掛かりな機構製作になるとは・・・

 つくるべきものはサイクリック・スティック、コレクティブ・レバー、アンチトルク・ペダルの3つです。これをUSB接続のゲームコントローラーとして製作すれば良いわけです。加えてインスツルメンツパネル(計器板)が要るには要るんですが、これはソフト的に解決できます。ただし、予算が潤沢にあれば面白いこともできるのですが、それはまた別のお話。

 USBゲームコントローラーを作るという点では幸いなことに汎用のコントローラー基板を売っている連中が世界中にたくさんいます。なぜかというと自宅コックピットを作ったり自作コントローラーを作る人がそこそこ居るようで、投資すくなく販売しやすいジャンルなもんですから結構市場で出回っているのです。ただし、これも物がいろいろあり選択すべきものが何かというのは後で問題になります。

 サイクリック・スティックは当初、ラジコン用のジョイスティック部分を流用しようと考えていました。こういうやつです。

 IMG_3142_2.JPG

 何せ長年ラジコンやってますからね。バラして捨ててもかまわない送信機もいくつかあるので、そこから取り出せば使えますから、もっとも安直です。このアイデアは一見よさそうに思えましたが、ある日気付きました。まったくダメです。

 ヘリのサイクリック・スティックは床からはえてます。ということは写真のスティックの上に60cm以上の棒が付きます。その棒を動かすところを想像してください。どんだけの距離を移動させないと操作できないのかを考えると、とてもじゃないけども・・となるわけですね。では中央部分だけを、ちょこっと使うということをすればいいじゃない?と思うわけです。そこで電気的な特性を考える必要が出てきます。

 写真のPOT(ボリューム)は12kΩです。この時、スティックの舵角は90度ほどです。抵抗値を測定してみると3~11kΩの範囲で変化します。つまり振れ幅が8kΩというわけで、抵抗値でみると66%。おそらくですが120度ほどの回転角のPOTが使われているということになります。

 もうひとつバラしてみたのが安物のジョイスティックで、これは使ってみてもうダメダメなやつだったのですが取り出したPOTは回転角が180度のもので、180度のを60度くらいの舵角で使っているもんだから精度が出やしないのです。

 なぜこれが問題になるかというと床からはえてるサイクリック・スティック、舵角はせいぜい10~15度しか切れないんです。仮に120度の回転角で12kΩのPOTを使ったとしましょう。使える角度を10度とすると1kΩの範囲しかありません。こんなもの精度が出るわけがなく、使い物になりません。

 ということは回転角が10度とか15度くらいのPOTを探せばいいので、探しますが、そんなものはありません。んでまあ例によって海外のフォーラムあたりで情報を漁りにいくわけですが、やはりみんな困ってるようでラジコン用ので60度のPOTがあるとかなんとか騒いでいるわけです。海外で見つけた情報で面白かったのは、高価なヘリ用スティックを作っている連中の発言で、世の中にそんな回転角の小さいPOTは存在しないので、うちは特注で作ってる、だから全体として値段が高くなるというものでした。しかもニッチマーケットだから量産できないので余計に高いと。まあ、そうですよねぇ。という話です。

 とにかくも回転角の小さいPOTを探さないとなのですが、抵抗膜式のPOTで精度のよさそうなものはなく、比較的買える値段で見つけたのが、これ。

 IMG_3123_2.JPG

 これが何物かというとPOTといえばPOTですが、ホールセンサを使った回転角センサーで検出角度が60度。ここのメーカー、より狭いタイプも作れるようですが、標準でそれほど高くない値段で出ているのが60度タイプだったので、これを購入しました。一般的なゲームコントローラーのセンサー入力というかPOT入力は電圧なので5Vで動作するホールセンサー式は最適です。

 ただしこのセンサーでも角度は60度なので、サイクリック・スティックを作る際には角度が大問題となります。そこでまたゴーストが囁きます。「お前はもともとラジコン・ビルダーではないか」と。

 ラジコンの場合、サーボモーターの動作角度に対して各部の作動角度を変更することはよくあります。これは『リンケージ』と呼ばれるもので、アームの長さによって作動量を変化させるものです。なのでリンケージの機構をうまく作れば1:6作動させることは可能です。じゃあ180度とかのPOTでもいいじゃない?と思うでしょ。180度はまず無理です。作ってみればわかりますが。もちろん工夫すればできます。リンケージではなくプーリーを使えば可能なのですが、10:180、つまり1:18の角度変換をしようと思うと1cmと18cmのプーリーが必要になります。

 というわけでラジコンのスティック部分の流用はなし。ジンバル部分から自作してリンケージ式にすることを方針として決定しました。

 そういや海外のフォーラムでコントローラーのビット数を気にする人がやたらいたのですが、これも考えてみれば当然でA/D変換の精度が10bitか12bitかは、かなりの違いになります。特にヘリのように小さい舵角のスティックで精度よく制御するとなればそりゃあビット数気にするわけです。

 同様にコレクティブ、アンチトルクも同じセンサーを使い、作動量を60度に変換する機構を付けることを決定しました。

 あとは何をやるかというとモノタロウあたりのサイトをじーっと眺めて使えそうな機構部品を漁りまくります。そして近所のホームセンターにも通います。この話も長いのですが、退屈なので省略します。

 その7 つくる

 まあ何となく色々なものが決まったら作ります。当初、サイクリックのジンバル部分はアルミを削り出しでとかカッコイイことを考えてたのですが、そもそも加工機がうちにはありません。あるものといえば電動のドリルドライバーとインパクトとジグソーとレシプロソー位です。こんなもんで精度よくアルミ加工なんてできるわけもありません。なので精度が悪くとも何とか収まるようにつくります。でまあできたのがこちら。

cyclic.jpg

かなりメカメカしいものになりました。これでもちゃんと物理的に動作します。

この上に付くのがサイクリックバー。こんな感じです。

cyclic-bar.jpg

 左側(コーパイ側)のスティックは外してあります。どうです、いい感じでしょ?と言いたいところですがロビンソンのT-barを見たことがない人はこちらをどうぞ。このスティック、イレクターパイプとオートバイ用のアルミハンドルで作ってあります。

 実はこれ「ちゃんとするべき」ところだけちゃんと作ってあります。例えばジンバルの軸の部分はスラストメタルを入れて軸を受けてあります。リンケージ部分はラジコン用のロッドとスプリングで構成してあります。サイクリックバーの受け部分もベアリングを入れたりしてスムーズに動くようになっています。もともと舵角が10度ほどしかないので大きなガタは禁物で、ガタつかずスムーズに作動しないとコントロールできないからです。

 そして出来上がったサイクリックスティック。要するにジョイスティックなのですが巨大&高級ジョイスティックです。

cyclic-comp_s.jpg

 同じようにしてアンチトルクペダルも作ります。アンチトルクペダルの場合には片方を踏んだら、もう片方が持ち上がるというメカニズムを作らないといけないので、ちょっと工夫が必要ですが、ロッドエンドや寸切りボルトを駆使して作ります。

anti-t.jpg

いい感じでしょ?

作動量は60度位になるので、センサーを軸にしてしまえばよさそうですが、わざわざリンケージしているのには理由があります。アンチトルクの場合、足で踏むので両足を突っ張った場合、その力はすべて差動機構(写真の黒い平たい板)のところに加わります。なので、ここでセンサーを直に付けてしまうとセンサーの軸に思いっきり力が、かかってしまい壊してしまうので一旦、しっかりした機構で受けておく必要があるんです。

  コレクティブは現在、製作中です。完成したら公開しますが、どうしようか少しお悩み中です。メカニズム的には一見、簡単に見えるのですが、コレクティブの役目は2つあって、引き上げるとメインローターのピッチを変化させるのですが、ひねるとエンジンの回転数を変えます。要するにバイクと同じツイスト・スロットルなのです。ただしこのスロットルは必ずしも必要ではなく、ロビンソンの場合にはガバナー(調速機)がついており、ピッチに応じてエンジンの速度を自動で調整してくれるので、ツイスト・スロットルはなくてもかまいません。ただし、オートローテーションを行う場合にはスロットルが必要なので、どうしたもんかなとお悩み中です。ちなみに私、普通のジョイスティックで5回に1回くらいならオートローテーションに入れます。どうでもいい話ですが。

 こういう物を作る際に細かなスペーサー等が結構必要になります。なんでじゃー、と言われると困るのですが、やってみればわかります。例えばネジの長さが長すぎるとかで強度的に金属を使わなくとも何かかませないといけない箇所が出てきます。そんな場合、以前ならば適合しそうなスペーサーを探しまくるという面倒な作業があったのですが、今ではスペーサーを3Dソフトで設計し、3Dプリントして作っています。3Dプリンタはこんな時にとても便利です。これなら特殊な形状のスペーサやちょっとした小物はすぐに作れてしまいますから。

IMG_3136.JPG

さらに市場に無い、あるいは金属を加工してネジ止めして作るのも困難な部品も3Dプリントで作ってしまいます。下の写真はサイクリックスティックのグリップ部分ですが、見ての通りスイッチを入れつつ、グリップを付けたいので3Dプリントで作ってしまいます。強度的に「そこそこ」あれば十分なので、これで使えます。

grip-h1.jpg

 その8 まとめる

 各コントローラーは出来上がりつつあり、これをどうまとめるかも問題ですが、実は意外と簡単な方法があります。自宅に十分な広さがあり、シミュレータ室を作れるお金に余裕のある人なら専用コックピットを設置してしまえばいいのですが、そりゃあ無理です。加えて運んで展示するとなると分解・組み立て式にする必要があるのですが、それにはイレクター・パイプを使います。パイプフレームに各コントローラーを固定すれば使えるようにしてしまえば分解・再組立てが可能です。

しかしまあ何でこんなに大変なことになるのかというと、考えてみたら当たり前の話でした。

世の中で普通の人が触れる機会のある、操縦の必要な機械とえいば自動車です。もっとも、自動車もそのうち操縦は必要なくなるかもしれませんが。まあそれはさておき、自動車を操縦する場合のインタフェースというのは車種が変わったところで大きく変わるものではありません。ハンドルとペダルが2つか3つ。セレクターレバーかシフトレバー。なのでシミュレーション上で使用する車種が何であれ、商用の大型車でない限りはインタフェースはあまり変わらないのです。もっともプリウスのシミュレーションをやれと言われると専用のセレクターレバーが必要そうですが。

ところが飛行機やヘリコプターは機種によってインタフェースが異なることが多く、操作方法も違います。なので汎用のコントローラーというのがあまりなく、小型の固定翼機ならばフライトヨーク(ハンドルみたいなの)とスロットルレバーを揃えてというケースが多いのですが、大型機やヘリとなると話が違ってきます。なので海外でも自分の持っている実機を家の中でも練習するために、専用コックピットを自力ビルドするようなケースが多いようです。そりゃまあヘリの特定機種用のコントローラーなんてお安い値段では売ってないわなというお話です。

その9 少々困る&補足

 作ってはみたものの困る点がひとつ。ヘリのスティックはセンターがないというのはすでに書いた通りですが、じゃあどうやって真っすぐ上昇するのかという問題が発生します。飛ばせる人には問題がない話でして、もし傾いて上昇しようとしたら一旦、離陸を止めて少し補正してから再度上昇しようとすることを繰り返せば問題ありません。ところがこれ、展示等では大問題でして、初めて飛ばす人にはちょっと無理です。ラジコンでも同様で傾いて上昇する場合には補正ししつ離陸して上に上がってからトリムを調整するということをするのですが、ここが最大の難関でラジコンヘリを練習しようとする場合に、ここで挫折するケースが多いのです。

 というわけでスティックのセンターが無いのは展示&実演する場合にはとても困ることに気付きました。離陸もできないんじゃ触っても面白くないのではないかというわけです。

 そこではたと気付きます。今回、シミュレータソフトにはX-Planeを使用していますが、このX-Plane、APIがありデータの入出力ができます。X-Planeはちゃんとしたフライト・シミュレータなので、データ入出力を使って各種の計器を動かしたり操作パネルからの入力を受け付けることもできます。このデータ入出力はIPネットワーク上のUDPでやり取りすることができるため、PC上で動作させているX-Planeに対してネットワーク経由で機器を拡張することができるわけです。極端な例かもしれませんがムービング・プラットフォーム(シミュレータの台座ごと可動するやつ)を制御することすらできます。さすがにムービング・プラットフォームまで作る気は起きませんが。

 ということはどういうことかというと、X-Planeからスティックの位置情報をネットワーク経由でUDPで投げます。これをArduinoやRaspberry Piで受けて処理すればスティックがセンターにあるかどうかを表示するインジケータを作ることができます。

X-Planeからのデータは次のような構造をしています。

struct xp_data_struct {
int index;
float data[8];
};

indexはどのパラメータであるかを識別するもので、例えばジョイスティックのデータなら"8"という風に決まっています。

UDPの受信プログラムは簡単で、受信ループは次のように書けます。

    //メインループ
    clientlen = sizeof(clientaddr);
    while (1) {
        bzero(buf, BUFSIZE);
        n = recvfrom(sockfd, buf, BUFSIZE, 0,(struct sockaddr *) &clientaddr, &clientlen);
        if (n < 0){
            error("recvfrom error");
        }

        strncpy(tmpbuf,buf,4);
        memcpy(&xp_data,&buf[5],sizeof(xp_data));
        if( strcmp(tmpbuf,"DATA") != 0 ) continue;

        for(i=0;i<3;i++){
        printf("%d = ",xp_data.index);
        printf("%f: ",xp_data.data[i]);
    }

これを利用してスティックのセンター・インジケータを作ることにしました。スティックのデータは端から端で±1の範囲のfloatで得られます。

そんなこんなで

何やらまあ完成したのはよいのですが、何分にも大きいので家の中で撮影できないつうね。

なんでデカくなったかというと、MFT当日に展示するとなると補助なしでは初めての人は飛べないのでコパイ席を作って・・・となりまして

他にもメーターパネルはPCでやるんですが、ジョイスティックのセンター表示をRaspberry Piで作ったら調子に乗ってコーションランプ系も実装するなどしまして結構なもんになってしまいました。

というわけで全貌はMFT当日に!

Maker Faire 2018当日

こんな感じで展示/実演していました。コパイ席を付けたのは大正解。初めての人は離陸もできませんでした。

DjufBu-U0AAzfP8.jpg

line_1533352040036.jpg