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