'Loki_8-2.bas 'Loki_7-2.bas 'Ullr_6-2.bas 'Baldur_6-2.bas 40x2 Firmware v3 #picaxe 40x2 #slot 2 #no_table #no_data #define keybip 'for GetCmnd DISCONNECT SETFREQ m16 'SERTXD 19200 @m16 'HSERSETUP B19200_16,%00101 'pulsout 4MHz 10us units 'pulsout 16MHz 2.5us units '#2 Memory used = 3382 bytes out of 4096 '================================================== #rem SELECT RootCmnd 'CaseVoice: CASE "v" SELECT cmnd CASE "1","b" GOSUB bip CASE "2","e" GOSUB whee CASE "3","o" GOSUB whoa CASE "4","v" GOSUB beep100 CASE "5","s" GOSUB sshhh ELSE cmnd ="0" GOSUB tsh ENDSELECT CASE "e" GOSUB eyes ELSE SELECT cmnd CASE "?","a" GOSUB PrintActs f_page0 =1 :GOSUB PrintActs :f_page0 =0 CASE "1" to "8" GOSUB PrintAct :f_page0 =0 CASE "b" GOSUB PrintBeHaves CASE "p" GOSUB PrintPose CASE "d" GOSUB DumpActs CASE "#" GOSUB DumpASCIIacts CASE "T" GOSUB PrintTipSensor CASE "U" RootCmnd ="?" : GOTO Run1 CASE "W" RootCmnd ="?" : GOTO Run1 '2023-01-03 CASE "F" RootCmnd ="?" : GOTO Run1 '2023-01-03 CASE "G" GOSUB PrintGroundSensors CASE "h" GOTO PrintHelp 'then redirected to #3 - not enough room here CASE "S" GOSUB Save_Behaviour ' bS CASE "0" GOSUB LoadBehaviour '"b0" and "0" from Prog0init CASE "I" GOSUB initEEPROM ' bI CASE "E" GOTO START CASE "!" GOSUB PrintReactions '2023-01-10 CASE "M" GOSUB PrintMind '2023-01-10 ELSE GOSUB sshhh ENDSELECT ENDSELECT #endrem '================================================== Pins: '========================== SYMBOL servoLR =A.1 SYMBOL servoLP =A.0 SYMBOL servoRR =D.3 SYMBOL servoRP =D.2 SYMBOL whiskerLLED =A.6 SYMBOL whiskerRLED =A.7 SYMBOL whiskerL =A.5 'READADC needs port.pin not a symbol SYMBOL whiskerR =D.0 'READADC needs port.pin not a symbol SYMBOL EyeLLED =C.2 SYMBOL EyeRLED =C.1 SYMBOL feelerLLED =D.7 SYMBOL Lfeeler =pinD.6 'READADC needs port.pin not a symbol SYMBOL Rfeeler =pinD.5 'READADC needs port.pin not a symbol SYMBOL tipB =pinD.6 SYMBOL tipF =pinD.5 SYMBOL pin_tipB =D.6 SYMBOL pin_tipF =D.5 SYMBOL feelerRLED =D.4 SYMBOL pingpin =C.0 SYMBOL voiceLED =C.5 SYMBOL voice =C.5 SYMBOL senseLtoe =pinA.2 SYMBOL senseRtoe =pinD.1 SYMBOL inIR =A.3 SYMBOL inIRpin =pinA.3 'SYMBOL O_LCD =A.4 'bus B.7 - B.0 '================================================== VarsCons: '========================== 'SYMBOL Esc =27 'Escape key 'SYMBOL quit =27 'cmnd quit =Escape key 'inherited from IR routines 'SYMBOL quote2 =34 'double quote mark 'built in variables '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 ground sensors, "bg" SYMBOL f_b_autoUp =bit10 'wrr- tested in Qfell, default=1 "bu" '## SYMBOL f_b_Uon =bit11 'w!R- Ultrasonic sense ON '## 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_Crawl =bit15 '!r-- 0=>be Tall, 1=>Crawl '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_ =bit23 ' SYMBOL f8_doServos =b3 'ww-- SYMBOL f_RRdo =bit24 '-!-! do servo SYMBOL f_RPdo =bit25 '-!-! do servo SYMBOL f_LRdo =bit26 '-!-! do servo SYMBOL f_LPdo =bit27 '-!-! do servo SYMBOL f_RRpulse =bit28 'r!-r pulse servos SYMBOL f_RPpulse =bit29 'r!-r pulse servos SYMBOL f_LRpulse =bit30 'r!-r pulse servos SYMBOL f_LPpulse =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 'W4 SYMBOL RHC =b8 'Right Hip Pace Centre for current posture SYMBOL LHC =b9 'Left Hip Pace Centre for current posture 'W5 SYMBOL RAC =b10 'Right Hip Roll Centre for current posture SYMBOL LAC =b11 'Left Hip Roll Centre for current posture 'W6 SYMBOL RHat =b12 'Servo Right Hip Pace At SYMBOL RHto =b13 'Servo Right Hip Pace To 'W7 SYMBOL LHat =b14 'Servo Left Hip Pace At SYMBOL LHto =b15 'Servo Left Hip Pace To 'W8 SYMBOL RAat =b16 'Servo Right Hip Roll At SYMBOL RAto =b17 'Servo Right Hip Roll To 'W9 SYMBOL LAat =b18 'Servo Left Hip Roll At SYMBOL LAto =b19 'Servo Left Hip Roll To 'W10 SYMBOL Sspeed =b20 '1-9 SYMBOL Sframe =b21 'Servo frame pause in ms 'W11 SYMBOL FL =b22 'Foot Lift UpDown movement SYMBOL FP =b23 'Foot Pace ForwardBack movement 'W12 SYMBOL FT =b24 'Foot Turn SYMBOL FLcmnd =b25 'Foot Lift UpDown movement 0-9 'W13 SYMBOL FPcmnd =b26 'Foot Pace ForwardBack movement 0-9 SYMBOL FTcmnd =b27 'Foot Turn movement 0-9 'W14 SYMBOL Scmnd =b28 ''Speed 1-9 SYMBOL IRcmnd =b29 'W15 SYMBOL Actptr =b30 SYMBOL ActEnd =b31 'W16 SYMBOL slot =b32 SYMBOL hframes =b33 'halt frames 'W17 SYMBOL kickcmnd =b34 SYMBOL Speedmax =b35 '1-9 'W18 SYMBOL ReactAt =b36 'React Table pointer SYMBOL TOD =b37 'Toes Offset Down 0-9 'W19 SYMBOL yawn =b38 SYMBOL standOnLR =b39 '%LR 1=down moving test toes if if <>%11 'W20 ''SYMBOL topple =b40 'Thor SYMBOL usdist =b41 'prog2 'W21 ''SYMBOL Bo =b42 'lean back offset for backwards ''SYMBOL FLTmin =b42 'min Lift in Turns, Thor SYMBOL TOO =b43 'Toes Offset Out (Front 'Freya, Thor) '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 'prog1 '--------- '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 ' ''SYMBOL RAM_holedetectL =59 ' 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 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 RAM_LHpose =80 'SYMBOL RAM_LApose =81 'SYMBOL RAM_RHpose =82 'SYMBOL RAM_RApose =83 SYMBOL EEPROM_LHC =255 'logical value SYMBOL EEPROM_LAC =254 'logical value SYMBOL EEPROM_RHC =253 'logical value SYMBOL EEPROM_RAC =252 'logical value SYMBOL EEPROM_TOO =251 'Toes Offset Out SYMBOL EEPROM_FLcmnd =250 'Foot Lift movement 1-9 SYMBOL EEPROM_FPcmnd =249 'Pace ForwardBack movement 1-9 SYMBOL EEPROM_FTcmnd =248 'Foot Turn movement 1-9 SYMBOL EEPROM_Speeds =247 'HiNib=speedmax(9), LoNib=speed(1) SYMBOL EEPROM_TOD =246 'Toes Offset Down 'SYMBOL EEPROM_Bo =245 'Back lean back SYMBOL EEPROM_kickcmnd =244 SYMBOL EEPROM_f8_behaves =243 SYMBOL EEPROM_Wthresh =242 SYMBOL EEPROM_Fthresh =241 SYMBOL EEPROM_USawarenear =240 'start of last 16 byte slot SYMBOL EEPROM_ActsEnd =239 'end of slot 06 '============================================================== 'SERVOS - ACTUAL values from .bpe - values are in 10us units 'Hips S03/2BB Ankles S06/2BB '================================================== SYMBOL SLHout = 60 ' 90 '55 servo stop SYMBOL SLHmid =150 ' 0 SYMBOL SLHin =230 ' 80 '234 pot electronics max SYMBOL SLAout =220 ' 89 '226 out hit SYMBOL SLAstand =131 ' 0 SYMBOL SLAin = 55 ' 76 '49 hit SYMBOL SRHout =245 ' 93 SYMBOL SRHmid =152 ' 0 SYMBOL SRHin = 60 ' 92 SYMBOL SRAout =65 ' 79 '55 parts hit out 50 servo stop S06 SYMBOL SRAstand =144 ' 0 SYMBOL SRAin =225 ' 81 '226 servostop S06 'Left hip out is -ve 'Left ankle out is +ve 'Right hip out is +ve 'Right ankle out is -ve '================================================== 'LOGICAL 'foot toe in is ve - if Lfd,Rbk > left foot is in front on the ground 'ankle out is +ve SYMBOL LHout =256 -SLHout '196 SYMBOL LHmid =256 -SLHmid '106 SYMBOL LHin =256 -SLHin ' 26 SYMBOL LAout =SLAout '220 SYMBOL LAstand =SLAstand '131 SYMBOL LAin =SLAin ' 55 SYMBOL RHout =SRHout '245 SYMBOL RHmid =SRHmid '152 SYMBOL RHin =SRHin ' 60 SYMBOL RAout =256 -SRAout '191 SYMBOL RAstand =256 -SRAstand '112 SYMBOL RAin =256 -SRAin ' 31 'for servo numbering in CaseAdjust: SYMBOL LH =3 SYMBOL LA =2 SYMBOL RH =1 SYMBOL RA =0 '-------------------------------------------------------------- SYMBOL DSframe =15 'default SFrame, LOOPs at ~40Hz/25ms SYMBOL Fclear =19 'minimum for toes to miss when walking SYMBOL TSO =5 'Toe Stand Offset - so toes clear each other #rem m#100#131#157#100 getup from face to full bow - max speed 4 m#196#131#245#100m#196#055#245#036 to up - not needed for get up m#196#125#245#105 set legs to halt - works from full bow m#196#125#245#080m#106#125#152#080m#100#131#157#112 toes back m#026#140#060#112m#026#055#060#030 up m#026#131#060#112 set legs to halt m#100#131#157#090 feet flat m#100#131#157#112 m#026#131#060#112m#100#131#157#090m#100#131#157#112 #endrem '================================================================= ' INITIALISATION '========================== Init: hserptr =W2temp 'get back pointer SERTXD("{2",RootCmnd,cmnd,",") '==================================================== ' COMMANDER '==================================================== SELECT RootCmnd 'CaseVoice: CASE "v" SELECT cmnd CASE "1","b" GOSUB bip CASE "2","e" GOSUB whee CASE "3","o" GOSUB whoa CASE "4","v" GOSUB beep100 CASE "5","s" GOSUB sshhh ELSE cmnd ="t" GOSUB tsh ENDSELECT CASE "e" GOSUB eyes ELSE SELECT cmnd CASE "?","a" GOSUB PrintActs f_page0 =1 :GOSUB PrintActs :f_page0 =0 CASE "1" to "8" GOSUB PrintAct :f_page0 =0 CASE "b" GOSUB PrintBeHaves CASE "p" GOSUB PrintPose CASE "d" GOSUB DumpActs CASE "#" GOSUB DumpASCIIacts CASE "T" GOSUB PrintTipSensor CASE "U" RootCmnd ="?" : GOTO Run1 CASE "W" RootCmnd ="?" : GOTO Run1 '2023-01-03 CASE "F" RootCmnd ="?" : GOTO Run1 '2023-01-03 CASE "G" GOSUB PrintGroundSensors CASE "h" GOTO PrintHelp 'then redirected to #3 - not enough room here CASE "S" GOSUB Save_Behaviour ' bS CASE "0" GOSUB LoadBehaviour '"b0" and "0" from Prog0init CASE "I" GOSUB initEEPROM ' bI CASE "E" GOTO START CASE "!" GOSUB PrintReactions '2023-01-10 CASE "M" GOSUB PrintMind '2023-01-10 ELSE GOSUB sshhh ENDSELECT ENDSELECT Run0: W2temp =hserptr 'Preserve pointer RUN 0 Run1: W2temp =hserptr 'Preserve pointer RUN 1 Run3: W2temp =hserptr 'Preserve pointer RUN 3 '==================================================== ' EXPERIMENT '==================================================== START: 'cmnd ="E" ' IF hserinflag =1 THEN :W2pulse =hserptr :RUN 0 :ENDIF 'The way back AliTalkTest: #rem Ali CON 22 'Ali talk control Pretty CON 0 'talkAli - "You think you are pretty" Prettiest CON 1 'talkAli - "You think you are pretty, I am the prettiest" Greatest CON 2 'talkAli - "...greatest" #endrem W2temp =0 gettime: IF hserinflag=0 THEN gettime cmnd =@ptrinc IF ptr>=hserptr THEN hserinflag =0 ptr =hserptr 'shouldn't be greater, but sometimes is - why? ENDIF cmnd =cmnd -"0" LOOKUP cmnd,(1300,2295,5500),W2temp W2temp =W2temp *2 GOTO _talkAli ' IF cmnd="." THEN _talkAli ' IF cmnd>="0" AND cmnd<="9" THEN ' W2temp =W2temp *10 ' W2temp =W2temp +cmnd -"0" ' sertxd(#W2temp,cr) ' ENDIF ' GOTO gettime _talkAli: sertxd(" Ali ") ' LOOKUP cmnd,[1300,2295,5500],W2temp '1300 "So you think you're pretty" '2295 "So you think you're pretty, well I'm the prettiest" '5500 "So you think....I am the greatest" HIGH C.6 PAUSE W2temp INPUT C.6 'HiZ =remove talk circuit supply GOTO Run0 #rem '----------------------------- LCDtest: HSERSETUP B9600_16,%00100 '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) hserout 1,(cr,254,1,254,2,"Hello World",254,1,254,2,"oops ") 'shows oops, but initial 1,2 don't work restoreHserial: HSERSETUP B19200_16,%01101 '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) HIGH C.6 'otherwise LCD fills with triangles GOTO Run0 #rem '----------------------------- Eyetest: PWMOUT EyeLLED,255,1000 'active high Dutycycle for obeying PWMOUT EyeRLED,255,200 pause 1000 PWMOUT EyeRLED,255,100 'active high Dutycycle for obeying pause 1000 PWMOUT EyeRLED,255,50 pause 1000 PWMOUT EyeRLED,255,10 pause 1000 PWMOUT EyeRLED,255,5 pause 1000 PWMOUT EyeRLED,255,3 pause 1000 goto start '----------------------------- HIGH whiskerRLED HIGH whiskerLLED HIGH feelerRLED HIGH feelerLLED '----------------------------- #rem pause 1000 PWMOUT EyeLLED,255,10 'active high Dutycycle for dim, PWMOUT EyeRLED,255,10 'active high Dutycycle for dim, pause 1000 PWMOUT EyeLLED,255,8 'active high Dutycycle for dim, PWMOUT EyeRLED,255,8 'active high Dutycycle for dim, pause 1000 PWMOUT EyeLLED,255,5 'active high Dutycycle for dim, PWMOUT EyeRLED,255,5 'active high Dutycycle for dim, pause 1000 goto start #endrem #rem '----------------- Qping: 'Query Ultrasonic Sensor, read into USdist ' POKE RAMUSlast,usdist LOW pingpin ' make trigger 0-1-0 PULSOUT pingpin,pingtrig ' activate sensor PULSIN pingpin,1,W2pulse ' measure high(=1) echo pulse in units, ' units are 10us@4MHz, 2.5us@32MHz ' pulsin rolls over at 65536counts =>0 ' ie 0.65536sec @ 4MHz(10uS) too long to wait if nothing there ' 0.16399sec @16MHz(2.5uS) tolerable ' so use 16MHz for HCSR04 ' SRF05 auto times out at 36ms and returns 0, good. ' PEEK RAMUSunits_cm_,temp ' IF temp=0 THEN W2pulse =W2pulse ** USscalecm 'scale time to cm ' ELSE ' W2temp =W2temp ** cmtoinch ' ENDIF IF W2pulse=0 THEN ' if timeout then usdist =255 ' set to max distance ELSE usdist =W2pulse MAX 255 ENDIF SERTXD(#usdist,cr) ' RETURN pause 50 goto start #endrem '----------------- 'tmr3setup %00110011 ; timer3 on, 1:8 prescalar 'settimer 65000 'sertxd(#timer,CR) 'w2 =41258 '----------------- 'SERTXD("whisker") 'READADC A.5,b1 'whiskerLeye 'SERTXD("L=",#b1) 'READADC D.0,b1 'whiskerLeye 'SERTXD(" R=",#b1) 'SERTXD(" toe") 'READADC D.6,b1 'toeLfeeler 'SERTXD("L=",#b1) 'READADC D.5,b1 'toeRfeeler 'SERTXD(" R=",#b1) 'SERTXD(CR) 'pause 200 'goto start '----------------- #rem flash: SERTXD("whisker") READADC A.5,b1 'whiskerLeye SERTXD("L=",#b1) high whiskerLLED READADC A.5,b1 'whiskerLeye SERTXD(",",#b1) pause 1000 low whiskerLLED READADC D.0,b1 'whiskerLeye SERTXD(" R=",#b1) high whiskerRLED READADC D.0,b1 'whiskerLeye SERTXD(",",#b1) pause 200 low whiskerRLED SERTXD(" toe") READADC D.6,b1 'toeLfeeler SERTXD("L=",#b1) high toeLLED READADC D.6,b1 'toeLfeeler SERTXD(",",#b1) pause 1000 low toeLLED READADC D.5,b1 'toeRfeeler SERTXD(" R=",#b1) high toeRLED READADC D.5,b1 'toeRfeeler SERTXD(",",#b1,CR) pause 200 low toeRLED pause 200 goto start high EyeLLED pause 500 low EyeLLED high EyeRLED pause 200 low EyeRLED pause 200 high whiskerLLED pause 500 low whiskerLLED high whiskerRLED pause 200 low whiskerRLED pause 200 goto start sound voice,(10,5,120,5) pause 1000 sound voice,(20,5,60,5,70,5,80,5,90,5,100,5) pause 1000 sound voice,(50,5,64,5,78,5,92,5,106,5,120,5) pause 1000 sound voice,(110,5,120,5) pause 1000 sound voice,(20,48,58,68,78,88,98,5,100,246) pause 1000 sound voice,(100,5,90,5,80,5,70,5,60,5,20,5) pause 1000 sound voice,(20,5,60,5,70,5,80,5,90,5,100,5,110,5) pause 1000 goto start random W2 temp =b4 b4 =b4 & 127 sound voice,(b4,b5) b4 =temp pause 200 GOSUB tsh pause 200 GOSUB tshh P0: W2pulse = 2000 '150 *4 'for 10us to 2.5us pulsout resolution @16MHz '100uS between pulses W2pulse =LHmid *4 pulsout servoLH,W2pulse W2pulse =LKmidS *4 pulsout servoLK,W2pulse '600 =1500 W2pulse =255 -RHmid *4 pulsout servoRH,W2pulse '500 =1250 W2pulse =255 -RKmidS *4 pulsout servoRK,W2pulse '400 =1000 W2pulse =Sframe *2 'Pause units 0.5ms @16MHz PAUSE 20'W2pulse goto P0 RUN 0 '-------------------------- tshh: 'because that is what it sounds like SOUND voice,(240,10) '(255,10ms) @32MHz RETURN tsh: 'because that is what it sounds like SOUND voice,(240,5) '(255,10ms) @32MHz RETURN '-------------------------- R2: high b.0 pause 100 low b.0 pause 100 high b.0 dirsB =255 for b0 =0 to 255 outpinsB =b0 pause 20 next b0 'outpinsB =255 'pause 50 #rem low b.7 pause 100 low b.6 pause 100 low b.5 pause 100 low b.4 pause 100 low b.3 pause 100 low b.2 pause 100 low b.1 pause 100 low b.0 pause 100 #endrem 'outpinsB =1 'pause 50 'sertxd("rippled") 'GOTO START 'end EXPERIMENT '-------------------------- 'DISCONNECT 'HIGH B.1 'GOTO START 'end EXPERIMENT '==================================================== ' HMI '==================================================== ' SOUND voice,(sound,time) time=~2.5ms @16MHz bip: SOUND voice,(80,7) RETURN '----------------------- beep100: ' SETFREQ m4 SOUND voice,(105,100) RETURN '----------------------- tsh: 'because that is what it sounds like SOUND voice,(240,10) '(255,10ms) @32MHz RETURN '----------------------- tshh: 'because that is what it sounds like SOUND voice,(240,20) '(255,10ms) @32MHz RETURN '----------------------- sshhh: 'because that is what it sounds like 'beep255: SOUND voice,(240,80) '(255,10ms) @32MHz RETURN '----------------------- whee: 'make rising sound FOR temp0 =50 TO 127 STEP 10 SOUND voice,(temp0,10) NEXT temp0 RETURN '----------------------- whoa: 'make falling sound FOR temp0 =127 TO 50 STEP -10 SOUND voice,(temp0,10) NEXT temp0 RETURN '----------------------- eyes: SELECT cmnd ' 10'active high Dutycycle for Dim - ie waiting CASE "R" PWMOUT EyeRLED,255,100 'active high Dutycycle for Doing CASE "L" PWMOUT EyeLLED,255,100 'active high Dutycycle for Doing CASE "E" PWMOUT EyeRLED,255,100 'active high Dutycycle for Doing PWMOUT EyeLLED,255,100 'active high Dutycycle for Doing CASE "e" 'leave eyes dim - no error sound CASE "r" PWMOUT EyeRLED,255,0 'active high Dutycycle for off CASE "l" PWMOUT EyeLLED,255,0 'active high Dutycycle for off CASE "0" PWMOUT EyeRLED,255,0 'active high Dutycycle for off PWMOUT EyeLLED,255,0 'active high Dutycycle for off CASE "1" PWMOUT EyeRLED,255,1000'active high Dutycycle for bright PWMOUT EyeLLED,255,0 'active high Dutycycle for off CASE "2" PWMOUT EyeRLED,255,0 'active high Dutycycle for off PWMOUT EyeLLED,255,1000'active high Dutycycle for bright CASE "3" PWMOUT EyeRLED,255,1000'active high Dutycycle for bright PWMOUT EyeLLED,255,1000'active high Dutycycle for bright ELSE cmnd ="0" GOSUB tshh ENDSELECT PAUSE 700 RETURN '==================================================== PrintActs: 'Remember internal Slots/Acts are 0-7 keys [1]-[8] FOR cmnd ="1" TO "8" GOSUB PrintAct NEXT cmnd SERTXD(CR) RETURN '---------------------------------------------------- PrintBeHaves: SERTXD(CR,CR,"Loki",CR) SERTXD(Scmnd," speed",CR) SERTXD(#Speedmax," speedmax",CR) SERTXD(FLcmnd,"(",#FL,") Lift",CR) SERTXD(FPcmnd,"(",#FP,") Pace",CR) SERTXD(FTcmnd,"(",#FT,") Turn",CR) SERTXD(#TOO," Toes Offset Out",CR) SERTXD(#TOD," Toes Offset Down",CR) 'SERTXD(#Bo," Back offset",CR) 'SERTXD(#f_Crawl," Crawl",CR) SERTXD(kickcmnd," Kick",CR) SERTXD(#f_b_react," $ react",CR) SERTXD(#f_b_autosense," autosense",CR) SERTXD(#f_b_Uon," U/S react",CR) '## SERTXD(#f_b_autoUp," autoUp",CR) PEEK RAM_Wthresh,temp0 :SERTXD(#temp0," Wthresh",CR) PEEK RAM_Fthresh,temp0 :SERTXD(#temp0," Fthresh",CR) PEEK RAM_USawareAt,temp0 :SERTXD(#temp0," USawareAt - units 5cm/2inch",CR) PEEK RAM_UStoonear,temp0 :SERTXD(#temp0," UStoonear - units 5cm/2inch",CR) RETURN '---------------------------------------------------- PrintAct: 'Remember internal Slots/Acts are 0-7 keys [1]-[8] Slot =cmnd -"1" 'Logical Act 0 - 7 Actptr =f_page0 *128 Actptr =Slot *16 +Actptr ActEnd =Actptr +15 MAX EEPROM_ActsEnd IF Actptr>=ActEnd THEN RETURN :ENDIF SERTXD(CR,"Act ") IF f_page0=1 THEN SERTXD("0") :ENDIF SERTXD(cmnd," - ") DO READ Actptr,temp0 IF temp0=0 OR temp0=255 THEN _endPrintAct 'uninitialised location SERTXD(temp0) Actptr =Actptr +1 LOOP UNTIL temp0="." OR temp0=";" OR temp0=255 OR Actptr>ActEnd _endPrintAct: RETURN '---------------------------------------------------- DumpActs: 'Dump sends all DATA to PC, could include Config Data SERTXD(CR) FOR Slot =0 TO 14 'don't print slot 15 with config data FOR Actptr =0 TO 15 temp0 =Slot *16 +Actptr READ temp0,cmnd SERTXD(cmnd) NEXT SERTXD("|",CR) NEXT SERTXD(CR) RETURN '---------------------------------------------------- DumpASCIIacts: SERTXD(CR) FOR Slot =0 TO 15 FOR Actptr =0 TO 15 temp0 =Slot *16 +Actptr READ temp0,cmnd SERTXD(#cmnd,",") NEXT SERTXD("|",CR) NEXT SERTXD(CR) RETURN '---------------------------------------------------- PrintPose: '?p SERTXD(CR,CR) READ EEPROM_LAC,temp0 SERTXD("E_LAC=",#temp0) READ EEPROM_LHC,temp0 SERTXD(" E_LHC=",#temp0) READ EEPROM_RHC,temp0 SERTXD(" E_RHC=",#temp0) READ EEPROM_RAC,temp0 SERTXD(" E_RAC=",#temp0,CR) SERTXD(" LAC=",#LAC," LHC=",#LHC," RHC=",#RHC," RAC=",#RAC,CR) SERTXD(" LAat=",#LAat," LHat=",#LHat," RHat=",#RHat," RAat=",#RAat,CR) RETURN '---------------------------------------------------- PrintTipSensor: '?T READADC D.5,W27temp0 'read Rfoot feeler, ie if tip F should be 0 READADC D.6,W27temp1 'read Lfoot feeler, ie if tip B should be 0 SERTXD(CR,"TF",#W27temp0," TB",#W27temp1,CR) RETURN '---------------------------------------------------- PrintGroundSensors: '?G SERTXD(CR,"L",#senseLtoe," R",#senseRtoe,CR) RETURN '==================================================== PrintHelp: SERTXD(CR,"HELP {choice ") SERTXD(CR," Forward,Back,Right,Left,Halt,stepL,stepR") SERTXD(CR,"K I V . ; Q q Esc") '## SERTXD(CR," Kick,Init,Voice,Stop,Continue,Quit,Quit,Quit") '## SERTXD(CR,"X x eXit,exit - to program") SERTXD(CR,"Z z Sleep,sleep") SERTXD(CR,"<1-8 play Act in current page") SERTXD(CR,"0 change to Acts page0 for next command") SERTXD(CR,"@ Autorun marker") SERTXD(CR,"; continue in next Slot") SERTXD(CR,"( start of Do, not nestable") SERTXD(CR,") end of Do") SERTXD(CR,"+ react ON test WF sensors") SERTXD(CR,"- react ON test G sensors") SERTXD(CR,"A be Alive") SERTXD(CR,"E Experiment - run2") SERTXD(CR,"¬ RESET") SERTXD(CR,"r{1-8 record Act moves - Esc ; . end record") SERTXD(CR,"l{1-8 load Act - Esc ; . end load") SERTXD(CR,CR,"s w v a ^ u b y + - $ ?") SERTXD(CR,"s{1-9 speed") SERTXD(CR," u speed-up") SERTXD(CR," d speed-down") SERTXD(CR," m set speedmax to speed") SERTXD(CR,"w0 wait any key or IR") SERTXD(CR," {1-9 wait 1/2 secs") GOTO Run3 'continue with Help '==================================================== PrintReactions: '2023-01-10 SERTXD(CR,"US+ vtta.") SERTXD(CR,"US- vss-Btatm.") 'obstacle SERTXD(CR,"OLR s-BBtatm.") SERTXD(CR,"OL_ s-BRR.") SERTXD(CR,"O_R s-BLL.") 'hole SERTXD(CR,"HLR s-BBBBtatm.") SERTXD(CR,"HL_ s-BRRR.") SERTXD(CR,"H_R s-BLLL.",CR) RETURN '==================================================== PrintMind: 'only one and two character mind commands 'one char '2023-01-10 SERTXD(CR,"ZH4FRFFLFH1FB1F3F2RFRLVLFHVVFV><") 'two chars SERTXD(CR,"subLbNbNbVw1w3w5w7w9vvvvvvvevevevevovovo") SERTXD(CR,"vovss+s+s+s+s-s-eReReLeEeEereleetatttmtm") SERTXD(CR,"totrtlaSsususuar",CR) RETURN '==================================================== Save_Behaviour: 'b_Save_Behaviour as default ' CASE "S" 'save current behaviour values to internal EEPROM WRITE EEPROM_f8_behaves, f8_behaves 'WRITE EEPROM_TOD, TOD 'WRITE EEPROM_Bo, Bo WRITE EEPROM_FLcmnd, FLcmnd WRITE EEPROM_FPcmnd, FPcmnd WRITE EEPROM_FTcmnd, FTcmnd WRITE EEPROM_TOO, TOO WRITE EEPROM_TOD, TOD temp0 =Speedmax *16 +Scmnd -"0" WRITE EEPROM_Speeds,temp0 WRITE EEPROM_kickcmnd, kickcmnd PEEK RAM_Wthresh,temp0 : WRITE EEPROM_Wthresh,temp0 PEEK RAM_Fthresh,temp0 : WRITE EEPROM_Fthresh,temp0 PEEK RAM_USawareAt,W2temphi 'hi nibble PEEK RAM_UStoonear,W2templo 'lo nibble temp0 =W2temphi *16 +W2templo WRITE EEPROM_USawarenear, temp0 'hi nibble,lo nibble RETURN '==================================================== LoadBehaviour: READ EEPROM_LHC,LHC IF LHC=255 THEN GOSUB InitEEPROM '255 -> EEprom not initialised READ EEPROM_f8_behaves,f8_behaves READ EEPROM_Speeds, temp0 'Servo speeds Scmnd =temp0 //16 +"0" 'lo nib Speedmax =temp0 /16 'hi nib READ EEPROM_FLcmnd, FLcmnd 'Foot Lift UpDown movement READ EEPROM_FPcmnd, FPcmnd 'Foot Pace ForwardBack movement READ EEPROM_FTcmnd, FTcmnd 'Foot Turn READ EEPROM_TOO, TOO 'Toes Offset Out READ EEPROM_TOD, TOD 'Toes Offset Down READ EEPROM_RHC, RHC READ EEPROM_LHC, LHC READ EEPROM_RAC, RAC READ EEPROM_LAC, LAC ' READ EEPROM_Bo, Bo 'Back offset READ EEPROM_kickcmnd,kickcmnd READ EEPROM_Wthresh, temp0 :POKE RAM_Wthresh,temp0 READ EEPROM_Fthresh, temp0 :POKE RAM_Fthresh,temp0 READ EEPROM_USawarenear, temp0 W2temphi =temp0/16 :POKE RAM_USawareAt,W2temphi 'hi nibble W2templo =temp0//16 :POKE RAM_UStoonear,W2templo 'lo nibble f_Bmodified =1 :cmnd ="M" IF f_warm=1 THEN Run1 'do #1_NewBehave: so ?b(servo values) are right RETURN 'else return to #0 to do Posture '==================================================== initEEPROM: WRITE EEPROM_LHC ,LHmid 'logical value WRITE EEPROM_LAC ,LAstand 'logical value WRITE EEPROM_RHC ,RHmid 'logical value WRITE EEPROM_RAC ,RAstand 'logical value WRITE EEPROM_TOO ,0 WRITE EEPROM_TOD ,3 WRITE EEPROM_FLcmnd ,"2" WRITE EEPROM_FPcmnd ,"3" WRITE EEPROM_FTcmnd ,"3" WRITE EEPROM_Speeds ,$52 'hiNib=speedmax(5), loNib=speed(2) 'WRITE EEPROM_Bo ,0 'Back lean back WRITE EEPROM_kickcmnd ,"2" WRITE EEPROM_Wthresh ,9 WRITE EEPROM_Fthresh ,9 WRITE EEPROM_USawarenear ,$73 '7*16 +3 RETURN '====================================================