' {$STAMP BS2}
' {$PBASIC 2.5}
' {$PORT COM1}

IR_IN           PIN     8                       'IR Remote 接收遙控器的 PIN
time VAR Word(4)                                'For IR signal storage
direction           VAR     Byte

ch VAR Byte
pw1 VAR Word
pw2 VAR Word
pw3 VAR Word
pw4 VAR Word
pw5 VAR Word
ra VAR Byte
Sdat CON 15
baud CON 396

ra = 7
pw1=750
pw2=750
pw3=750
pw4=750
pw5=750

SEROUT Sdat, Baud+$8000,["!SC", 1, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
PAUSE 500
SEROUT Sdat, Baud+$8000,["!SC", 2, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
PAUSE 500
SEROUT Sdat, Baud+$8000,["!SC", 3, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
PAUSE 500
SEROUT Sdat, Baud+$8000,["!SC", 4, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
PAUSE 500
SEROUT Sdat, Baud+$8000,["!SC", 5, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
PAUSE 500

DO

DO
  RCTIME IR_IN, 1, time(0) ' 此段程式用來接收TV遙控器送過來的調變訊號, 此段程式只適用在SONY遙控器
LOOP UNTIL time(0) > 1000  ' 只需抓前4個data就夠用來區別遙控器的0~9, 所以在此只有設time(0~3), 4 組 ARRAY

  PULSIN IR_IN, 0, time(0) ' Measure/store data pulses.
  PULSIN IR_IN, 0, time(1)
  PULSIN IR_IN, 0, time(2)
  PULSIN IR_IN, 0, time(3)
  'DEBUG  DEC(time(0)), CR '以下讀出 TV遙控按鈕的值
  'DEBUG  DEC(time(1)), CR
  'DEBUG  DEC(time(2)), CR
  'DEBUG  DEC(time(3)), CR
  'DEBUG "----------------",CR



IF (time(3) < 650 AND time(3) > 550 ) AND (time(2) < 400) AND (time(2) > 300) AND (time(1) < 400) AND (time(1) > 300) AND (time(0) < 400) AND (time(0) > 300) THEN '9' Heading to 4 O'clock
  'pw0 = 900
  'pw2 = 773
  'pw1 = 520
  'GOSUB ServoMove
  DEBUG "9 axis5 cw",CR
  ch=5
  direction =9


ELSEIF (time(3) < 690 AND time(3) > 600 ) AND (time(2) < 400) AND (time(2) > 310) AND (time(1) < 400) AND (time(1) > 310) AND (time(0) < 690) AND (time(0) > 610) THEN     '1'
  'pw0 = 520
  'pw1 = 870
  'pw2 = 773
  'GOSUB ServoMove
  DEBUG "0 axis5 ccw",CR
  ch=5
  direction =0


ELSEIF (time(3) < 400 AND time(3) > 300 ) AND (time(2) < 400) AND (time(2) > 300) AND (time(1) < 400) AND (time(1) > 300) AND (time(0) < 400) AND (time(0) > 300) THEN     '1'
  'pw0 = 520
  'pw1 = 870
  'pw2 = 773
  'GOSUB ServoMove
  DEBUG "1 axis1 cw",CR
  ch=1
  direction =1


ELSEIF (time(3) < 380 AND time(3) > 330 ) AND (time(2) < 390) AND (time(2) > 320) AND (time(1) < 380) AND (time(1) > 320) AND (time(0) < 680 AND time(0) > 610) THEN     '2'
  'pw2 = 520
  'pw1 = 870
  'pw0 = 773
  'GOSUB ServoMove
  DEBUG "2 axis1 ccw",CR
  ch=1
  direction =2

ELSEIF (time(3) < 400 AND time(3) > 300 ) AND (time(2) < 400) AND (time(2) > 300) AND (time(1) < 650 AND time(1) > 550) AND (time(0) < 400) AND (time(0) > 300) THEN     '3'
  'pw0 = 900
  'pw1 = 773
  'pw2 = 520
  'GOSUB ServoMove
  DEBUG "3 axis2 cw",CR
  ch=2
  direction =3



ELSEIF (time(3) < 380 AND time(3) > 320 ) AND (time(2) < 370) AND (time(2) > 320) AND (time(1) < 680 AND time(1) > 630) AND (time(0) < 670 AND time(0) > 610) THEN     '4' Turn Left
  'pw0 = 670
  'pw1 = 670
  'pw2 = 670
  'GOSUB ServoMove
  DEBUG "4 axis2 ccw",CR
  ch=2
  direction =4

ELSEIF (time(3) < 400 AND time(3) > 300 ) AND (time(2) < 650 AND time(2) > 550) AND (time(1) < 400) AND (time(1) > 300) AND (time(0) < 400) AND (time(0) > 300) THEN     '5'
  'pw0 = 773
  'pw1 = 773
  'pw2 = 773
  'GOSUB ServoMove
  DEBUG "5 axis3 cw",CR
  ch=3
  direction =5


ELSEIF (time(3) < 390 AND time(3) > 340 ) AND (time(2) < 690 AND time(2) > 630) AND (time(1) < 395) AND (time(1) > 325) AND (time(0) < 685 AND time(0) > 620) THEN     '6' Turn Right
  'pw0 = 870
  'pw1 = 870
  'pw2 = 870
  'GOSUB ServoMove
  DEBUG "6 axis3 ccw",CR
  ch=3
  direction =6


ELSEIF (time(3) < 400 AND time(3) > 300 ) AND (time(2) < 650 AND time(2) > 550) AND (time(1) < 650 AND time(1) > 550) AND (time(0) < 400) AND (time(0) > 300) THEN     '7' Heading to 8 O'clock
  'pw0 = 520
  'pw1 = 773
  'pw2 = 920
  'GOSUB ServoMove
  DEBUG "7 axis4 cw",CR
  ch=4
  direction =7

ELSEIF (time(3) < 380 AND time(3) > 330 ) AND (time(2) < 670 AND time(2) > 630) AND (time(1) < 670 AND time(1) > 630) AND (time(0) < 680 AND time(0) > 630) THEN     '8' Backward
  'pw1 = 520
  'pw2 = 870
  'pw0 = 773
  'GOSUB ServoMove
  DEBUG "8 axis4 ccw",CR
  ch=4
  direction =8

ELSE
direction =-1  'servos no move

ENDIF

SELECT direction
CASE 1
ch=1
pw1 = pw1 + 30  'axis 1
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
DEBUG DEC(pw1),CR
PAUSE 200

CASE 2
pw1 = pw1 - 30
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw1.LOWBYTE, pw1.HIGHBYTE, CR]
DEBUG DEC(pw1),CR
PAUSE 200

CASE 3
pw2 = pw2 + 30   'axis 2
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw2.LOWBYTE, pw2.HIGHBYTE, CR]
DEBUG DEC(pw2),CR
PAUSE 200

CASE 4
pw2 = pw2 - 30
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw2.LOWBYTE, pw2.HIGHBYTE, CR]
DEBUG DEC(pw2),CR
PAUSE 200

CASE 5
pw3 = pw3 + 30   'axis 3
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw3.LOWBYTE, pw3.HIGHBYTE, CR]
DEBUG pw3
PAUSE 200

CASE 6
pw3 = pw3 - 30
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw3.LOWBYTE, pw3.HIGHBYTE, CR]
DEBUG pw3
PAUSE 200

CASE 7
pw4 = pw4 + 30   'axis 4
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw4.LOWBYTE, pw4.HIGHBYTE, CR]
PAUSE 200

CASE 8
pw4 = pw4 - 30
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw4.LOWBYTE, pw4.HIGHBYTE, CR]
PAUSE 200

CASE 9
pw5 = pw5 + 30   'axis 5
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw5.LOWBYTE, pw5.HIGHBYTE, CR]
PAUSE 200

CASE 0
pw5 = pw5 - 30
SEROUT Sdat, Baud+$8000,["!SC", ch, ra, pw5.LOWBYTE, pw5.HIGHBYTE, CR]
PAUSE 200

ENDSELECT
LOOP