メリークリスマス
いきなり話変わって
昨日のWizardry自動戦闘のプログラムをメモってみます。
wikiなどを見ると、ホリパッド3ターボを買って… 「×↓○」の順に連射ホールドすれば良いらしい
でもって、これをPICマイコンで実現してみる
あ、
この記事は知的好奇心を満たすための実験的なものなので、実用的ではありません。
ホリパッドを買った方が確実かと思います
開発環境としては、
MPLAB C18 と、USB Framework v2.9b (Microchip Application Libraries v2011-10-18 Windows) を使います。
今回はこのUSBフレームワークのフォルダ内のサンプルプロジェクトを、そのまま改造してみました。
USB Device - HID - Joystick フォルダ内の、
USB Device - HID - Joystick - C18 - PICDEM FSUSB.mcp のプロジェクトを使いました。
ソースは、main.c です。これを改造します。
void Joystick(void) を次のように差し替えます。
--------------------------------------------
unsigned long counter = 0;
void Joystick(void)
{
if(!HIDTxHandleBusy(lastTransmission))
{
//入力をリセット
joystick_input.val[0] = 0x00;
joystick_input.val[1] = 0x00;
joystick_input.val[2] = 0x08;
joystick_input.val[3] = 0x80;
joystick_input.val[4] = 0x80;
joystick_input.val[5] = 0x80;
joystick_input.val[6] = 0x80;
//左アナログスティックは下に入れっぱなし
joystick_input.members.analog_stick.Y = 0xff;
//××↓↓○○と連打する
if (counter>100 && counter<200) joystick_input.members.buttons.x = 1;
if (counter>300 && counter<400) joystick_input.members.buttons.x = 1;
if (counter>500 && counter<600) joystick_input.members.hat_switch.hat_switch = HAT_SWITCH_SOUTH;
if (counter>700 && counter<800) joystick_input.members.hat_switch.hat_switch = HAT_SWITCH_SOUTH;
if (counter>900 && counter<1000) joystick_input.members.buttons.o = 1;
if (counter>1100 && counter<1200) joystick_input.members.buttons.o = 1;
//キーコード送信
lastTransmission = HIDTxPacket(HID_EP, (BYTE*)&joystick_input, sizeof(joystick_input));
Delay1KTCYx(12); //1msのウェイト(0.0833us*12*1000=1ms ※48MHzの場合)
if (++counter>=1200) counter=0;
}
return;
}
--------------------------------------------
ちなみに自分はPIC18F14K50を使いました。(→プロジェクトの使用マイコンの設定も変更の必要あり)
最初は×↓○でプログラミングしたものの、「調べる」コマンドのループ状態となって使えなかった
ボタン押し時間を長めにして××↓↓○○としたら安定しました
ホリパッド持ってないので本当の動作は分からないけど、とりあえずこれでいいや

いきなり話変わって

昨日のWizardry自動戦闘のプログラムをメモってみます。
wikiなどを見ると、ホリパッド3ターボを買って… 「×↓○」の順に連射ホールドすれば良いらしい

でもって、これをPICマイコンで実現してみる

あ、
この記事は知的好奇心を満たすための実験的なものなので、実用的ではありません。
ホリパッドを買った方が確実かと思います

開発環境としては、
MPLAB C18 と、USB Framework v2.9b (Microchip Application Libraries v2011-10-18 Windows) を使います。
今回はこのUSBフレームワークのフォルダ内のサンプルプロジェクトを、そのまま改造してみました。
USB Device - HID - Joystick フォルダ内の、
USB Device - HID - Joystick - C18 - PICDEM FSUSB.mcp のプロジェクトを使いました。
ソースは、main.c です。これを改造します。
void Joystick(void) を次のように差し替えます。
--------------------------------------------
unsigned long counter = 0;
void Joystick(void)
{
if(!HIDTxHandleBusy(lastTransmission))
{
//入力をリセット
joystick_input.val[0] = 0x00;
joystick_input.val[1] = 0x00;
joystick_input.val[2] = 0x08;
joystick_input.val[3] = 0x80;
joystick_input.val[4] = 0x80;
joystick_input.val[5] = 0x80;
joystick_input.val[6] = 0x80;
//左アナログスティックは下に入れっぱなし
joystick_input.members.analog_stick.Y = 0xff;
//××↓↓○○と連打する
if (counter>100 && counter<200) joystick_input.members.buttons.x = 1;
if (counter>300 && counter<400) joystick_input.members.buttons.x = 1;
if (counter>500 && counter<600) joystick_input.members.hat_switch.hat_switch = HAT_SWITCH_SOUTH;
if (counter>700 && counter<800) joystick_input.members.hat_switch.hat_switch = HAT_SWITCH_SOUTH;
if (counter>900 && counter<1000) joystick_input.members.buttons.o = 1;
if (counter>1100 && counter<1200) joystick_input.members.buttons.o = 1;
//キーコード送信
lastTransmission = HIDTxPacket(HID_EP, (BYTE*)&joystick_input, sizeof(joystick_input));
Delay1KTCYx(12); //1msのウェイト(0.0833us*12*1000=1ms ※48MHzの場合)
if (++counter>=1200) counter=0;
}
return;
}
--------------------------------------------
ちなみに自分はPIC18F14K50を使いました。(→プロジェクトの使用マイコンの設定も変更の必要あり)
最初は×↓○でプログラミングしたものの、「調べる」コマンドのループ状態となって使えなかった

ボタン押し時間を長めにして××↓↓○○としたら安定しました

ホリパッド持ってないので本当の動作は分からないけど、とりあえずこれでいいや

