AtsEXを使用してスイッチで扉の開閉を行おう2(CH552編) の続きです。
実装する
今回は、運転台に組み込んでみましょう。
私が製作している運転台は、
- ドア開閉スイッチ(片側のみ)
- 乗降促進ボタン
- レバーサ
- キー
- 切替スイッチ
- EBリセットスイッチ
が搭載されており、合計で11個のピンが必要です。
WeActStudioのCH552CoreBoard を使用しており、GPIO は 12ピン 使用可能です。
ただし、LED が Pin30 についており、このままでは使用できません。
この為、GPIO30 をコメントアウトしていますが、LEDを外せば12ピン目に警笛などを追加可能です。
これ以上のピン数が必要な場合は、Raspberry Pi Pico などのピン数が多いものを選択すると良いでしょう。
変更部分
前回のプログラムからいくつかのキーを変更しています。
乗降促進
乗降促進ボタンは押して離すではなく、1度目で開始、2度目で終了となっている為
Keyboard_press,Keyboard_release ではなく、Keyboard_write にしています。
ATOボタン
bve-autopilot は
[key]
atostart = x
で設定します。
東京メトロ10000系のATOファイルは Insert+Delete で起動するようになっていましたので
KEY_INSERT,KEY_INSERT にしています。
Keyboard_press(KEY_INSERT);
Keyboard_press(KEY_INSERT);
車掌スイッチ 扉閉
今回、開閉に割り当てているキーは1個の為、閉のみ左右の扉が閉まるようにしています。
こちらも上記と同じく2つのキーを入力する形にしました。
プログラム
/*
HID Keyboard example
created 2020
by Deqing Sun for use with CH55xduino
This example code is in the public domain.
cli board options: usb_settings=user148
*/
//For windows user, if you ever played with other HID device with the same PID C55D
//You may need to uninstall the previous driver completely
//#include <Serial.h>
#ifndef USER_USB_RAM
#error "This example needs to be compiled with a USER USB setting"
#endif
#include "src/userUsbHidKeyboard/USBHIDKeyboard.h"
#define BUTTON0_PIN 10
#define BUTTON1_PIN 11
#define BUTTON4_PIN 14
#define BUTTON5_PIN 15
#define BUTTON6_PIN 16
#define BUTTON7_PIN 17
//#define BUTTON30_PIN 30
#define BUTTON31_PIN 31
#define BUTTON32_PIN 32
#define BUTTON33_PIN 33
#define BUTTON34_PIN 34
#define BUTTON35_PIN 35
bool button0PressPrev = false;
bool button1PressPrev = false;
bool button4PressPrev = false;
bool button5PressPrev = false;
bool button6PressPrev = false;
bool button7PressPrev = false;
//bool button30PressPrev = false;
bool button31PressPrev = false;
bool button32PressPrev = false;
bool button33PressPrev = false;
bool button34PressPrev = false;
bool button35PressPrev = false;
void setup() {
USBInit();
pinMode(BUTTON0_PIN, INPUT_PULLUP);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);
pinMode(BUTTON5_PIN, INPUT_PULLUP);
pinMode(BUTTON6_PIN, INPUT_PULLUP);
pinMode(BUTTON7_PIN, INPUT_PULLUP);
// pinMode(BUTTON30_PIN, INPUT_PULLUP);
pinMode(BUTTON31_PIN, INPUT_PULLUP);
pinMode(BUTTON32_PIN, INPUT_PULLUP);
pinMode(BUTTON33_PIN, INPUT_PULLUP);
pinMode(BUTTON34_PIN, INPUT_PULLUP);
pinMode(BUTTON35_PIN, INPUT_PULLUP);
}
void loop() {
//button 0 is mapped to letter '6'
bool button0Press = !digitalRead(BUTTON0_PIN);
if (button0PressPrev != button0Press) {
button0PressPrev = button0Press;
if (button0Press) {
Keyboard_press('6');
} else {
Keyboard_release('6');
}
}
//button 1 is mapped to letter KEY_INSERT&KEY_DELETE
bool button1Press = !digitalRead(BUTTON1_PIN);
if (button1PressPrev != button1Press) {
button1PressPrev = button1Press;
if (button1Press) {
Keyboard_press(KEY_INSERT);
Keyboard_press(KEY_DELETE);
} else {
Keyboard_release(KEY_INSERT);
Keyboard_release(KEY_DELETE);
}
}
//button 4 is mapped to letter '1'
bool button4Press = !digitalRead(BUTTON4_PIN);
if (button4PressPrev != button4Press) {
button4PressPrev = button4Press;
if (button4Press) {
Keyboard_press('1');
} else {
Keyboard_release('1');
}
}
//button 5 is mapped to Capslock
bool button5Press = !digitalRead(BUTTON5_PIN);
if (button5PressPrev != button5Press) {
button5PressPrev = button5Press;
if (button5Press) {
Keyboard_press(KEY_DOWN_ARROW);
} else {
Keyboard_release(KEY_DOWN_ARROW);
}
}
//button 6 is mapped to '5'
bool button6Press = !digitalRead(BUTTON6_PIN);
if (button6PressPrev != button6Press) {
button6PressPrev = button6Press;
if (button6Press) {
Keyboard_press('5');
} else {
Keyboard_release('5');
}
}
//button 7 is mapped to 0xDE
bool button7Press = !digitalRead(BUTTON7_PIN);
if (button7PressPrev != button7Press) {
button7PressPrev = button7Press;
if (button7Press) {
Keyboard_write(0xDE);
}
}
/* //button 30 is mapped to letter 0xDF
bool button30Press = !digitalRead(BUTTON30_PIN);
if (button30PressPrev != button30Press) {
button30PressPrev = button30Press;
if (button30Press) {
Keyboard_press(KEY_RETURN);
} else {
Keyboard_release(KEY_RETURN+1);
}
}
*/
//button 31 is mapped to letter '7'
bool button31Press = !digitalRead(BUTTON31_PIN);
if (button31PressPrev != button31Press) {
button31PressPrev = button31Press;
if (button31Press) {
Keyboard_press('7');
} else {
Keyboard_release('7');
}
}
//button 32 is mapped to letter KEY_UP_ARROW
bool button32Press = !digitalRead(BUTTON32_PIN);
if (button32PressPrev != button32Press) {
button32PressPrev = button32Press;
if (button32Press) {
Keyboard_press(KEY_UP_ARROW);
} else {
Keyboard_release(KEY_UP_ARROW);
}
}
//button 33 is mapped to letter 'r'&'i'
bool button33Press = !digitalRead(BUTTON33_PIN);
if (button33PressPrev != button33Press) {
button33PressPrev = button33Press;
if (button33Press) {
Keyboard_press('r');
Keyboard_press('i');
} else {
Keyboard_release('r');
Keyboard_release('i');
}
}
//button 34 is mapped to letter 'e'
bool button34Press = !digitalRead(BUTTON34_PIN);
if (button34PressPrev != button34Press) {
button34PressPrev = button34Press;
if (button34Press) {
Keyboard_press('e');
} else {
Keyboard_release('e');
}
}
//button 35 is mapped to letter '8'
bool button35Press = !digitalRead(BUTTON35_PIN);
if (button35PressPrev != button35Press) {
button35PressPrev = button35Press;
if (button35Press) {
Keyboard_press('8');
} else {
Keyboard_release('8');
}
}
delay(50); //naive debouncing
}
以上でCH552でドア開閉などが使用できるようになったと思います。
CH552に限らず、USB-HIDとして使用可能なマイコンがありますので用途に合わせて選んで作ってみてください。