見出し画像

ビーマニポケット、令和に復刻!beatmaniaIIDX編

BEMANIにはかつて、ビーマニポケットというシリーズがあったことをご存知だろうか。携帯機やスマホの普及で現代ではすっかり見ることが無くなった、液晶一体型ゲーム機で展開されたシリーズだ。他シリーズで代表的なものではゲーム&ウォッチがある

それはそれとして、いつも通りTwi……Xを見ていると興味深いツイー……ポストを発見した

今まで当noteでは「どれだけ実機に則したコントローラーを制作できるか」ばかり考えていて、斬新さや見た目の楽しさには無頓着であった
携帯できる手のひらサイズのコントローラー、操作性はともかく見た目が面白い。上記のビーマニポケットを彷彿させる。3Dプリンターを使えば制作も現実的だし、SNSでウケそう
早速試作に取り掛かった。IIDXの前にアイメイ氏のアイデアをパクった参考にしたポップンコントローラーも制作しており、こちらも近々形にしたい


手元に5cm×7cmのユニバーサル基板が余っていたので、それを使用してみた。基板、タクトスイッチ共に秋月電子で購入。ロータリーエンコーダーも、当noteでIIDXコンSDVXコンに使用しているいつものやつだ。ゲームパッドとしてのアウトプットにも、いつも通りPro Microを使用する

・タクトスイッチ10円×7=70円
・5cm×7cm基板55円
・ロータリーエンコーダー110円
合計235円。安い。いつもありがとうございます秋月電子さん
ロータリーエンコーダーが90円→110円に値上がりしてることには突っ込まないでおこう

Pro Microは各サイトで売られているものを。相変わらず遊舎工房が一番安いと思う

記事執筆時点で770円なので合計1005円(送料別)

はんだ付けの前にシミュレート

この他に4種類のパーツを3Dプリンターで作成する。外箱上部、下部、鍵盤、ターンテーブルだ

PLAに爪は無理です

外箱上部と下部をジョイントする際に爪の機構を試したが、PLAのような柔軟性の無い素材ではすぐ爪が折れるため、スライドではめ込む形にした。以下、それらの3DデータをまとめたSTLファイル
ビーマニポケットIIDXのSTLファイル

以下、各パーツについて解説していく。プリント時間と使用フィラメント量はUltimaker Curaでの測定値(インフィル率20%、レイヤー高さ0.28mm)

1,外箱下部
印刷時間:2時間19分
使用フィラメント量:23g

bemaniPocketIIDXbelow

四隅に基板を固定するためのピンを配置。右皿なので右にロータリーエンコーダーを配置するスペースを作る。左の穴はPro Microの端子用
左皿で制作したい場合はスライサーソフトで左右反転させるとよい

2,外箱上部
印刷時間:1時間13分
使用フィラメント量:11g

bemaniPocketIIDXabove

爪は無理だったので縦からスライドではめ込む形にする。7つの鍵盤とロータリーエンコーダー用の穴
これも右皿用なので、左皿にするならスライサーソフトで左右反転させること

3,ボタン
印刷時間:12分
使用フィラメント量:2g

bemaniPocketIIDXbutton

鍵盤。それ以上でも以下でもない
デフォルトでは、組み立てたときに上部のなる部分が接地面となっているが、向きを上下反転させて印刷したほうが綺麗に仕上がると思う

4,ターンテーブル
印刷時間:7分
使用フィラメント量:1g

bemaniPocketIIDXturntable

缶詰のパイナップルみたい

上記パーツを揃えるのと同時に配線も進めていく。ユニバーサル基板に直接配線する。タクトスイッチ、ロータリーエンコーダー、Pro Microの位置関係は下記の図のようになる
ここで注意が必要なのはタクトスイッチが浮きすぎてると、スイッチと鍵盤の間の遊びが無くなり、ボタンがハマってしまうということ。タクトスイッチはできるだけ押し込んではんだ付けすること

IIDXは久々の配線であまりにも汚い

外箱下部は基板が5mmほど浮くようになっているので多少はごちゃごちゃな配線も可能ロータリーエンコーダーのために抵抗も配線する

Pro Microのスケッチはハンドメイドコントローラーと同じものを使用。Arduinoアプリの導入方法はそちらの記事参照。各ピンの対応は配線に応じて変えるとよい

#include <Arduino.h>
#include "HID-Project.h"
#include <limits.h>
#include <Encoder.h>

// ピン番号 1~7鍵→E1~E4
int button[13] = {0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 14, 15, A0};
bool button_prev[13];
#define log_timer 50 //スクラッチ入力許容度
#define scratch_timer 50 //スクラッチの入力が残る時間

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);

  Gamepad.begin();
}

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]);
  }

  // 鍵盤の処理 皿の入力タイミングと合わせるために1ms遅延させる
  for (i = 1; i < 13; i++) {
    if (button_prev[i] == true) {
      Gamepad.press(i);
    }
    else {
      Gamepad.release(i);
    }
  }
  for (i = 1; i < 13; i++) {
    if (digitalRead(button[i]) == LOW) {
      button_prev[i] = true;
    }
    else {
      button_prev[i] = false;
    }
  }

  //台揺れなどのチャタリング防止のために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();
}

配線と部品のプリントが終わったら各パーツを組み合わせて完成

奥行き6cm
幅9cm
手のひらサイズ!

ターンテーブルは音量調節ダイヤルのように操作する。これが意外と楽しい

その気になればレベル8くらいもできる

黒ベースに黒鍵は映えないので、後に白鍵で統一。ロータリーエンコーダーに巻かれてるのは遊びを無くすための養生テープ

タクトスイッチの耐久性が怪しいため販売予定は無いが、欲しい人はこの記事を参考に作ってみるといいだろう。
惜しむらくはアルモバで使えないこと。外でスマホとこれを使ってプレイできたら盛り上がりそうなのに

・タクトスイッチ10円×7=70円
・5cm×7cm基板 55円
・ロータリーエンコーダー 110円
・Pro Micro 770円
・使用フィラメント量49g×2円=98円
・抵抗、はんだ プライスレス
原価は合計1100円ほど。経済的で可愛いコントローラー