AtsEXを使用してスイッチで扉の開閉を行おう

__5速AT (おーとま)__ さんが開発中の __AtsEXプラグイン__ により __BVE__ の機能拡張が可能になりました。

https://automatic9045.github.io/AtsEX/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/14259c80-0c01-96f3-06e4-72dcfe539e8a.png)
今回は __都市型ワンマンプラグイン__ を使用してドア開閉を行ってみます。
なお、今回紹介するプラグインはβ版になります。（2023年12月現在）
# AtsEXプラグインのインストール
最初に __AtsEXプラグイン__ をインストールしましょう。

https://automatic9045.github.io/AtsEX/download/

まずは、ダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dd9d4f45-80d9-c227-d8d9-cbac08040a60.png)
AtsEXプラグインをインストールします。
インストーラーにより簡単に導入できるようになりました。
__詳細情報__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2d6df01a-b0b8-ce2a-8b6d-5c0f23913169.png)
__実行__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9edda38f-c575-9dcb-2ccd-4eabbbdce160.png)
__次へ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b47c6cb0-ac7f-a3eb-a77f-d0a675b7d3cd.png)
今回は、BVE5に入れるため __スキップ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1b4a4542-57bd-1bbf-5889-773394c0e064.png)
__はい__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/720e3972-b527-8fc6-3424-6a5260cf8047.png)
BVE5を立ち上げた状態で __自動検出__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e2220c3a-6814-8ef5-a0bf-d92091c34f8c.png)
プロセス名に起動しているBVE5が表示されます。
__選択__ をクリックします。
** プロセス名に表示されていない場合は、 __最新情報に更新__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/adee195d-5273-f5fe-a9e6-f71db29c375d.png)
__次へ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ea1882b5-063f-6876-41e9-19f7c5f840f7.png)
__シナリオフォルダ__ を選択し、__次へ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d0266b71-f908-20b9-c288-0a423deed504.png)
__インストールを開始__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a9bd159e-5772-1e26-c1ed-7034ca6bb87f.png)
起動しているBVE5を終了させるか確認されますので、__OK__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6de8a7f4-7bc4-566f-5495-70102690de84.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d1a43437-cf00-4717-1b5c-85550c204d91.png)
インストールが終了したので、 __完了__ をクリックします。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b2eb11b9-ee62-5057-9376-782b051b988d.png)
# 起動する
BVEを起動します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b2a8a2b0-91f7-5c1b-40d6-02232d622358.png)
# 都市型ワンマンプラグインのインストール
次に、__都市型ワンマンプラグイン__ をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/db940bd3-2dcf-96eb-40d6-5fdfec16a21c.png)
__Github__ から最新のZIPファイルを __ダウンロード__ します。

https://automatic9045.github.io/AtsEX.Docs.Plugins/city-oneman/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/29587dd6-2f50-f7b1-08f4-cadf3a47c369.png)
ZIPファイルから該当のフォルダとファイルを、__車両ファイル__ にコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f1dc05f5-bd0d-40a7-fbd2-9f87add5aa18.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a39b69c3-eae3-1ef2-fb93-47e5797f756d.png)
__CityOneman.dll__ はそのままではブロックされてしまうため、__許可__ をします。
__右クリック⇒プロパティ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9667c13c-420f-b151-408b-1da4818122e0.png)
__セキュリティ⇒許可する__ を選択し、__OK__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9aa399ce-7ff7-68fd-c7a7-cee956679b43.png)
以上で、__都市型ワンマンプラグイン__ が使用できるようになりました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/56564e41-0cd7-3e47-38b9-a07dda6120fa.png)
# 　都市型ワンマンプラグインの設定ファイルの文法
__設定ファイルの文法__ にあるように __CityOneman.Config.xml__ の以下が __キーアサイン__ になります。
```
    <Keys>
      <LeftOpen KeyCode="E" />
      <LeftClose KeyCode="R" />
      <LeftReopen KeyCode="T" />
      <RightOpen KeyCode="O" />
      <RightClose KeyCode="I" />
      <RightReopen KeyCode="U" />
    </Keys>
 ```
# Raspberry Pi Picoでキースイッチを作る
__Raspberry Pi Pico__ を使用してキースイッチを作ってみましょう。
__再開閉ボタン__ や、__ホーン__ は、長押しをするために

    Keyboard.press
    Keyboard.release
と記述します。
# プログラム
コード全容
```
/*
  Button to HID Custom!
  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
*/
#include "Keyboard.h"

// constants won't change. They're used here to set pin numbers:
const int Button2 = 2;    // the number of the pushbutton pin
const int Button3 = 3;    
const int Button4 = 4;    
const int Button5 = 5;    
const int Button6 = 6;    
const int Button7 = 7;    
const int Button8 = 8;    
const int Button9 = 9;    
const int Button10 = 10;  

// variables will change:
int buttonState2 = 0;       // variable for reading the pushbutton status
int buttonState2_old = 0;   // variable for reading the pushbutton status
int buttonState3 = 0;       // variable for reading the pushbutton status
int buttonState3_old = 0;   // variable for reading the pushbutton status
int buttonState4 = 0;       // variable for reading the pushbutton status
int buttonState4_old = 0;   // variable for reading the pushbutton status
int buttonState5 = 0;       // variable for reading the pushbutton status
int buttonState5_old = 0;   // variable for reading the pushbutton status
int buttonState6 = 0;       // variable for reading the pushbutton status
int buttonState6_old = 0;   // variable for reading the pushbutton status
int buttonState7 = 0;       // variable for reading the pushbutton status
int buttonState7_old = 0;   // variable for reading the pushbutton status
int buttonState8 = 0;       // variable for reading the pushbutton status
int buttonState8_old = 0;   // variable for reading the pushbutton status
int buttonState9 = 0;       // variable for reading the pushbutton status
int buttonState9_old = 0;   // variable for reading the pushbutton status
int buttonState10 = 0;      // variable for reading the pushbutton status
int buttonState10_old = 0;  // variable for reading the pushbutton status

void setup() {
  pinMode(Button2, INPUT_PULLUP);
  pinMode(Button3, INPUT_PULLUP);
  pinMode(Button4, INPUT_PULLUP);
  pinMode(Button5, INPUT_PULLUP);
  pinMode(Button6, INPUT_PULLUP);
  pinMode(Button7, INPUT_PULLUP);
  pinMode(Button8, INPUT_PULLUP);
  pinMode(Button9, INPUT_PULLUP);
  pinMode(Button10, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  // read the state of the pushbutton value:
  buttonState2 = digitalRead(Button2);
  if (buttonState2 != buttonState2_old) {
    // check if the pushbutton is pressed. If it is, the buttonState is LOW:
    if (buttonState2 == LOW) {
      // Keyboard Write:
      Keyboard.write('e');
    }
  }
  buttonState3 = digitalRead(Button3);
  if (buttonState3 != buttonState3_old) {
    if (buttonState3 == LOW) {
      Keyboard.write('r');
    }
  }
  buttonState4 = digitalRead(Button4);
  if (buttonState4 != buttonState4_old) {
    if (buttonState4 == LOW) {
      Keyboard.press('t');
    } else  {
      Keyboard.release('t');
    }
  }
  buttonState5 = digitalRead(Button5);
  if (buttonState5 != buttonState5_old) {
    if (buttonState5 == LOW) {
      Keyboard.write('o');
    }
  }
  buttonState6 = digitalRead(Button6);
  if (buttonState6 != buttonState6_old) {
    if (buttonState6 == LOW) {
      Keyboard.write('i');
    }
  }
  buttonState7 = digitalRead(Button7);
  if (buttonState7 != buttonState7_old) {
    if (buttonState7 == LOW) {
      Keyboard.write('u');
    }
  }
  buttonState8 = digitalRead(Button8);
  if (buttonState8 != buttonState8_old) {
    if (buttonState8 == LOW) {
      Keyboard.write(0xDE);
    }
  }
  buttonState9 = digitalRead(Button9);
  if (buttonState9 != buttonState9_old) {
    if (buttonState9 == LOW) {
      Keyboard.press(KEY_RETURN);
    } else  {
      Keyboard.release(KEY_RETURN);
    }
  }
  buttonState10 = digitalRead(Button10);
  if (buttonState10 != buttonState10_old) {
    if (buttonState10 == LOW) {
      Keyboard.press(0xDF);
    } else {
      Keyboard.release(0xDF);
    }
  }
  buttonState2_old = buttonState2;
  buttonState3_old = buttonState3;
  buttonState4_old = buttonState4;
  buttonState5_old = buttonState5;
  buttonState6_old = buttonState6;
  buttonState7_old = buttonState7;
  buttonState8_old = buttonState8;
  buttonState9_old = buttonState9;
  buttonState10_old = buttonState10;
  delay(100);
}

```

以上で、__ATSex__ を手元のスイッチで使用できるようになったと思います。