'>CyclerHead '{$Stamp BS2} 'edit hmm for Shakespeare,Byron,Shelley '@ - marker '----------------------------------------------------------- 'Old ideas '--------- 'Cmnds 'n - nod up 'N - Nod down 's - shake Right 'S - shake Left 'z - no command 'Data 'N - nod, NU,NC,ND 'S - shake SR,SC,SL 'E - eyes position ER,EC,EL 'R - right eye pattern 'L - left eye pattern 'B - both eyes pattern 'z - end of list '----------------------------------------------------------- 'Notes '----- 'After a wakeup msg the idletime is it =itnokey. 'The default idletime is 256 since:- ' on entry it=0 unless set ' then it counts down to 255 ' <>0 we loop back to pause. '----------------------------------------------------------- 'Eopen 'BlinkR 'BlinkL 'Blink 'BlinkR2 'BlinkL2 'Blink2 'BlankR2 'BlankL2 'Blank2 'cmnd from top BS2 'keyA cmnd.bit0 HRm FD 'keyB cmnd.bit1 HRm BK 'keyC cmnd.bit2 HLm FD 'keyD cmnd.bit3 HLm BK 'chan.bit0 cmnd.bit4 not used 'chan.bit1 cmnd.bit5 not used 'chan.bit2 cmnd.bit6 not used 'still cmnd.bit7 if bit set then centre Head and Eyes and close Eyes ' 'BS2 pins '-------- ' eyes 012 210 ' 543 345 'outL(0-5) right eye 'outH(0-5) left eye listenpin CON 6 'listen_to_me from master controller listen_i VAR IN6 'listen_to_me from master controller Empin CON 7 'eye vo pin Rmpin CON 14 'right head-motor pin Lmpin CON 15 'left head-motor pin 'Serial i/o is through through pins 16 'BS2 2uS/count servo position data in 4us units, 0 to 250 for 0 to 1000us 'sp var word 'Servo Pulse i96n CON 16468 'baud i96n - BS2 tout CON 100 'timeout cmnd in eyesL CON 255 eyesC CON 127 '157 eyesR CON 0 basepulse CON 250 '1000ms in 4us units smin CON 250 '1000ms in 4us units smax CON 500 '2000ms in 4us units pscale CON 2 'BS2 4us to 2us flags VAR Byte i VAR Byte 'loop counter - Randeyes still_time VAR i 'be_still counter still_at CON 20 'no pulses after still_time>still_at ptcount VAR Byte '@nib 'loop counter - _pause pt VAR Byte '@nib 'frame delay pause time ptmove CON 6 'frame delay during a move ptidle CON 10 'frame delay during idle it VAR Byte 'idletime itkeymove CON 100 'idletime after a key move cmnd VAR pt 'cmnd from top processor keys VAR cmnd.LOWNIB 'cmnd from BS2_Brain keyA VAR cmnd.BIT0 keyB VAR cmnd.BIT1 keyC VAR cmnd.BIT2 keyD VAR cmnd.BIT3 still VAR cmnd.BIT7 'if bit set then only flash eyes be_still CON 128 'cmnd from BS2_Brain eyesP VAR Word 'eyes Pattern, Random workspace eyePR VAR eyesP.LOWBYTE 'eye Pattern Right eyePL VAR eyesP.HIGHBYTE 'eye Pattern Left eyeP VAR eyePL 'eye Pattern eD VAR Byte 'eye Data pointer et VAR Byte 'pause time for eye data re VAR et 'random eye count ec VAR et 'Eye Count be_still ret CON 100 'pause time for random eyes Es VAR Byte 'eye speed 25 is about fastest Emax CON 255 Emin CON 0 eyesat VAR Byte 'current eyes position eyesto VAR Byte 'desired eyes position f_Edir VAR flags.BIT2 'HRm 0=servoarm forwards =>head up 'HLm 0=servoarm forwards =>head up hD VAR Byte 'head Data pointer Hpulses VAR Byte 'number of pulses to servo HmRpulse VAR Word HmLpulse VAR Word 'Nod up=0, Shake right=0 HLmmin CON 0 'up HLmC CON 170 'Head Nod Centre HLmmax CON 250 'down HRmmin CON 0 'up HRmC CON 170 'Head Shake Centre, right=0, left=255 HRmmax CON 250 'down Hs VAR Byte 'head speed Headat VAR Word HLmat VAR Headat.HIGHBYTE HRmat VAR Headat.LOWBYTE Headto VAR Word HLmto VAR Headto.HIGHBYTE HRmto VAR Headto.LOWBYTE f_HRmdir VAR flags.BIT0 f_HLmdir VAR flags.BIT1 'f_Edir var flags.bit2 f_be_still VAR flags.BIT3 mov VAR Byte hmm CON 170 'head move mean Shakespeare 'hmm con 140 'head move mean Byron 'hmm con 160 'head move mean Shelley 'Note in BeStill HLmC,HRmC are used not hmm, - oops! '-------------------------------------------------------------------- init: DIRL =255 DIRH =255 INPUT listenpin LOW Empin LOW Rmpin LOW Lmpin HRmat =170 :HLmat =170 :Eyesat =EyesC HLmto =170 :HRmto =170 :Eyesto =EyesC :it =70 Hs =3 :Es =3 'speeds mov =255 GOSUB _Eopen GOSUB _Blink ' goto positioneyes 'and END - test eye position pt =255 :GOSUB Lpause '------------------------ MOVES: GOTO rmoves '********** 1 NOT USED ******** mov =mov +1 DEBUG ?mov BRANCH mov,[_00,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13] mov =255 'so it counts to 0 _00: HLmto =170 :HRmto =170 :it =5 :GOTO Move _0: Eyesto =EyesC :it =5 :GOTO Move _1: eyePR =255 :eyePL =255 :GOSUB Seteyes :GOTO MOVES 'nod _2: HLmto =250 :HRmto =250 :it =5 :GOTO Move _3: HLmto =100 :HRmto =100 :it =5 :GOTO Move _4: HLmto =250 :HRmto =250 :it =5 :GOTO Move 'centre _5: HLmto =170 :HRmto =170 :it =5 :GOTO Move 'shake _6: HLmto =240 :HRmto =110 :it =7 :GOTO Move _7: HLmto =110 :HRmto =240 :it =7 :GOTO Move _8: HLmto =240 :HRmto =110 :it =7 :GOTO Move _9: HLmto =170 :HRmto =170 :it =7 :GOTO Move _10: Eyesto =0 :it =5 :GOTO Move _11: re =5 :GOSUB Randeyes :GOTO MOVES _12: Eyesto =255 :it =5 :GOTO Move _13: re =5 :GOSUB Randeyes :GOTO MOVES '**********END 1 NOT USED ******** rmoves: Hs =3 RANDOM eyesP 'use eyesP as scratchpad workspace mov =eyePR.LOWNIB BRANCH mov,[mH,eP,mE,eP,mH,eP,mE,eP,eP,mE,eP,mE,eP,mE,eP,eP] 'mH2,mE5,eP9 GOTO rmoves mH: eyePL =eyePL*eyePL/256*eyePL/256*eyePL/256/2 eyePR =eyePR*eyePR/256*eyePR/256*eyePR/256/2 'choose a bit and add or subtract eyePx value to neutral position(=170) 'depending on bit value. it =20 _lm: IF eyePL.BIT2=0 THEN HLmless HLmto =hmm +eyePL MAX 255 GOTO _rm HLmless: HLmto =hmm -(eyePL MAX hmm) _rm: IF eyePR.BIT3=0 THEN HRmless HRmto =hmm +eyePR MAX 255 GOTO _ec HRmless: HRmto =hmm -(eyePR MAX hmm) _ec: eyesto =eyesC GOTO move mE: it =10 IF eyePL.BIT6=0 THEN reless eyesto =127 +eyePL MAX 255 GOTO move reless: eyesto =127 -(eyePL MAX 127) GOTO move eP: re =eyePR.HIGHNIB GOSUB Randeyes GOTO rmoves '---------------------------------- MOVE: pt =ptmove _HLm: IF HLmat=HLmto THEN _endHLm IF HLmat>HLmto THEN _decHLm IF HLmatHRmto THEN _decHRm IF HRmatEyesto THEN _decE IF Eyesatstill_at THEN _Ppause 'no pulses HmRpulse =HRmat +basepulse *pscale HmLpulse =HLmat +basepulse *pscale PULSOUT Rmpin,HmRpulse PULSOUT Lmpin,HmLpulse PULSOUT Empin,Eyesat +basepulse *pscale _Ppause: 'Pulse pause GOSUB Lpause 'check if done IF HLmat<>HLmto OR HRmat<>HRmto OR Eyesat<>Eyesto THEN MOVE _Idle: pt =ptidle it =it -1 IF it<>0 THEN _Hpulse IF f_be_still=1 THEN _Ppause GOTO MOVES '---------------------------------- Lpause: 'Listen pause FOR ptcount=1 TO pt IF listen_i=1 THEN LISTEN ' pause 1 NEXT RETURN '---------------------------------- LISTEN: PAUSE 1 SEROUT 16,i96n,[">"] SERIN 16,i96n,tout,Move,[cmnd] IF keys=0 THEN Lep OUTL =keys 'debug aid OUTH =keys 'cmnd.highnib 'debug aid GOTO Qstill Lep: OUTH =eyePL & %111111 OUTL =eyePR & %111111 Qstill: IF cmnd=be_still THEN _be_still ' cmnd=0=wakeup or =127=be_still or chan=3=head ' so channel info ignored f_be_still =0 still_time =0 IF cmnd=0 THEN init IF keys =0 THEN endkeymove 'wakeup=>keys=0 'keys CA ' E DB 'if A&B then A _kB: IF keyB=0 THEN _kA HRmto =HRmmin _kA: IF keyA=0 THEN _kD HRmto =HRmmax 'if C&D then C _kD: IF keyD=0 THEN _kC HLmto =HLmmin _kC: IF keyC=0 THEN _endk HLmto =HLmmax _endk: eyesto =eyesC Hs =6 GOTO dokeymove 'Move _be_still: f_be_still =1 still_time =still_time +1 MAX 255 ec =ec +1 eyePR =%010000 :eyePL =%010000 :GOSUB Seteyes ' outL =ec &%111111 'put a count out to eyes ' outH =ec &%111111 HLmto =HLmC HRmto =HRmC eyesto =eyesC GOTO dokeymove endkeymove: HLmto =HLmat HRmto =HRmat dokeymove: it =itkeymove GOTO Move '---------------------------------- Seteyes: OUTH =eyePL & %111111 OUTL =eyePR & %111111 RETURN '---------------------------------- Randeyes: FOR i =0 TO re RANDOM eyesP OUTH =eyePL & %111111 OUTL =eyePR & %111111 'corrects servo overrun PULSOUT 7,eyesat +basepulse MIN smin MAX smax *pscale pt =ret :GOSUB Lpause NEXT RETURN '------------------------------------------------------- ' R L ' D1 D1 ' D0 D2 D2 D0 ' D5 D3 D3 D5 ' D4 D4 _Eopen: eD =Deopen :GOTO _eye2 _BlinkR: eD =Dblink1 :GOTO _eyeR _BlinkL: eD =Dblink1 :GOTO _eyeR _Blink: eD =Dblink1 :GOTO _eye2 _BlinkR2: eD =Dblink2 :GOTO _eyeR _BlinkL2: eD =Dblink2 :GOTO _eyeL _Blink2: eD =Dblink2 :GOTO _eye2 _BlankR2: eD =Dblank2 :GOTO _eyeR _BlankL2: eD =Dblank2 :GOTO _eyeL _Blank2: eD =Dblank2 :GOTO _eye2 Deopen DATA DATA %000000,100 DATA %010000,100,%111000,100,%111101,100,%111111,100 DATA 255 Dblink1 DATA DATA %111111,50,%111101,50,%111000,50,%010000,50 DATA %000000,254 DATA %010000,50,%111000,50,%111101,50,%111111,50 DATA 255 Dblink2 DATA DATA %111111,50,%111101,50,%111000,50,%010000,50 DATA %000000,254 DATA %010000,50,%111000,50,%111101,50,%111111,50 DATA %111111,50,%111101,50,%111000,50,%010000,50 DATA %000000,254 DATA %010000,50,%111000,50,%111101,50,%111111,50 DATA 255 Dblank2 DATA DATA %111111,50,%0,254,%111111,254,%0,254,%111111,254,255 _eyeR: READ eD,eyeP :eD =eD +1 IF eyeP=255 THEN _return READ eD,pt :eD =eD +1 OUTL =eyeP & %111111 GOSUB Lpause GOTO _eyeR _eyeL: READ eD,eyeP :eD =eD +1 IF eyeP=255 THEN _return READ eD,pt :eD =eD +1 OUTH =eyeP & %111111 GOSUB Lpause GOTO _eyeL _eye2: READ eD,eyeP :eD =eD +1 IF eyeP=255 THEN _return READ eD,pt :eD =eD +1 OUTL =eyeP & %111111 OUTH =eyeP & %111111 GOSUB Lpause GOTO _eye2 _return: RETURN '-------------------------------------------------------------------------------- positioneyes: 'TEST ONLY 'Moveyes: FOR i =eyesat TO eyesto STEP es PULSOUT 7,i +basepulse MIN smin MAX smax *pscale eyesat =i PAUSE 20 NEXT END RETURN '================================================================================= '-----------------NOT USED --------------------- 'can't use these because don't LISTEN play0: GOSUB HeadR PAUSE 2000 GOSUB HeadL PAUSE 2000 GOSUB HeadC PAUSE 2000 GOSUB HeadNod GOSUB _Blink PAUSE 2000 GOSUB HeadShake GOSUB _Blink PAUSE 2000 GOTO play0 'head DATA Hpulses,HLmto,HRmto, Hpulses,HLmto,HRmto,...,255 DHeadR DATA 50,250,0, 255 DHeadC DATA 100,170,170, 255 DHeadL DATA 50,0,225, 255 DHeadD DATA 50,250,225, 255 DHeadU DATA 50,0,0, 255 DHeadN DATA 15,250,225, 15,0,0, 15,250,225, 15,0,0, 30,175,175, 255 DHeadS DATA 13,185,65, 13,65,185, 13,185,65, 13,65,185, 30,175,175, 255 HeadR: hD =DHeadR :GOTO Headplay HeadC: hD =DHeadC :GOTO Headplay HeadL: hD =DHeadL :GOTO Headplay HeadD: hD =DHeadD :GOTO Headplay HeadU: hD =DHeadU :GOTO Headplay HeadNod: hD =DHeadN :GOTO Headplay HeadShake: hD =DHeadS :GOTO Headplay Headplay: READ hD,Hpulses :hD =hD +1 IF Hpulses=255 THEN _Hpret READ hD,HLmto :hD =hD +1 :HLmat =HLmto READ hD,HRmto :hD =hD +1 :HRmat =HRmto GOSUB Headset Eyesat =Eyesto GOTO Headplay _Hpret: RETURN Headset: FOR i =0 TO Hpulses PULSOUT Lmpin,HLmto +basepulse *pscale PULSOUT Rmpin,HRmto +basepulse *pscale PULSOUT 7,Eyesto +basepulse *pscale PAUSE 10 NEXT RETURN '--------------------------------------------------------------------------------- FOR i =0 TO 30 PULSOUT Rmpin, 2000/2 MAX 950 PULSOUT Lmpin, 2000/2 PAUSE 20 NEXT '-----------------NOT USED --------------------- initE: DIRL =255 DIRH =255 INPUT listenpin INPUT Empin INPUT Rmpin INPUT Lmpin et =100 FOR i =0 TO 5 RANDOM eyesP OUTH =eyePL & %111111 OUTL =eyePR & %111111 PULSOUT 7,eyesC +basepulse *pscale PAUSE et NEXT eyesat =eyesC re =5 :GOSUB randeyes ' gosub BlinkR1 ' gosub BlinkR2 GOSUB _Blink2 ' gosub Blank2 GOSUB _BlankL2 eyePR =255 :eyePL =255 :GOSUB seteyes '# eyesto =eyesL :es =1 :gosub moveyes GOSUB DoEyes GOTO initE DoEyes: re =10 :GOSUB Randeyes eyePR =255 :eyePL =255 :GOSUB Seteyes '# eyesto =eyesC :es =5 :gosub Moveyes re =20 :GOSUB Randeyes eyePR =255 :eyePL =255 :GOSUB Seteyes '# eyesto =eyesR :es =1 :gosub Moveyes re =5 :GOSUB Randeyes GOSUB _BlinkR2 eyePR =255 :eyePL =255 :GOSUB Seteyes '# eyesto =eyesL :es =10 :gosub Moveyes GOSUB _BlinkL2 ' eyesto =eyesC :es =5 :gosub Moveyes ' re =5 :gosub Randeyes RETURN 'doeyes