![見出し画像](https://assets.st-note.com/production/uploads/images/150898176/rectangle_large_type_2_6f8c590df5afab43ef1169bd987db11e.jpeg?width=1200)
REVIVE USB ADVANCEにロータリーエンコーダを接続してアナログ値を変化させてみる
REVIVE USB ADVANCEを使ってジョイスティックを作り、ESP32を使ってハンコンを作ったのですが、両方同時に使おうとするとESP32側が悪さしているのかフレームレートが1桁くらいになるような動作となります。
もしかしたらESP32ハンコン開発中にVSCodeのログに大量に出ていたUSB関係のメッセージが関係あるのかもしれませんが、確証がありません。
ESP32側が怪しいのであれば、REVIVE側にハンコンも接続してESP32は取り外してしまえば? 最初はREVIVE USB ADVANCE CUSTOMのGitHubのページにロータリーエンコーダが使用できるとの記載があったので試してみたのですが期待の動作とはならず、製作者のushui様に問い合わせたところロータリーエンコーダ入力によってアナログ出力を変更する処理は対応はしていないとの回答でした。残念。
でもコードは自由に見れるし変更もできるし、基本的な仕組みはESP32と同じでよいのだからと、中身を調べてコードを変更してみたらうまく動きました。
コードの中身を見たのは、本家ではなくREVIVE USB ADVANCE CUSTOMの方です。
v102cのコード一式は、GitHubのここからダウンロードできます。
開発環境は、MPLAB X IDE v3.60、xc32 v1.30が必要とのこと。こちらに詳細の説明が書かれています。ダウンロードリンクまで用意されており、とても助かります。
まずは、ダウンロードしたFW_ReviveAdvanceCustom_v102をお試しでビルド。なんの問題もなくビルドが通りました。
変更方針
エンコーダの出力(オープンドレイン)A/Bは、D12(RC7)/D13(RC8)に接続する。ボード上にPullUP 1kΩがついているので、単純に接続すればok。
D12(RC7)を PICのexternal INT4に割り当てて、この端子の立下りで割り込みが入るようにする。
割り込みハンドラ内で同一方向の割り込みを3回カウントしたら対応するフラグをセットする。これは600パルス/回転のロータリーエンコーダだと回転角に対するWindows側のZ軸の変化が大きすぎたため。
3回カウントする前に方向が変わったらカウントは0からリスタートとする。
この回数はdefineで定義しておく。ハンドルの回転とZ軸の増減の対応を変えたり、ロータリーエンコーダのパルス数/回転が変わる場合は、ここで調整する。
出力はアナログ Z軸、コーディングで固定。
変更したファイル
オリジナルソースコードは株式会社ビット・トレード・ワンですが、ADL(Assembly Desk License)というライセンスに基づいて改変されたREVIVE USB ADVANCE Customに手を加えました。
以下にライセンス本文が読めるようにしておきます。
![](https://assets.st-note.com/img/1724651547778-dFbSb8XHDd.jpg?width=1200)
変更内容
![](https://assets.st-note.com/img/1723289446595-fN8WORMVEC.jpg?width=1200)
変数定義
![](https://assets.st-note.com/img/1723289511861-UwWcQomt9k.jpg?width=1200)
端子、割り込みの設定を追加。関数の本体はl_timer.cに追加。
![](https://assets.st-note.com/img/1723289531738-HC0EAzTfGy.jpg?width=1200)
ロータリーエンコーダ用のコードを追加
変数 encdata をEncフラグにより増減
USBからPCに送るデータの元となる変数にencdataをセット
an_joystick_lever_out_value[fi] = encdata;
![](https://assets.st-note.com/img/1723289752093-4QmIaJMt37.jpg?width=1200)
External INT4 のベクター追加
![](https://assets.st-note.com/img/1723289797820-8STNhx1H1Y.jpg?width=1200)
rc7_init(void)RPC7をExternal INT4に割り当て、立下りエッジ設定
![](https://assets.st-note.com/img/1723289890359-IBRVfvSLEJ.jpg?width=1200)
rc7_task(void)external INT4の割り込みハンドラ
RC7=Low & RC8=Low が3回続いたら Enc=1
RC7=Low & RC8=High が3回続いたら Enc=-1
![](https://assets.st-note.com/img/1723290152201-7M4rnrlzXR.jpg?width=1200)
HEXファイル
上から、
・割り込み毎にEncフラグセット
・割り込み2回毎にEncフラグセット
・割り込み3回毎にEncフラグセット
これらのHEXファイルを使う場合は、F/W更新手順をよく調べて理解した上でご使用ください。
接続
![](https://assets.st-note.com/img/1723785255639-rP3eQTIe6p.jpg?width=1200)
赤:+5V 黒:GND
黄:D12(RC7) - A相
青:D13(RC8) - B相
![](https://assets.st-note.com/img/1724651966896-JQf4nHy8Qw.jpg?width=1200)
![](https://assets.st-note.com/img/1724652065863-mxQUWgnS25.jpg?width=1200)
動作確認
動作確認の開始直後は、ロータリーエンコーダは接続しないで、もともとついていたスイッチでデバッグしていました。D12(RC7)に接続されているボタンを押すと割り込みが入ってZ軸値が増えること、D13(RC8)を押しながらD12(RC7)を押すとZ軸値が減ること、が確認できましたが、スイッチのチャタリングの影響のためか、1回スイッチを押しただけなのにZ軸がドカッと増減することがありました。
ただ以前にESP32でハンコンを作った時には、ロータリーエンコーダがチャタリング無しのように動作していたので、あまり気にしないでスイッチをロータリーエンコーダに置き換えたところ、ハンドルの回転にきれいに追随してZ軸値が増減するようになりました。オシロで波形を見ればすぐにわかるのですが、少々値段が高く使用頻度も少ないと思われ、まだ入手していないので動作から推測するだけです。
割り込みハンドラでは、3回同じ向き(CW/CCW)の割り込みが入ったらEncフラグをセットさせています。これ、最初は無くて #if 0~endif で囲まれた部分のコードのように割り込み毎にEncフラグをセットしていたのですが、動作確認時にハンドル半回転でZ軸のバーが0からmaxまで振れてしまったので、割り込み3回に1度だけZ軸を増減させるようにしました。このようにするとハンドル1回転と半分でZ軸がminからmaxまで動くようになりました。ちなみに、ロータリーエンコーダは600パルス/回転の物を使っています。200パルス/回転のロータリーエンコーダを入手して試しましたが、割り込み毎にEncフラグセットのコードでちょうどよい感じでした。
F1とかの高速レース用の車なら、ハンドル半回転でZ軸が振り切れるようにしたほうが運転しやすいかもしれません。
PC側のREVIVE USB ADCANCE CUSTOMの設定ツールでは、
(1) A3ピンをアナログZ軸に設定。物理的にはA3の端子には何も接続していない。
(2) D12、D13は未設定
としました。(1)をやらないとWindowsのゲームコントローラのプロパティにZ軸が現れません。(2)でD12とD13に何かしらの設定がされていると、ロータリーエンコーダを回してパルスが発生するたびにそれらの設定がPCに伝わって、よからぬことが起きてしまいます。最初、D12=「キーボード7」、D13=「キーボードW」と設定してあったので、ロータリーエンコーダを回したら、PCの画面上に"7"と”W"が氾濫して慌てました。
Assetto Corsa、Rush Rarry3で試してみましたが、どちらも設定をしておけばきちんと認識して遊ぶことができました。
Rush Rarry3はちょっと面倒で、まずはSteamの設定を実行してロータリーエンコーダとコントローラの各入力の対応付けを行っておき、その後 Rush Rarry3のオプションで動作(ステアリング左右等)とコントローラの入力の対応付けという、2段階の設定が必要でした。Steamの設定時にAボタンとBボタンが必要なので、これらのスイッチもREVIVE USB ADVANCEに接続しておく必要もあります。知らないとハマると思います。
スロットルとブレーキはスティックのY軸に割り当てているのですが、ハンドルがあるとフットペダルも使いたくなってきます。前にプロトタイプを作ってみましたが、足の力に耐えられず壊れてしまったので、どうにかできないものかと思案中です。