Autonomous with Ultrasonic sensor doesnt work!!

Here is the code I have written for autonomous. I want the robot to stop and the piston to extend when the ultrasonic sensor reads 40 inches. But it doesnt happen. We have tested the ultrasonic sensor and tuned it. We are sure that the distance ultrasonic sensor reads is true.

Can anyone tell me if the code is correct or wrong?
Thanks in advance.

The portion of the code in the “while loop” will run continuously. The portion outside of the “while loop” will only run once (as soon as autonomous starts), and will never run again. Therefore, the code that is checking the ultrasonic sensor is never checked after the start of autonomous.

Remove the “while loop” around the motors, and place the while loop around all of your code. That should fix the problem.

We do a very similar routine, but with the vision system instead of the ultrasonic sensor. See the attached vi for an example.

The Target info would be your value coming from the ultrasonic sensor. The idea is to look at current value and compare to some setpoint. If you are above a setpoint, move one way. If you are below setpoint, move the other way and lastly if you are within some acceptable window, do nothing because you are in place. In the attached vi, the setpoint is zero, and the acceptable window is between .25 and -.25.

Reply back if more questions.

Position (9.41 KB)

Position (9.41 KB)

We put all of our autonomous code inside the while loop however the robot still doesnt do what we want. We would be really happy if you could help us.

Thanks in advance.

Please post a picture of your new code.

Please see the post from MotorHead above. You autonomous code should look similar to his when your finished.

here are the pictures:

and I think my autonomous code is pretty same with MotorHead’s.

Your logic seems correct. However, you may not be getting anything from the ultrasonic sensor. See the attached image of the ultrasound example (the example can be found in (LabviewInstallFolder)/examples\FRC\Analog\EZ1 MB1010 Sonar Analog).

The example sets the averaging, sets sample rate, and then gets the voltage within the while loop. We tried moving the “set averaging” and “set sample rate” to, but the “analog get voltage” stopped working when we did that. Perhaps you need to add the “set averaging” and “set sample rate” into your while loop.

Can you describe the following:

  1. How exactly is your robot behaving when you run autonomous?

  2. When you run autonomous, what are you seeing from your “Distance” indicator?

I haven’t used the Ultrasonic yet, so I can’t comment on its setup. I do have a problem with your logic. The way you currently are configured is: If distance >= to 40 then back up with y =-.4, If distance < 40, stop and activate solenoid.

The problem with this is you do not have a deadzone in which to stop. Your arrangement can cause the robot to excessively hunt about the setpoint of 40. Look again at the vi I posted. There is a nested case structure to test if you are above or below the setpoint or if you are within the acceptable deadzone, in which case, do nothing.

After we put set averagıng and set sample inside the while loop the code seems to be working however there is a small problem. Let x inches be the distance I want the robot to stop and to extend the piston. When I set robots position to some distance which is greater than x inches and run the code the robot stops and extends the piston at x-y inches. If I set robots position to x inches from the wall and run the code the robot doesnt move and extends the piston as I want. Is there anything I can do to avoid this problem or should I just tell the robot to stop at x+y inches to make it stop at x inches?

It doesnt back up it goes forward with negative integers.

Thank you guys for your helps!!!:slight_smile:

The robot is moving. Once you detect that you are at x and tell the drive motors to stop, the robot coasts to a halt y inches further on. You could set the motor speed controllers to “brake” mode so the robot stops immediately, though that can make driving it a little less easy.

Or you could control the motor speed based on how far away you are, slowing down as you approach the target distance so you don’t overshoot. For example, set the motor output to a value proportional to the error between the desired location and the measured location. If your proportionality constant is too high, you will overshoot (and then perhaps back up to the target, depending on the details of the code). If the constant is too low, you will stop too soon, so you can use another term that increases motor speed based on how long the position error is present. You can also reduce power if you’re approaching the target too quickly. Put it all together and you have PID control – search the forums for more discussion and explanation.