ブログパーツUL5

PS2ワイヤレスコントローラ対応の試作(2)

試作したI/F回路 PS2コントローラのインターフェイス回路を試作して、PICマイコンの16F688にプログラムを書き込んでいろいろテストしています。PIC用マイコンのライター(ソフトはPICProg4U)が16F688に対応しているか不明であり、書き込みの実績がなかったので、実績のある16F628もコンパイルしてどちらでも試作できるように準備しました。 結果的には16F688に書き込めたので、14pinと小型なので16F688に決めました。16F688は安く秋月電子で購入でき、テスト用と搭載用に2個購入しました。

 RZ-1に搭載する方法を考えると、PS2コネクタに直接インタフェイス基板を取付けるのは搭載が難しくなるので、試作基板はここままでいいですが、RZ-1に搭載する方法も検討しておく必要があります。フロント側にはLCD表示があるので、スペースがなくバックカバーに搭載するしかないないようです。

 デバッグは手元にある中古のPS2コントローラを活用しています。有線のコントローラなので、下図のような試作回路回路で3,3Vの電源は使わず5V電源電圧に変更しています。
試作した回路
PS2コントローラのテスト
 PICマイコンの書込んだプログラムの動作確認やデバッグをするために、MR-C3024にはroboBASICでPS2コントローラ用のテスト評価プログラムを作成しました。一応、基本動作について有線のPS2コントローラで動作確認ができましたので、参考に掲載しました。プログラムソースが長いので、「続きを読む>>」を見てください。

 但し、PICマイコンにどのようにプログラミングしたかで変り、マイコンの動作に依存していますので、汎用性はまったくありませんので、ご注意ください。アナログモードではコントローラにも依存するようで、キーを押した圧力度データがとれる場合ととれない場合があります。
MR-C3024用のPS2ワイヤレスコントローラテストプログラム(roboBASIC v2.72)です。
'==================================================================
' TEST program for PS2controller
' by T.mikawa 2011/06/11
' PS2controller connected to ETX/ERX of MR-C3024
'==================================================================
DIM rr AS BYTE ' first variable is reserved
DIM txchar AS BYTE ' store for character to send to controller
DIM rxchar AS BYTE
DIM A AS BYTE

rr = 0

'Empty the ERX buffer
Reset:
ERX 19200, rxchar, bemt1
bemt1:
ERX 19200, rxchar, bemt2
bemt2:
' Set the PS2 controller to DS2 mode
'---- LCD Display ----
PRINT 12 'CLS
PRINT "My name is RZ-1"
PRINT 13 'CR
PRINT 10 'LF
txchar = "W"
ETX 19200, txchar
PRINT "DS MODE SET "
GETW:
ERX 19200, rxchar, GETW
PRINT FORMAT(rxchar,DEC,3)
DELAY 500
IF rxchar=255 THEN
PRINT 12
PRINT "PS2 CONECT ERROR!"
ELSE
PRINT 12
PRINT "PS2 CONECT OK!"
PRINT 13 'CR
PRINT 10 'LF
PRINT "19200bps setting"
ENDIF
DELAY 1000
LCDINIT
PRINT 12 'CLS
'-------------------------
'== motor diretion setting ======================
DIR G6A,1,0,0,1,0,0
DIR G6B,1,1,0,0,0,0
DIR G6C,0,0,0,0,0,0
DIR G6D,0,1,1,0,1,0

'== GYRO1 setting ================================

GYROSET G6A,2,1,1,1,2,0
GYROSET G6D,2,1,1,1,2,0

GYRODIR G6A,1,1,1,1,1,0
GYRODIR G6D,1,1,1,1,1,0

GYROSENSE G6A,200,5,5,5,200,0
GYROSENSE G6D,200,5,5,5,200,0

'== motor zero setting ========================
A=AD(2)

IF A<134 THEN '=== Low tempture ==
ZERO G6A, 98, 103, 107, 105, 103, 97
ZERO G6B,102, 102, 101, 100, 100, 100
ZERO G6C, 97, 99, 90, 91, 100, 100
ZERO G6D,101, 104, 105, 100, 101, 96
ELSEIF A>143 THEN '=== High tempture ==
ZERO G6A, 98, 107, 107, 104, 103, 97
ZERO G6B,102, 102, 101, 100, 100, 100
ZERO G6C, 97, 99, 90, 91, 100, 100
ZERO G6D,101, 106, 105, 99, 101, 96
ELSE '=== Mid tempture ==
ZERO G6A, 98, 105, 107, 107, 103, 97
ZERO G6B,102, 102, 101, 100, 100, 100
ZERO G6C, 97, 99, 90, 91, 100, 100
ZERO G6D,101, 106, 105, 101, 101, 96
ENDIF
'== motor motion setting ========================
PTP SETON
PTP ALLON
'== motor start position read ===================
TEMPO 230
MUSIC "CDE"
GETMOTORSET G24,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1
'== motor power on =============================
SPEED 5
MOTOR G24
'-- motor off setting --
MOTOROFF 11
MOTOROFF 16
MOTOROFF 17
'-----------------------
OUT 52,0 '-- LED DISPLAY SW1 --

GOSUB standard_pose

'================================================
'================================================
'================================================
MAIN:
'Read the PS2 buttons
txchar ="X"
ETX 19200, txchar
GETX:
ERX 19200, rxchar, GETX

PRINT 12 'CLS
PRINT "x -> rxchar="
PRINT FORMAT(rxchar,DEC,3)
PRINT 13 'CR
PRINT 10 'LF
IF rxchar > 0 AND rxchar < 17 THEN
ON rxchar GOTO MAIN,K1,K2,K3,K4,K5,K6,K7,K8,K9,K10,K11,K12,K13,K14,K15,K16
ENDIF
GOTO MAIN

K1: ' Left Button
PRINT "Left Button"
DELAY 1000
GOTO MAIN

K2: ' Down Button
PRINT "Down Button"
DELAY 1000
GOTO MAIN

K3: ' Right Button
PRINT "Right Button"
DELAY 1000
GOTO MAIN

K4: ' Up Button
PRINT "Up Button"
DELAY 1000
GOTO MAIN

K5: ' Start Button Use to force restart
PRINT "Start Button"
DELAY 1000
GOTO Reset

K6: ' Right Joystick Button
'read the Right joystick position
PRINT 12 'CLS
PRINT "Right Joystick"
PRINT 13 'CR
PRINT 10 'LF
PRINT "RX="
txchar ="C"
ETX 19200, txchar
GETC:
ERX 19200, rxchar, GETC
SERVO 9,rxchar
PRINT FORMAT(rxchar,DEC,3)

PRINT " RY="
txchar ="D"
ETX 19200, txchar
GETD:
ERX 19200, rxchar, GETD
SERVO 6,rxchar
PRINT FORMAT(rxchar,DEC,3)
DELAY 1000

PRINT 12 'CLS
PRINT "Right Joystick"
PRINT 13 'CR
PRINT 10 'LF
PRINT "rx="
txchar ="c"
ETX 19200, txchar
GETC2:
ERX 19200, rxchar, GETC2
SERVO 9,rxchar
PRINT FORMAT(rxchar,DEC,3)

PRINT " ry="
txchar ="d"
ETX 19200, txchar
GETD2:
ERX 19200, rxchar, GETD2
SERVO 6,rxchar
PRINT FORMAT(rxchar,DEC,3)
DELAY 1000
GOTO MAIN

K7: ' Left Joystick Button
'read the left joystick position
PRINT 12 'CLS
PRINT "Left Joystick"
PRINT 13 'CR
PRINT 10 'LF

PRINT "LX="
txchar ="E"
ETX 19200, txchar
GETE:
ERX 19200, rxchar, GETE
SERVO 15,rxchar
PRINT FORMAT(rxchar,DEC,3)

PRINT " LY="
txchar ="F"
ETX 19200, txchar
GETF:
ERX 19200, rxchar, GETF
SERVO 12,rxchar
PRINT FORMAT(rxchar,DEC,3)
DELAY 1000

PRINT 12 'CLS
PRINT "Left Joystick"
PRINT 13 'CR
PRINT 10 'LF

PRINT "lx="
txchar ="e"
ETX 19200, txchar
GETE2:
ERX 19200, rxchar, GETE2
SERVO 15,rxchar
PRINT FORMAT(rxchar,DEC,3)

PRINT " ly="
txchar ="f"
ETX 19200, txchar
GETF2:
ERX 19200, rxchar, GETF2
SERVO 12,rxchar
PRINT FORMAT(rxchar,DEC,3)
DELAY 1000
GOTO MAIN

K8: ' Select Button
PRINT "Select Button"
DELAY 1000

txchar ="Z"
ETX 19200, txchar
GETZ:
ERX 19200, rxchar, GETZ
PRINT 12 'CLS
PRINT "Degital MODE SET"
DELAY 1000

txchar = "V"
ETX 19200, txchar
PRINT 12 'CLS
PRINT "Vibration Enable"
DELAY 1000

txchar = "v"
ETX 19200, txchar
PRINT "Vibration Disenb"
DELAY 1000

txchar ="Y"
ETX 19200, txchar
GETY:
ERX 19200, rxchar, GETY
PRINT 12 'CLS
PRINT "Analog MODE SET"
DELAY 1000

GOTO MAIN

K9: ' Square Button
PRINT "Square Button"
DELAY 1000
GOTO MAIN

K10:' Cross Button
PRINT "Cross Button"
DELAY 1000
GOTO MAIN

K11:' Circle Button
PRINT "Circle Button"
DELAY 1000
GOTO MAIN

K12:' Triangle Button
PRINT "Triangle Button"
DELAY 1000
GOTO MAIN

K13:' R1 Button
' read the R1 button pressure
PRINT "R1 Button "
txchar ="P"
ETX 19200, txchar
GETP:
ERX 19200, rxchar, GETP
PRINT FORMAT(rxchar,DEC,3)
MOVE G6B,100,70,80,100,100,
WAIT
SPEED 5
GOSUB Standard_Pose
GOTO MAIN

K14:' L1 Button
' read the L1 button pressure
PRINT "L1 Button "
txchar ="O"
ETX 19200, txchar
GETO:
ERX 19200, rxchar, GETO
PRINT FORMAT(rxchar,DEC,3)
MOVE G6C,100,70,80,100,100,
WAIT
SPEED 5
GOSUB Standard_Pose
GOTO MAIN

K15:' R2 Button
' read the R2 button pressure
PRINT "R2 Button "
txchar ="R"
ETX 19200, txchar
GETR:
ERX 19200, rxchar, GETR
PRINT FORMAT(rxchar,DEC,3)
MOVE G6B,100,100,100,100,100,
WAIT
SPEED 5
GOSUB Standard_Pose
GOTO MAIN

K16:' L2 Button
' read the L2 button pressure
PRINT "L2 Button "
txchar ="Q"
ETX 19200, txchar
GETQ:
ERX 19200, rxchar, GETQ
PRINT FORMAT(rxchar,DEC,3)
MOVE G6C,100,100,100,100,100,
WAIT
SPEED 5
GOSUB Standard_Pose
GOTO MAIN

'================================================
Standard_Pose:
MOVE G6A, 100,85,90,90,90,100
MOVE G6D, 100,85,90,90,90,100
MOVE G6B, 100,30,80,100,100,100
MOVE G6C, 100,30,80,100,100,100
WAIT
RETURN
'================================================
0

    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック

    カレンダ

         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    << September 2017 >>