アナログ入力に対応したREVIVE USB ADVANCEとカスタム版
REVIVE USB ADVANCEは、ビット・トレード・ワン社が2019年9月27日に発売した製品です。
REVIVE USBシリーズ3つ目の製品であり、アナログ入力に対応しています。
この記事のような小手先の疑似アナログ入力ではない、本物のアナログ入力を実現できるということです。
ちなみにREVIVE USBシリーズは、オリジナルUSBデバイスを簡単に作成できる小型モジュールです。
上記を使って自作デバイスを作れます。
PCに接続すると、PCは1度にキーボード・マウス・ゲームパッドの3つを認識します。
REVIVE USB MICROの写真でちょっと見えてますが、Windows用設定ツールを使用してキーボード・マウス・ゲームパッドの設定を変更できるようになっており、何の入力を割り当てるか選ぶことができます。
またPICライターなど特別な機器なしに、USB接続だけで内部プログラムを更新可能です。
さらに第三者がファームウェアを作ることが可能という、全体的に自由度の高い設計になっています。
そしてこちらがREVIVE USB ADVANCEです。
REVIVE USB(初代)とREVIVE USB MICROではデジタル入力にのみ対応しています。
簡単に言えば、デジタル入力では0と1の入力しか受け取れません。
0と1で判断できるのはボタンを押した/押していないの状態のみです。
REVIVE USB ADVANCEはそれに加えてアナログ入力に対応しています。
アナログ入力とは、主にジョイスティックやセンサー類を指します。
※ここでのセンサー類が何を指しているかというと、環境光センサーや圧力センサーなどを使った入力のことです
ジョイスティックの分かりやすい例はゲームコントローラです。
ゆっくり倒した/はじき入力をしたなどの状態があり、0と1だけではない細かな値が入力されます。
REVIVE USB ADVANCEを使うと、そういう仕様のデバイスの制作が可能になります。
実際にジョイスティックを使って制作された方の記事もありました。
一言で言えば、REVIVE USBおよびMICROよりも高度なデバイスの制作が可能、ということです。
私も音ゲーコン自作用の素材を買ったのですが、まだ組んでいません……いつになるか分かりませんが組んだら記事を載せます
私は第三者としてファームウェアを制作・公開しました。
この記事の後半で紹介します。
実は結構変わった技術仕様
REVIVE USB(MICRO)ではPIC18F14K50というPICマイコンを採用していました。
ADVANCEではPIC32MX230F064Dに変わっています。
PIC18F(8ビットマイコン)からPIC32(32ビットマイコン)になったのです。
8ビットから32ビットですよ。この辺は素人なのでぶっちゃけ何が変わるのか分からんのですが多分凄い。
おかげでリソース面にかなりの余裕ができました。
まず、SRAMは768バイトから16KBに容量アップしました。
REVIVE USBでファームウェアを作っていた頃は常にバッファオーバーフローを気にしながら実装していたので、ものすごくありがたかったです。
またREVIVE USBシリーズでは設定の保存にEEPROMを採用しています。
PIC32MX230F064DにはEEPROMが内蔵されていないため、ADVANCEはAT25080B-XHLというEEPROMを外付けしています。
これにより、REVIVE USBでは256バイトしか保存できなかったEEPROMの記憶領域が8KBに増えました。
調べていませんが、このEEPROM領域は恐らく公式ファームウェアでも使いきれないほどでしょう。
これらにより、REVIVE USBのファームウェア開発上で抱えていた大きな問題がクリアになりました。
ファームウェアの開発環境について
ファームウェアの開発環境もMPLAB IDEからMPLAB X IDEになりました。
REVIVE USB(MICRO)の環境では開発できないので注意が必要です。
開発時点での最新バージョン(MPLAB X IDE v5.40、コンパイラ v2.41)ではコンパイルできませんでした。
公式ファームウェアで使用しているIDEのバージョンはv3.60、コンパイラのバージョンはv1.30なので、これをダウンロードして使用しました。
※公式ファームウェアのソースコードに含まれる「Makefile-local-default.mk」より
該当バージョンは以下よりダウンロードできます。
※IDE v3.60のリンクは公式に見当たらなかったため、v3.61を使用しました。何らかの理由によりv3.60は非推奨になっていると思われます
IDE: http://ww1.microchip.com/downloads/en/DeviceDoc/MPLABX-v3.61-windows-installer.exe
コンパイラ: http://ww1.microchip.com/downloads/en/DeviceDoc/xc32-v1.30-windows-installer.exe
ちなみにコンパイラですが、Free版ライセンスではインストール後60日の間はPro版として使用できます。
60日間を過ぎると機能制限が掛かり、コンパイル時の最適化オプションが効かなくなります。
REVIVE USBでは最適化を効かせないとプログラムメモリの容量オーバーでファームウェアが書き込めなかったので、REVIVE USB ADVANCEでも同様と思われます。(プログラムメモリの容量は変わっていないため)
あとソースコードを見れば一目瞭然ですが、プログラムの構造についても大幅に変更されています。
以下の記事のプログラム解説はほとんど役に立ちません。
興味があれば公式ファームウェアとカスタム版のソースコードを突き合わせてみてください。
設定ツールの開発環境について
こちらはREVIVE USB(MICRO)と変わらず「Visual Studio Express 2010 for Visual C#」で開発できます。
以下記事を参考にインストールしてください。
REVIVE USB ADVANCE カスタム版
GitHubで配布しています。
(実は公開したのがこの記事を書いた2年くらい前なのでめちゃくちゃ今さらなんですが)
公式ファームウェアに対して、以下の3つの機能を追加しました。
- チャタリング防止機能
公式ファームウェアが備えたチャタリング防止やノイズ除去機能の強化、設定機能の追加 - ロータリーエンコーダ設定機能
公式ファームウェアでは使用できない、ロータリーエンコーダが使用できる機能 - 遅延秒数の計算機能
平均でどの程度遅延が発生するか、自動で計算する機能(チャタリング防止機能の設定によって変動)
そのほか、以下の改善を行っています。
- アナログ入力、デジタル入力どちらも設定により1ms応答が可能
(公式ファームウェアのアナログ入力は最大6.4msの遅延が発生) - アナログ入力、デジタル入力をサンプリングするように変更し、入力精度を向上
- アナログ入力の平均化処理のアルゴリズムをカスタム版ファームウェアに合わせて調整し、入力精度を向上
まとめると、以下がカスタム版の内容です。
- 入力精度の全体的な向上
- 遅延改善
- ロータリーエンコーダの対応
全体的な品質向上のほか、ゲーム用途のようなシビアな入力の最適化や、ロータリーエンコーダの対応で作れるデバイスの幅がより広がります。
デジタル入力に関しては以前より提供していたREVIVE USB チャタリング対策版などと同様の仕様です。
なお、ADVANCEのロータリーエンコーダ設定機能はデジタル入力にのみ対応しています。
(エンコーダはデジタルな部品であるため)
ロータリーエンコーダ対応で作れるようになるもの
一例として、マウスのホイール部分です。
トラックボールマウスのボール部分もそうで、これはX軸とY軸の2軸入力で実現されています。
※上記はREVIVE USB ADVANCEで作ったものではありません
こういうものは公式ファームウェアでは作れません。
カスタム版でロータリーエンコーダに対応させることで作れるようになります。
「入力精度の全体的な向上」の詳細について
公式ファームウェアに対し、ロジックの変更や追加を行いました。
公式ファームウェア | カスタム版ファームウェア | |
---|---|---|
デジタル入力 | 一致検出(20回で固定) | サンプリング方式、一致検出 |
アナログ入力 | 平均化処理 | サンプリング方式、平均化処理(カスタム版に合わせて改善) |
REVIVE USB(MICRO)に比べてアナログ入力が増えた分、アナログ入力専用のロジックがあります。
まずデジタル入力とアナログ入力の共通事項として、入力の受信タイミングには間隔を設ける仕組み(=サンプリング)を採用しています。
それに加え、デジタル入力ではON/OFFが連続した時に入力値を反映する仕組み(=一致検出)、アナログ入力では複数回取得した入力値を平均化する仕組み(=平均化処理)を採用することでチャタリング等のノイズを除去しています。
例えばデジタル入力においては、サンプリング周期=10ms/一致検出回数3回の場合、10msごとに値をチェックし、3回同じ値であれば入力値をUSBの接続先へ流すという処理をすることで、より正確な入力を行います。
デジタル入力のチャタリング防止処理の詳細は以下の「サンプリング(+ゲージ判定)方式」をご覧ください。
アナログ入力においては、1回の入力値の取得では電圧の変動によるばらつきが大きいため、入力値をサンプリング周期ごとに8回取得し、それらの平均化を行うことで、より正確な入力を行います。
デジタル入力の一致検出、アナログ入力の平均化処理は公式ファームウェアにも搭載されています。
デジタル入力の一致検出回数は20回になっており、カスタム版ファームウェアではサンプリング周期と合わせて変更できるようにしています。
アナログ入力の平均化処理は平均化回数が8回になっており、「A1ピンを8回平均化→A2ピンを8回平均化→……A8ピンを8回平均化」としていた処理の流れをカスタム版ファームウェアで変更し、「A1ピンを平均化→A2ピンを平均化→……A8ピンを平均化」という処理を8回行うようにしています。
こうすることでA1~A8ピンから見た平均化処理を行うタイミングにばらつきを持たせ、アナログ入力のサンプリング周期が長くなった場合も遅延が顕著に現れないようにしました。