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ボタンを押せばインストールされる

以上でファームウェアがアップデートされます。アップデート後に不具合があった場合はまたご報告ください

参考にした記事