'********************************************************************************************* ' conditons-remote.bas ' Robot uses seperate walking subroutines for each of the 8 direction commands. ' The robot walks in a smooth, coordinated manner. ' PicBasic Pro compiler - MicroEngineering Labs. '********************************************************************************************* trisa = %00000011 ' set porta pins 0&1 to inputs trisb = %00001000 ' set portb pin 3 to input m_servo var byte ' define variables and constants l_servo var byte r_servo var byte timer var byte right_led var PORTB.0 left_led var PORTB.1 trigger var PORTB.2 echo var PORTB.3 piezo var PORTB.4 right_servo var PORTB.5 left_servo var PORTB.6 mid_servo var PORTB.7 chan_1 var PORTA.0 chan_2 var PORTA.1 Channel_1 var byte Channel_2 var byte dist_raw var word dist_inch var word conv_inch con 15 ' conversion factor for inches turn var byte I var byte low trigger ' set sonar trigger low low left_led ' turn off left LED low right_led ' turn off right LED sound piezo,[100,10,50,5,70,10,50,2] ' Make startup sound trans_power: pulsin chan_1,1,channel_1 ' check to see if the transmitter is pulsin chan_2,1,channel_2 ' turned on or not if (channel_1 > 155 or channel_1 < 145) or (channel_2 > 155 or channel_2 < 145) then sound piezo,[100,5] goto trans_power ' if transmitter is off then keep endif ' checking main: pulsin chan_1,1,channel_1 ' get receiver values for channels 1 & 2 pulsin chan_2,1,channel_2 if channel_1 = 0 or channel_2 = 0 then ' check to see if the transmitter is off goto trans_power ' or out of range. endif If channel_2 > 180 and (channel_1 > 145 and channel_1 < 155) then gosub walk_forward endif If channel_2 < 120 and (channel_1 > 145 and channel_1 < 155) then gosub walk_reverse endif If channel_1 < 120 and (channel_2 > 145 and channel_2 < 155) then gosub turn_right endif If channel_1 > 180 and (channel_2 > 145 and channel_2 < 155) then gosub turn_left endif If channel_1 < 120 and channel_2 > 180 then gosub right_forward endif If channel_1 > 180 and channel_2 > 180 then gosub left_forward endif If channel_1 < 120 and channel_2 < 120 then gosub right_reverse endif If channel_1 > 180 and channel_2 < 120 then gosub left_reverse endif gosub sr_sonar ' get sonar ranger information if dist_inch < 6 then ' check to see if the robot is within 5 inches of high left_led ' an object. Make warning noise and flash LEDs if high right_led ' an obstacle is encountered. sound piezo,[80,10,100,5,110,2,90,2] low left_led low right_led endif Goto main walk_forward: ' walk froward subroutine m_servo = 170 gosub servo l_servo = 160 r_servo = 160 gosub servo m_servo = 100 gosub servo l_servo = 120 r_servo = 120 gosub servo return walk_reverse: ' walk reverse subroutine m_servo = 170 gosub servo l_servo = 120 r_servo = 120 gosub servo m_servo = 100 gosub servo l_servo = 160 r_servo = 160 gosub servo return turn_left: ' rotate the robot left 15 degree m_servo = 170 gosub servo l_servo = 120 r_servo = 160 gosub servo m_servo = 100 gosub servo l_servo = 160 r_servo = 120 gosub servo return turn_right: ' rotate the robot right 15 degrees m_servo = 170 gosub servo l_servo = 160 r_servo = 120 gosub servo m_servo = 100 gosub servo l_servo = 120 r_servo = 160 gosub servo return right_forward: ' foward right subroutine m_servo = 170 gosub servo l_servo = 160 r_servo = 140 gosub servo m_servo = 100 gosub servo l_servo = 120 r_servo = 130 gosub servo return left_forward: ' walk froward subroutine m_servo = 170 gosub servo l_servo = 140 r_servo = 160 gosub servo m_servo = 100 gosub servo l_servo = 130 r_servo = 120 gosub servo return right_reverse: ' walk reverse subroutine m_servo = 170 gosub servo l_servo = 130 r_servo = 120 gosub servo m_servo = 100 gosub servo l_servo = 140 r_servo = 160 gosub servo return left_reverse: ' walk reverse subroutine m_servo = 170 gosub servo l_servo = 120 r_servo = 130 gosub servo m_servo = 100 gosub servo l_servo = 160 r_servo = 140 gosub servo return sr_sonar: pulsout trigger,1 ' send a 10us trigger pulse to the SRF04 pulsin echo,1,dist_raw ' start timing the pulse width on echo pin dist_inch = (dist_raw/conv_inch) ' Convert raw data into inches pause 1 ' wait for 10us before returning to main return servo: ' subroutine to set servos for timer = 1 to 10 pulsout mid_servo,m_servo pulsout left_servo,l_servo pulsout right_servo,r_servo pause 13 next timer return End