以下は前述の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 件のコメント:
コメントを投稿