2015年7月18日土曜日

ゲームの自動操作装置(3):USBキーボードスケッチ

ゲームの自動操作装置(2):USBキーボードシールド からの続き

以下は前述のUSBキーボードシールドのためのスケッチ

シリアルポートを監視してPCから打鍵情報(1byte)が来るのを待つ
打鍵情報が来たら対応するGPIOへの出力を行う

ピンの最大数は17、打鍵は3種類(ON/OFF/HIT(一瞬ONしたのちOFF))なので1byteで足りる
(スケッチ内では簡単化のために17ではなくキリのよい20で計算している)

また、暴走対策のためにすべてのキーをOFFにするALL_OFF命令を設けている
どのピンに何のキーが対応しているかはこのスケッチでは扱わない

シリアル出力へデバッグ出力を行っているがアプリケーション側はこれを無視してもかまわない


ゲームの自動操作装置(4):アプリ/シリアル通信部分 へ続く

  
#define  PIN_MAX  17
#define  KEY_BASE  20

#define  KEYTYPE_HIT  0
#define  KEYTYPE_ON  1
#define  KEYTYPE_OFF  2
#define  KEYTYPE_MAX  2

#define  ALL_OFF  0
#define  KEY_DELAY  100

char command = 0;
int pin;
int commandType;
int commandNum;

void setup()
{
  Serial.begin(9600);
  for(pin = 2; pin <= 17; pin++)
  {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }
}

void loop()
{
  if (Serial.available() > 0) 
  {
    command = Serial.read();
    if(command == ALL_OFF)
    {
      Serial.print("command:");
      Serial.print(command, DEC);

      Serial.print("ALL OFF");
      for(pin = 2; pin <= 17; pin++)
      {
        digitalWrite(pin, HIGH);  
      }      
      delay(KEY_DELAY);
    }
    else
    {
      commandType = (int)(command / KEY_BASE);
      if(commandType <= KEYTYPE_MAX)
      {
        pin = (int)(command - (KEY_BASE * commandType));
        if(pin <= PIN_MAX)
        {
          Serial.print("command:");
          Serial.print(command, DEC);
          Serial.print(" commandType:");
          Serial.print(commandType);
          Serial.print(" pin:");
          Serial.println(pin);
           
          switch(commandType)
          {
            case KEYTYPE_HIT:
              Serial.print("HitKey");          
              digitalWrite(pin, LOW);
              delay(KEY_DELAY);
              digitalWrite(pin, HIGH);
              break;
            case KEYTYPE_ON:
              Serial.print("OnKey");          
              digitalWrite(pin, LOW);
              delay(KEY_DELAY);            
              break;
            case KEYTYPE_OFF:
              Serial.print("OffKey");          
              digitalWrite(pin, HIGH);
              delay(KEY_DELAY);
              break;
            default:
              Serial.println("UnknownType");
              break;         
          }
        } 
      }
    }
  }
}

0 件のコメント:

コメントを投稿