IIDX用ハンドメイドコントローラー初期ロット(VX-01-1A3使用)のファームウェアアップデート
※2022/11/15追記※
ファームウェアの内容を更新しました。過去のファームウェアで更新した方は、お手数ですが再度ファームウェアの更新をお願いします
IIDX用ハンドメイドコントローラーの初期ロット分に使用しているオムロン製スイッチ「VX-01-1A3」のチャタリングが頻発しているため、チャタリング対策を行ったファームウェアアップデートを行います
D2MVをシリーズ使用した製品においても、VXシリーズにスイッチを換装する場合は当記事を参考にアップデートを行うことでチャタリング対策ができます
公式サイトにアクセスして最新版のArduino IDEをダウンロード&インストールする
最新版のHIDライブラリもダウンロードする
ロータリーエンコーダー用のライブラリもインストールする
割り込み処理用のライブラリもインストールする
Sketch→Include Library→Add .ZIP Libraryから上記の3つのzipファイルを追加する
コントローラーをUSB接続し、Board→Arduino AVR Boards→Arduino Leonardoを選択
Port→COM XX(Arduino Leonardo)を選択(XXの値は不定)。複数台繋いでいる場合はどのポートか分からなくなるため、ファームウェアを書き換えたいコントローラーのみ接続してください
下記のコードをコピペする。3ミリ秒(button_sampling)ごとに割り込み処理を行い、その時点で入力されていればカウント、2(button_thres)以上でボタン入力扱いとなります。チャタリングがひどい場合は各数値を大きくすれば改善しますが、その分判定にもブレが生じます
#include <Arduino.h>
#include "HID-Project.h"
#include <limits.h>
#include <Encoder.h>
#include <MsTimer2.h>
// ピン番号 1~7鍵→E1~E4
volatile int button[13] = { 0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 14, 15, A0 };
int button_count[13];
#define log_timer 50 //スクラッチ入力許容度
#define scratch_timer 50 //スクラッチの入力が残る時間
#define button_sampling 3//ボタン判定の周期(ミリ秒)
#define button_thres 2//ボタン判定のしきい値(周期回数)
Encoder Enc(10, 16);
int input_log[log_timer];
int max_value;
int min_value;
int timer;
int i;
void setup() {
for (i = 1; i < 13; i++) pinMode(button[i], INPUT_PULLUP);
MsTimer2::set(button_sampling, sampling);
MsTimer2::start();
Gamepad.begin();
}
void sampling() {
for (i = 1; i < 13; i++) {
if (digitalRead(button[i]) == LOW) {
button_count[i]++;
if (button_count[i] >= button_thres)
Gamepad.press(i);
} else {
Gamepad.release(i);
button_count[i] = 0;
}
}
}
void loop() {
int i;
//delay(1); delayは消してみる
max_value = INT_MIN;
min_value = INT_MAX;
//過去log_timer秒分のロータリーエンコーダーの値を記録し最小値と最大値を調べる
for (i = 0; i < log_timer; i++) {
if (i == log_timer - 1) input_log[i] = Enc.read();
else input_log[i] = input_log[i + 1];
max_value = max(max_value, input_log[i]);
min_value = min(min_value, input_log[i]);
}
//台揺れなどのチャタリング防止のために2以上動いてたらスクラッチ判定
if (max_value - min_value > 1 || max_value - min_value < -1) {
if (input_log[log_timer - 1] > input_log[log_timer - 2]) {
Gamepad.release(20);
Gamepad.press(21);
timer = scratch_timer;
}
if (input_log[log_timer - 1] < input_log[log_timer - 2]) {
Gamepad.release(21);
Gamepad.press(20);
timer = scratch_timer;
}
}
if (timer < 0) {
Gamepad.release(20);
Gamepad.release(21);
}
timer--;
Gamepad.write();
}
Uploadボタンを押せばインストールされる
以上でファームウェアがアップデートされます。アップデート後に不具合があった場合はまたご報告ください
参考にした記事