2016年9月6日火曜日

共用ジョイスティック(Universal Controller)のコネクタ規格を作ってみました。

いろんな据え置き型ゲーム機を所有していると、遊んでいると使いたいけれどもどうにも邪魔くさいのが「ジョイスティック」です。
一々ゲーム機ごとにジョイスティックを用意すると邪魔ですし、対戦格闘物など2台単位とかになると、なんというか絶望的に片付きません…。

昔からコントローラ乗っ取り改造などする場合に、他機種でも使えるよう気を利かせてD-SUB15ピン(NEOGEO準拠)に合わせてみたり、6ボタン格ゲー用にD-SUB25ピンで繋ぐ人もいましたが、実際作ると…
  • 25ピンだとケーブルも太くなり取り回しが悪い
  • コネクタを筐体に付けるのには結構手間が掛かり、また抜き差しでの耐久性も問題
  • そもそも部品代がそれなりに掛かる
など難点もあります。
また信号を変換するタイプも悪くないのですが、市販されていないマイナー機種の物を自作するとなると技術と機材と時間(とコスト)が掛かってしまします。 でどうしたものかなぁと思案しました…

で、以下を基本アイデアに単純な直結(パラレル)タイプの規格をでっち上げ、最近実際に作ってみました。
  1. 比較的安価でいつでも入手可能、延長も簡単なLANケーブルを流用
  2. 必要な信号数に応じ複数ケーブルで接続する
  3. 各ゲーム機用にコントローラを乗っ取った「エンコーダユニット」を作成
  4. ジョイスティック・ユニットからはコネクタを固定せず、LANケーブルを直接外に出す
  5. ジョイスティックとエンコーダの接続にはLANケーブル延長コネクタを挟む

とこんな感じで。肝心のピンアサインは色々悩み、結局以下の様に定義しました。


UniversalController20160906.PNG

UniversalController20160906.pdf


各ケーブルにはS・B・Cのタグを付けて接続先を管理します。また使うケーブル数は
 1本:ATARI(2ボタン)
 2本:FC、PCE、MD、SFC、NG、レトロフリーク等10ボタンまで
 3本:PS3や連射機能付きUSBなど
 4本:アナログ入力付き(現在は仕様のみ)
 この様に、必要に応じて変化させます。基本的には2本でおおよそ対応できる様ですね。

ボタン配置の変更や連射装置などは、ジョイスティック←→エンコーダユニット間に変換ケーブルや拡張ユニットを挟み込む形の後付けで対応します。

注意点として、カテゴリー5以下のケーブルは全線結線されていない物も有り、当然使えませんので注意が必要です。
あと付け替えが比較的頻繁に発生しますので、爪折れ防止のタイプをお勧めします。
もしくは延長コネクタをつけっぱなしにして爪折れを防ぐのも手です。


とりあえずこれだけでは実際どうなのかわかり辛いとは承知していますので、アレコレ作った改造後のジョイスティックの使用感とか、後日レポートを追記しようかと思ってます。
↑本当は撮影面倒で後回しにしてるだけ…(^o^;

2016年9月4日日曜日

Excel方眼紙をGoogleスプレッドシートで

ふとGoogleスプレッドシートでExcel方眼紙と同じ使い方をしたくなりシートを弄ってたのですが、相当なんというか相当面倒で…。
毎度アレコレ手作業でやるのは不便なのでちょいと調べた所、Google Apps Script(GAS)というExcelで言う所のVBAのようなスクリプトで出来るとの事で、折角なのでやってみました。

で出来たのがこちら。

自動方眼紙

セルのA1に方眼のサイズをピクセル数で、A2に縦のマスの数、A3に横のマスの数を入れて、メニューの[Script]→[方眼Go!]でシートを整形します。

 さてスクリプトの作り方ですが、シートのメニューの[ツール]→[スクリプト エディタ]で別のタグにスクリプトの編集画面が開きます。

でソースはこんなですね、見たまんま。
JavaScriptは初めて使いましたが、詳細を知らなくてもサンプルを弄ってなんとなくで動きました。
というかコレ以外の詳しい使い方はまだ分かりません…(゚∀゚;)

function onOpen() {
  // ここでシートのメニューに関数呼び出しを追加
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Script').addItem('方眼Go!', 'Grid').addToUi();
}

function onEdit() {
  onOpen();
}

// シートを方眼化する関数
function Grid() {
  var sheet = SpreadsheetApp.getActiveSheet();

  var size = sheet.getRange(1, 1).getValue(); // セルA1から方眼のサイズ指定値を取得
  if (size == 0) return;

  var tr = sheet.getRange(2, 1).getValue(); // セルA2から方眼の縦の数を取得
  var tc = sheet.getRange(3, 1).getValue(); // セルA3から方眼の横の数を取得
  var mr = sheet.getMaxRows();    // 現在のシートの縦の数
  var mc = sheet.getMaxColumns(); // 現在のシートの横の数

  // 現在値との差分
  var dr = tr - mr;
  var dc = tc - mc;

  if (dr < 0) sheet.deleteRows(1, -dr);    // 縦が多い場合
  if (dr > 0) sheet.insertRows(1, dr);     // 縦が少ない場合
  if (dc < 0) sheet.deleteColumns(1, -dc); // 横が多い場合
  if (dc > 0) sheet.insertColumns(1, dc);  // 横が少ない場合

  sheet.clearContents(); // セルを全てクリア

  // 一応設定値を書き戻しておく
  sheet.getRange(1,1).setValue(size);
  sheet.getRange(2,1).setValue(tr);
  sheet.getRange(3,1).setValue(tc);

  mr = sheet.getMaxRows(); // 現在のシートの縦の数
  // 全てのセルの高さをsizeに
  for(var i = 1; i <= mr; i++) {
    sheet.setRowHeight(i, size);
  }
  mc = sheet.getMaxColumns(); // 現在のシートの横の数
  // 全てのセルの幅さをsizeに
  for(var i = 1; i <= mc; i++) {
    sheet.setColumnWidth(i, size);
  }

}
シートに一発でセルの縦横数をセット出来るのかと思ったのですがどうにも無いようで、仕方無くご覧のとおりわざわざ縦横の差をみて増減させてます。
パラメータもサンプルだとポップアップが開いて入力してたのですが、面倒くさいのでセルに値を入れとくようにしてみました。
まだスクリプトとシートとプロジェクトの関係もよく分かってない状態なのですが、とりあえず使う分には十分かなと。
 まぁもっと色々できるようになると楽しそうですよね。