秋月H8マイコン・マザーボードでプレイステーションアナログコントローラ(DUALSHOCK, DUALSHOCK 2)を制御するライブラリマニュアル

-----------------------------------------------------------------------------------------
 秋月電子のH8マイコンは,開発環境がほとんどいらないという手軽さが受けて,大量に売れています。H8マイコンを組み込んだロボットなどを開発する場合,プレイステーションのアナログコントローラを使うと,ロボットの操作性もよくなります。また,使い慣れた人も多いので,ロボットを展示した場合に見学者が操作しやすいというメリットもあります。

 ロボコンなど競技に出場する場合でも,コントローラを自作するよりも,立派なスイッチ類がたくさんついていて,壊れたらすぐに交換できるDUALSHOCK/DUALSHOCK2を使う方がはるかに開発が楽です。さらに高速赤外線通信を使えば無線通信ができますので,高専ロボコンにも対応できます。(がんばってテレビリモコンや自作コントローラを使っているチームもありますが,操作性・信頼性の点でDUALSHOCK/DUALSHOCK2の方が断然上です。)

 本ライブラリは,H8マイコンで簡単にプレイステーションアナログコントローラ”DUALSHOCK”または"DUALSHOCK 2"を使うためのライブラリ集です。満足のいくものが,小さいコードで開発できたので公開します。ライブラリを使用した簡単なサンプルソフトも付属しました。

 DUALSHOCKでないデジタルコントローラの場合でも,スイッチやスティックの状態を読み込んだりすることが可能です。また,H8をコントローラの解析ツールとして使うための関数も用意しました。

(以下,デジタルを含めたすべてのコントローラ共通の表記として”PAD”を,またDUALSHOCK専用の表記として”PSPAD”を,DUALSHOCK2専用の表記として”PS2PAD”を使うことにします。)
-----------------------------------------------------------------------------------------

1.最初に
 本ライブラリは,個人で使用する場合は,フリーウェアです。けれども,本ライブラリを組み込んで開発したシステムや解析結果を雑誌やインターネット,研究論文,学会発表等で公開する場合は著作物ですので出典を記すようにしてください。
 本ライブラリをどのような形態であっても,製品の一部として組み込んで,企業(秋月電子を除く)が販売する場合は,僅かですが製品の価値が上がりますので,スタンプウェア(代金は葉書切手額面に同期)となります。
 なお,このライブラリや本マニュアルの記載内容を利用することによって生じるかもしれないあらゆる損害に対して,作者は一切責任を持ちません。個人の責任において使用してください。記述内容の正しさの保証もありません。

2.動作確認環境
 
次の環境で動作確認を行っています。他のマイコン(3052F等)でクロックが異なる場合ではそのままでは動きません。waitの数だけ調整すればよいのですが,とりあえずすぐに動作確認できないので,要望の大きさと仕事量のせめぎ合いで,開発するかどうかが決まることになります(^^;)。

マイコン  秋月電子製 H8マイコン(3048F)+マザーボード(AE-H8MB)
ソニー アナログコントローラ(DUALSHOCK 2) (SCPH-10010xx)(注:xxは色コード)

 なお,入手しづらくなっているようですが,DUALSHOCK(かその互換品)でも動作するはずです。試してみてください。

3.参考文献と解析結果
 次の文献を参考にしました。すばらしい解析結果を公開されている,藤田氏,寺川氏,永田氏に感謝いたします。

1 藤田氏によるプレイステーション・PAD/メモリ・インターフェースの解析ベクター
2 寺川氏によるDUALSHOCKの解析
3 永田氏によるDUALSHOCK2の信号解析

 これらの文献の情報を元にプログラムしましたが,文献の情報とプログラミング・動作テスト中に独自に調べた解析結果が異なっていた部分をまとめます。青字が独自に調べた結果です。各氏の解析後,ハードの仕様が変更になった可能性があります。

●<永田文書>
[[DS2 native modeにするには]]
     DS2 native modeにDS2を移行させるためには,少なくとも2つの段階を踏
     む必要がある。

     1. DS2をDUALSHOCK互換アナログモードにする
     2. set_DS2_native_mode(後述) コマンドを出す

     更に,バイブレーションも使いたければ,1と2の間に,  2の後にvibration_enable
     コマンドを出す必要がある。以上で,DS2をDS2 native modeで使うことが
     できる.

 configModeEnterとconfigModeExitの間ですべて実行するのであれば,1と2の間でもokかもしれません。1,2それぞれがconfigModeEnterとconfigModeExitの間で実行される場合,2の後でないとだめでした。

●<寺川文書,永田文書>
<< セットモード&ロック(SET_MODE_AND_LOCK) >>
CMD=01,44,00,XX,YY,00,00,00,00
DAT=--,F3,5A,00,00,00,00,00,00
    XX=01     --> アナログモード
    XX=00     --> デジタルモード
    YY=03     --> モード固定/ボタンにより切り替え不能
    YY=03以外 02 --> ボタンにより切り替え可能
    付随効果として強制的にバイブレーションがディセーブルされる。

 PADのANALOGボタンで切り替え可能にセットするのに,少なくとも00, 01, 04では駄目でした。02でのみうまくいきました。05〜FFは試していません。前のバージョンのライブラリでは00でやっていました。筆者自身00では切り替え可能に成功していなかったのですが,それはHORI製の互換品を使っていたからだと思いこんでいました。

●<寺川文書,永田文書>(説明に必要な部分のみ抜粋
<< リードデータ&バイブレートEX(READ_DATA_AND_VIBRATE_EX) >>
CMD=01,42,00,WW,PP(,00,00,00,00)
    WW=00 --> 小モータオフ       互換モードとの違いに注意
    WW=01 --> 小モータオン
    PP=00 --> 大モータオフ        |  PPには00〜FFを指定できるが、
    PP=FF --> 大モータ出力最大    |  あまり小さいと回転しないので注意

 解析した結果,PPの値だけで,大・小のモータをコントロールできるようになっていました(小モータの回転の勢いはいつも一定)。おそらく仕様変更だと思います。
  PP=00〜3F -> 小モータのみ回転
  PP=40〜FF -> 値が大きいほど大モータが勢いよく回転する(小モータも同時に回転)

3.H8マイコンとアナログコントローラとの接続
 H8マイコンでアナログコントローラDUALSHOCK/DUALSHOCK 2(以下PSPAD/PS2PAD)を制御して,コントローラからスイッチやスティックの状態を取り込むわけですから,ハード的に接続しなければなりません。マイコンには,たくさんポートがありますから,どのポートに接続するか悩むところですが,独断と偏見でポートはP6に固定しました。接続表を示します。



 必要な部品は,5.1kΩ抵抗1本という事になります。DATにはシュミットトリガを入れた例をよくインターネットで見かけます。これはDATに関して特に立ち上がりが鈍いからですが,本ライブラリではタイミングを調整しシュミットトリガ不要を実現しています。

 PADへの電源は+3.6Vと規定されていますが,おそらく内部のチップは,CMOSでしょうからマイコンの5Vで駆動しても問題ありません。また,+7Vは振動モータやCD-ROMドライブを駆動する電源になりますが,インターネット上では,+9Vで駆動している例がよく見られます。マイコン上の三端子レギュレータ7812の出力12Vで動かしてみましたが,電圧が高い分,勢いよく回りました。同じくマイコンの7805出力の5Vでも試してみました。回転が弱々しくはなりますが,実用上問題はなさそうです。

フェライトコアの隙間に爪を入れて横にずらすとはずれますので,フェライトコアの取り付け場所を移動します。次にケーブルを切断して皮をむきます。

拡大写真。

どのケーブル色がどのピンかを調べました(上の表)。未使用の8番ピンは最初から入っていませんでした。裸の線の束はGNDかな?と思いましたが,つながっていませんでした。

マザーボードに接続するため,DOS/Vコンピュ−タのマザーボードのLED, POWER, RESETなどの端子にケーブルを接続するためのコネクタを取り付けました。接続ポートを簡単に変更できるので便利です。メーカーのホームページを示します。筆者は千石電商で入手しました(ピンはバラだと高いのでリールで購入)。
型番:2550−1×1,2550−10GT(4本組)

必ず圧着工具を使ってください。1.7Lで芯,1.7Hで被覆をしっかり締めることができます。細いケーブルなので圧着工具なしでは厳しいです。

コネクタをつけ終えたところです。ACK(緑)は使いません。緑はコネクタをつけなくてもよかったですね。
マイコンマザーに接続したところ。

接続の様子。茶色のケーブル(DAT)をプルアップしている抵抗がLEDのすぐ上に見えます。緑のケーブル(ACK)は使っていません。

                

4.ライブラリとサンプルプログラムの使い方
 すでに,H8マイコン・マザーボードで,秋月電子が提供しているC言語で書かれたサンプルプログラムがコンパイル・リンクでき,H8マイコンの動作確認が済んでいる方が対象です。まだ,動作確認が済んでいない方は,マニュアルをよく読んで,動かせるところまで何とかがんばってください。

(1)圧縮ファイルを解凍してください。これが読めている方は,解凍済みです。
 中身は,次のようになっています。
    PS2Pad.h, PS2Pad.obj  ・・・PSPAD/PS2PAD制御ライブラリ(ヘッダファイルとオブジェクトファイルで構成)
    sample              ・・・サンプルプログラムが入ったフォルダ
    manual              ・・・マニュアルが入ったフォルダ
 sampleの中身は,次のようになっています。とりあえずテストプログラムを動かしてみましょう。(motファイルをマイコンに書き込むだけでもokです。)
    lcdlib.h        ・・・LCDライブラリヘッダファイルVer3.8,3048F+AE-H8MB用
    lcdlib.obj       ・・・LCDライブラリ(LCDに表示する関数群)Ver3.8,3048F+AE-H8MB用
    Pad2Test.c     ・・・テストプログラム
    Pad2Test.sub    ・・・リンクするためのsubファイル例
    Pad2Test.MOT   ・・・テストプログラムをコンパイル・リンク済みのmotファイル
    PS2Pad.h      ・・・PSPAD/PS2PAD制御ライブラリヘッダファイル(一つ上のディレクトリのものと同一)
    PS2Pad.obj     ・・・PSPAD/PS2PAD制御ライブラリ(一つ上のディレクトリのものと同一)
    RESETV.MAR    ・・・秋月のキットに付属のスタートアップルーチン(自作のものでももちろんokです)
    RESETV.OBJ    ・・・秋月のキットに付属のスタートアップルーチンをアセンブルしたオブジェクトファイル
 LCDライブラリは,LCDに文字を表示するライブラリで,PadTest.c中でPSPAD/PS2PADから受け取るデータを表示するために利用しています。次の場所からダウンロードできるものと同じです。Ver3.8,3048F+AE-H8MB用です。詳細はダウンロードして,ドキュメントを参照してください。(LCDライブラリ:http://www.vector.co.jp/soft/other/h8/se086727.html

(2)Pad2Test.cをコンパイルした,Pad2Test.objをlcdlib.obj,PS2Pad.objなどのライブラリとリンクするためのsubファイル,Pad2Test.sub(付属)を次のような内容にします。
−−−−−−−−−
OUTPUT Pad2Test
PRINT Pad2Test
INPUT resetv,lcdlib,PS2pad,Pad2Test
LIB c:\Progra~1\h8\c\c38hab        ←ここは各自の環境に変更のこと
START P,C,D(200),B(0FEF10)               ←LCDライブラリ付属のreadme2.txt参照
EXIT
−−−−−−−−−
 見てわかると思いますが,resetv, lcdlib, PS2pad, Pad2Testの4つのオブジェクトをリンクすることを示しています。

(3)いつものようにコンパイル・リンク・mot変換・H8に転送をして,実行します。次の内容のコンパイル・リンク用バッチファイルを作っておくと便利でしょう。添付のPad2Test.MOTをマイコンに書き込むだけでも実行できます。
−−−−−−−−−
cc38h -include=c:\Progra~1\h8\c PS2Pad.c     ←ここは各自の環境に変更のこと
L38H -SUBCOMMAND=Pad2Test.sub
−−−−−−−−−

(4)サンプルプログラムの動作
 PADをポートに接続し,ディップスイッチはすべてOFFにした状態で,マイコンの電源を入れます。写真のようにLCDに表示されれば正常です。またLEDが二つともちらちらと高速点滅します。うまく動かない場合は,すぐに電源を落とし結線を確認してください。

電源投入時のLCD表示

(5)アナログモードへの移行
 S1(H8マイコンマザー上のタクティールプッシュスイッチ)を押すと,アナログフリーモードに移行します。また,
PSPAD/PS2PADのLEDが赤色に点灯します。LCD表示で2番目の値が,41hから73hに変わっています。これはモードを表します。41hはデジタルモード,73hはアナログDUALSHOCKモードです。フリーモードですから,ANALOGボタンでデジタルモードに戻すことができます。
 さて,この状態で,PSPAD/PS2PADのボタンやスティックを操作してみてください。データが取得できているのがわかると思います。どのボタンがどの16進数のどのビットに対応するのか表を作ろうかと思いましたが,試してみればわかることですので割愛します。このサンプルプログラムのソースリストや上に記した参考文献を参照してください。

アナログフリーモードに移行


(6)DUALSHOCK2ネィティブモードへの移行
 S2を押すと,DUALSHOCK2ネィティブ固定モードに移行します。液晶の2番目の16進数が”79”になればDUALSHOCK2ネィティブモードに移行しています。固定モードですから,ANALOGボタンではモードチェンジできません。もちろんプログラムを変更してフリーモードにすることもできます。

DUALSHOCK2ネィティブ固定モード


 DUALSHOCK2ネィティブモードでは,PS2PADの各押しボタンを押す強さも調べることができます。どれかのディップスイッチ(たとえば8)をONにしてみてください。表示が切り替わって,ボタンを押している力をみることができます。

ディップスイッチの8をONにして,PADのボタンは何も押さない場合のLCD表示。

○ボタンを強く押した場合のLCD表示(”FF”と表示されている)。押されてないボタンに該当する部分は”00”と表示されています。



(7)振動モータの駆動
 S3を押すと振動がイネーブル(許可)になります。どのモードでもイネーブルされます。続けてS4を押すと振動モータが回り始めます。ディップスイッチの状態によりモータの回転の強さが変わります。マイコンマザーボード上のディップスイッチは,右側(8とかかれている方)が上位でONの状態が1となる8ビットの2進数と考えてください。その値をdip(16進数)とすると次のようにモータの回転の強さが変わります。試してみてください。スケルトンのPADでは回っているのが見えておもしろいです。デジタルモードでも回転の強さを変えることができます。
  dip=00〜3F -> 小モータのみ回転
  dip=40〜FF -> 値が大きいほど大モータが勢いよく回転する(小モータも同時に回転)


5.ライブラリで使用できる関数・コマンド

5.1 ユーザプログラムの記述の仕方

(1) #include"PS2Pad.h"
 これは,プログラムの先頭で,他に必要なヘッダファイルと共に記述してください。これがないとライブラリが使えません。本ライブラリはPS2PAD専用というわけではありません。PS2PADネィティブの機能をのぞき,PSPADでもそのまま動作するはずです。

(2) initPSPadPortP6();
 main関数の先頭で,この関数でポートの初期化をしてください。この関数は,次のようにP6の初期化をします。下位4ビット分を使用します。上位のポートを別の用途に利用する場合など,この関数に相当するものをユーザーが別に記述しても構いません。
−−−−−−−−−
P6.DDR = 0x07;      /* ****0111 */
P6.DR.BYTE = 0x07;  /* SEL0=1, CLK=1, CMD=1 */

−−−−−−−−−

(3) sendPSPad(コマンド); ,  sendPSPadUser(コマンド,リターンコード,バイト数);
 PADにコマンドを送ります。4.3を参照してください。

(4) getPSPadRetCode(retCode);
 PADにコマンドを送った後,この関数でPADが返す値を得ることができます。PADにコマンドを送るとPADは何らかのコードを返してきます。PADのボタン等の状態と返す値の一覧表を作ろうかと思いましたが,サンプルプログラムで調べることができますし,文献もあるので割愛します。引数は,unsigned char 型の配列へのポインタを指定します。その配列の要素数はcmdLengthとしてください。cmdLengthは,PS2Pad.hの中で,21 に定義されています。たとえば,unsigned char retCode[cmdLength];のように配列を定義し,retCodeを引数として,この関数を実行します。下にあるサンプルプログラムの解説を参照してください。

(5) setVibrationPower(引数);
 振動モータの振動の強さをセットする関数です。引数には0x00から0xffの値を指定します。サンプルプログラムの解説を参照してください。

5.2 アナログモードのタイムアウトについて
 PSPAD/PS2PADに一度でもconfigModeEnterコマンドを送ると,アナログモードに移ります。アナログモードに移って3秒以上,コマンドを送らない場合は,自動でデジタルモードに戻ってしまいます。ですので常にコマンドを出し続ける必要があります。プレイステーションのゲームではPADに常時アクセスするはずですから,当然といえば当然です。サンプルプログラムPad2Test.cもそうなっています。

5.3 コマンド
 すべてのコマンドは,関数sendPSPad()の引数で指定します。全コマンドに対するPADからのリターンコードは,上述のgetPSPadRetCode(retCode);で読み出すことができます。

(1) sendPSPad(configModeEnter);
 コンフィギュレーションモードに入るコマンドです。一度でもこのコマンドを実行すると,PSPAD/PS2PADのアナログモードになります。

(2) sendPSPad(configModeExit);
 コンフィギュレーションモードから抜け出るコマンドです。抜け出てもアナログモードのままです。

(3) sendPSPad(analogFix);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PSPAD/PS2PADをアナログDUALSHOCK固定モードに設定します。固定モードですから,ANALOGボタンを押しても変更できなくなります。また強制的に振動がディセーブルされます。

(4) sendPSPad(analogFree);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PSPAD/PS2PADをアナログDUALSHOCKフリーモードに設定します。フリーモードですから,ANALOGボタンを押せば動作モードを変更できます。また強制的に振動がディセーブルされます。

(5) sendPSPad(digitalFix);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PADをデジタル固定モードに設定します。固定モードですから,ANALOGボタンを押しても動作モードは変更できません。また強制的に振動がディセーブルされます。

(6) sendPSPad(digitalFree);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PADをデジタルフリーモードに設定します。フリーモードですから,ANALOGボタンを押せば動作モードを変更できます。また強制的に振動がディセーブルされます。

(7) sendPSPad(DS2NativeMode);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PS2PADをDUALSHOCK2ネィティブアナログモードに設定します。ただし,あらかじめPS2PADをアナログモードにしておく必要があります。フリー/固定は,アナログモード時の設定が引き継がれます。また強制に振動がディセーブルされます。

(8) sendPSPad(vibrationEnable);
 このコマンドは,コンフィグレーションモードに入ってから設定します。振動をイネーブルにします。

(9) sendPSPad(vibrationDisable);
 このコマンドは,コンフィグレーションモードに入ってから設定します。振動をディセーブルにします。

(10) sendPSPad(queryModelAndMode);
 このコマンドは,コンフィグレーションモードに入ってから設定します。PADのモデルと動作モードが読み出せます。

(11) sendPSPad(readData);
 コンフィグレーションモードに一度も出入りしていない状態でも実行できます。コントローラのスイッチやスティックの角度情報を読み出すコマンドです。情報は,getPSPadRetCode(retCode);で読み出すことができます。この関数は全PAD,全動作モードで有効です。

(12) sendPSPad(readDataAndVibrate);
 コンフィグレーションモードに入らずに実行します。コンフィグレーションモードに一度も入っていない状態で実行できます。一度でも出入りすると実行できません。小振動モータのみを回して振動させます。振動の大きさは設定できません。あまり使うことはないでしょう。次のコマンドの方を使ってください。

(13) sendPSPad(readDataAndVibrateEx);
 コンフィグレーションモードに一度でも入った場合は,このコマンドで振動させます。逆にreadDataAndVibrateは使えなくなります。振動の強さは,setVibrationPower(引数);でセットした強さになります。引数は16進数で次のようになります。
  引数=00〜3F -> 小モータのみ回転
  引数=40〜FF -> 値が大きいほど大モータが勢いよく回転する(小モータも同時に回転)

(14) sendPSPadUser(cmd,ret,num);
 
ユーザ解析用関数です。プロトタイプ宣言は,次のようになっています。
 void sendPSPadUser(unsigned char *cmd,unsigned char *retCode, unsigned num);
まだ世の中で解析されてないコマンドをユーザが試すこともできるよう用意しました。この関数によりH8マイコンを解析ツールにできます。numバイトのコマンド(cmd)をPADに送信し,numバイトのリターンコード(retCode)を受け取ります。サンプルプログラムの振動の部分を参照してください。

5.4 便利な関数
 コマンドを組み合わせた便利な関数を用意しました。サンプルプログラムで使っています。参考のためソースも示します。freeFixTypeはps2pad.hで次のように定義されています。
typedef enum{ FREE, FIX} freeFixType;


(1) アナログモードに移行
使用例:setPSPadAnalogMode(FREE);
          setPSPadAnalogMode(FIX);

 PSPAD/PS2PADをアナログ(フリー/固定)モードにセットします。成功すれば,0x73を返します。
unsigned char setPSPadAnalogMode(freeFixType ff)
{
    unsigned char retCode[cmdLength];
    retCode[1]=0x00;
    sendPSPad(configModeEnter);
    if(ff==FIX) sendPSPad(analogFix); else sendPSPad(analogFree);
    sendPSPad(configModeExit);
    sendPSPad(readData);
    getPSPadRetCode(retCode);
    return retCode[1];/* 0x73=analog mode */
}


(2) デジタルモードに移行
使用例:setPSPadDigitalMode(FREE);
          setPSPadDigitalMode(FIX);
 PSPAD/PS2PADをデジタル(フリー/固定)モードにセットします。成功すれば,0x41を返します。
unsigned char setPSPadDigitalMode(freeFixType ff)
{
    unsigned char retCode[cmdLength];
    retCode[1]=0x00;
    sendPSPad(configModeEnter);
    if(ff==FIX) sendPSPad(digitalFix); else sendPSPad(digitalFree);
    sendPSPad(configModeExit);
    sendPSPad(readData);
    getPSPadRetCode(retCode);
    return retCode[1];/* 0x41=digital mode */
}

 
(3) DUALSHOCK2ネィティブアナログモードに移行
使用例:setPS2PadAnalogMode(FREE);
          setPS2PadAnalogMode(FIX);
 PS2PADをDUALSHOCK2ネィティブアナログ(フリー/固定)モードにセットします。成功すれば,0x79を返します。

unsigned char setPS2PadAnalogMode(freeFixType ff)
{
    unsigned char retCode[cmdLength];
    retCode[1]=0x00;
    setPSPadAnalogMode(ff);
    sendPSPad(configModeEnter);
    sendPSPad(DS2NativeMode);
    sendPSPad(configModeExit);
    sendPSPad(readData);
    getPSPadRetCode(retCode);
    return retCode[1];/* 0x79=DS2NativeMode */
}

(4) 振動をイネーブル/ディセーブル(許可/不許可)
使用例:setVibrationEnable();
          setVibrationDisable();

 振動をイネーブル/ディセーブルします。値は返しません。
void setVibrationEnable(void)
{
    sendPSPad(configModeEnter); sendPSPad(vibrationEnable); sendPSPad(configModeExit);
}

void setVibrationDisable(void)
{
    sendPSPad(configModeEnter); sendPSPad(vibrationDisable); sendPSPad(configModeExit);
}

(5) 振動モータをON
使用例:vibratePSPad(0xff);    /*最大の勢いで振動*/

 振動モータを回転させます。引数で振動の強さを指定(0x00〜0xff)します。
void vibratePSPad(unsigned char dip)
{
    setVibrationPower(dip); sendPSPad(readDataAndVibrateEx);
}


5.サンプルプログラムPad2Test.cの解説

#include <3048f.h>
#include"lcdlib.h"       ←LCDライブラリを使用するために必要
#include"PS2Pad.h" ←本PSPAD/PS2PADデュアルショックライブラリを使用するために必要

void printReturnCode(unsigned char *retCode)
{
    unsigned i;
    unsigned char dip;
    dip=~P2.DR.BYTE;
    if(dip){
        gotoxy(0,0); for(i=9;i<15;i++)         printf("%02x",retCode[i]);
        printf("    ");
        gotoxy(0,1); for(i=15;i<cmdLength;i++) printf("%02x",retCode[i]);
        printf("    ");
    }else{
        gotoxy(0,0); for(i=0;i<5;i++) printf("%02x ",retCode[i]);
        gotoxy(0,1); for(i=5;i<9;i++) printf("%02x ",retCode[i]);
    }
}
↑LCDライブラリ関数を利用して,PSPADのリターンコードを表示させ,
 ボタンやスティックの状態を表示する。ディップスイッチが一つでもONになっていれば,PS2PADのボタンを
 押す強さを表示。すべてOFFの時は,ボタンのON/OFF情報とスティックの状態等を表示。

void main(void)
{
    unsigned char dip,led=1,retCode[cmdLength/*21*/];
    unsigned char cmd[21]={0x01,0x42,0x00,0x01,0xff,0x00,0x00,0x00,0x00,
                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ←振動させるコマンド列
                    ,ret[21]; 
    unsigned i;
    initMotherSystem();  ←LCD等の初期化関数
    initPSPadPortP6();   ←PSPADを接続するポートの初期化関数

    clrscr(); ←LCDライブラリに含まれるLCD画面クリア関数
    while(1){

        if(led=1-led) ledon(all); else ledoff(all); ←LCDライブラリに含まれるLEDコントロール関数を利用して点滅
        dip=~P2.DR.BYTE; /*Dip Switch*/ ←ディップスイッチの状態を読み込む

        if( (~P4.DR.BYTE)&0x10 ){/*s1が押されたらアナログDUALSHOCKフリーモード*/
            setPSPadAnalogMode(FREE);  ←DUALSHOCKアナログフリーモード
        }
        else if( (~P4.DR.BYTE)&0x20 ){/*s2が押されたらPS2Padアナログ固定モード*/
            setPS2PadAnalogMode(FIX);  ←DUALSHOCK2ネィティブアナログ固定モード
        }
        else if( (~P4.DR.BYTE)&0x40 ){/*s3が押されたら振動許可*/
            setVibrationEnable();  ←振動許可(イネーブル)
        }
        else if( (~P4.DR.BYTE)&0x80 ){/*s4が押されたら振動*/↓ディップスイッチで振動の強さを設定
            vibratePSPad(dip);/* = setVibrationPower(dip); sendPSPad(readDataAndVibrateEx); */
            /*cmd[4]=dip; sendPSPadUser(cmd,ret,21); printReturnCode(ret);*/
        }              ↑ユーザ解析用関数を使って書いた例 
        else{                         /*padの状態を読み込む*/
            sendPSPad(readData);             ←PSPADの各スイッチの状態を読み込む
            getPSPadRetCode(retCode);         ←PSPADが返す値を得る
            printReturnCode(retCode);        ←それを表示
        }
    }
}


7.バージョンアップ履歴

Ver. 3.0    2006/02/05 DUALSHOCK2ネィティブモードに対応した最初のバージョン
Ver. 2.7    2006/02/05 PADのMODE(ANALOG)ボタンでのモード切替を許可できなかったバグをフィクス。
Ver. 2.6    2006/02/01 マニュアルを一部わかりやすく訂正。ライブラリ自身の変更はなし。
Ver. 2.5    2002/12/26 本ライブラリを組込むプログラムで割り込み処理が非常に忙しい場合に,
                                      パッドから取得できる最終ビットを取りこぼす場合があったバグをフィクス。
Ver. 2.4    2001/12/01 マニュアルにモード変更に関する情報を追加
Ver. 2.3    2001/11/24 マニュアルのミスを訂正
Ver. 2.2    2001/11/12 ユーザが解析するための関数の追加,タイミングの再調整
Ver. 2.1    2001/11/10 リターンコードの受け取り関数のバグをフィクス
Ver. 2.0    2001/11/09 公開バージョン。変数の隠蔽などオブジェクト指向を強化。
                             HORI HPS-39を動作確認に追加。
Ver. 1.0    2001/11/08 最初のバージョン


8.質問など問い合わせ先

 必ずメールにてご連絡ください。
東京高専 松林勝志  matsu@tokyo-ct.ac.jp