見出し画像

シムレース用スイッチボックス作成 Vol.8

プログラム設定

引き続きArduino IDE上で作業を進めていきます。

プログラムファイル構成

スイッチボックスのプログラムは3つのファイルで構成されています。

  • SwitchBox_Ver.x.x.x.ino

  • SwithSetting.h

  • OutPutSetting.h

ファイル切り替えはタブをクリックするとできます。

今までの説明通りの配線であれば、OutPutSetting.hのみ修正すればOKです。多分💦

メイン処理<SwitchBox_Ver.x.x.x.ino>

スイッチボックスのメイン処理。
変更の必要はありません。

スイッチ設定<SwithSetting.h>

スイッチ、キーパット、ロータリエンコーダの数、使用するPINの設定を行います。

使用するスイッチ数、PIN番号に変更がなければ変更の必要はありません。

PIN設定

スイッチで使用するPINのアサインを行います。

並びが美しくないのは当初予定していたPINアサインでロータリーエンコーダがうまく動かなかったので入れ替えたためです💦

/* 
 * PIN設定
 */
// スイッチ
const byte PIN_SW_0 = -1;     // 設定なしのためダミー値
const byte PIN_SW_1 = -1;     // 設定なしのためダミー値
// マトリクススイッチ
const byte PIN_MAT_IN_0 = 1;  // 基板上はTX0 
const byte PIN_MAT_IN_1 = 0;  // 基板上はRX1
const byte PIN_MAT_IN_2 = 16; // 基板上は16
const byte PIN_MAT_IN_3 = 10; // 基板上は10
const byte PIN_MAT_IN_4 = 4;  // 基板上は4
const byte PIN_MAT_OUT_0 = 5; // 基板上は5
const byte PIN_MAT_OUT_1 = 6; // 基板上は6
const byte PIN_MAT_OUT_2 = 7; // 基板上は7
const byte PIN_MAT_OUT_3 = 8; // 基板上は8
const byte PIN_MAT_OUT_4 = 9; // 基板上は9
// ロータリエンコーダ
const byte PIN_ENC_A_0 = 20;  // 基板上はA2
const byte PIN_ENC_A_1 = 21;  // 基板上はA3
const byte PIN_ENC_B_0 = 18;  // 基板上はA0
const byte PIN_ENC_B_1 = 19;  // 基板上はA1
const byte PIN_ENC_C_0 = 14;  // 基板上は14
const byte PIN_ENC_C_1 = 15;  // 基板上は15
const byte PIN_ENC_D_0 = 2;   // 基板上は2
const byte PIN_ENC_D_1 = 3;   // 基板上は3

スイッチ設定

スイッチの数、使用するPINを設定します。
今回は使用しないので、SWITCH_COUNT = 0を設定しています。

※1つのPINに1つのスイッチを繋いだ場合の設定

/* 
 * スイッチ設定
 */
const byte SWITCH_COUNT = 0;               // スイッチ数
const byte switchPins[SWITCH_COUNT] = {   // スイッチPIN設定
  };

マトリクススイッチ設定

マトリクススイッチの列数、行数、使用するPINを設定します。
5x5から変更がなければこのままでOKです。

/* 
 * マトリクススイッチ設定
 */
const byte COLS = 5;                      // マトリクススイッチ列数
const byte ROWS = 5;                      // マトリクススイッチ行数  
const byte outPins[ROWS] = {              // マトリクススイッチ行PIN設定
  PIN_MAT_OUT_0, 
  PIN_MAT_OUT_1, 
  PIN_MAT_OUT_2, 
  PIN_MAT_OUT_3, 
  PIN_MAT_OUT_4
  };
const byte inPins[COLS] = {               // マトリクススイッチ列PIN設定
  PIN_MAT_IN_0,
  PIN_MAT_IN_1,
  PIN_MAT_IN_2,
  PIN_MAT_IN_3,
  PIN_MAT_IN_4
  };

ロータリエンコーダ設定

ロータリエンコーダ―の数、使用するPINを設定します。
4個から変更がなければこのままでOKです。

/* 
 * ロータリエンコーダ設定
 */
const byte ROTARY_ENCODER_COUNT = 4;       // ロータリーエンコーダ数
const byte rotaryEncoderPins[ROTARY_ENCODER_COUNT][2] = {   // ロータリーエンコーダPIN設定
  { PIN_ENC_A_0, PIN_ENC_A_1 },
  { PIN_ENC_B_0, PIN_ENC_B_1 },
  { PIN_ENC_C_0, PIN_ENC_C_1 },
  { PIN_ENC_D_0, PIN_ENC_D_1 }
  };

出力設定<OutPutSetting.h>

ジョイスティック

ジョイスティックのHid Report Idを設定します。
この値が重複数とジョイスティックを認識しません。
もし、他につないでいるジョイスティック類と重複するようであれば変更してください。0x06,0x07などなど。

/* 
 * ジョイスティック 
 * 
 * 複数のスイッチボックスを接続する場合は値が重複しないように変更する。
 */
const byte joystick1HidReportId = 0x04;   // ジョイスティック1 Hid Report Id
const byte joystick2HidReportId = 0x05;   // ジョイスティック2 Hid Report Id

キー

ボタンを押したときにキーボードを押して、ホールドして、離す。
という動作する場合に設定します。
複数キー同時押しも可能です。

・sキーやESCキーを数秒押して離す。
・ALT+[ を押す。

ということができます。

/* 
 * キー
 * 
 * Push,Releaseを行うキー設定
 * 
 * 例えば「s」キーを登録すると
 * 1.ボタンを押したときにキーボードの「s」キーをPush
 * 2.ボタンを押した状態を保持すると「s」キーのPush状態を保持
 * 3.ボタンを離すとキーボードの「s」キーをRelease
 * という動作になり、エンジンスタートで使用することができる。
 * 他に「esc」キーを登録すると走行画面からexitできる。
 * 
 * キーは複数登録でき、「ctrl」「alt」「delete」の3つを登録すると
 * 3つのキーが同時に押すことになる。
 * 
 * キー1つの場合
 * const byte key0[] {'s'};
 * 複数キー同時押しの場合
 * const byte key0[] {KEY_RIGHT_CTRL, KEY_LEFT_ALT, KEY_DELETE};
 * 
 * 16種類のキーを登録可能
 */
byte key0[] {'s'};              // キー番号1番
byte key1[] {'i'};              // キー番号2番
byte key2[] {KEY_LEFT_ALT,'['}; // キー番号3番
byte key3[] {KEY_LEFT_ALT,']'}; // キー番号4番
byte key4[] {KEY_ESC};          // キー番号5番
byte key5[] {KEY_ESC};          // キー番号6番
byte key6[] {KEY_ESC};          // キー番号7番
byte key7[] {KEY_ESC};          // キー番号8番
byte key8[] {KEY_ESC};          // キー番号9番
byte key9[] {KEY_ESC};          // キー番号10番
byte key10[] {KEY_ESC};         // キー番号11番
byte key11[] {KEY_ESC};         // キー番号12番
byte key12[] {KEY_ESC};         // キー番号13番
byte key13[] {KEY_ESC};         // キー番号14番
byte key14[] {KEY_ESC};         // キー番号15番
byte key15[] {KEY_ESC};         // キー番号16番

英数字記号以外のキー(修飾キー)は下記の値を使います

KEY_LEFT_CTRL
KEY_LEFT_SHIFT
KEY_LEFT_ALT
KEY_LEFT_GUI
KEY_RIGHT_CTRL
KEY_RIGHT_SHIFT
KEY_RIGHT_ALT
KEY_RIGHT_GUI
KEY_UP_ARROW
KEY_DOWN_ARROW
KEY_LEFT_ARROW
KEY_RIGHT_ARROW
KEY_BACKSPACE
KEY_TAB
KEY_RETURN
KEY_ESC
KEY_INSERT
KEY_DELETE
KEY_PAGE_UP
KEY_PAGE_DOWN
KEY_HOME
KEY_END
KEY_CAPS_LOCK
KEY_F1
KEY_F2
KEY_F3
KEY_F4
KEY_F5
KEY_F6
KEY_F7
KEY_F8
KEY_F9
KEY_F10
KEY_F11
KEY_F12


メッセージ

キーボード出力のメッセージ設定を行います。
iRacingで走行中にメッセージを送る場合は
t[メッセージ]\n
と書きます。(先頭のtはiRacingの設定次第なのでそこは環境に合わせて)


tKonnichiwa!\n
とすれば、ボタンを押した時に「Konnichiwa!」と出力されます。

/* 
 * メッセージ
 * 
 * キーボード入力される文字列を設定
 * 
 * 例えば「tOK!\n」という文字列を登録すると
 * ボタンを押したときにキーボードから「t」「O」「K」「!」「enter」と順番に入力され
 * iRacingの走行中に「OK!」というメッセージが表示される。
 * 
 * 8種類のメッセージを登録可能
 */
String message[16] = {
  "tKonnichiwa!\n", // メッセージ番号1番
  "tKonbanwa!\n",   // メッセージ番号2番
  "tThanks!\n",     // メッセージ番号3番
  "tSorry!\n",      // メッセージ番号4番
  "tOK!\n",         // メッセージ番号5番
  "",               // メッセージ番号6番
  "",               // メッセージ番号7番
  ""               // メッセージ番号8番
  };

出力設定

各スイッチが切り替わった時にPCに対して何を出力するのかを設定します。
出力設定値は
[識別子]-[種別]-[動作]
という書式で書きます。

識別子
 K:キー
 M:メッセージ
 J1:ジョイスティック1
 J2:ジョイスティック2
種別
 ・キーの場合
  1~16:キー番号
 ・メッセージの場合
  1~16:メッセージ番号
 ・ジョイスティックの場合
  1~28:ボタン番号
  L:十字キー左
  R:十字キー右
  U:十字キー上
  D:十字キー下
動作(識別子K,J1,J2で有効)
 P:Push(押した状態を保持) ※ロータリースイッチは使用不可
 R:Release(離した状態を保持) ※ロータリースイッチは使用不可
 PR:Push-Detay-Release(押す->40msec待機->離す)

 キーボードメッセージ1番の場合・・・M-1
 ジョイスティック1のボタン1を押す場合・・・J1-1-P
 ジョイスティック1のボタン1を離す場合・・・J1-1-R

/* 
 * 出力設定
 * 
 * 各スイッチ動作時の出力を設定。
 * 
 * [識別子]-[種別]-[動作]
 * 
 * という書式で設定する。
 * 
 * 識別子
 *   K:キー
 *   M:メッセージ   
 *   J1:ジョイスティック1
 *   J2:ジョイスティック2
 *  種別
 *   キーの場合:キー番号(1~16)
 *   メッセージの場合:メッセージ番号(1~16)
 *   ジョイスティックの場合:ボタン番号(1~32)
 *  動作(識別子K,J1,J2で有効)
 *   P:Push(押した状態を保持)
 *   R:Release(離した状態を保持)
 *   PR:Push-Detay-Release(押す-40msec-離す)
 *
 * 例
 *  キー1を押す場合・・・K-1-P
 *  キー1を離す場合・・・K-1-R
 *  メッセージ1番の場合・・・M-1
 *  ジョイスティック1のボタン1を押す場合・・・J1-1-P
 *  ジョイスティック1のボタン1を離す場合・・・J1-1-R
 * 
 */

/*
 * スイッチがONになたっとときの出力設定
 * 
 * 設定なし
 */
const String swOnOutPut[SWITCH_COUNT] = {
  };

/*
 * スイッチがOFFになたっとときの出力設定
 * 
 * 設定なし
 */
const String swOffOutPut[SWITCH_COUNT] = {
  };

/*
 * マトリクススイッチがONになたっとときの出力設定
 */
const String matrixOnOutPut[ROWS][COLS] = {
    { "K-1-P",    "J1-1-P",   "J1-3-P",   "J1-5-P",   "J1-7-P"   }, // スイッチ1,  スイッチ2,  スイッチ3,  スイッチ4,  スイッチ5
    { "J1-18-PR", "J1-2-P",   "J1-4-P",   "J1-6-P",   "J1-8-P"   }, // スイッチ6,  スイッチ7,  スイッチ8,  スイッチ9,  スイッチ10
    { "J1-20-PR", "J1-9-P",   "J1-10-P",  "J1-11-P",  "J1-12-P"  }, // スイッチ11, スイッチ12, スイッチ13, スイッチ14, スイッチ15
    { "J1-22-PR", "M-1",      "M-2",      "M-3",      "M-4"      }, // スイッチ16, スイッチ17, スイッチ18, スイッチ19, スイッチ20
    { "",         "J2-9-P",   "J2-10-P",  "J2-11-P",  "J2-12-P"  }  // スイッチ21, スイッチ22, スイッチ23, スイッチ24, スイッチ25
  };

/*
 * マトリクススイッチがOFFになたっとときの出力設定
 */
const String matrixOffOutPut[ROWS][COLS] = {
    { "K-1-R",    "J1-1-R",   "J1-3-R",   "J1-5-R",   "J1-7-R"   }, // スイッチ1,  スイッチ2,  スイッチ3,  スイッチ4,  スイッチ5
    { "J1-19-PR", "J1-2-R",   "J1-4-R",   "J1-6-R",   "J1-8-R"   }, // スイッチ6,  スイッチ7,  スイッチ8,  スイッチ9,  スイッチ10
    { "J1-20-PR", "J1-9-R",   "J1-10-R",  "J1-11-R",  "J1-12-R"  }, // スイッチ11, スイッチ12, スイッチ13, スイッチ14, スイッチ15
    { "J1-23-PR", "",         "",         "",         ""         }, // スイッチ16, スイッチ17, スイッチ18, スイッチ19, スイッチ20
    { "",         "J2-9-R",   "J2-10-R",  "J2-11-R",  "J2-12-R"  }  // スイッチ21, スイッチ22, スイッチ23, スイッチ24, スイッチ25
  };

/*
 * ロータリエンコーダの出力設定
 */
const String rotaryEncoderOutPut[ROTARY_ENCODER_COUNT][2] = {
    { "J2-2-PR",  "J2-1-PR"  }, // ロータリエンコーダ1 左回り,右回り
    { "J2-4-PR",  "J2-3-PR"  }, // ロータリエンコーダ2 左回り,右回り
    { "J2-6-PR",  "J2-5-PR"  }, // ロータリエンコーダ3 左回り,右回り
    { "J2-8-PR",  "J2-7-PR"  }  // ロータリエンコーダ4 左回り,右回り
  };

出力設定例

オルタネイトスイッチ

エンジンスタートボタンの場合
ON:K-1-P
OFF:K-1-R
と設定すると ※Keyの1番には「s」を登録

  1. ボタンを押したときにキーボードの「s」キーをPush

  2. ボタンを押した状態を保持すると「s」キーのPush状態を保持

  3. ボタンを離すとキーボードの「s」キーをRelease

ボタンを押している間キーボードが押され続けるという動きになります。

モーメンタリスイッチ

ミサイルスイッチで使用しているトグルスイッチの場合
ON:J1-18-PR
OFF:J1-19-PR

と設定すると

  1. スイッチがONになった時、ジョイステック1のボタン18をPush

  2. 40msec待機

  3. ジョイステック1のボタン18をRelease

  4. OFFになった時、ジョイステック1のボタン19をPush

  5. 40msec待機

  6. ジョイステック1のボタン19をRelease

スイッチが切り替わった瞬間だけジョイスティックのボタンが押されるという動きになります。

ロータリエンコーダ

ロータリエンコーダは押しっぱなしというのはないのでモーメンタリスイッチと同じようにスイッチが切り替わった瞬間だけジョイスティックのボタンが押されるという設定をします。
左回り:J2-2-PR
右回り:J2-1-PR

と設定すると

  1. 右に回すと、ジョイステック2のボタン1をPush

  2. 40msec待機

  3. ジョイステック2のボタン1をRelease

  4. 左にに回すと、ジョイステック2のボタン2をPush

  5. 40msec待機

  6. ジョイステック2のボタン2をRelease

という動きになります。

以上設定はここまで。

次回はプログラムの書き込みと動作確認です。

以前の記事はこちらから。


この記事が気に入ったらサポートをしてみませんか?