JumperT16を使ってみる
柏KOILで審査員特別賞として、本格仕様のプロポJumperT16をいただいてしまいました。
今までJOYSTICKでやっていたので使いこなせる気がしませんが、やっていることをメモしてみます。
まずは電池の調達。18650が2本必要です。(私は単三乾電池と勘違いしていました)。受信機は手持ちのラジコンのものを適当に流用します。チャンネルが足りなくなってから本格的なものを手配することにしました。
JumperT16情報源のリンク
ドローンワークスの今村さんに情報源のリンクを教えていただきました。
マニュアルと設定の動画です。
Virtual RC Pro
手軽に試せるということで、まずはUSBケーブルでPCにつないでJOYSTICKとして使ってみることにします。
なかなかリアルな動きができて、プロポ操縦の練習にもなるということで、Virtual RC Proをインストールしてみました。
なかなかいい感じなのですが、接続に苦労しました。
Windows10に認識されているのに使えない
Windowsでは認識しているのに、VirtualRCでは無効になっています。
JOYSTICKからの入力は全く反応がありません。
会津大学の奥山先生が解決方法を教えてくださいました。
ドライバのロールバックで対処できます。デバイスマネージャからBETTER_USB_HSを右クリック->プロパティ、タブのドライバー->ドライバーを元に戻すで、Microsoftのドライバに戻れば認識します。
こちらの動画が参考になるそうです。
認識できました。操作もできましたが、プロポのアクセルの方向が逆向きでした。調整などで変更できるはずです。
受信機と接続を試みる
手持ちでJumper T16に接続できる受信機がないので、適当なものを発注。
2019/08/03,04のMF-Tokyoで投入されたけど、対応できた人が少なかった2.4Ghzのプロポの出力をF710互換のUSB入力に変換する技を使うこととします。
8月は無線対策でしたが、今回は性能がよく分解能が高いプロポの入力で操作性を上げるのが目的です。
プロポ→受信機→PWM→Arduino→USB→ラズパイ
プロポの入力をラズパイに入れなければなりません。
ラジコンならPWMからサーボモータに接続ですが、学習のためにラズパイに入力する必要があります。
Arduinoを使ってUSBに変換するハードを用意します。
Faboの佐々木さんから、アウトボードも何枚かいただいて保管しておりましたが、しばらくお預け。(失敗していきなりArduinoを壊すような事態は避けたい)
写真ではジャストフィットしているので大変惜しい。
とりあえずは、ブレッドボードから。
pinchangeinterrupt()を使って記述します。
ソフトウェアはテックショップルート、有山さんから頂いています。
Lチカからやってみる
Arduino IDEをインストールして、ボード>ボードマネージャで適当なボードをインストール(Arduino microを検索して引っかかったもの)。
ボードの設定を"Arduino/Genuino Micro"に設定。シリアルポートをArduino Microが刺さっているポートにしてBlinkのサンプルを書き込み。
ファイル>スケッチ例>01.Basic>Blink
で、コンパイルして書き込み。
あっさり動きました。
こちらを参考にさせていただきました。
ありがとうございます。
本命の入力変換ROMを焼いてみる
本命が焼けるかやってみることにします。が、コンパイルで異常が出ます。
PinChangeInterrupt.h:No such file or directory
どこのライブラリを持ってくるの?
ライブラリマネージャで、PinChangeInterrupt.hとJoystick.hをインストール。
Joystickは、こちらを使うので、githubからダウンロードして、ライブラリの下に入れます。(%userprofile%\Documents\Arduino\libraries)
とりあえず、コンパイルは通ったみたいだけど、受信機がまだ来ないので、確認方法がないな~。
Fabo佐々木流とテックショップ有山流のソースコードを比較してみる
佐々木流はpulseIn()を使用しています。
見た目も普通にloopの中でpulseIn()関数で値を更新して処理しています。
pulseIn関数を検索すると、シビアなタイミングで制御する人で、処理の負荷が大きい人はpulseIn()関数の使用を避けています。
value[i] = pulseIn(PWM_PIN[i], HIGH, 29412);
有山流は?
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(channel_pin[0]), onRising0, CHANGE);
割り込み発生時のコールバック関数を設定して、対象のPWMのONしている時間を測定しています。
面倒ですが、ここで精度を犠牲にしたら、プロポに交換した意味がなくなります。
本人曰く。
ハード割り込みで4チャンネル同時取得で4usの最少誤差になっている
と、いうことで、このあたりの精度なども詳しく見てみたいところ。
やっぱり近藤科学のプロポとレシーバーを使う
Frskyの受信機が届くのが相当先なので、やはり近藤科学のセットで試します。
PWM入力をArduinoに入力して確認します。
RCレシーバチャンネルクラスを描いてみる
ベタにCで書くとわけがわからなくなるので、RCレシーバのクラスを書いてみます。
コールバックからいい感じで、クラスのメソッドを呼び出したいんだけど、コールバック関数を何個も作らずにできないだろうか?
記事が長くなりすぎたので、次回に続く。
この記事が気に入ったらサポートをしてみませんか?