お問い合わせSHOPトップ>設計・開発>ArduinoでUSBジョイスティックを作ろうプロポ信号でジョイスティック2019年10月8日ラジコン送信機(プロポ)の背面にはトレーナ出力(DSC)があります。この信号を読み込んでUSBジョイスティックを作ろうと言う試みです。前作のJOYPRO3のようにラジコン送信機を改造するには勇気が要りますが、今回は無改造でラジコン送信機をUSBジョイスティックに利用します。そのためトレーナケーブルの先に、信号コンバータを取り付けてPCに接続します。すれば平日はジョイスティックとして、ウィークエンドは本来の送信機として、1台二役です。)XG14を対象として説明します。10を搭載した基板を利用します。Microを使用します。トレーナ出力は古くはDSC(D.S.C.)信号とも言っていました。受信機に直接接続して電波を出さずにサーボの調整ができていました。この機能は2.4GHzのDMSS方式になると受信機にその機能が無いのかも知れません。マニュアルに接続図がありませんでした。トレーナ出力は昔と同じく出ていました。10へ入力して解析(デコード)します。FPGAは何でも構いません。IIでも可能ですし、Xilinxでも構いません。タイマーでパルス幅を計測するだけです。今回は他のJOBで作成したFPGA基板に余裕があったので、MAX10になりました。Microを使用しました。Leonardo同様スケッチで簡単にUSBジョイスティックが実現できます。FPGAとの通信はSCIシリアルポートを使用しました。当初UARTを使用しましたが、通信速度の点でUARTより早いSCIに落ちつきました。FPGAをスレーブ、CPU(ATmega34U4)をマスターとしています。レベルシフト回路トレーナ信号は昔解析して、レベル変換回路は実績があります。昔の5Vと違って、現在の回路はは3.3Vが主流です。そのため入力のプルアップ抵抗にダイオードを入れています。直流カット後NPNトランジスタでインバートして、FPGAのI/O電圧(3.3V)にシフトしています。波形遅れがあるはずですが、過去経験より200nS程度であろうと踏んでいます。それ以上であっても全ての信号が同じように遅れていれば無視して構わないでしょう。回路の定数は特に計算した値でありません。トランジスタやダイオード、CRは手持ちで賄っています。(注:定数は乗数標記です)トレーナ信号XG14のトレーナ出力をレベル変換回路に入れて、コレクタ信号をオシロスコープで観測しました。XG14は、トレーナジャックからデフォルトでPPM信号が出るようです。pcm9Xあるいはそれ以前の送信機では、デフォルトがSPCMなので、このコンバータではPPM出力の設定をします。ところで、久し振りに送信機の信号を触るので、過去プロジェクトフォルダーを見たり、Webを徘徊したりしました。Mudulationと説明してあるHPがありました。違和感がありますが、問い合わせる会社は今はありません。Modulationと思っていました。FMモードとも言っていました。この後波形を説明しますが、スロットル、エルロン等出力信号の順番は歴代JR送信機において一定です。信号配置が変調されているのではなく、アナログ量によってパルス周期が変化します。Modulationが正解のように思えます。Modulation)です。Modulationです。Positionが正解かも知れません。XG14のトレーナ信号全体は、冒頭の写真のように約5.4mSの0Vの後に13個の正パルスがあります。このひと塊の周期は約26mSです。アナログ値により変化します。この正パルスの立上りエッジ間が送信機1チャネルのアナログ量になります。JRの場合はスロットル、エルロン、エレベータ、ラダー、その他の順番になります。各チャネルは、1500uSを中心として900uSが最小、2100uSが最大値になっています。Adjustで±150%の動作量設定ができます。すると4uSが1%に相当します。この信号をデコードするには、FPGAはパルスの立上りエッジ間を計測すれば良いことが解ります。立上りエッジ(正エッジ)でTimerの値をラッチし、同時にTimerをクリアして再スタートします。ストリーム間の2100uSを超える長いLow後の立上りでは、チャネルのIndexをクリアし、他の立上りエッジではIndexをカウントアップします。やることは単純なのですが、これをCPUのソフトで組むと、そのCPU独自のタイマー構成のドキュメントを何ページか読破しないと実現できません。IDEは設定がテーブルになっていて楽でしたが)。FPGAは、ロジックどおりHDLを記述して行くだけなので、こういうことは得意です。左は作成したjoypro4の全体の回路図(pdf)です。お絵書きなので、結線図と言った方が良いでしょう。先のレベルシフト回路はMAX10の38pinに入れています。Microに合わせています。Microが出力します。Microへ通知します。XG14の場合、スティック軸以外のポテンショメータは、サイドパネルにあるレバー式だけになっています。pcm10Sにあった前面のダイヤル式のポテンショメータはスイッチ式に変わっています。pcm9Xもそうなっています。サイドのポテンショメータの片方しかトレーナ出力に出て来ていません。そこで基板上に5kΩBカーブのボリューム(ポテンショメータ)を追加しました。ついでにプッシュスイッチも追加しました。MicroのAnalog入力を使用しました。スイッチ割当て図はXG14のスティック、あるいはスイッチの各値が、トレーナ信号から出てくる順番を示しています。sig0を最初の信号として、以降sig1,sig2,,と続いて、sig11まで12チャネルです。sig12,sig13はトレーナ信号には出てきませんが予測で名前を付けています。スイッチはアナログ値として出力されています。Modeスイッチは向う側が0x7DF、センターが0x5D6、手前が0x3D6でした。Microへ送信します。CPUでは受取った値を0~1023の10bit値に変換しています。これはAtmega32U4のアナログ入力範囲に合わせいるからです。以下に信号名と送信機の機能名の対応を示します。機能名はヘリモードの名前です。フラップレバーArduinoスケッチ今後、ArduinoのスケッチとFPGAのプログラムを紹介する予定ですが、しばらくBreakeします。ImpactSystems。