' {$STAMP BS1}
'>TinyTim DLB 20-5-94
READ 255,B0 :DEBUG B0 'b0=4 =first byte used, ie. 2 => 0 and 1 free
'History
'-------
'14-4-97 tidyed, keywords now in uppercase
'9-4-97 Tiny Tim's Hg cells (4.05v) changed to Ag cells (4.5v)
'29-7-96 bump L was 42 now 40, Song2 was for 3 now 2
'Notes
'-----
'0-Rmf 1-Rmb 2-Lmf 3-Lmb 4-whiskers 5-speaker 6-eyeR 7-eyeL
'm-motor f-forward b-backward R-right L-left
'bump sensors -: Rf-4k7 Lf-10k Rr-22k Lr-47k, all in parallel then in series with 0u1
'eyes:- each side - LDR in series with 0u1
'f-front r-rear
'random reversing time 'revtime' in Song3 avoids repeated bump/reverse
'w0 b1 FOR counter i b0 temp for prog size
'w1 b3 POT darkL b2 POT bump, darkR
'w2 b5 dark gradient b4
'w3 b7 b6 movemask
'w4 b9 explore counter b8 frustrated counter
'w5 RANDOM freewill b11 revtime b10 randmove
'w6 GOSUB
SYMBOL whiskers =4 'Pin4
SYMBOL spkr =5 'Pin5 speaker
SYMBOL eyeR =6 'Pin6 right LDR
SYMBOL eyeL =7 'Pin7 left LDR
SYMBOL i =B1 'FOR counter
SYMBOL bump =B2
SYMBOL darkR =B2 'right eye light level
SYMBOL darkL =B3 'left eye light level
SYMBOL deltadark =B5 'darkness gradient between left and right eyes
SYMBOL movemask =B6 '%1010=>motors forward only
SYMBOL frust =B8 'frustrated level
SYMBOL explores =B9 'explore counter
SYMBOL randmove =B10 'random value for motor pins gives random move
SYMBOL revtime =B11 'reverse time in Song3 for avoid
SYMBOL freewill =W5 'RANDOM
SYMBOL bumpscale =55 'adjust so b2 unbumped is 33, b2 prop to scale
SYMBOL wfront =150 'threshold for both front whiskers hit
SYMBOL wright =70 'threshold for right front whisker hit
SYMBOL wleft =40 'threshold for left front whisker hit
' can't reliably tell which rear whisker is hit so don't try
SYMBOL nobump =34 'threshold for bumping
SYMBOL lightscale =100
SYMBOL bright =50 'black is 255, incandescent is 0
SYMBOL evendark =20 'minimum difference between eyes for action
SYMBOL exploremax =6 'explore loops+1 before new move
SYMBOL frustrated =50 '<maxfrust
SYMBOL maxfrust =60 '<254 otherwise counts to 0!!
SYMBOL frustup =5 'frustration growth rate
SYMBOL frustdown =1 'frustration decay rate
frust =0
movemask =%1010 'only forwards
start:
DIRS =%1111 ' motor pins to Output in case noise corrupted them
GOSUB Song 'timer for main loop
RANDOM freewill
revtime =revtime&%11 'limit to random time in Song3 for avoids
frust =frust -frustdown
frust =frust MIN 1
'debug %pins
bumps:
POT whiskers,bumpscale,bump
DEBUG bump
IF bump<nobump THEN eyes 'ie no bump 'else
frust =frust +frustup 'bumped so increment
movemask =%1010 'guess motors only forward
IF frust<frustrated THEN cont1 'else really frustrated so
movemask =%1111 'motors any direction
frust =frust MAX maxfrust 'endif, endif
cont1:
IF bump>wfront THEN avoidLR 'bumped both front whiskers
IF bump>wright THEN avoidR 'bumped front right whisker
IF bump>wleft THEN avoidL 'bumped front left whisker
movemask =%1010
GOTO newmove 'must be at rear so avoid rear
eyes:
POT eyeR,lightscale,darkR
POT eyeL,lightscale,darkL
DEBUG #darkL,#darkR,CR 'cmnd only takes 2 bytes!
IF darkR>darkL THEN darkright
darkleft:
deltadark =darkL -darkR
IF deltadark<evendark THEN explore 'even light so explore
IF darkR>bright THEN turnright 'if bright light then rotate
GOTO curveright 'else curve towards light
darkright:
deltadark =darkR -darkL
IF deltadark<evendark THEN explore 'even light so explore
IF darkL>bright THEN turnleft 'if bright light then rotate
GOTO curveleft 'else curve towards light
explore:
explores =explores +1
IF explores<exploremax THEN start 'else newmove
newmove:
PINS =randmove&movemask 'new motor settings
explores =0 'reset counter
GOTO start
avoidLR:
PINS =%0101 :GOSUB Song3 :PINS =%0100 :NAP 4 :GOTO start
avoidR:
PINS =%0101 :GOSUB Song3 :PINS =%0100 :NAP 4 :GOTO start
avoidL:
PINS =%0101 :GOSUB Song3 :PINS =%0001 :NAP 4 :GOTO start
turnleft:
PINS =%0110 :GOSUB Song2 :GOTO start
turnright:
PINS =%1001 :GOSUB Song2 :GOTO start
curveleft:
PINS =%0010 :GOSUB Song1 :GOTO start
curveright:
PINS =%1000 :GOSUB Song1 :GOTO start
Song:
FOR i =100 TO 110
SOUND spkr,(i,1)
NEXT i
RETURN
Song1:
SOUND spkr,(100,5,0,5)
RETURN
Song2:
SOUND spkr,(126,2,0,2)
RETURN
Song3:
FOR i =0 TO 50
SOUND spkr,(227,revtime)
NEXT i
RETURN
'Song5: SOUND spkr,(227,10) :RETURN
'Song4: SOUND spkr,(180,revtime) :RETURN