2017/6/4
mameで使えるコントローラです。
4軸ジョイスティック2系統
ボタンスイッチ3個+2個(コイン、スタート)
USBキーボードをエミュレートして、ボタンやジョイスティックの各操作を
キーボードのボタンに置き換えてHOSTに送ります。
ジョイスティックが2系統あるのは、リブルラブル、クレイジークレイマー用です。
検索すると、I-PAC2というのが見つかりますが、ebay価格$38とそこそこの値段です。
押されたボタンに対応するキーコードをUSBでPCに送る仕組みのようです。
それだったら、もっと安くあがる方法があるはず、と再検索しました。
見つかったのはArduinoを使う方法。
USB対応ライブラリも揃っていて、簡単にUSBキーボードをエミュレートできるようです。
買ったのは、Arduino LEONARDO。28kByteのプログラム領域、16MHz。
実例があったので、いきなりポートへのスイッチ割付検討です。
検討図
ソースコード
#include
void setup() {
Keyboard.begin();
pinMode(1, INPUT_PULLUP); // CTRL
pinMode(2, INPUT_PULLUP); // ALT
pinMode(3, INPUT_PULLUP); // SPACE
pinMode(4, INPUT_PULLUP); //
pinMode(5, INPUT_PULLUP); //
pinMode(6, INPUT_PULLUP); // 1 start
pinMode(7, INPUT_PULLUP); // 5 coin
pinMode(8, INPUT_PULLUP); // RIGHT
pinMode(9, INPUT_PULLUP); // UP
pinMode(10,INPUT_PULLUP); // LEFT
pinMode(11,INPUT_PULLUP); // DOWN
pinMode(A0, INPUT_PULLUP); // K Down
pinMode(A1, INPUT_PULLUP); // J Left
pinMode(A2, INPUT_PULLUP); // I Up
pinMode(A3, INPUT_PULLUP); // L Right
}
void loop() {
// Check the switches:
int buttonState1 = digitalRead(1); // CTRL
int buttonState2 = digitalRead(2); // ALT
int buttonState3 = digitalRead(3); // SPACE
int buttonState4 = digitalRead(4); //
int buttonState5 = digitalRead(5); //
int buttonState6 = digitalRead(6); // 1 start
int buttonState7 = digitalRead(7); // 5 coin
int buttonState8 = digitalRead(8); // RIGHT
int buttonState9 = digitalRead(9); // UP
int buttonState10= digitalRead(10); // LEFT
int buttonState11= digitalRead(11); // DOWN
int AState0 = digitalRead(A0); // K Down
int AState1 = digitalRead(A1); // J Left
int AState2 = digitalRead(A2); // I Up
int AState3 = digitalRead(A3); // L Right
//-----------------------------------
// Arrow Left
if (buttonState8 == LOW) {
Keyboard.press(KEY_LEFT_ARROW);
}
else {
Keyboard.release(KEY_LEFT_ARROW);
}
// Arrow Right
if (buttonState10 == LOW) {
Keyboard.press(KEY_RIGHT_ARROW);
}
else{
Keyboard.release(KEY_RIGHT_ARROW);
}
// Arrow Up
if (buttonState11 == LOW) {
Keyboard.press(KEY_UP_ARROW);
}
else{
Keyboard.release(KEY_UP_ARROW);
}
// Arrow Down
if (buttonState9 == LOW) {
Keyboard.press(KEY_DOWN_ARROW);
}
else{
Keyboard.release(KEY_DOWN_ARROW);
}
//-----------------------------------
// Left Ctrl key
if(buttonState1 == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
}
else{
Keyboard.release(KEY_LEFT_CTRL);
}
// Left ALT key
if(buttonState2 == LOW) {
Keyboard.press(KEY_LEFT_ALT);
}
else{
Keyboard.release(KEY_LEFT_ALT);
}
// Space key
if(buttonState3 == LOW) {
Keyboard.press(32);
}
else{
Keyboard.release(32);
}
//-----------------------------------
// 1 key
if(buttonState6 == LOW) {
Keyboard.press(49);
}
else{
Keyboard.release(49);
}
// 5 key
if(buttonState7 == LOW) {
Keyboard.press(53);
}
else{
Keyboard.release(53);
}
//-----------------------------------
// 'k' Down
if (AState0 == LOW) {
Keyboard.press(107);
}
else {
Keyboard.release(107);
}
// 'j' Left
if (AState1 == LOW) {
Keyboard.press(106);
}
else{
Keyboard.release(106);
}
// 'i' Up
if (AState2 == LOW) {
Keyboard.press(105);
}
else{
Keyboard.release(105);
}
// 'l' Right
if (AState3 == LOW) {
Keyboard.press(108);
}
else{
Keyboard.release(108);
}
}
手近にあった木材の寸法に合わせて筐体を作りました。
スイッチは上から叩かれるので、近くに補強の板を配置しています。
構造図。
組みあがったところ。