Continues Read Of Ir Sensor

 
#1

Im a little confused here. I'm simply trying to read the value coming from my IR sensor (one of the Sharp IR ones).
The script I wrote should should be a simple loop and display the value, can continue to display the value until I tell it to stop.

Code:


goto(sensor)
:sensor
$IRSensor = GetADC(ADC4)
# Sharp IR Sensor
print($IRSensor)
sleep(1000)
Return()



It seems to run only a couple of times then stops. That's my issue, why it displays the values twice then stops. What am I missing?
*confused*

#2

script to perform a loop reading:

Code:


:sensor
$IRSensor = GetADC(ADC4)
print($IRSensor)
sleep(1000)
Goto(sensor)

#3

your code only prints two readings and the behavior is correct, let's investigate how return works:

Quote:


Return()
Return from a Goto()



Quote:


1) If you jump to a position of code with a Goto(), the Return statement will allow you to return back to that piece of code following the last Goto() statement.



Quote:


2) If you attempt to Return() with an empty stack, nothing will happen. The script will ignore the Return() statement.



let's follow the execution:
1) goto sensor
2) arrive at sensor label
3) read & print & sleep 1 second
4) call return => do a stack pop => founds a goto (quote point 1)
5) arrive :sensor
6) read & print & sleep 1 second
7) call return => do a stack pop => stack is empty no goto (quote point 2) => do nothing

conclusion 2 readings

#4

@ptp
ok, I think I see it now.I was following a method I've used when programming a Basic Stamp. next test will be to add a ping sensor, then to add a specific value to each to cause some action to happen.

#5

@ptp

This was my next test, which am happy to say works!

Code:


:sensors
$IRSensor = GetADC(ADC4) #Sharp IR sensor
$PingS =GetPing(D16,D16) #Parallax Ping sensor
print($PingS)
print($IRSensor)
sleep(250)
if($IRSensor >=160) #a random value I picked
print("too close")
endif
if($PingS = 12) #should be about 12inches
print(" this is too close!")
endif
Goto(sensors)



Next, since I have 3 stationary ping sensors to add in, and want to run the IR on a servo to sweep.

#6

So I've added a few more sensors, and am able to read the values. But now I wanted to add a couple of mechanical bumper switches. The swicthes work fine in a seperate script, but not quite sure how to add it into this script. Im sure it has something to do with it being in the proper spot within the code,but not quite getting it. Any ideas? Thank you

Code:


:sensors
$IRSensor = GetADC(ADC4) #Sharp IR sensor
$PingL =GetPing(D14,D15) #EZB Ping sensor
$PingF =GetPing(D16,D16) #Parallax Ping sensor
$PingR =GetPing(D18,D19) #EZB Ping sensor
$PingRr=GetPing(D17,D17) #Parallax Ping sensor
print($PingL)
print($PingF)
print($PingR)
print($PingRr)
print($IRSensor)
sleep(750)
if($IRSensor >=160) #a random value I picked
print("too close")
#sleep(500)
endif
if($PingL <= 14) #should be about 14inches
print("Left corner is near!")
#sleep(500)
endif
if($PingF <= 12) #should be about 12inches
print(" this is too close!")
#sleep(500)
endif
if($PingR <= 16) #should be about 16inches
print("Right corner is near!")
#sleep(500)
endif
if($PingRr <= 18) #should be about 14inches
print("Backed up too close!")
#sleep(500)
endif
#goto(sensors)
:switches #this part still not working right---
if (ADC_Wait(ADC0,lower,50)) #Left Bumer Switch
print("Left Bumper")
endif
if (ADC_Wait(ADC1,lower,50)) #Right Bumper Switch
print("Right Bumber")
endif
goto (switches)
goto(sensors)


*confused* *confused* *confused*

#7

it's important to understand how ADC_Wait works and the impact in a loop script.

Code:


ADC_Wait(ADC0,lower,50)



is similar to:

Code:


:adc_wait_loop
Sleep(100) # ADC_Wait's 4 Th parameter if not specified the delay is 100 ms
$a = GetADC(ADC0)
if ($a >= 50)
#value is not less than 50 so keep the loop
Goto(adc_wait_loop)
endif



it's easy to understand each ADC_Wait blocks the script until the condition is met, the delay is used to define how frequent EZBuilder pulls an ADC reading from the EZB.

The question is this what you want ?

if you don't want ADC_Wait to block the script you should change to :

Code:


$a = GetADC(ADC0)
if ($a<50)
print("left bumper")
endif

#8

@ptp
Morning! yes that is correct, I don't want the ADC to Wait. I want to run and loop just like the sensors are doing. In most cares the bumpers will act as a secondary if any of the other sensors failed to stop the robots forward motion.

The ultimate goal will be to have the IR sensor on a servo to sweep, but will only sweep after one of the other sensors have been triggered. Then the robot performs another task,etc.
Thank you again. I will try some more experiments tonight,love to see what happens! Grin

#9

So I've made alt of progress with adding all the sensors in my test routine here. My newest attempt was the IR sensor as a radar (is servo on SSC32- V0). I figured out how to use the ControlCommand("Sharp IR Radar", PauseOn) and pauseoff commands. What i really would like to figure out now is if there is a way to make the Sharp IR Radar command only be activated when called upon to do so, then made to stop when told to do so. I didn't see anything usuefull within the "cheat sheet". Is there another command to use I may have missed? or a script to use?

Code:


:sensors
$IRSensor = GetADC(ADC4) #Sharp IR sensor
$PingL =GetPing(D14,D15) #EZB Ping sensor
$PingF =GetPing(D16,D16) #Parallax Ping sensor
$PingR =GetPing(D18,D19) #EZB Ping sensor
$PingRr=GetPing(D17,D17) #Parallax Ping sensor
print($PingL)
print($PingF)
print($PingR)
print($PingRr)
print($IRSensor)
sleep(750)
#starts the IR radar sweeping
ControlCommand("Sharp IR Radar", PauseOn)
if($IRSensor >=160) #a random value I picked.
print("too close")
ControlCommand("Sharp IR Radar", PauseOn)
#pauses the sweep when thevalue is found, then resumes when clear.
#sleep(500)
endif
if($PingL <= 14) #should be about 14inches.
print("Left corner is near!")
#sleep(500)
endif
if($PingF <= 12) #should be about 12inches.
print(" this is too close!")
#sleep(500)
endif
if($PingR <= 16) #should be about 16inches.
print("Right corner is near!")
#sleep(500)
endif
if($PingRr <= 18) #should be about 14inches
print("Backed up too close!")
#sleep(500)
endif
$a = GetADC(ADC0) #left bumper switch
if ($a<50)
print("left bumper")
endif
$a = GetADC(ADC1) #right bumper switch
if ($a<50)
print("right bumper")
endif
goto(sensors)


*eek*

#10

Hi, RoboHappy. Why are you using the analog ports for the bumpers. It is a simple 1 or 0 contact, use the digital ports and save the analog for future use.
Regards.