SyntaxHighlighter

2015年5月30日土曜日

Arduino Leonardで、JRプロポのトレーナー信号をUSBジョイスティックに変換するアダプタ作った。(ついでにFMS Interface互換の出力付き)

Arduino Leonardで、JRプロポのトレーナー信号をUSBジョイスティックに変換するアダプタ作った。

(ついでにFMS Interface互換の出力付き)


作り方を以下に紹介しますが。注意事項。
警告:ここでは、プロポの本来の使いからから逸脱したものを紹介しています。
    一応安全に気を付け、問題のないように紹介を行っているつもりですが、
    結果として、プロポの破損・発煙・炎上・データ破壊・ノーコンなどが発生する恐れがあります。
    また、ここで作成した回路をPCPCなどに差し込んだ際、
    PCなどが破損・発煙・炎上・データ破壊し、最悪の場合、身体の損傷や火災などを招く危険性があります。
    これらリスクを理解もしくは同意のどちらか、もしくはその両方ができない場合は、行わないでください。
    筆者は、生じた事故・損害・損傷・データ等に対する賠償・謝罪等の責任を一切負いません。

0. Arduino Leonardを購入します。(いわゆる32U4系ボードやAVRでも可)

1. 以下を参考に、Arduino LeonardでUSBジョイスティック扱いの操作ができるようにします。

 Arduino LeonardをUSBジョイスティックにする
 http://gpsnmeajp.blogspot.jp/2015/05/arduino-leonardusb.html


2.以下の回路を組み立てます。(ブレッドボードで十分だが、組み込むなら小さめに)

 ただし、この回路はJRプロポの出力用なので、他のものを使う場合は
 別途回路を組み替えてください。(100k抵抗をGNDに落とす程度)

 コンデンサはなくても動きますし、最悪トランジスタ無しで直結した上で
 プログラム上の論理を反転すれば動く気がしますが、
 JRプロポは最低1万円位すると思うので、万が一のことを考え、おすすめしません。

 100kの抵抗は、200kでも多分動きます。
 トランジスタはNPNであれば何でも良いと思います。
 私は1815を使ってますが、2001でも問題はないかと。
 コンデンサも、大きすぎたり小さすぎたりしなければ問題ないと思います。
 ブレッドボードで組むとこんな感じ。
 

3.Arduino Leonardに繋ぎます。

4.以下のプログラムを書き込みます。
JoyState_t joySt;

void setup()
{
  Serial.begin(19200);
  pinMode(7,INPUT_PULLUP);
  pinMode(13,OUTPUT);

  joySt.xAxis = 0;joySt.yAxis = 0;joySt.zAxis = 0;joySt.xRotAxis = 0;joySt.yRotAxis = 0;
  joySt.zRotAxis = 0;joySt.throttle = 0;joySt.rudder = 0;joySt.hatSw1 = 0;
  joySt.hatSw2 = 0;joySt.buttons = 0;
}

void loop()
{
  static int ch=0;
  unsigned long cnt = pulseIn(7,LOW,3000);
  if(cnt == 0){
    interrupts(); //USB通信許可
    Joystick.setState(&joySt);
    delay(2); //通信時間確保

    ch=0;
    Serial.write((byte)0xFF);
    
    while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
    noInterrupts(); //通信禁止
  }else{
    switch(ch)
    {
      case 0:joySt.throttle = map(cnt,700,1500,0,255);break;
      case 1:joySt.xAxis = map(cnt,700,1500,0,255);break;
      case 2:joySt.yAxis = map(cnt,700,1500,0,255);break;
      case 3:joySt.rudder = map(cnt,700,1500,0,255);break;
      case 4:joySt.xRotAxis = map(cnt,700,1500,0,255);break;
      case 5:joySt.zAxis = map(cnt,700,1500,0,255); break;
    }    
    
    ch++;
    Serial.write((byte)map(cnt,700,1500,0,254));
  }
}

5. USBポートに繋げば完成です。
 ジョイスティックとしても動作しますし、FMSのシリアルインターフェースとしても動作するので
 どちらでも構いません。

Arduino Unoしか持ってない、USBジョイスティックとしての機能はいらないから、
FMSで動けばいい、という方はこちら。
少々バタつきはあるかもしれませんが、動くと思います。
void setup()
{
  Serial.begin(19200);
  pinMode(7,INPUT_PULLUP);
}

void loop()
{
  static int ch=0;
  unsigned long cnt = pulseIn(7,LOW,3000);
  if(cnt == 0){
    ch=0;
    Serial.write((byte)0xFF);
    
    while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
  }else{
    ch++;
    Serial.write((byte)map(cnt,700,1500,0,254));
  }
}


ついでに、パルス幅を観測したい人向け。ターミナルで開けば数字で出ます。
void setup()
{
  Serial.begin(19200);
  pinMode(7,INPUT_PULLUP);
}

void loop()
{
  static int ch=0;
  unsigned long cnt = pulseIn(7,LOW,3000);
  if(cnt == 0){
    ch=0;
    Serial.write((byte)0xFF);
    
    while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
  }else{
    ch++;
    Serial.print(ch);
    Serial.print(':');
    Serial.println(cnt);
  }
}

Q.なんでLeonard限定なの?
A.USB通信機能を使っているからです。
  USB通信機能がないと、まずジョイスティックとして認識させられないというのがひとつ。
  もう一つは、超高速な仮想シリアル通信が使えるからです。

Q.ジョイスティックが6chしか反応しないんだけど?
A.私の持ってるプロポが6chだからです。ご自分でプログラムを改造すればすぐ解決します。
 多分1,2行程度。ただし、ジョイスティックの入力の数には限界があるので、
 8chが限界でしょう。

2015年5月28日木曜日

JRのプロポのトレーナー端子のPPM出力について(波形追加)

JR(日本遠隔制御)のプロポのトレーナー端子(トレーナージャック/トレーナーケーブル)のPPM出力について、
調べても調べてもなんか情報が混乱しているというか、微妙に出てこないのでまとめる。

というのも、JRのXG6 NET-R116Gを買ったので、それを色々使おうと思ったら
てんで情報が出てこないので、見つけた情報と説明書を参考に考えてみたものだ。

1.トレーナー信号の波形と振幅、極性
 JRのプロポのトレーナー端子の出力は、率直に言ってヘンらしい。

 様々なブログやサイトを見てみたが、どこも-1.2~+0.3[V]らへんの波形を出している。
 代表として以下のブログを張っておく。

 Lightbridge用 8ch→11ch基板の製作1 XG8のPPM信号をオシロで見てみる - 空の履歴 - Yahoo!ブログ
 http://blogs.yahoo.co.jp/helichallenge/35056811.html


 実際にオシロスコープで取得した波形を示す。
 確かに、-1.2V ~ +0.2V程度の波形である。振幅Vp-pは1.5Vほどであるらしい




 プロポがこんな波形を出す理由がわからない。
 ICから直接出すのなら、フタバなどのように、0 ~ +5[V]になるはずである。
 そもそもとして、ICなどからこんな正負に振れた波形を出すのは至極面倒なはずだ。
 
 ありえるとするなら、コンデンサでデカップリングしているくらい... と考えていると、
 以下のブログが引っかかった。

 JRのDSC信号にできるかも - とりあえず「何でもぶろぐ」Ⅱ
 http://oteru0106.exblog.jp/22049137/

 抵抗+コンデンサで、CMOS出力をJRプロポ風の出力に出来た、
 また、JRのプロポ自体分解してみると出力にコンデンサがつながっていた、ということだった。
 
 実際、オシロスコープで観測した際、最初の観測だけ、徐々に電圧が正から負へと
 推移していく様子が見られた。

 また、波形が明らかに訛っている。



 これで謎が解ける。
 JRのトレーナー端子は、ミニプラグ。
 ミニプラグには弱点があり、それは「抜き差しした際に信号が短絡する」という問題だ。
 中途半端な状態で差し込むと特に起きる。

 JRはこの状態でプロポが破損するのを避けるために、デカップリングコンデンサを挟んだのだろう。
 PPM波形は交流なので、コンデンサを通しても問題なく伝わる。
 また、外部から変な直流(特に、コンデンサマイク用直流電圧)が加わっても遮断されるし、
 さらに、この電圧かつ交流であれば、外部のマイク入力などにつないでも破損を起こしにくい。

 そういう目的があったのだろう。
 
2.トレーナー端子には4chしかでてこない?
 「JRのプロポはスレーブモードにすると4chしかでないのでダメだ」など、
 2chなどで勘違いしている記述を見かける。
 どうも、説明書を見る限り、SLAVE MODE(スレーブモード)と、PPM MODE(標準モード)の違いらしい。
 
 結論から先に言うと、「JRのプロポはトレーナー端子に差し込んだ時点でDSCモード
  (PPMスレーブモード)になってるので、SLAVEモードに切り替える必要はない」だ。
 
 説明書でも、「親機がノーマルトレーナー (NORMAL) の場合、特に設定として項目があるわけではありませんが、トレーナー のモードを ”SLAVE” とはしないでください。」と書いてある。

 SLAVEモードという名前が混乱のもとだと思うが、言い換えるなら、
 無設定モード → 一般的なPPM出力スレーブモード・DSCモード
 SLAVEモード → 生4chスティックPPM出力モード
  らしい。

いうところ、親機と子機の設定の組み合わせが2通りあるようで、

1.親機が通常モード(chをすべてMASTERにする)
 子機は何もしない(PPM MODE)

→どういう状態か?
 親機は、子機から受け取った信号をそのまま無線に飛ばす。
 そのため、トレーナースイッチで親機操作か子機操作かを切り替える。
 子機からは、子機で設定されたすべての情報が適用された信号が出ている
 結果、子機はDSCモードと等価。全チャネル出力。故に子機側は切り替えが不要。

 親機のプロポのSLAVE: PPM MODE というのは、子機はPPM(DSC)モードにしろ、という意味。
 XG6などの最近の機種は、トレーナーケーブルを差しこみ自動で電源が入った時点で
 PPM(DSC)モードとなっている。

 親が通常モードのまま、子をSLAVEモードにするとうまく動かない。

2.親機がプログラムモード(chごとにMASTER、SLAVEを選択)
 子機はスレーブモード(SLAVE MODE)

→どういう状態か?
 親機は、子機の操作を一旦解釈し、親機の設定を適用、スティックの置き換えをして無線送信。
 子機でミキシング等の適用をされると、スティックを推定できずめちゃくちゃになる。
 そのため、子機をスレーブモードにし、4chの生のスティック情報だけ出力させることで
 後処理は全部親機でやる。
 結果、スレーブモードでは子機から4ch分の情報しか出ない。

 親機のプロポのSLAVE: SLAVE MODE というのは、子機はSLAVEモードにしろ、という意味。
 これは、XG6などの機種の場合はSLAVEモードに設定する必要があり、
 他の場合は余計な適用が行われない状態にしなければならない、ということだろう。


実際に波形を観測してみたものを以下に示す。
まず、DSCモード。

次に、SLAVEモード。



どちらも、8ch分の出力がされていることがわかる。
しかし、XG6なので、実際に操作可能なのは6chである。

操作してみたとこ、説明書の説明とは違い、SLAVEモードでも
6chすべてが動作していることがわかった。

しかし、SLAVEモードでは、トリムやジャイロ設定は無効となっていることも確認できた。
おそらく、ミキシングなども同様に無効になっているのだろう。

3.トレーナー端子はモノラルじゃなきゃダメ?
 写真を見ればわかるが、トレーナーケーブルはモノラルミニプラグである。

 ステレオミニプラグを使って色々やっているブログを見ると、
 「接触不良なのか、電源が入らないことがある」、「中途半端に差し込むと良い」と書いてあることが多い。
 これは、モノラル端子のGND部分で電源を入れる処理をしているのが、
 ステレオだとLとRに分離されていて、接触が挿入時の一瞬しかされないための誤動作と考えられる。
 ただし、自分はプロポを分解していないので不明である。
 素直にモノラルプラグを買ったほうが良いのでは。

 マルツなどでは、ケーブル付きのL字型モノラルケーブルが売られている。
 トレーナーケーブル同様、コンパクトで良い。

 [マルツオンライン] 3.5mm モノラルプラグ付き 1.8m
 http://www.marutsu.co.jp/pc/i/107911/


おまけ。

JRのプロポ XG6で観測した全波形を以下に示す。
なにかの参考になるかもしれない。

通常モード


SLAVEモード時。



波形の周期は、通説の通り、22.00msであった。

出力コンデンサの影響か、訛りが見られる。



ホールドオフをこのくらいの値にすると、波形が暴れにくい(トリガがきちんと掛かりやすい)。


PPMなので、パルス幅は一定の400us。これも通説通り。


パルス間はニュートラルで1.5ms。


最小値で1.1ms。


最大値で1.9ms。


パルス-パルス間時間は、ニュートラルで1.1ms。


最小値で700us。


最大値で1.5ms。


信号。


最後のパルスから次の周期までの時間は、全最大(8ch中6ch最大)で、7.2ms

全最小(8ch中6ch最小)で、12ms。


以上。

2015年5月26日火曜日

Arduino LeonardでUSBを生かしつつ割り込みを禁止する

Arduino Leonardで、USB機能を使いつつ、タイミングシビアな信号を受け取りたい、という時。

結構単純で、ループ毎に(感覚的には500ms以内くらい?)

  interrupts();
  delay(2);
  noInterrupts();

を実行してやれば、通信には成功する模様。
delayは1msでは失敗し、2ms以上では問題ないようだ。

また、delayでなくとも、割り込みを許可した状態で一定以上の時間があればいいようだ。
USBの仕様的には、1ループ50ms以内がいいだろう。

2015年5月25日月曜日

Arduino LeonardをUSBジョイスティックにする

ここを参考にすれば良い。

Devel/電子工作/Arduino/ゲームコントローラー - cubic9.com
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%B2%A1%BC%A5%E0%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%BC/


キーとなるのはここのサイトで、このサイトのHID.hとUSBAPI.hを導入すれば、
他なんの苦労もなく、LeonardがUSBジョイスティックになる...

Turning an Arduino Leonardo into a joystick. | Imaginary Industries
http://www.imaginaryindustries.com/blog/?p=80


と良かったのだが、ならなかった。自分の環境ではコンパイルエラーとなった。
で、どうしたかというと、前者のサイトに公開されていたdiffを使って、
自分の環境のHID.hと、USBAPI.hにパッチを当てた。

それだけで正常に動くようになった。

Arduino 1.0.6でファイル置き換えが上手く動かない場合、diffにしたがってパッチを当てると良い。

パッチを当てる、というのがなんとやら、という人向けに、
パッチ済みファイルも置いておく。1.0.6なら上書きすれば動くと思う。

ただし、動作の保証もしないし、安全の保証もしない。
自己責任で。

ダウンロード↓
https://sites.google.com/site/gpsnmeajp/files/API.zip

FMS Flying-Model-Simulator メモ

久しぶりにFMSを触ったのでメモ

1.起動時のエラーは、シリアルポートが1つもないことと、D3DRM.dllが無いのが原因。
 
 シリアルポートの場合の解決方法は
 ・com0comなど仮想COMポートを導入する
 ・USB-シリアル変換、もしくはArduinoなどのUSB-COMポートを繋ぐ
 ・レジストリをいじって適当なシリアルポートを作り出す

 の方法がある。自分は、USB-シリアル変換を適当につないだら起動した。
 1回起動すれば、以降は外しても問題ないようだ。

 D3DRM.dllはどっかから持ってくればいい。
 自分は前のPCから引っ張りだしたが、欲しい人は問い合わせてくれればいい。

2.キーコンフィグが失敗する場合
 キーコンフィグはバグってるらしく、触らないのが吉だが、
 触った上で保存してしまった場合。

 HKEY_CURRENT_USER\Software\Flying-Model-Simulator\KeyForm以下を
 レジストリエディタで開き、251になってるのを直してあげればOK。

 
とりあえず。JRプロポ届くまで待機。