'Ullr_8-0.bas 40x2 Firmware v3 'Ullr_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 = 4007 bytes out of 4096 Commander '#1 Memory used = 4052 bytes out of 4096 Movement '#2 Memory used = 3171 bytes out of 4096 ?Report,EEPROM,Execute,?help '#3 Memory used = 4085 bytes out of 4096 ?help2, @Setup '================================================== 'Reactions Table: SYMBOL USaware =0 TABLE USaware ,("vtta.") SYMBOL USnear =16 TABLE USnear, ("vss-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 ReactEnd =127 TABLE ReactEnd,(".") 'Mind Table from Baldur SYMBOL mindstart =128 'only one and two character mind commands 'one char SYMBOL Mind128 =128 TABLE Mind128,("FB3LVFBFVHFR<>LRHLFHK1LVRBZF2F4V")'32 'two chars SYMBOL Mind160 =160 TABLE Mind160,("w1vew3bVw5vew7w9vobLvevovob0vss+s-eRbNeL")'40 SYMBOL Mind200 =200 TABLE Mind200,("eEertaelvveetaeRa")'40 SYMBOL Mind240 =240 TABLE Mind240,("bNaSpseEtmvevovv")'16 SYMBOL Mindend =255 #rem 11 2 3 4 FFFFFFF BBB RRR LLLL K HHH VVVV Z > < b0 bL bNbN bV w1 w3 w5 w7 w9 vvvvvv veveveve vovovovo vs s+s+s+s+ s-s- eReR eL eEeE er el ee tata tmtm to aSaS a kick L kick R pf psps #endrem '================================================== 'BUGS '================================================== 'ToDo '#1 Qfell, '================================================== '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 '================================================== #rem History: ------- 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, . 30Aug21 added cmnd =255 at start and lastcmnd and test in QIR to avoid keyrepeats NoIR timeout incraesed from 50 to 100 added - Mind table, separated getting IR subcmnds from other subcmnds bg removed, b$-,b$+,b$0 added Ullr 8 ************ 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. Ullr 7 11Jul21 added 4pin 0v,5v,C.6/hserout,Serin header 21may21 corrected Tt and Ta, needed <=,>= not <,>, added 'eye' control. 27Jan21 changed f_fdL to test RPat, moved bS to #2, modified #0initEEPROM, test and init in #2 18Jan21 added QRecRUN1 etc added at end behaves IF f_Bmodified =1 THEN : cmnd ="M" : GOTO RUN1 : ENDIF so print prints updated cmnd values added TOO moved things around and saved a lot of bytes 16Jun20 added [9][0] ="E" so can turn on LEDS from IR to photograph 16Jun20 0-load, IF cmnd="0" THEN f_page0 =1 16Jun20 1-Qground, anti bounce code rem'd - Ullr has IR ground sensing. 17May20 added test in prog1 Halt for crawl so doesn't stand up if crawling added f_crawl=0 after S 23Apr20 added Sspeed /2 in SLR to make move less jerky 13Apr20 introduced bT, be Tall and bC be Crawl, when crawl=1 FBRL do crawl 13Apr20 added "p" poses split from "a" 12Apr20 introduced SYMBOL RAM_Sspeed =78, SYMBOL RAM_leglLift =79 10Apr20 changed CASE "s" to update Sspeed directly and commented f_Bmodified =1 Ullr 6 06Apr20 cloned from Baldur6 ********************* 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" 08Mar18 Feeler and Whisker LEDs on for avoid duration, Tip sensors added 27Sep17 added LoadBehaviour - CASE "D" 07Jul17 ReadSerCmnd: added test of last serbyte received, if Q or ESC then Quit 02Mar17 P0 deleted saving f8_Cmnder0 22Feb16 rewrote Qground 21Feb16 f_allSerial @@@commented and bit 6 reused for f_b_React 22Sep15 changed slot length to 16 from 32, now have slots 1-8 and 01-08 f_page0 =bit22 '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 Baldur 6 26Aug15 changed \@ to b@ 05Jul15 added feet bulges - now gets up from upside down by front and back 02Jul15 optosensors now work 23Jun15 added "@" for Autorun, changed @ adjust to \@, revised Whisker code to Bamduino 14Jun15 brought Freya, Baldur cmnds into line Baldur 5 26May15 added "K",changed P_whiskerLLED-C.1,P_whiskerRLED-C.2 to A.6,A.7 25May15 added D - reset to Default behaviour,changed D,#,? to ?D,?#,?? 23May15 added bb, af,ab,au,aF,aB 22May15 Got Baldur walking, but can't get it to turn, works from manual pots! added "bD" 20Mar15 ported from Freya_4a, new - servo positions 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 Ullr_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_servoLknee A.1 (tAIOC2-) 4 I_ToeL A.2 (tAIOC2+D) 5 IRin A.3 (tAIOC1+) 6 SERIN 7 SEROUT/O_LCD A.4 (SoO){SRNQ} 8 A_whiskerLeye A.5 (tAIO) 9 P_whiskerLLED A.6 (tAIO) 10 P_whiskerRLED A.7 (tAIO) 11 +v 12 0v 13 (Resonator) 14 (Resonator) 15 Ping C.0 (IOT) 16 EyeRLED C.1 (IO pwm) 17 EyeLLED C.2 (tAIO hPwm pwm) 18 [hi2c sck] C.3 (tAIO IICscl SPIsck) 19 A_whiskerReye D.0 (tAIO) 20 I_ToeR 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_toeLLED D.7 (tAIO hPwm KBdata) 29 A_toeLfeeler D.6 (tAIO hPwm KBclk) tipB 28 A_toeRfeeler D.5 (tAIO hPwm) tipF 27 O_toeRLED D.4 (tAIO) 26 [hserin ] C.7 (tAIOSi) 25 [hserout ] C.6 (tAIOSo) 24 O_voice/O_vLED C.5 (tAIO SPIsdo) 23 [hi2c sda] C.4 (tAIO ICsda SPIsdi) 22 O_servoRknee D.3 (tAIO) 21 O_servoRhip D.2 (tAIO) ----------------------- 1 Reset_ 40 B.7 2 O_servoLhip A.0 39 B.6 3 O_servoLknee A.1 38 B.5 4 I_toeL A.2 37 B.4 5 IRin 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 P_whiskerLLED A.6 32 +v 10 P_whiskerRLED A.7 31 0v 11 +v 30 O_footLLED D.7 12 0v 29 A_footLfeeler D.6 tipB 13 (Resonator) 28 A_footRfeeler D.5 tipF 14 (Resonator) 27 O_footRLED D.4 15 Ping C.0 26 [hserin ]cmnds C.7 16 EyeRLED C.1 25 [hserout] C.6 17 EyeLLED C.2 24 O_voice/O_vLED C.5 18 [hi2c sck] C.3 23 [hi2c sda] C.4 19 A_whiskerReye D.0 22 O_servoRknee D.3 20 I_RToe D.1 21 O_servoRhip D.2 ----------------------- o servo o tip o 5v o 5v o 0v o 0v o toe o 5v o 0v o WhiskerFeelerIn o WhiskerFeelerLED o 0v ----------------------- '================================================== Connectors ______________________________________ |Power Aux Program Servos| | | Pace servo | 0v 6v D2 A0 6v 0v | Pace servo Roll servo | 0v 6v D3 A1 6v 0v | Roll servo toe switch | 0v D1 A2 0v | toe switch whisker | 0v A7 D0 C0 6v 0v | Pingpin ShinFeeler | 0v D4 D5 A5 A6 0v | whisker Eyes | 0v C1 C2 D6 D7 0v | ShinFeeler \____________________________________/ front Aux - 0v 5v C.6/Hserout Serin Serin is with usual 10k to 0v and 22k to Serin #endrem '================================================== Pins: '========================== SYMBOL servoLR =A.1 SYMBOL servoLP =A.0 SYMBOL servoRR =D.3 SYMBOL servoRP =D.2 SYMBOL whiskerLLED =A.6 '1=on SYMBOL whiskerRLED =A.7 '1=on 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 '1=on SYMBOL EyeRLED =C.1 '1=on SYMBOL feelerLLED =D.7 '1=on 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 '1=on SYMBOL pingpin =C.0 SYMBOL voiceLED =C.5 '1=on 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: '================================================== 'Speed - for IR [9]{[1],[2],[3] SYMBOL sslow ="1" 'speed slow SYMBOL snormal ="3" 'speed normal SYMBOL sfast ="6" 'speed fast '================================================== 'Vitality - for IR [9]{[4],[5],[6] SYMBOL vll ="2" 'low lift SYMBOL vnl ="4" 'normal lift SYMBOL vhl ="6" 'high lift SYMBOL vxl ="7" 'extreme lift SYMBOL vlp ="3" 'low pace SYMBOL vnp ="5" 'normal pace SYMBOL vhp ="7" 'high pace SYMBOL vxp ="8" 'extreme pace SYMBOL vlk ="1" 'low kick SYMBOL vnk ="2" 'normal kick SYMBOL vhk ="4" 'high kick SYMBOL vxk ="6" '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$+" 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 Baldur 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 'SYMBOL servonum =b7 'SETUP 'W4 SYMBOL RPC =b8 'Right Hip Pace Centre for current posture SYMBOL LPC =b9 'Left Hip Pace Centre for current posture 'W5 SYMBOL RRC =b10 'Right Hip Roll Centre for current posture SYMBOL LRC =b11 'Left Hip Roll Centre for current posture 'W6 SYMBOL RPat =b12 'Servo Right Hip Pace At SYMBOL RPto =b13 'Servo Right Hip Pace To 'W7 SYMBOL LPat =b14 'Servo Left Hip Pace At SYMBOL LPto =b15 'Servo Left Hip Pace To 'W8 SYMBOL RRat =b16 'Servo Right Hip Roll At SYMBOL RRto =b17 'Servo Right Hip Roll To 'W9 SYMBOL LRat =b18 'Servo Left Hip Roll At SYMBOL LRto =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 'Acts 1-8 occupy Slots 0-7 SYMBOL hframes =b33 'halt frames 'W17 SYMBOL kickcmnd =b34 SYMBOL Speedmax =b35 '1-9 'W18 SYMBOL FinCmnd =b36 'Foot In 0-9 SYMBOL ReactAt =b37 'React Table pointer 'W19 SYMBOL yawn =b38 'SYMBOL standOnLR =b39 '#1 %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 ' '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_leglLift =79 'SYMBOL RAM_randvarLo =68 'SYMBOL RAM_randvarHi =69 'SYMBOL RAM_randseedlo =70 'SYMBOL RAM_randseedhi =71 SYMBOL EEPROM_LPC =255 'logical value SYMBOL EEPROM_LRC =254 'logical value SYMBOL EEPROM_RPC =253 'logical value SYMBOL EEPROM_RRC =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_FinCmnd =246 'Foot in when standing on it '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 '************************* Machine Dependent ***************************** #rem Ullr ==== Notes ----- Servos 'Cirrus-CS601-BB-STD 5.5Kgcm@4.8v, 0.2sec, +ve clockwise, 'jerk on poweron if not already being pulsed. Cirrus CS601BB 4.8/6v, 0.2 sec/0.16sec, 5.5kg.cm/6.5kg.cm, +ve clock, plastic gears, ball bearing finger load 1/4amp same as Breedon head Allp logical values '================================================== 'SERVOS - ACTUAL values from @ - values are in 10us units '================================================== SYMBOL SLPback = 47 '106 SYMBOL SLPb90 = 61 ' 92 SYMBOL SLPmid =153 ' 0 SYMBOL SLPf90 =246 ' 93 SYMBOL SLPfwd =250 ' 97 SYMBOL SLRout = 56 '140 SYMBOL SLRo90 =102 ' 95 SYMBOL SLRoeasy =186 ' 10 SYMBOL SLRoattn =191 ' 5 SYMBOL SLRstand =196 ' 0 SYMBOL SLRin =237 ' 41 SYMBOL SRPback =250 ' 96 SYMBOL SRPb90 =250 ' 96 SYMBOL SRPmid =154 ' 0 SYMBOL SRPf90 = 61 ' 93 SYMBOL SRPfwd = 53 '101 SYMBOL SRRout =234 '127 'seems to be stopped by something SYMBOL SRRo90 =198 ' 91 SYMBOL SRRoeasy =117 ' 10 SYMBOL SRRoattn =112 ' 5 SYMBOL SRRstand =107 ' 0 SYMBOL SRRin = 68 ' 39 'Left foot forward is +ve 'Left leg out is -ve 'Right foot forward is -ve 'Right leg out is +ve '================================================== 'LOGICAL 'foot forward is +ve 'leg out is +ve SYMBOL LPback =SLPback ' 47 SYMBOL LPb90 =SLPb90 ' 61 SYMBOL LPmid =SLPmid '153 SYMBOL LPf90 =SLPf90 '246 SYMBOL LPfwd =SLPfwd '250 SYMBOL LRout =256 -SLRout '200 SYMBOL LRo90 =256 -SLRo90 '154 SYMBOL LRoeasy =256 -SLRoeasy ' 70 SYMBOL LRoattn =256 -SLRoattn ' 65 SYMBOL LRstand =256 -SLRstand ' 60 SYMBOL LRin =256 -SLRin ' 19 SYMBOL RPback =256 -SRPback ' 5 SYMBOL RPb90 =256 -SRPb90 ' 5 SYMBOL RPmid =256 -SRPmid '101 SYMBOL RPf90 =256 -SRPf90 '195 SYMBOL RPfwd =256 -SRPfwd '203 SYMBOL RRout =SRRout '234 SYMBOL RRo90 =SRRo90 '198 SYMBOL RRoeasy =SRRoeasy '117 SYMBOL RRoattn =SRRoattn '112 SYMBOL RRstand =SRRstand '107 SYMBOL RRin =SRRin ' 68 'for servo numbering in CaseAdjust: SYMBOL LP =3 SYMBOL LR =2 SYMBOL RP =1 SYMBOL RR =0 #endrem '-------------------------------------------------------------- SYMBOL DSframe =10 'default SFrame, LOOPs at ~40Hz/25ms SYMBOL Fclear =20 'minimum for toes to miss when walking SYMBOL TSO =3 'Toe Stand Offset - so toes clear each other '************************* 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 cmnd =255 'command done IF f_warm=1 THEN Commander 'Init: SERTXD(CR,"Ullr8 09Aug23",CR) '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) hserinflag =0 hserptr =0 ptr =0 'LoadBehaviour: sertxd("LPC=",#LPC,CR) '=0 on powerup IF LPC=0 THEN :cmnd ="0" GOTO RUN2 ENDIF 'as "b0" Load behaviour 'Behaviour: yawn ="0" 'not bored Sframe =DSframe 'Servo Frame Pause POKE RAM_Sspeed,Sspeed 'Posture: RPat =RPC +TSO 'Servo Right Pace At '+ Toe Stand Offset LPat =LPC -TSO 'Servo Left Pace At '- Toe Stand Offset RRat =RRC 'Servo Right Roll At LRat =LRC 'Servo Left Roll At RPto =RPat 'Servo Right Pace To LPto =LPat 'Servo Left Pace To RRto =RRat 'Servo Right Roll To LRto =LRat 'Servo Left Roll To f_b_F =1 'default going forwards 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 PWMOUT EyeLLED,255,10 'active high Dutycycle for dim PWMOUT EyeRLED,255,10 'active high Dutycycle for dim IF ReactAt=ReactEnd THEN 'leave on if reacting LOW whiskerLLED 'turned on by NewMap LOW whiskerRLED 'turned on by NewMap LOW feelerLLED 'turned on by NewMap LOW feelerRLED 'turned on by NewMap ENDIF lastcmnd =cmnd GOSUB GetCmnd 'and update servos while waiting 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 "$" 'KEY_VCROSS 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 mQrecV vitalN: CASE "5" 'set vitality normal FLcmnd =vnl :FPcmnd =vnp :kickcmnd =vnk :temp0 ="n" :GOTO mQrecV vitalH: CASE "6" 'set vitality high FLcmnd =vhl :FPcmnd =vhp :kickcmnd =vhk :temp0 ="h" mQrecV: 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 "+" 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 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") ENDSELECT '==================================================== DoCmnd: 'sertxd("DoCmnd") '==================================================== 'COMMANDS SELECT cmnd 'CaseQuit: CASE Esc,"Q","q" cmnd ="." :DoAt =0 :InDo =0 :mindAt =0 :ReactAt =ReactEnd :GOTO DoCmnd 'CaseStop 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","M","<",">" :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: '+-012a34UWFGT CASE "$" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting doSensors: RootCmnd="$" : GOTO QRecRUN1 'PARAMETER-COMMANDS wtcuvepasy 'CaseWait: CASE "w" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" f_waitcmnd =1 CASE "1" TO "9" GOSUB QRecord hframes =cmnd -"0" *25 'units about 1/2 sec cmnd="M" GOTO RUN1 ELSE cmnd ="?" ENDSELECT 'CaseTurn: CASE "t" 'rlatmo GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="t" :GOTO QRecRUN1 'CaseCrawl CASE "c" 'fbrl GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="c" :GOTO QRecRUN1 'CaseGetUp: CASE "u" 'fbua GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting f_b_autoUp =0 'else action gets done twicw RootCmnd="u" :GOTO QRecRUN1 'CaseVoice: CASE "v" '1b2e3o4v5s GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="v" :GOTO QRecRUN2 'Case eye: CASE "e" GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd 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 750 'CasePoses: CASE "p" 'seufmbFB GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="p" :GOTO QRecRUN1 'CaseSubroutine: CASE "a" GOSUB QRecord :GOSUB GetSubCmnd 'and update servos while waiting RootCmnd="a" :GOTO QRecRUN1 '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 :Sspeed =Scmnd -"0" 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" :Sspeed =Scmnd -"0" ENDSELECT POKE RAM_Sspeed,Sspeed ' 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" 'I0SlptoikTCug$UWF@ 0$@ CFISTUW gikloptu GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd ' 0 FSUW bdfgklpstu $@ ' 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 "0" TO "9" : FPcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_turn CASE "t" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" : FTcmnd =cmnd ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_ToesOffsetOut CASE "o" 'Toes Offset Out GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" TO "9" : TOO =cmnd -"0" CASE "-" :GOSUB QRecord : GOSUB GetSubCmnd SELECT cmnd CASE "0" TO "9" : TOO =256 -cmnd +"0" ELSE GOSUB tshh ENDSELECT ELSE GOSUB tshh ENDSELECT f_Bmodified =1 ' b_FootIn - side CASE "i" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" : FinCmnd =cmnd 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_Tall CASE "T" 'be Tall GOSUB QRecord f_Crawl =0 ' b_Crawl CASE "C" 'Crawl GOSUB QRecord f_Crawl =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_Ultrasonic CASE "U" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "0" f_b_Uon =0 CASE "1" f_b_Uon =1 'enable Ultrasonic reactions CASE "+" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" temp0 =cmnd -"0" POKE RAM_USawareAt,temp0 ENDSELECT CASE "-" GOSUB QRecord : GOSUB GetSubCmnd 'and update servos while waiting SELECT cmnd CASE "1" TO "9" temp0 =cmnd -"0" POKE RAM_UStoonear,temp0 ENDSELECT 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 :GOTO QRecRUN2 '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 'CaseReset 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[500,Qserial],inIR,IRcmnd 'msg 45ms interwordgap 40ms =85ms. 100 catches next word. f_IRcmnd =1 'SOUND voice,(80,40) '~2.5*40ms =100ms takes us past the end of the next word 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: 'here to miss repeated IR cmnds 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 /2 '0-127 IF mindAt<32 THEN mindAt =mindAt +mindstart 'single char cmnds mindsub =0 ELSE mindAt =mindAt -32 /2 *2 +32 +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 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 [100,_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 servoLR =A.1 'SYMBOL servoLP =A.0 'SYMBOL servoRR =D.3 'SYMBOL servoRP =D.2 'SERTXD(#LRat,#LPat,#RPat,#RRat,cr) TellServos: '@m16 'SERTXD("T") IF f_LRpulse=1 THEN W2pulse =256 -LRat *4 'for 10us to 2.5us pulsout resolution, reverse servo PULSOUT servoLR,W2pulse ENDIF IF f_RRpulse=1 THEN W2pulse =RRat *4 'for 10us to 2.5us pulsout resolution PULSOUT servoRR,W2pulse ENDIF 'TellHipServos: ' TellHipServos: only used in InitLegs: IF f_RPpulse=1 THEN W2pulse =256 -RPat *4 'for 10us to 2.5us pulsout resolution, reverse servo PULSOUT servoRP,W2pulse ENDIF IF f_LPpulse=1 THEN W2pulse =LPat *4 'for 10us to 2.5us pulsout resolution PULSOUT servoLP,W2pulse ENDIF _Spause: 'pause Servo frame W2pulse =Sframe *2 'Pause units 0.5ms @16MHz PAUSE W2pulse '************************* END Machine Dependent ************************* RETURN '====================================================