'**************************************************************** '* Name : rolly4.BAS * '* Author : Bill Sherman * '* Notice : Copyright (c) 2001 Bill Sherman * '* : All Rights Reserved * '* Date : 6-17-02 * '* Version : 1.0 * '* Notes : wheel speed con added * '* : 813 words used * '**************************************************************** define osc 20 TRISA=%11110100 'set porta i/o as needed TRISB=%00010101 'set portb i/o as needed rest var byte 'decide to rest var y var byte 'scan count f var byte 'forward movement count s var byte 'backing up count n var word 'for/next loop counter righteye var portb.4 'right sensor lefteye var portb.2 'left sensor speed con 20 'speed variable pyro var portb.0 'pyro heat sensor irrec var porta.4 'reciever for commands push var porta.2 'pushbutton switch lwheel con 764 'left servo wheel zero speed rwheel con 776 'right servo wheel zero speed init: 'initalize key systems low portb.3 'turn off ir low porta.3 'beeper off s=0 'backup count zero y=0 'scan count zero f=0 'set backing up count to 1 rest = 0 'clear rest var to zero gosub zero 'stop servos flash: 'flash blue led, detect mode select, servos ON high porta.1 'turn on motor pwr high portb.1 'turn on blue led if push = 0 then watchdog 'Hold down button at ON for watchdog mode pause 2000 low portb.1 'turn off blue led pulseme: high portb.1 'blue led ON for n= 1 to 250 'start burst 38 kc high portb.3 'led on pauseus 2 'led on for 2 more usec low portb.3 'led off pauseus 13 '0ff time for led next n 'repeat to complete waveform burst sense: 'check for objects in front, right, left if (lefteye = 0) AND (righteye = 0) then backup if righteye = 0 then turnleft if lefteye = 0 then turnright low portb.1 'blue led off forward: 'move ahead high porta.1 'pwr up servo for n=1 to 20 'generate PWM for servos to move forward low porta.0 pulsout porta.0,(lwheel+speed) 'left servo low portb.5 pulsout portb.5,(rwheel-speed) 'right servo pause 20 if righteye = 0 then goto command 'look for IR from Remote next low portb.6 'red led off f=f+1 'increment forward motion counter if f>40 then goto scan 'clear forward path has been taken goto pulseme backup: 'backup f=0 'clear forward counts gosub zero 'stop all servos gosub beep 'beep high porta.1 'pwr up servo for n=1 to 15 'generate PWM for servos to backup low porta.0 pulsout porta.0,(lwheel-(speed-5)) low portb.5 pulsout portb.5,(rwheel+(speed-5)) pause 20 next s=s+1 'count backups if s>8 then goto turnright 'if >8 backups occur, then turn goto pulseme turnright: 'turn right f=0 'clear forward counts s=5 'advance backup counts by 5 when turning high porta.1 'pwr up servo for n=1 to 20 'generate PWM for servos to turn right low porta.0 pulsout porta.0,(lwheel+speed) low portb.5 pulsout portb.5,(rwheel+speed) pause 20 next goto pulseme turnleft: 'turn left f=0 'clear forward counts s=2 'advance backup counts by 2 when turning high porta.1 'pwr up servo for n=1 to 20 'generate PWM for servos to turn left low porta.0 pulsout porta.0,(lwheel-speed) low portb.5 pulsout portb.5,(rwheel-speed) pause 20 next goto pulseme zero: 'stop the servos for n=1 to 5 low porta.0 pulsout porta.0,lwheel low portb.5 pulsout portb.5,rwheel pause 20 next low porta.1 'pwr down servo return beep: sound portb.7, [75,10,110,10] 'make a sound return scan: 'seeks ir beacon y=0 'clear scan turn count s=0 'clear backup counts scan2: gosub zero f=0 'forward step counts y=y+1 'scan count high portb.1 'turn on blue led high porta.3 'beeper on 'make a sound for i am lost for n=1 to 20 'loop 20 seeks for beacon if irrec = 0 then beacon pause 10 low portb.1 'blue led off next n 'if no heat, then loop every 10 ms low porta.3 'beeper off high porta.1 'pwr up servo for n=1 to 10 'scan right pulsout porta.0,(lwheel+speed) 'PWM to rotate right low portb.5 pulsout portb.5,(rwheel+speed) pause 20 next n if y > 16 then hotbody 'after turning around goto pulseme goto scan2 'if less than 18 turns then turn cw beacon: pause 500 'pause a bit low porta.3 'turn off beeper goto forward 'go toward operator hotbody: 'seeks heat y=0 'clear number of scan turns hotbody2: gosub zero y=y+1 'scan count pause 3000 'wait for pyro to settle high portb.1 'turn on blue led pause 100 low portb.1 'turn off blue led for n=1 to 500 'loop 500 seeks for heat if pyro = 1 then high portb.6 'turn on red led if pyro = 1 then rest = 0 'reset rest var to zero if pyro = 1 then goto pulseme 'goto pulseme (body of program) if irrec = 0 then goto beacon 'still can seek ir from operator low portb.1 'turn off blue led pause 10 'if no heat, then loop every 10 ms next n high porta.1 'pwr up servo for n=1 to 30 'scan left pulsout porta.0,(lwheel-speed) low portb.5 pulsout portb.5,(rwheel-speed) pause 20 next n rest = rest + 1 'increment rest value if rest > 18 then watchdog 'goto watchdog and wait if y > 5 then goto pulseme 'after turning around goto pulseme goto hotbody2 'if less than 6 turns then turn cw command: 'operator can make it turn to the right gosub beep pause 500 goto turnright watchdog: low porta.1 'turn off motor pwr low portb.1 'turn blue led off high porta.3 'beep pause 2000 low porta.3 'stop beep s=s+1 if s > 4 then flash 'dog comes out if disturbed 5 times watchdog2: if pyro = 1 then watchdog 'look for heat if push = 0 then watchdog3 'look for silent watchdog mode if righteye = 0 then flash 'look for IR-remote signal goto watchdog2 watchdog3: 'silent watchdog if righteye = 0 then flash 'look for IR-remote signal if pyro = 0 then watchdog3 'look for heat high portb.1 'flash blue led for 1 second pause 1000 'if it sees heat low portb.1 goto watchdog3 end