Ping)))Dar But Using SRF04 Problems/Issues
Rocko
Posts: 8
My end game is to have my BoeBot use the PingDar_GoToClosestObject.bs2 program successfully.
Let me first say that I am using a generic SFR04 instead of a Parallax Ping Sensor.
The SFR04 is connected to the top of a servo.
I have the SRF04 in Mode 2 whereby a 10K ohm resistor is placed between the Trigger and the Echo pins.
Using PingServoCenter.bs2, I was able to establish:
ServoCenter: 750
LimitLeft: 289
LimitRight: 1189
When I put these values into Ping)))Dar.bs2 (see below) and run the program, the SRF04/servo swings hard right and stops and the only thing that appears on the radar (Debug) screen is the X and a single blinking * off to the right.
If I swap the LimitLeft and LimitRight values, the SRF04/servo sweeps back and forth between limits as it should and the radar screen displays & updates the half circle of ***s as it should with the exception that when an obstacle is put into the field, its ***s appears on the opposite side of the X then where they should. (???)
(Note: I have the SRF Trigger connected to P1. The Echo is not connected with the exception of the 10K to the Trigger)
Someone at my robotics club meeting suggested turning the SRF04 upside down. I tried that and it didnt have any effect.
I also tried mounting the SRF04 on the opposite side of the horn but that had no effect.
Any ideas as to what I can change in the Ping)))Dar.bs2 program to get the obstacle ***s to appear on the correct side of the X ?
Thanks for any suggestions !
Ping)))Dar.bs2 Here's the entire code
Let me first say that I am using a generic SFR04 instead of a Parallax Ping Sensor.
The SFR04 is connected to the top of a servo.
I have the SRF04 in Mode 2 whereby a 10K ohm resistor is placed between the Trigger and the Echo pins.
Using PingServoCenter.bs2, I was able to establish:
ServoCenter: 750
LimitLeft: 289
LimitRight: 1189
When I put these values into Ping)))Dar.bs2 (see below) and run the program, the SRF04/servo swings hard right and stops and the only thing that appears on the radar (Debug) screen is the X and a single blinking * off to the right.
If I swap the LimitLeft and LimitRight values, the SRF04/servo sweeps back and forth between limits as it should and the radar screen displays & updates the half circle of ***s as it should with the exception that when an obstacle is put into the field, its ***s appears on the opposite side of the X then where they should. (???)
(Note: I have the SRF Trigger connected to P1. The Echo is not connected with the exception of the 10K to the Trigger)
Someone at my robotics club meeting suggested turning the SRF04 upside down. I tried that and it didnt have any effect.
I also tried mounting the SRF04 on the opposite side of the horn but that had no effect.
Any ideas as to what I can change in the Ping)))Dar.bs2 program to get the obstacle ***s to appear on the correct side of the X ?
Thanks for any suggestions !
Ping)))Dar.bs2 Here's the entire code
' -----[ Title ]-------------------------------------------------------------- ' Smart Sensors and Applications - Ping)))Dar.bs2 ' Display radar style object distance measurements in the Debug Terminal. ' as the Boe-Bot sweeps the Ping))) Mounting Bracket servo from right ' (0-degrees) to left (180-degrees). ' {$STAMP BS2} ' Target device = BASIC Stamp 2 ' {$PBASIC 2.5} ' Language = PBASIC 2.5 ' -----[ I/O Definitions ]---------------------------------------------------- PingServo PIN 14 ' Servo that directs Ping))) Ping PIN 15 ' Ping))) sensor signal pin ' -----[ Constants ]---------------------------------------------------------- LimitLeft CON 1250 ' Bracket 90-degrees LimitLeft LimitRight CON 250 ' Bracket 90-degrees LimitRight PingDirToAngle CON 8454 ' Servo pulse -> angle with ** CmConstant CON 2260 ' Echo time -> cm with ** SinCosTo256 CON 517 ' For */ -127..127 -> -256..256 Increment CON 15 ' Servo PULSOUT increment value Negative CON 1 ' Negative sign Positive CON 0 ' Positive sign ' -----[ Variables ]---------------------------------------------------------- pingDir VAR Word ' Pulse duration -> direction time VAR Word ' Ping))) echo time distance VAR Time ' Object distance x VAR Word ' x Debug cursor coordinate y VAR Word ' y Debug cursor coordinate angle VAR Byte ' Angle from LimitRight in brads counter VAR angle ' Loop counter sweepInc VAR Nib ' Sweep increment sweepDir VAR Bit ' Increment/decrement pingDir xSign VAR Bit ' x variable sign ySign VAR xSign ' Stores sign of y variable nsign VAR Bit ' Numerator sign dsign VAR Bit ' Denominator sign ' -----[ Initialization ]----------------------------------------------------- pingDir = LimitRight ' Start servo at 0-degrees FOR counter = 1 TO 40 ' Initialize servo position PULSOUT PingServo, pingDir PAUSE 20 NEXT sweepInc = Increment ' Set the sweep increment ' -----[ Main Routine ]------------------------------------------------------- DO IF pingDir <= LimitRight THEN ' Refresh display if far right DEBUG CLS, CRSRXY, 50, 25, "X" ENDIF GOSUB Sweep_Increment ' Move servo by sweepInc ' Calculate angle from far right in brads. angle = pingDir - LimitRight ** PingDirToAngle GOSUB Get_Ping_Cm ' Get cm measurement distance = distance MAX 100 / 4 ' Scale for Debug Terminal GOSUB Polar_To_Cartesian ' distnace @ angle -> (x, y) x = x * 2 ' 2 spaces for every 1 CR DEBUG CRSRXY, 50 + x, 25 - y, "*" ' Display (x, y) coordinate LOOP ' -----[ Subroutine - Get_Ping_Cm ]------------------------------------------- ' Gets Ping))) rangefinder measurement and converts time to centimeters. ' Distance may be declared as time to save variable space. Get_Ping_Cm: PULSOUT Ping, 5 PULSIN Ping, 1, time distance = time ** CmConstant RETURN ' -----[ Subroutine - Polar_To_Cartesian ]------------------------------------ ' Calculates x and y (Cartesian coordinates) given distance and angle ' (polar coordinates). Polar_To_Cartesian: ' Calculate x coordinate. x = COS angle ' Polar to Cartesian xSign = x.BIT15 ' Store sign bit x = ABS(x) */ SinCOsTo256 ' Polar to Cartesian continued x = distance */ x IF xSign = negative THEN x = -x ' Correct sign with sign bit ' Calculate y coordinate. y = SIN angle ' Polar to Cartesian ySign = y.BIT15 ' Store sign bit y = ABS(y) */ SinCOsTo256 ' Polar to Cartesian continued y = distance */ y IF ySign = negative THEN y = -y ' Correct sign with sign bit RETURN ' -----[ Subroutine - Sweep_Increment ]--------------------------------------- ' Increment/decrement the position of the servo that directs the Ping))) ' rangefinder. When pingDir goes outside either LimitRight or LimitLeft, ' the sweep direction toggles. Sweep_Increment: ' Change sweepDir for adding/subtracting increment if at rotation limit. IF pingDir <= LimitRight THEN sweepDir = Positive ELSEIF pingDir >= LimitLeft THEN sweepDir = Negative ENDIF ' Add/subtract increment to/from pingDir. IF sweepDir = negative THEN pingDir = pingDir - sweepInc ELSEIF sweepDir = Positive THEN pingDir = pingDir + sweepInc ENDIF ' Send positioning pulse to Ping))) Mounting Bracket servo. PULSOUT PingServo, pingDir RETURN
Comments
(I'm nice enough I might fix it but not nice enough to search for the code myself.)
Go Duane Go!
Yes, it may be a case of servo reversal since this is copied from that code:
LimitLeft CON 1250 ' Ping servo 90-degrees left
LimitRight CON 250 ' Ping servo 90-degrees right
Center CON 750 ' Center/0-degree pulse duration
Why thanks buddy ol' pal.
Okay, this is the lazy way to do it.
Add the following constant:
And add the following variable:
Now there are two of these statements in the code:
Change them to this:
The above is a really sloppy way of making the changes but I would need to wire up a servo and ping to a BS2 to make sure the code still worked correctly if I did it the proper way.
The proper way involves changing the equations so the shorter servo pulse is on the left with the longer pulse on the right as the code increments through the angles. I don't use the BS2 enough to trust myself to make these changes without testing them.
If my sloppy version doesn't work, let me know and I'll dig out a servo and Ping to make sure the next revision works correctly.
Since I started with an erco quote, I'd also like to end with one.
The Ping)))Dar program resides in a zipped folder at Andy Lindsay's (Parallax) thread, Ping)))Dar - A Radar Style Display
For some reason, I was unable to attach the link, so I copied/paste the entire code and added it at the end of my thread.
When you post code without code tags, you lose all indentation which makes it harder to read. Had you used code tags I might have copied it from the post.
Not a big deal since no one had told you have to use code tags. Next time you won't have that excuse.
Here's link to Phil's tutorial on using code tags.
BTW, that last quote from erco was to point out how irritating it can be since he's right about stuff so often. There are many examples of erco setting me straight in the ways of robot but post #23 of this thread shows my failed attempt at keeping treads on a robot. Erco told me how to fix it (the solution was very counter intuitive). Erco gave more advice in post #53 which (once again) greatly improved the performance of the robot.
I suppose I can live with erco being right all the time since it ends making my robots work so much better than they would have if I hadn't had his help.
So, did you try the changes I suggested? Did they do the trick?
Hopefully, these editions will help the BoeBot perform less hinky with the PingDar_GoToClosestObject.bs2 program running.
Thanks again,
rocko
I think it should help. I haven't seen that particular program. I didn't see on the page erco linked to (and once again I'm too lazy to search for it myself).
I wrote a little tutorial on how to create links in forum posts. Here's a link to it.
I think questions on the forum are more likely to answered when accompanied by a link to the code or device the question is about (not that you asked another question in your last post).
Near the bottom of post #3 in my index there's a link to a couple tutorials on how to add pictures to a post. I think it's fun to see pictures and videos of others robots. When you get your Boe-Bot working like you want, I hope you make a video of it in action.
Oh, by the way, welcome to the forum.