ImpactSystems(インパクトシステム)

プロポ信号でジョイスティック

送信機とコンバータ

ラジコン送信機(プロポ)の背面にはトレーナ出力(DSC)があります。この信号を読み込んでUSBジョイスティックを作ろうと言う試みです。前作のJOYPRO3のようにラジコン送信機を改造するには勇気が要りますが、今回は無改造でラジコン送信機をUSBジョイスティックに利用します。そのためトレーナケーブルの先に、信号コンバータを取り付けてPCに接続します。こうすれば平日はジョイスティックとして、ウィークエンドは本来の送信機として、1台二役です。

構成

システム構成図

ラジコン送信機は手持ちの、JR(旧日本遠隔制御株式会社)XG14を対象として説明します。コンバータはINTEL(元ALTERA)製MAX 10を搭載した基板を利用します。USB I/FにはArduino LeonardoコンパチのPro Microを使用します。

トレーナ出力は古くはDSC(D.S.C.)信号とも言っていました。また、受信機に直接接続して電波を出さずにサーボの調整ができていました。この機能は2.4GHzのDMSS方式になると受信機にその機能が無いのかも知れません。マニュアルに接続図がありませんでした。ただし、トレーナ出力は昔と同じく出ていました。

このトレーナ出力をレベル変換し、FPGAのMAX 10へ入力して解析(デコード)します。FPGAは何でも構いません。MAX IIでも可能ですし、Xilinxでも構いません。タイマーでパルス幅を計測するだけです。今回は他のJOBで作成したFPGA基板に余裕があったので、MAX10になりました。

USBインターフェイスは、Atmega32U4を搭載しているArduino Pro Microを使用しました。Leonardo同様スケッチで簡単にUSBジョイスティックが実現できます。FPGAとの通信はSCIシリアルポートを使用しました。当初UARTを使用しましたが、通信速度の点でUARTより早いSCIに落ちつきました。FPGAをスレーブ、CPU(ATmega34U4)をマスターとしています。

レベルシフト回路

レベルシフト回路図

トレーナ信号は昔解析して、レベル変換回路は実績があります。それがこの回路です。ただし昔の5Vと違って、現在の回路はは3.3Vが主流です。そのため入力のプルアップ抵抗にダイオードを入れています。
直流カット後NPNトランジスタでインバートして、FPGAのI/O電圧(3.3V)にシフトしています。波形遅れがあるはずですが、過去経験より200nS程度であろうと踏んでいます。それ以上であっても全ての信号が同じように遅れていれば無視して構わないでしょう。
回路の定数は特に計算した値でありません。トランジスタやダイオード、CRは手持ちで賄っています。(注:定数は乗数標記です)

トレーナ信号

XG14のトレーナ信号

XG14のトレーナ出力をレベル変換回路に入れて、コレクタ信号をオシロスコープで観測しました。XG14は、トレーナジャックからデフォルトでPPM信号が出るようです。pcm9Xあるいはそれ以前の送信機では、デフォルトがSPCMなので、このコンバータではPPM出力の設定をします。

ところで、久し振りに送信機の信号を触るので、過去プロジェクトフォルダーを見たり、Webを徘徊したりしました。その中でPPMをPulse Position Mudulationと説明してあるHPがありました。ちょっと違和感がありますが、問い合わせる会社は今はありません。昔はPulse Phase Modulationと思っていました。FMモードとも言っていました。この後波形を説明しますが、スロットル、エルロン等出力信号の順番は歴代JR送信機において一定です。信号配置が変調されているのではなく、アナログ量によってパルス周期が変化します。パルス周波数=波長=位相と言う連想をすればPhase Modulationが正解のように思えます。ちなみに受信機からサーボへ行く信号はPWM(Pulse Width Modulation)です。1チャネルの信号で、周期一定でパルス幅が変化するので、こちらはWidth Modulationです。
でも、スティックを変化させながら波形を見ると、ひとつのチャネルはパルスの開始位置が前後に変化して見えるから、やはりPulse Positionが正解かも知れません。

さて、XG14のトレーナ信号全体は、冒頭の写真のように約5.4mSの0Vの後に13個の正パルスがあります。このひと塊の周期は約26mSです。アナログ値により変化します。この正パルスの立上りエッジ間が送信機1チャネルのアナログ量になります。JRの場合はスロットル、エルロン、エレベータ、ラダー、その他の順番になります。

トレーナ信号の一部拡大

各チャネルは、1500uSを中心として900uSが最小、2100uSが最大値になっています。JRの送信機は、Travel Adjustで±150%の動作量設定ができます。そうすると4uSが1%に相当します。

この信号をデコードするには、FPGAはパルスの立上りエッジ間を計測すれば良いことが解ります。立上りエッジ(正エッジ)でTimerの値をラッチし、同時にTimerをクリアして再スタートします。ストリーム間の2100uSを超える長いLow後の立上りでは、チャネルのIndexをクリアし、他の立上りエッジではIndexをカウントアップします。
やることは単純なのですが、これをCPUのソフトで組むと、そのCPU独自のタイマー構成のドキュメントを何ページか読破しないと実現できません。万能に作ってあるのでレジスタ設定が大変です(Rensas のIDEは設定がテーブルになっていて楽でしたが)。一方FPGAは、ロジックどおりHDLを記述して行くだけなので、こういうことは得意です。

全体回路図

joypro4回路図

左は作成したjoypro4の全体の回路図(pdf)です。お絵書きなので、結線図と言った方が良いでしょう。先のレベルシフト回路はMAX10の38pinに入れています。シリアル通信はMAX10の3.3VをTC7MBD3245AFK(Toshiba)で5Vにレベルシフトして、Arduino Pro Microに合わせています。MOSI,MISO,SCKはSCI信号ですが、SIOCSとしてLow enableの選択信号をPro Microが出力します。MAX10をスレーブにしていますので、読み取りのリクエストをSIOENB(Low level)でPro Microへ通知します。

XG14の場合、スティック軸以外のポテンショメータは、サイドパネルにあるレバー式だけになっています。pcm10Sにあった前面のダイヤル式のポテンショメータはスイッチ式に変わっています。pcm9Xもそうなっています。しかも、サイドのポテンショメータの片方しかトレーナ出力に出て来ていません。そこで基板上に5kΩBカーブのボリューム(ポテンショメータ)を追加しました。ついでにプッシュスイッチも追加しました。MAX10にはAnalog入力があるのですが、今回はそれを使わずに、Pro MicroのAnalog入力を使用しました。

スイッチ割当て

SW割当て

図はXG14のスティック、あるいはスイッチの各値が、トレーナ信号から出てくる順番を示しています。sig0を最初の信号として、以降sig1,sig2,,と続いて、sig11まで12チャネルです。sig12,sig13はトレーナ信号には出てきませんが予測で名前を付けています。スイッチはアナログ値として出力されています。例えばFlight Modeスイッチは向う側が0x7DF、センターが0x5D6、手前が0x3D6でした。
FPGAは最後のパルス終了後に、これらの値をそのままPro Microへ送信します。CPUでは受取った値を0~1023の10bit値に変換しています。これはAtmega32U4のアナログ入力範囲に合わせいるからです。以下に信号名と送信機の機能名の対応を示します。機能名はヘリモードの名前です。

  • sig0 スロットル
  • sig1 エルロン
  • sig2 エレベータ
  • sig3 ラダー
  • sig4 F.MODE(フライトモード)
  • sig5 AUX2
  • sig6 GEAR
  • sig7 AUX3
  • sig8 RUDD D/R(ラダー D/R)
  • sig9 TRNR(トレーナ)
  • sig10 HOLD(ホールド)
  • sig11 ELEV D/R(エレベータ D/R)
  • sig12 AILE D/R(エルロン D/R)
  • sig13 フラップレバー

Arduinoスケッチ

今後、ArduinoのスケッチとFPGAのプログラムを紹介する予定ですが、しばらくBreakeします。