WPILib and Ultrasonic sensors

Ok, I have an easy one.

I am trying to get ultrasonic sensors to work on a Vex using WPILib.

This is my code:

#define _VEX_BOARD
#include "API.h"
#include "BuiltIns.h"

#define UltraOnePing	1
#define UltraOneEcho	1

int sonicValue;

void main(void){

StartUltrasonic(UltraOneEcho, UltraOnePing);
PrintToScreen("Start");
	while(1==1)
           {
		sonicValue = GetUltrasonic(UltraOneEcho, UltraOnePing);
		PrintToScreen("Ultra returns %d. 
", sonicValue);
	
	   }
}


I get nothing. I have tried also with RobotC and had success, so I know the sensor works. I cannot figure out what is wrong.

Do I need to set port direction (tried that, didn’t work, maybe I did it wrong)?

Does it have something to do with DefineControllerIO()?

Is it a conspiracy? I just don’t know.

Assuming you’re using the Vex Ultrasonic sensor, then the input(echo, sensor output) and output(ping, sensor input) ports should be different.

If you’re using non-vex sensors you may need to use the analog input, and bypass the wpilib functions.

Thank you for the response. Using vex sensors. The echo is on (interrupt port 1), and the ping is on (analog/digital port 1). Also, I have tried it with echo=1 and ping = 1 -11.

The current configuration is the one that worked in RobotC. I have not changed the sensor’s wiring.

I forgot the Vex has the interupts and the digital I/O pins seperated.

I don’t see any obvious problems with the code. Hopefully someone who has more experiance with WPILib/RobotC can answer your question.

By default
Ports 1-4 Are Assigned to Analog Inputs
Ports 5-10 Are Assigned Digital Inputs
Ports 11-16 Are Assigned Digital Ouputs

So you either need to re-assign that port (see documentation) or move the
pulse port to I/O Port 11 or higher.

{ The following is the post I was in the process of writing when I had an idea I felt the need to verify. }
Thanks, I guess I didn’t see that in the documentation. However, I did try moving the input connection to Digital Output 11 and 16, with no change in results.

Well, not exactly . . . once when I turned the Vex back on to upload a code modification it started outputting the Ultrasonic value to the terminal. It did it really fast as well, instead of the slow crawl it does when it is not working.

I really wish I knew what was going on here.
{End post}

Umm, what … I am now confused and mystified.

It works now. Sort of. Here is what happened…

  1. changed #define UltraOnePing from ‘1’ to ‘11’
  2. moved ‘input’ from port 1 to port 11
  3. uploaded code
  4. nuthin’
  5. changed #define UltraPingOne from ‘11’ to ‘16’
  6. moved ‘input’ from port 11 to port 16
  7. uploaded code –>terminal popped up while uploading and Vex was outputting expected values, upload completed, no more good output.
  8. Wrote response on CD…had a thought.
    9)changed #define UltraPingOne back to ‘11’
  9. left ‘input’ plugged into port 16
  10. uploaded code
  11. Now it works.

If I set the Ping port to 11 and plug the wire into port 16 it works. The echo (output) wire is still plugged in to interrupt port 1.

I have nothing more to say about that.

Try this.


#define _VEX_BOARD
#include "API.h"
#include "BuiltIns.h"

#define UltraOnePing	11
#define UltraOneEcho	1

int sonicValue;

void main(void){

DefineControllerIO ( 4, 1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ) ;

StartUltrasonic(UltraOneEcho, UltraOnePing);
PrintToScreen("Start");
	while(1==1)
           {
		sonicValue = GetUltrasonic(UltraOneEcho, UltraOnePing);
                Wait(1);
		PrintToScreen("Ultra returns %d. 
", sonicValue);
	
	   }
}


DefineControllerIO ( 4, 1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ) ;
4 = Number Of Analog Ports //First ports are always analog
1 = Input
0 = Output

Thanks again. I still am reading off of port 16 when port 11 is what is in the code. Also, it seems that is the only configuration I can find that works.

It is odd.