'Freya_8-0.bas 40x2 Firmware v3 'Freya_7-0.bas 40x2 Firmware v3 #picaxe 40x2 'terminal 19200 baud '#slot 0 #no_data '#no_table 'directive cannot be used when program occupies that area #define keybip 'for ReadSerCmnd: DISCONNECT 'the Serrxd pin is connected to the Hserin pin 'without DISCONNECT the system activity upsets 'the data received into the Hserin buffer. SETFREQ m16 'SERTXD @19200 - see Init: 'HSERSETUP B19200_16,%00101 'pulsout 4MHz 10us units 'pulsout 16MHz 2.5us units '#0 Memory used = 3511 bytes out of 4096 Commander '#1 Memory used = 3302 bytes out of 4096 Movement '#2 Memory used = 2745 bytes out of 4096 Print,InitEEPROM,Execute '#3 Memory used = 3922 bytes out of 4096 @SetUp,Help '================================================== 'Reactions Table: 'SYMBOL USaware =0 TABLE USaware,("ta.") 'SYMBOL USnear =16 TABLE USnear, ("s-Btatm.") SYMBOL OLR =32 TABLE OLR, ("s-BBtatm.") SYMBOL OL_ =48 TABLE OL_, ("s-BRR.") SYMBOL O_R =64 TABLE O_R, ("s-BLL.") SYMBOL HLR =80 TABLE HLR, ("s-BBBBtatm.") SYMBOL HL_ =96 TABLE HL_, ("s-BRRR.") SYMBOL H_R =112 TABLE H_R, ("s-BLLL.") SYMBOL HBLR =128 TABLE HBLR, ("s-FF.") SYMBOL HBL_ =144 TABLE HBL_, ("s-FFR.") SYMBOL HB_R =160 TABLE HB_R, ("s-FFL.") SYMBOL ReactEnd =175 TABLE ReactEnd,(".") 'Mind Table 'only one and two character mind commands SYMBOL mindstart =192 SYMBOL Mind192 =192 TABLE Mind192,("FBVFFVFRLRLRHLHK1BZF2F")'22 SYMBOL Mind214 =214 TABLE Mind214,("vss+vebVw5w9bLvevovos-")'22 SYMBOL Mind236 =236 TABLE Mind236,("bNvobNtatttmtoaSaKve") '20 SYMBOL Mindend =255 #rem 1 2 FFFFFF BB RRR LL K H VV Z bL bNbN bV w5 w9 veveve vovovo vs s+ s- ta tt tm to aS aK #endrem '================================================== 'BUGS '================================================== 'Program Memory '-------------- '4x4K slots ' 'DATA Memory '----------- '256 ' 'Variables - General '------------------- 'Bytes Bit Byte Word '56 bit0-31 b0-55 w0-27 ' 'Variables - Storage - peek and poke '------------------- '200 56 to 255 ($38 to $FF) ' 'Variables - Scratchpad '- GET byte, PUT byte, @ptr, @ptrinc (post +1), @ptrdec (post -1) . '---------------------- '1024 scratchpad bytes (0-1023) HS buffer '================================================== History: #rem 09Aug23 Commander: was inside the DoLoop, added DoCommands: 10Jan23 added PrintReactions, PrintMind 03Jan23 ?W.?F now read Whiskers and Feelers and show map, names in reaction table changed 06Sep22 corrected record ; overwriting next slot 16Sep21 brought all Aesir into line, . 15Aug21 added Mind table, separated getting IR subcmnds from other subcmnds changed b$x to b$-,b$+,b$0, added $T Freya 8 ************ 15Aug21 moved test toes and kick from Qstanding: to Rhole: reduced bounce time to 0.1sec bg removed, b$a added, if b$a then all sensors are auto tested, b$0 turns it off 12Aug21 added SYMBOLs vlk,vnk,vhk,vxk; kickcmnd to [9]{[4][5][6] and bv 08Aug21 ^bip,^whee,^whoa,^beep100 now jump from #1 to #2, whee,whoa tempo altered added bv and IR speed and vitality const are now in a SYMBOL table 25Jul21 removed stackcmnd from #1Getcmnd and altered #2LoadBehaviour to GOTO Run1 ready prompt ">" only printed if not recording or playing 18Jul21 changed prog0 to hold Reaction Table and Prog1 to set ptr ReactAt rather then use a sequence of GoSubs. Table based on Bamduino Reaction slot. Freya 7 ************ 17Jan21 amended Kick to be like Ullr, added aW,a7, aw,aK,aS, added at end behaves IF f_Bmodified =1 THEN : cmnd ="M" : GOTO RUN1 : ENDIF so print prints updated cmnd values added CaseTurn 't' from Ullr 28May19 added Do 28May19 limited recording to one slot at a time 20May19 revised auto hole test 02May19 changed LoadBehaviour to CASE "b0" in line with Bamduino, added EEPROM initialisation "bI" and changed behaviour save to "bS" 17Mar18 brought Vars/Cons into line with Baldur 07Jul17 ReadSerCmnd: added test of last serbyte received, if Q or ESC then Quit 03Mar17 Kickout now uses kickcmnd, tidied help and command list 22Feb16 rewrote Qground 22Feb16 f_allSerial @@@commented and bit 6 reused for f_b_React 18Jan16 made TSO a constant same as Baldur, Thor 23Sep15 brought into line with Baldur changed slot length to 16 from 32, now have slots 1-8 and 01-08 f_page0 =bit11 '1=Acts/Slots 01-08, 0(default) =1-8 1-8 in 0-127, 01-08 in 128-255 slots flow into next slot if no '.', ';' continue in next slot Freya 6 ************ 26Aug15 changed \@ to b@ 22Jul15 changed f,W,T routines tp $F $+ $W $S $G $- 29Jun15 wrote f,W,T routines 27Jun15 added PicAxe18 and eye-LEDS 23Jun15 added "@" for Autorun, changed @ adjust to \@, revised Whisker code to Bamduino 14Jun15 Freya5, brought Freya, Baldur cmnds into line 26May15 added "K" 01Mar15 auto SLR in MOVE: now controlled by f_bg_Qtoes=1 26Jan15 added auto SLR if falling over in MOVE: 24Jan15 added standOnLR in SLR,SR,SL and test at end of Move: 07Jan15 moved u to bu, added bg, T 06Jan15 wired toe sensors 4a-0 ************ 23Sep14 corrected w0 so it works for serial as well as IR, and ignores the command 20Sep14 added cmnd I to Commander, already there in prog1 for initialisation 07Sep14 Added BEHAVIOUR section to 4.1, and f_Bmodified only cmnd values in 4.0 07Sep14 4.0 ************ 20Jul14 corrected w so it calls Move 06Jul14 corrected mp so it works 05Jul14 Added #, amended Print-Act 11Jun14 moved Adjust to Prog1 11Jun14 got hserin working hrserptr gets set to 0 on slot RUN !!!! 10Jun14 now in 3 slots Freya3 ************ 05Jun14 2927 Load working 04Jun14 2805 recording and playing working 22May14 Now working from Terminal "F,B,R,L,U,S,s,cr,' ',-,+,X,x" 11May14 '================================================== 'Note there are ">>" between Acts, one > to get the Act, and one > to get the move '================================================== 'Commands - see Freya_commands.bas '================================================== 'Pinout: '================================================== PICAXE-40X2 18F45K22 ______ RESET |1 40| B.7 IN OUT COMP1- TOUCH ADC0 IN OUT A.0 |2 39| B.6 IN OUT COMP2- TOUCH ADC1 IN OUT A.1 |3 38| B.5 IN OUT ADC13 TOUCH DAC VREF- COMP2+ TOUCH ADC2 IN OUT A.2 |4 37| B.4 IN OUT ADC11 TOUCH VREF+ COMP1+ TOUCH ADC3 IN OUT A.3 |5 36| B.3 IN OUT ADC9 TOUCH SI |6 35| B.2 IN OUT ADC8 TOUCH HINT2 SRNQ OUT SO A.4 |7 34| B.1 IN OUT ADC10 TOUCH HINT1 TOUCH ADC5 IN OUT A.5 |8 33| B.0 IN OUT ADC12 TOUCH HINT0 SRI TOUCH ADC6 IN OUT A.6 |9 32| V+ TOUCH ADC7 IN OUT A.7 |10 31| 0V V+ |11 30| D.7 IN OUT ADC27 TOUCH KBD HPWMD 0V |12 29| D.6 IN OUT ADC26 TOUCH KBC HPWMC XO |13 28| D.5 IN OUT ADC25 TOUCH HPWMB XI |14 27| D.4 IN OUT ADC24 TOUCH TIMER IN OUT C.0 |15 26| C.7 IN OUT ADC19 TOUCH HSERIN PWM IN OUT C.1 |16 24| C.6 IN OUT ADC18 TOUCH HSEROUT PWM HPWMA TOUCH ADC14 IN OUT C.2 |17 24| C.5 IN OUT ADC17 TOUCH SDO SCK SCL TOUCH ADC4 IN OUT C.3 |18 23| C.4 IN OUT ADC16 TOUCH SDI SDA TOUCH ADC20 IN OUT D.0 |19 22| D.3 IN OUT ADC23 TOUCH TOUCH ADC21 IN OUT D.1 |20__21| D.2 IN OUT ADC22 TOUCH Pins: ----------------------- C.7 hserin C.6 hserout C.4 hi2c sda C.3 hi2c sck ----------------------- [Pot ] touch,Analog,Input,Output,Serial out in,Timer clk,DAC,Compare ----------------------- 1 Reset_ 2 O_servoLhip A.0 (tAIOC1-) 3 O_servoLankle A.1 (tAIOC2-) 4 I_toeL A.2 (tAIOC2+D) 5 I_heelL A.3 (tAIOC1+) 6 SERIN 7 SEROUT A.4 (SoO){SRNQ} [7 O_LCD A,4] 8 A_whiskerLeye A.5 (tAIO) 9 A_whiskerReye A.6 (tAIO) 10 A_tipFB A.7 (tAIO) 11 +v 12 0v 13 Resonator 14 Resonator 15 I_heelR C.0 (IOT) 16 P_whiskerLLED C.1 (IO pwm) 17 P_whiskerRLED C.2 (tAIO hPwm pwm) 18 [hi2c sck] C.3 (tAIO IICscl SPIsck) 19 O_servoRankle D.0 (tAIO) 20 O_servoRhip D.1 (tAIO) 40 B.7 (IO) 39 B.6 (IO) 38 B.5 (TAIO) 37 B.4 (TAIO) 36 B.3 (TAIO) 35 B.2 (TAIOi2) 34 B.1 (TAIOi1) 33 B.0 (TAIOi0) 32 +v 31 0v 30 O_feelerLLED D.7 (tAIO hPwm KBdata) 29 A_feelerL D.6 (tAIO hPwm KBclk) 28 A_feelerR D.5 (tAIO hPwm) 27 O_feelerRLED D.4 (tAIO) 26 [hserin ] C.7 (tAIOSi) 25 [hserout] eyes C.6 (tAIOSo) 24 O_voiceLED_ C.5 (tAIO SPIsdo) 24 O_voice C.5 23 [hi2c sda] C.4 (tAIO ICsda SPIsdi) 22 I_toeR D.3 (tAIO) 21 I-inIR D.2 (tAIO) ----------------------- 1 Reset_ 40 B.7 2 O_servoLhip A.0 39 B.6 3 O_servoLankle A.1 38 B.5 4 I_toeL A.2 37 B.4 5 I_heelL A.3 36 B.3 6 SERIN 35 B.2 7 SEROUT/[O_LCD] A.4 34 B.1 8 A_whiskerLeye A.5 33 B.0 9 A_whiskerReye A.6 32 +v 10 A_tipFB A.7 31 0v 11 +v 30 O_feelerLLED D.7 12 0v 29 A_feelerL D.6 13 Resonator 28 A_feelerR D.5 14 Resonator 27 O_feelerRLED D.4 15 I_heelR C.0 26 [hserin ] C.7 16 P_whiskerLLED C.1 25 [hserout ] C.6 eyes serial 17 P_whiskerRLED C.2 24 O_voiceLED_ C.5 24 O_voice C.5 18 [hi2c sck] C.3 23 [hi2c sda] C.4 19 O_servoRankle D.0 22 I_toeR D.3 20 O_servoRhip D.1 21 I-inIR D.2 ----------------------- o servo o tip o speaker o 5v o 5v o 5v o 0v o 0v o 0v o heel o toe o sense Whiskers/Feelers o 5v o LED o 0v o 9v ----------------------- #endrem '================================================== Pins: '========================== SYMBOL servoLA =A.1 SYMBOL servoLH =A.0 SYMBOL servoRA =D.0 SYMBOL servoRH =D.1 SYMBOL A_tipFB =A.7 'READADC needs port.pin not a symbol or pinX.Y SYMBOL whiskerLLED =C.1 SYMBOL whiskerRLED =C.2 SYMBOL whiskerL =A.5 'READADC needs port.pin not a symbol or pinX.Y SYMBOL whiskerR =A.6 'READADC needs port.pin not a symbol or pinX.Y SYMBOL feelerLLED =D.7 SYMBOL feelerL =D.6 'READADC needs port.pin not a symbol or pinX.Y SYMBOL feelerR =D.5 'READADC needs port.pin not a symbol or pinX.Y SYMBOL feelerRLED =D.4 'SYMBOL EyesSerial =C.6 'hserout SYMBOL senseLtoe =pinA.2 SYMBOL senseRtoe =pinD.3 SYMBOL senseLheel =pinA.3 SYMBOL senseRheel =pinC.0 SYMBOL voiceLED =C.5 SYMBOL voice =C.5 SYMBOL inIR =D.2 SYMBOL inIRpin =pinD.2 'SYMBOL O_LCD =A.4 'SEROUT 'bus B.7 - B.0 '================================================== VarsCons: '================================================== 'Speed - for IR [9]{[1],[2],[3] SYMBOL sslow ="1" 'speed slow SYMBOL snormal ="3" 'speed normal SYMBOL sfast ="8" 'speed fast '================================================== 'Vitality - for IR [9]{[4],[5],[6] SYMBOL vll ="1" 'low lift SYMBOL vnl ="3" 'normal lift SYMBOL vhl ="5" 'high lift SYMBOL vxl ="8" 'extreme lift SYMBOL vlp ="3" 'low pace SYMBOL vnp ="4" 'normal pace SYMBOL vhp ="6" 'high pace SYMBOL vxp ="8" 'extreme pace SYMBOL vlk ="2" 'low kick SYMBOL vnk ="3" 'normal kick SYMBOL vhk ="4" 'high kick SYMBOL vxk ="5" 'extreme kick '================================================== SYMBOL Esc =27 'Escape key SYMBOL quote2 =34 'double quote mark 'built in variables 'bptr = RAM pointer 'ptr - scratchpad pointer 'hserptr - pointer to scratchpad location of last byte received by hardware UART 'X2 parts - bit0-31 b0-55 w0-27 +56 - 255 Peek/Poke 'W0 'SYMBOL sense0 =b0 SYMBOL temp0 =b0 SYMBOL f8_behaves =b1 'used in programs 0123 w=write r=read !=wr SYMBOL f_b_react =bit8 'wrr- 1=reacts on SYMBOL f_b_autosense =bit9 'w!r- 1= auto test sensors, "b$a" SYMBOL f_b_autoUp =bit10 'wrr- tested in Qfell, default=1 "bu" SYMBOL f_Rfwd =bit11 'w!r- Right Forward SYMBOL f_b_F =bit12 '-!-- Forward - set by Fd/Bk etc SYMBOL f_Bmodified =bit13 'w!-- behaviour settings modified 'SYMBOL f_tF =bit14 '-!-- last turn on spot SYMBOL f_MoveAborted =bit15 '-!-- 'W1 SYMBOL f8_Cmnder0 =b2 SYMBOL f_warm =bit16 '!--- SYMBOL f_play =bit17 '!--- SYMBOL f_record =bit18 '!--- SYMBOL f_recordC =bit19 '!--- SYMBOL f_waitcmnd =bit20 '!--- just wait for an IRkey or Serin SYMBOL f_IRcmnd =bit21 '!r-- 1=>IRcmnd 0=>Serial/Play cmnd SYMBOL f_page0 =bit22 'w-!- 1=Acts/Slots 01-07, 0(default) =1-8 SYMBOL f_React =bit23 '-!-- SYMBOL f8_doServos =b3 'ww-- SYMBOL f_RAdo =bit24 '-!-! do servo SYMBOL f_RHdo =bit25 '-!-! do servo SYMBOL f_LAdo =bit26 '-!-! do servo SYMBOL f_LHdo =bit27 '-!-! do servo SYMBOL f_RApulse =bit28 'r!-r pulse servos SYMBOL f_RHpulse =bit29 'r!-r pulse servos SYMBOL f_LApulse =bit30 'r!-r pulse servos SYMBOL f_LHpulse =bit31 'r!-r pulse servos 'W2 SYMBOL W2pulse =w2 SYMBOL W2pulselo =b4 SYMBOL W2pulsehi =b5 SYMBOL W2temp =w2 'Interpage jumps for hserptr SYMBOL W2templo =b4 SYMBOL W2temphi =b5 'SYMBOL W2temp0 =b4 'SYMBOL W2temp1 =b5 'W3 SYMBOL cmnd =b6 SYMBOL RootCmnd =b7 'SYMBOL servonum =b7 'SETUP 'W4 SYMBOL RAC =b8 'Right Ankle Centre for current posture SYMBOL LAC =b9 'Left Ankle Centre for current posture 'W5 SYMBOL RHC =b10 'Right Hip Centre for current posture SYMBOL LHC =b11 'Left Hip Centre for current posture 'W6 SYMBOL LHat =b12 'Servo Left Hip At SYMBOL LHto =b13 'Servo Left Hip To 'W7 SYMBOL LAat =b14 'Servo Left Ankle At SYMBOL LAto =b15 'Servo Left Ankle To 'W8 SYMBOL RHat =b16 'Servo Right Hip At SYMBOL RHto =b17 'Servo Right Hip To 'W9 SYMBOL RAat =b18 'Servo Right Ankle At SYMBOL RAto =b19 'Servo Right Ankle To 'W10 SYMBOL Sspeed =b20 'max to 15 then to can't go past zero SYMBOL Sframe =b21 'Servo frame pause in ms 'W11 SYMBOL FL =b22 'Foot Lift UpDown movement min 25 SYMBOL FP =b23 'Foot Pace ForwardBack movement +- 9 - 23 'W12 SYMBOL FT =b24 'Foot Turn SYMBOL FLcmnd =b25 'Foot Lift movement 1-9 'W13 SYMBOL FPcmnd =b26 'Foot Pace ForwardBack movement 1-9 SYMBOL FTcmnd =b27 'Foot Turn movement 1-9 'W14 SYMBOL Scmnd =b28 'Speed 1-9 SYMBOL IRcmnd =b29 'W15 SYMBOL Actptr =b30 SYMBOL ActEnd =b31 'W16 SYMBOL slot =b32 'Acts 1-8 occupy Slots 0-7 SYMBOL hframes =b33 'halt frames 'W17 SYMBOL kickcmnd =b34 SYMBOL Speedmax =b35 'W18 SYMBOL TOD =b36 'Toes Offset Down SYMBOL TOF =b37 'Toes Offset Front 'W19 SYMBOL yawn =b38 'SYMBOL standOnLR =b39 '%LR 1=down moving test toes if if <>%11 'W20 'SYMBOL topple =b40 'prog1 'SYMBOL usdist =b41 'no ultrasonics 'W21 SYMBOL EyeCode =b42 SYMBOL ReactAt =b43 'React Table pointer 'W22 SYMBOL W22random =w22 'b44,b45 SYMBOL W22random0 =b44 'W23 SYMBOL DoAt =b46 'Pointer in Do SYMBOL InDo =b47 'flag for In a Do 'W24 SYMBOL mindAt =b48 ' SYMBOL mindSub =b49 ' 'W25 'W26 SYMBOL lastcmnd =b53 ' 'W27 SYMBOL W27temp =w27 'prog1 SYMBOL W27temp0 =b54 'prog1 SYMBOL W27temp1 =b55 'prog1 'SYMBOL temp54 =b54 'prog1 'SYMBOL temp55 =b55 'prog0,1 '--------- 'Variables - Storage - peek and poke '------------------- '200 56 to 255 ($38 to $FF) SYMBOL RAM_temp0 =56 'first non variable RAM location SYMBOL RAM_P1_f8_flags =57 'Prog1 flags 'turned Left bit 0 '1=last turned Left, 0=Right SYMBOL RAM_holedetectR =58 'set by calibrateholewhiskers: % light level difference for hole SYMBOL RAM_holedetectL =59 'set by calibrateholewhiskers: % light level difference for hole SYMBOL RAM_obstaclesR =60 'map SYMBOL RAM_obstaclesL =61 'map SYMBOL RAM_lightR =62 'whisker ambient light level Right SYMBOL RAM_lightL =63 'whisker ambient light level Left 'SYMBOL RAM_UStoonear =64 'US not fitted 'SYMBOL RAM_USawareAt =65 'SYMBOL RAM_USunits_cm_ =66 'SYMBOL RAM_USlast =67 SYMBOL RAM_WhiskerR =68 SYMBOL RAM_WhiskerL =69 SYMBOL RAM_WhiskerRlit =70 SYMBOL RAM_WhiskerLlit =71 SYMBOL RAM_FeelerR =72 SYMBOL RAM_FeelerL =73 SYMBOL RAM_FeelerRlit =74 SYMBOL RAM_FeelerLlit =75 SYMBOL RAM_Wthresh =76 SYMBOL RAM_Fthresh =77 SYMBOL RAM_Sspeed =78 'SYMBOL RAM_randvarLo =68 'SYMBOL RAM_randvarHi =69 'SYMBOL RAM_randseedlo =70 'SYMBOL RAM_randseedhi =71 SYMBOL EEPROM_LHC =255 'logical value constant LHmid transferred to EEPROM so can be changed by @ SYMBOL EEPROM_LAC =254 'logical value constant LAmid transferred to EEPROM so can be changed by @ SYMBOL EEPROM_RHC =253 'logical value constant RHmid transferred to EEPROM so can be changed by @ SYMBOL EEPROM_RAC =252 'logical value constant RAmid transferred to EEPROM so can be changed by @ SYMBOL EEPROM_TOD =251 'Toes Offset Down 0-9 SYMBOL EEPROM_TOF =250 'Toes Offset Front 0-9 'SYMBOL EEPROM_FPcmnd =249 'not Freya SYMBOL EEPROM_FLcmnd =248 'Foot Lift movement 1-9 SYMBOL EEPROM_FPcmnd =247 'Pace ForwardBack movement 1-9 SYMBOL EEPROM_FTcmnd =246 'Foot Turn movement 1-9 SYMBOL EEPROM_Speeds =245 '(hiNib)Speedmax 1-9, (loNib)Speed 1-9 SYMBOL EEPROM_kickcmnd =244 SYMBOL EEPROM_f8_behaves =243 SYMBOL EEPROM_Wthresh =242 'WhiskerThreshold SYMBOL EEPROM_Fthresh =241 'FootfeelerThreshold 'SYMBOL EEPROM_USawarenear =240 'not Freya 'start of last 16 byte slot SYMBOL EEPROM_ActsEnd =239 'end of slot 06 '************************* Machine Dependent ***************************** 'MechanicalBehaviour '------------------- 'LegLift L R is not the same, servo differences? 'Modifying LHto in PH_SL (q.v) corrects it but then Left foot bounces. '================================================== 'Freya 'Notes '----- 'hips Supertec S062BB, ankles Supertec S03 'SERVOS LEFT RIGHT 'Hips S3 [LegOut=- LegIn=+ ] S1 [LegIn=- LegOut=+ ] 'Hips ie S3 [ToeUp=- ToeDown=+ ] S1 [ToeUp=- ToeDown=+ ] 'Ankles S2 [ToeFd=- ToeBk=+ ] S0 [ToeBk=- ToeFd=+ ] 'Ankles ie S2 [ToeLeft=- ToeRight=+] S0 [ToeLeft=- ToeRight=+] ' 'LOGICAL 'Hips S3 [LegOut=+ LegIn=- ] S1 [LegIn=- LegOut=+ ] 'Ankles S2 [ToeFd=+ ToeBk=- ] S0 [ToeBk=- ToeFd=+ ] ' 'Allp logical values ' 'max speed ~12, works at 15 but feet start to catch on each other. '************************* END Machine Dependent ************************* #rem '================================================== 'SERVOS - ACTUAL values from PotSetRanges - values are in 10us units '================================================== SYMBOL SRHmax =230 'Right Hip Max out up leg hits body SYMBOL SRHout =149 'Right Hip horizontal SYMBOL SRHmid =66 'Right Hip Stand feet flat SYMBOL SRHWmid =69 'Right Hip Mid feet flat TDO=3 SYMBOL SRHmin =50 'Right Hip Min in leg hits body SYMBOL SRAmax =255 'Right Ankle Max out servo stop SYMBOL SRAFFWmax =181 '+35 LongStep SYMBOL SRAFFWmin =177 '+31 LongStep SYMBOL SRAFWmax =169 '+23 SYMBOL SRAFWmid =162 '+16 SYMBOL SRAFWmin =155 '+9 SYMBOL SRAmid =146 'Right Ankle Mid ahead SYMBOL SRABWmin =137 '-9 SYMBOL SRABWmid =130 '-16 SYMBOL SRABWmax =122 '-24 SYMBOL SRABFWmin =115 '-31 LongStep SYMBOL SRABFWmax =111 '-35 LongStep SYMBOL SRAmin =60 'Right Ankle Min in servo stop SYMBOL SLHmax =250 'Left Hip Max in servo stop SYMBOL SLHWmid =226 'Left Hip Mid feet flat LOGICAL=25 TDO=7 SYMBOL SLHmid =233 'Left Hip Stand feet flat LOGICAL=22 SYMBOL SLHout =135 'Left Hip horizontal SYMBOL SLHmin =54 'Left Hip Min out up leg hits body SYMBOL SLAmin =50 'Left Ankle Min out servo stop SYMBOL SLAFFWmax =111 '-35 LongStep SYMBOL SLAFFWmin =115 '-31 LongStep SYMBOL SLAFWmax =122 '-24 SYMBOL SLAFWmid =130 '-16 SYMBOL SLABWmin =137 '-9 SYMBOL SLAmid =146 'Left Ankle Mid ahead SYMBOL SLAFWmin =155 '+9 SYMBOL SLABWmid =162 '+16 SYMBOL SLABWmax =169 '+23 SYMBOL SLABFWmin =176 '+30 LongStep SYMBOL SLABFWmax =182 '+36 LongStep SYMBOL SLAmax =220 'Left Ankle Max in servo stop 'Left toes forward is -ve 'Left leg out is -ve 'Right toes forward is +ve 'Right leg out is +ve '================================================== 'LOGICAL 'toes forward is +ve 'leg out is +ve SYMBOL RAmax =SRAmax SYMBOL RAFWmid =SRAFWmid SYMBOL RAmid =SRAmid SYMBOL RABWmid =SRABWmid SYMBOL RAmin =SRAmin SYMBOL RHmax =SRHmax SYMBOL RHout =SRHout SYMBOL RHmid =SRHmid SYMBOL RHmin =SRHmin ' 60 SYMBOL RHinmin =RHmin +5 'don't hit stop SYMBOL RHiclear=RHmid +25 SYMBOL LAmax =255 -SLAmin SYMBOL LAFWmid =255 -SLAFWmid SYMBOL LAmid =255 -SLAmid SYMBOL LABWmid =255 -SLABWmid SYMBOL LAmin =255 -SLAmax 'note max min reversals for left SYMBOL LHmax =255 -SLHmin '201 SYMBOL LHout =255 -SLHout '120 SYMBOL LHmid =255 -SLHmid ' 22 SYMBOL LHmin =255 -SLHmax ' 5 SYMBOL LHinmin =LHmin +5 'don't hit stop 'for servo numbering in CaseAdjust: SYMBOL RA =0 SYMBOL RH =1 SYMBOL LA =2 SYMBOL LH =3 #endrem '-------------------------------------------------------------- SYMBOL DSframe =10 'default SFrame, LOOPs at ~40Hz/25ms SYMBOL Fclear =20 'minimum for toes to miss when walking SYMBOL f_RfF =1 '1=>Right Foot Forward SYMBOL TSO =3 'Toe Stand Offset - so toes clear each other '================================================== ' SENSORS '================================================== 'HgTilt #rem SYMBOL TipedB =235 'A/D reading on Back SYMBOL TipB =200 'Tip B test threshold SYMBOL TipedU =167 'A/D reading Upside down SYMBOL TipU =120 'Tip B test threshold SYMBOL TipX =85 'A/D reading on Feet SYMBOL TipF =50 'Tip F test threshold SYMBOL TipedF =19 'A/D reading on Nose #endrem #rem 'nonHgTilt SYMBOL BTip =235 'A/D reading SYMBOL TipB =150 'Tip B test threshold SYMBOL NoTip =85 'A/D reading SYMBOL TipF =50 'Tip F test threshold SYMBOL FTip =19 'A/D reading #endrem #rem 'Accelerometer-KD SYMBOL BTip =59 'A/D reading SYMBOL TipB =65 'Tip B test threshold SYMBOL NoTip =74 'A/D reading SYMBOL TipF =80 'Tip F test threshold SYMBOL FTip =85 'A/D reading #endrem '************************* END Machine Dependent ************************* '================================================================= TVR010_PicAxe_IR_controller: '--------------------------- 'Before use, the transmitter must be programmed with the 'Sony' transmit code. '1. Insert 2 AAA size batteries, preferably alkaline. '2. Press 'S' and 'B' at the same time. S is in the centre of the arrows. ' The top left red LED should light. '3. Press '0'. The LED should flash. '4. Press '1'. The LED should flash. '5. Press '3'. The LED should go out. '6. Press the red power button (top right). '------------------------------------------- 'IRin cmnds PicAxe controller 'DO NOT PRESS OTHER KEYS 'ie [A] [B] [C] [D] [E] [F] [G] 'They change the Mode and [B] has to be pressed to change back. '[square] [triangle] [()] [L] [X] [backwards F] have no effect '{} original Bambino commands SYMBOL KEY_POWER = 21 'Sleep SYMBOL KEY_UP = 16 '[Fd] Step Forward {[9][Fd]=set vitality Behaviour to faster} SYMBOL KEY_DOWN = 17 '[Bk] Step Backward {[9][Bk]=set vitality Behaviour to slower} SYMBOL KEY_RIGHT = 18 '[Rt] Step Right SYMBOL KEY_LEFT = 19 '[Lt] Step Left SYMBOL KEY_BAR = 96 '[f|] learn an Act, next [key] selects an Act SYMBOL KEY_TENT = 54 '[f^] next [key] selects a Subroutine-Act SYMBOL KEY_VERT_CROSS = 37 'use synonym for easier coding SYMBOL KEY_VCROSS = 37 '[f+] "z" ' { Modify Mode {when routine included} ' { [+] set USAwareAt in DUSawareAt} ' { [-] set UStoonear in DUStoonear} ' {[Fd] alter PaceCentre in DpaceC} ' {[Bk] alter PaceCentre in DpaceC} ' {[Rt] alter RollCentre in DrollC} ' {[Lt] alter RollCentre in DrollC} ' { [-][+] to adjust } ' [Key_POWER] to quit SYMBOL KEY_DIAG_CROSS = 20 'use synonym for easier coding SYMBOL KEY_XCROSS = 20 '[fX] " " '{transfer EEPROM to PC for including in programs} ' -- Subroutine-Act and Commands -- SYMBOL KEY_1 = 0 '[1] [f^][1]=>{RockADo} [9][1]=set speed slow SYMBOL KEY_2 = 1 '[2] [9][2]=set speed medium SYMBOL KEY_3 = 2 '[3] [9][3]=set speed fast SYMBOL KEY_4 = 3 '[4] [9][4]=set vitality to Low {US behaviour to timid} SYMBOL KEY_5 = 4 '[5] [9][5]=set vitality to Normal {US behaviour to normal} SYMBOL KEY_6 = 5 '[6] [9][6]=set vitality to High {US behaviour to bold} SYMBOL KEY_7 = 6 '[7] [9][7]=disable Whiskers test SYMBOL KEY_8 = 7 '[8] [9][8]=disable Ultrasonic test SYMBOL KEY_9 = 8 '[9] (set Behaviour modes) [9][9]= {set US behaviour to User} SYMBOL KEY_MINUS = 98 '[-] enable & test Whisker sensors and re-act, R_Whiskers: SYMBOL KEY_0 = 9 '[0] {WANDER} [9][0]=set vitality Behaviour to normal SYMBOL KEY_PLUS = 11 '[+] enable & test Ping sensor and re-act, R_Ping: '================================================================= ' INITIALISATION '================================================================= hserptr =W2temp 'get back pointer SERTXD("{0") 'prognum IF f_warm=1 THEN Commander 'Init: SERTXD(CR,"Freya8 09Aug23") 'adcsetup = %0000000011100000 not needed for new PIC18F45K22 HSERSETUP B19200_16,%00101 'don't need to redo this ' bit0 - background receive serial data ' bit1 - invert serial output data (0 = 'T', 1 = 'N') ' bit2 - invert serial input data (0 = 'T', 1 = 'N') ' bit3 - disable hserout (1 = hserout pin normal i/o) ' bit4 - disable hserin (1 = hserin pin normal i/o) hserinflag =0 hserptr =0 ptr =0 'LoadBehaviour: sertxd(CR,"LHC=",#LHC) '=0 on powerup => not initialised IF LHC=0 THEN :cmnd ="0" GOTO RUN2 ENDIF 'as "b0" Load behaviour 'Behaviour: yawn ="0" 'not bored Sframe =DSframe 'Servo Frame Pause 'Posture: LHat =LHC 'Servo Left Hip At RHat =RHC 'Servo Right Hip At LAat =LAC -TSO 'Servo Left Ankle At - Toe Stand Offset, so toes clear each other RAat =RAC +TSO 'Servo Right Ankle At + Toe Stand Offset, so toes clear each other LHto =LHat 'Servo Left Hip To RHto =RHat 'Servo Right Hip To LAto =LAat 'Servo Left Ankle To RAto =RAat 'Servo Right Ankle To f_Rfwd =1 SERTXD(CR,"Start") f_warm =1 f_page0 =0 ReactAt =ReactEnd 'otherwise does USaware@0 FOR temp0 =0 to 7 Actptr =temp0 *16 'Acts 1-8 READ Actptr,cmnd IF cmnd="@" THEN :cmnd ="1" +temp0 :GOTO DoCmnd :ENDIF 'do autorun Act NEXT FOR temp0 =0 to 6 Actptr =temp0 *16 +128 'Acts 01-07 READ Actptr,cmnd IF cmnd="@" THEN :f_page0 =1:cmnd ="1" +temp0 :GOTO DoCmnd :ENDIF 'do autorun Act NEXT cmnd ="I" GOTO RUN1 'Init Legs, next entry will be warm->Commander '==================================================== ' LEAVES '==================================================== ReProgram: RECONNECT pause 50 GOSUB bip SERTXD("ReProgram") END 'wait for new download QRecRUN1: GOSUB QRecord RUN1: W2temp =hserptr 'preserve pointer RUN 1 QRecRUN2: GOSUB QRecord RUN2: W2temp =hserptr 'preserve pointer RUN 2 RUN3: W2temp =hserptr 'preserve pointer RUN 3 '==================================================== ' COMMANDER '==================================================== Commander: 'SERTXD("Commander") DO DoCommands: IF f_record=1 THEN HIGH voiceLED f_recordC =1 ELSE LOW voiceLED ENDIF IF f_record=0 AND f_play=0 THEN :sertxd(">") ENDIF IF ReactAt=ReactEnd THEN 'leave on if reacting PWMOUT WhiskerLLED,255,1 'active high Dutycycle for dim PWMOUT WhiskerRLED,255,1 'active high Dutycycle for dim LOW feelerLLED 'turned on by NewMap LOW feelerRLED 'turned on by NewMap ENDIF lastcmnd =cmnd GOSUB GetCmnd 'and update servos while waiting HSEROUT 0,(cmnd) '0=nobreak 'to eyes Rootcmnd =" " '----------------------------- 'TranslateIR: IF f_IRcmnd=0 THEN DoCmnd 'translate some Bambino IR cmnds SELECT cmnd CASE "." hserinflag =0 'Flush Serial buffer ptr =hserptr -1 CASE "^" cmnd ="a" GOSUB QRecord : GOSUB GetSubCmndIR 'and update servos while waiting RootCmnd="a" :GOTO QRecRUN1 CASE "$" GOSUB GetSubCmndIR :RootCmnd="$" :GOTO QRecRUN1 CASE "9" 'sertxd("case9") GOSUB GetSubCmndIR SELECT cmnd speed1: CASE "1" 'set speed slow Scmnd =sslow :GOTO mQrecS speed2: CASE "2" 'set speed normal Scmnd =snormal :GOTO mQrecS speed3: CASE "3" 'set speed fast Scmnd =sfast mQrecS: f_Bmodified =1 IF f_record=1 THEN cmnd ="s" GOSUB Record :cmnd =Scmnd :GOSUB Record ENDIF vitalL: CASE "4" 'set vitality low FLcmnd =vll :FPcmnd =vlp :kickcmnd =vlk :temp0 ="l" :GOTO _vQrec vitalN: CASE "5" 'set vitality normal FLcmnd =vnl :FPcmnd =vnp :kickcmnd =vlk :temp0 ="n" :GOTO _vQrec vitalH: CASE "6" 'set vitality high FLcmnd =vhl :FPcmnd =vhp :kickcmnd =vlk :temp0 ="h" _vQrec: FTcmnd =FPcmnd f_Bmodified =1 IF f_record=1 THEN cmnd ="b" GOSUB Record :cmnd ="v" :GOSUB Record :cmnd =temp0 :GOSUB Record ENDIF CASE "7" CASE "8" CASE "9" CASE "0" ' CASE "-" 'whiskers off ' CASE "+" 'ultrasonics off CASE "+" f_b_autosense =0 temp0 =cmnd GOTO _sensQrec 'auto sense off CASE "-" f_b_react =0 temp0 =cmnd 'sensor react off _sensQrec:IF f_record=1 THEN cmnd ="b" GOSUB Record :cmnd ="$" :GOSUB Record :cmnd =temp0 :GOSUB Record ENDIF ELSE GOSUB tshh : cmnd ="Q" :SERTXD("[?IR]") ENDSELECT 'case cmnd for case 9 GOSUB noIRkey 'wait for finger off and clear cmnds processed above, RETURNs "z" f_recordC=0 'don't record the "z" 'sertxd("IR",cmnd,"IR") 'end select case 9 ENDSELECT '==================================================== DoCmnd: 'sertxd("DoCmnd") '==================================================== 'COMMANDS SELECT cmnd 'CaseQuit: CASE Esc,"Q","q" cmnd ="." :DoAt =0 :InDo =0 :mindAt =0 :ReactAt =ReactEnd :GOTO DoCmnd CASE "." IF ReactAt<>ReactEnd THEN :ReactAt =ReactEnd :GOTO DoCommands :ENDIF IF f_record=0 AND f_play=0 THEN cmnd ="S" : GOTO RUN1 'StandStill ENDIF IF f_record=1 THEN WRITE Actptr,"." f_record =0 ENDIF IF f_play=1 THEN f_play =0 ENDIF yawn ="0" IF DoAt<>0 THEN SERTXD("(",#DoAt,")"); Actptr =DoAt :DoAt =0 :f_play =1 :InDo =1 'back in the Do ENDIF 'CaseDo: CASE "(": InDo =1 CASE ")": InDo =0 'CaseMove: CASE "F","B","R","L","H","S","I","K" :GOTO QRecRUN1 CASE "E" GOTO RUN2 CASE "V" GOSUB bip 'CaseIgnore: CASE ","," " 'ignore comma, space CASE 10,13 : f_recordC=0 'ignore LF,CR and don't record them 'CaseNextSlot: CASE ";" GOSUB QRecord Slot =Slot +1 //8 'continue in next slot IF Actptr<128 THEN :Actptr =0 :ELSE Actptr =128 :ENDIF 'keep in same page Actptr =Slot *16 +Actptr f_record =0 '2022-09-07 don't write in next slot 'CaseSleep: CASE "z","Z" : f8_doServos =0 'sleep 'CaseAct: CASE "@" 'marker for autorun, so ignore it CASE "0" f_page0 =1 CASE "1" TO "8" IF f_record=0 THEN IF InDo=1 AND DoAt=0 THEN DoAt =Actptr :SERTXD("(@",#DoAt,")"); InDo =0; 'because we are jumping to another Act ENDIF Slot =cmnd -"1" 'Logical Act 0 - 7 Actptr =f_page0 *128 Actptr =Slot *16 +Actptr f_page0 =0 'back to default f_play =1 ENDIF 'CaseSensors: CASE "-" f_b_react=1 :GOTO doSensors 'from IR CASE "+" f_b_react=1 :GOTO doSensors 'from IR ;CaseAlive: CASE "A" mindAt =mindstart 'PARAMETER-COMMANDS 'CaseSensors: CASE "$" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting doSensors: RootCmnd="$" : GOTO QRecRUN1 'CaseWait: CASE "w" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" f_waitcmnd =1 CASE "1" TO "9" hframes =cmnd -"0" *25 'units about 1/2 sec GOSUB QRecord cmnd="M" GOTO RUN1 ELSE cmnd ="?" ENDSELECT 'CaseTurn: CASE "t" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="t" :GOTO QRecRUN1 'CaseVoice: CASE "v" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="v" :GOTO QRecRUN2 'CaseSubroutine: CASE "a" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="a" :GOTO QRecRUN1 'CaseGetUp: CASE "u" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd 'if f_autoUp=1 then Freya gets up with Auto then does up command as well!!!! CASE "f","b","a","u" RootCmnd="u" :f_b_autoUp =0 : GOTO QRecRUN1 ELSE cmnd ="0" : GOSUB tshh ENDSELECT 'Case EyeCode CASE "e" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting GOSUB QRecord : EyeCode =cmnd 'SEROUT EyesSerial,N2400_16,(EyeCode) HSEROUT 0,(EyeCode) '0=nobreak 'Case Control: ' CASE 92,"k" '92 is "\" which gives syntax error here!!! ' GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting ' SELECT cmnd ' ENDSELECT 'CaseBehave_Speed: CASE "s" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" Scmnd =cmnd CASE "d","-" Sspeed =Sspeed /2 MIN 1 :Scmnd ="0" +Sspeed CASE "u","+" Sspeed =Sspeed +1 MAX Speedmax :Scmnd ="0" +Sspeed CASE "m" Speedmax =Scmnd -"0" ELSE GOSUB tshh Scmnd ="1" ENDSELECT f_Bmodified =1 'CaseBehave_Yawn: CASE "y" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" IF f_play=1 THEN yawn =yawn +1 IF yawn>=cmnd THEN :Actptr =Actptr +1 :yawn ="0" :ENDIF ENDIF ENDSELECT '------------------ 'BEHAVE: 'CaseBehave: CASE "b" 'DdfFgklpStuW GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd ' b_Initialise 'Initialise EEPROM with defaults CASE "I" GOTO QRecRun2 ' b_Behave_Default CASE "0" GOTO QRecRun2 'LoadBehaviour ' b_Save_Defaults CASE "S" GOTO QRecRun2 'save current behaviour to EEPROM ' b_Vigorous CASE "V" GOTO case_bvh ' b_Normal CASE "N" GOTO case_bvn ' b_Lethargic CASE "L" GOTO case_bvl ' b_vitality CASE "v" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "l" case_bvl: FLcmnd =vll :FPcmnd =vlp :kickcmnd =vlk CASE "n" case_bvn: FLcmnd =vnl :FPcmnd =vnp :kickcmnd =vnk CASE "h" case_bvh: FLcmnd =vhl :FPcmnd =vhp :kickcmnd =vhk CASE "x" FLcmnd =vxl :FPcmnd =vxp :kickcmnd =vxk ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_lift CASE "l" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" : FLcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_pace CASE "p" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" : FPcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_turn CASE "t" 'turn GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" : FTcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_ToeOffsetDown CASE "d" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" TOD =cmnd -"0" ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_ToesFrontOffset CASE "f" 'Toes front offset GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" : TOF =cmnd -"0" ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_kick CASE "k" 'kick GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" : kickcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_GetUp: CASE "u" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" f_b_autoUp =0 CASE "1" f_b_autoUp =1 ELSE GOSUB tshh ENDSELECT ' b_$ensor react CASE "$" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "a" f_b_autosense =1 CASE "1" f_b_react =1 CASE "0" f_b_react =0 f_b_autosense =0 ELSE GOSUB tshh ENDSELECT ' b_WhiskerThreshold CASE "W" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "S" 'Scale GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" PEEK RAM_Wthresh,temp0 :temp0 =temp0 //10 'remove decade temp0 =cmnd -"0" *10 +temp0 :POKE RAM_Wthresh,temp0 ELSE GOSUB tshh ENDSELECT CASE "0" TO "9" PEEK RAM_Wthresh,temp0 :temp0 =temp0 /10 *10 'round to decades temp0 =cmnd -"0" +temp0 :POKE RAM_Wthresh,temp0 ELSE GOSUB tshh ENDSELECT ' b_FeelerThreshold CASE "F" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "S" 'Scale GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" PEEK RAM_Fthresh,temp0 :temp0 =temp0 //10 'remove decade temp0 =cmnd -"0" *10 +temp0 :POKE RAM_Fthresh,temp0 ELSE GOSUB tshh ENDSELECT CASE "0" TO "9" PEEK RAM_Fthresh,temp0 :temp0 =temp0 /10 *10 'round to decades temp0 =cmnd -"0" +temp0 :POKE RAM_Fthresh,temp0 ELSE GOSUB tshh ENDSELECT ' b_AdjustServos CASE "@" GOTO RUN3 'Adjust joints to determine Servo values for Pose ' b_ELSE ELSE GOSUB tshh ENDSELECT 'Behaves IF f_Bmodified =1 THEN : cmnd ="M" : GOTO RUN1 : ENDIF 'EndCaseBehaves: '------------------ 'CaseRecord: CASE "r" IF f_record=0 THEN GOSUB GetSubCmndIR 'and update servos while waiting f_recordC =0 ELSE cmnd ="." 'if recording will end the recording ENDIF SELECT cmnd CASE "1" TO "8" IF f_page0=1 AND cmnd>"7" THEN :GOSUB badkey :GOTO EndRecordcmnd :ENDIF Slot =cmnd -"1" 'Logical Act 0 - 7 Actptr =f_page0 *128 Actptr =Slot *16 +Actptr f_page0 =0 'back to default ActEnd =Actptr +15 MAX EEPROM_ActsEnd IF Actptr>=ActEnd THEN RETURN :ENDIF 'don't overwrite BeHaves f_record =1 HIGH voiceLED IF f_IRcmnd=1 THEN GOSUB noIRkey 'wait for finger off button IF Slot=7 THEN : cmnd ="@" : f_recordC =1 : ENDIF 'for IR Act8 is always Autorun ENDIF ELSE GOSUB tshh EndRecordcmnd: ENDSELECT '------------------ 'SYSTEM 'CaseHelp CASE "?" GOSUB QRecord :RootCmnd ="?" :GOSUB GetCmnd :GOSUB QRecord :GOTO Run2 'CaseExit CASE "X" GOTO ReProgram CASE "x" GOTO ReProgram 'CaseLoadAct: CASE "l" IF f_record=1 THEN 'otherwise recording continues in loaded Act! f_record =0 WRITE Actptr,"." ENDIF GOSUB GetCmnd 'and update servos while waiting IF cmnd="0" THEN :f_page0 =1 :GOSUB GetCmnd :ENDIF SELECT cmnd CASE "1" TO "8" IF f_page0=1 AND cmnd>"7" THEN :GOSUB badkey :GOTO EndLoadcmnd :ENDIF Slot =cmnd -"1" 'Logical Act 0 - 7 Actptr =f_page0 *128 Actptr =Slot *16 +Actptr DO GOSUB GetCmnd 'and update servos while waiting IF Actptr=EEPROM_ActsEnd THEN :cmnd="." :ENDIF IF cmnd=Esc OR cmnd="." OR cmnd=";" THEN EXIT WRITE Actptr,cmnd Actptr =Actptr +1 LOOP IF cmnd<>";" THEN :cmnd ="." ENDIF WRITE Actptr,cmnd ELSE GOSUB tshh EndLoadcmnd: ENDSELECT 'cmnd CASE "¬" reset 'Error: ELSE GOSUB badkey f_recordC =0 'don't record a bad command sertxd("!",#cmnd,cmnd,"!") ENDSELECT 'cmnd '----------------------------- GOSUB QRecord LOOP '==================================================== ' SYSTEM '==================================================== GetSubCmndIR: 'only "r","^","9" IF inIRpin=0 THEN GOSUB noIRkey 'wait for finger off button GetCmnd: 'sertxd(" GetCmnd") QIR: 'sertxd(" QIR") f_IRcmnd =0 IF inIRpin=0 THEN 'pulses low if IR being received, waiting for IRmsg messes up hserin 'sertxd("I") ' IRIN inIR,IRcmnd IRIN[50,Qserial],inIR,IRcmnd f_IRcmnd =1 GOSUB bip 'must phase with the length of the IR word 'pause 20 'sometimes Play never gets started 'pause 50 'Play gets restarted 'pause 100 'Play doesn't get restarted cmnd ="z" LOOKDOWN IRcmnd,(KEY_1,KEY_2,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9,KEY_0,KEY_MINUS,KEY_PLUS),cmnd LOOKUP cmnd,("1","2","3","4","5","6","7","8","9","0","-","+"),cmnd IF cmnd<>"z" THEN Gotcmnd LOOKDOWN IRcmnd,(KEY_POWER,KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT,KEY_BAR,KEY_TENT,KEY_VCROSS,KEY_XCROSS),cmnd LOOKUP cmnd, ( ".", "F", "B", "R", "L", "r", "^", "$", "z"),cmnd IF cmnd="." AND mindAt<>0 THEN :cmnd ="Q" ENDIF '"." won't stop Alive IF IRcmnd<16 OR IRcmnd>19 THEN IF cmnd=lastcmnd THEN Qserial ENDIF 'no repeatkey cmnds except F B R L IF cmnd<>"z" THEN Gotcmnd 'if bad IR then carry on ENDIF GetSubCmnd: Qserial: 'sertxd(" Qserial") IF hserinflag=1 THEN ReadSerCmnd Qstack: 'never used 'IF stackcmnd<>0 THEN :cmnd =stackcmnd :stackcmnd =0 :RETURN :ENDIF QReact: IF ReactAt<>ReactEnd THEN READTABLE reactAt,cmnd :ReactAt =ReactAt +1 RETURN ENDIF QPlayAct: 'sertxd(" QPlayAct") IF f_play=1 AND f_waitcmnd=0 THEN READ Actptr,cmnd IF cmnd=0 OR cmnd=255 THEN cmnd ="." 'avoid uninitialised DATA ENDIF Actptr =Actptr +1 RETURN ENDIF QMind: IF mindAt<>0 THEN IF mindsub=0 THEN RANDOM W22random mindAt =W22random0 /4 '0-63 IF mindAt<22 THEN mindAt =mindAt +mindstart 'single char cmnds mindsub =0 ELSE mindAt =mindAt -22 /2 *2 +22 +mindstart mindsub =mindAt +1 ENDIF READTABLE mindAt,cmnd ELSE READTABLE mindsub,cmnd mindsub =0 ENDIF RETURN ENDIF 'RefreshServos: GOSUB TellServos 'x TellServos, f_Spulse test is in Move, 'if Sspeed>1 then StandFoot bounces at end without this, pity RANDOM W27temp EyeCode =W27temp0 IF W27temp1>240 THEN :HSEROUT 0,(EyeCode) :ENDIF '0=nobreak GOTO GetCmnd '----------------- ReadSerCmnd: '@@@IF f_allSerial=1 THEN 'f_readAllSerial (re)set by load(0/all) "l0/a" W2temp =ptr 'see if last cmnd was Quit ptr =hserptr -1 cmnd =@ptrinc IF cmnd="Q" OR cmnd=Esc THEN :hserinflag =0 :GOTO Qbip :ENDIF ptr =W2temp 'if not Quit then carry on cmnd =@ptrinc IF ptr>=hserptr THEN hserinflag =0 ptr =hserptr 'shouldn't be greater, but sometimes is - why? ENDIF '@@@ELSE '@@@ ptr =hserptr -1 'one command at a time '@@@ cmnd =@ptrinc '@@@ hserinflag =0 '@@@ENDIF Qbip: #ifdef keybip GOSUB bip #endif '----------------- GotCmnd: IF f_waitcmnd=1 THEN 'w0 waits for an IR or keycmnd f_waitcmnd =0 IF cmnd="Q" OR cmnd=Esc or cmnd="." THEN :RETURN :ENDIF IF f_play=1 THEN QPlayAct 'throw away command and resume playing iff playing ENDIF IF cmnd=Esc THEN SERTXD("[Esc]") ELSE SERTXD(cmnd) ENDIF RETURN '---------------------------------------------------- noIRkey: sertxd("k") IRIN [50,_noIRkeyend],inIR,IRcmnd 'IRIN timeout =>return GOTO noIRkey _noIRkeyend: IRcmnd =255 cmnd ="z" RETURN '---------------------------------------------------- QRecord: IF f_record=0 OR f_recordC=0 THEN RETURN ENDIF Record: HIGH voiceLED IF Actptr>=EEPROM_ActsEnd THEN 'don't overwrite BeHaves WRITE EEPROM_ActsEnd,"." f_record =0 GOSUB tshh GOSUB tshh ELSE WRITE Actptr,cmnd ENDIF Actptr =Actptr +1 IF Actptr>ActEnd THEN :f_record=0 :ENDIF '28May19 don't overwrite next slot RETURN '==================================================== ' HMI '==================================================== ' SOUND voice,(sound,time) time=~2.5ms @16MHz bip: SOUND voice,(80,7) RETURN '----------------------- tshh: 'because that is what it sounds like SOUND voice,(240,20) '(255,10ms) @32MHz RETURN '----------------------- badkey: HIGH whiskerRLED GOSUB tshh LOW whiskerRLED HIGH whiskerLLED GOSUB tshh LOW whiskerLLED ' PWMOUT EyeLLED,off ' PWMOUT EyeRLED,off ' HIGH EyeRLED ' GOSUB tshh ' LOW EyeRLED ' HIGH EyeLLED ' GOSUB tshh ' LOW EyeLLED Z: RETURN '==================================================== '************************* Machine Dependent *** Servo direction ********* 'SYMBOL servoLA =A.1 'SYMBOL servoLH =A.0 'SYMBOL servoRA =D.0 'SYMBOL servoRH =D.1 'SERTXD(#LAat,#LHat,#RHat,#RAat,cr) TellServos: '@16MHz 'SERTXD("T") IF f_RApulse=1 THEN W2pulse =RAat *4 'for 10us to 2.5us pulsout resolution PULSOUT servoRA,W2pulse ENDIF IF f_LApulse=1 THEN W2pulse =255 -LAat *4 'for 10us to 2.5us pulsout resolution, reverse servo PULSOUT servoLA,W2pulse ENDIF TellHipServos: ' TellHipServos: only used in InitLegs: IF f_RHpulse=1 THEN W2pulse =RHat *4 'for 10us to 2.5us pulsout resolution PULSOUT servoRH,W2pulse ENDIF IF f_LHpulse=1 THEN W2pulse =255 -LHat *4 'for 10us to 2.5us pulsout resolution, reverse servo PULSOUT servoLH,W2pulse ENDIF _Spause: 'pause Servo frame W2pulse =Sframe *2 'Pause units 0.5ms @16MHz PAUSE W2pulse '************************* END Machine Dependent ************************* RETURN '====================================================