VEX Sensors Overview

From ROBOTC API Guide
Revision as of 16:00, 8 March 2012 by Bfeher (Talk | contribs)

Jump to: navigation, search

Main >> PIC >> Sensors Overview


For ROBOTC PIC Sensor functions, check out the PIC Sensor Functions page!



Analog Sensors

There are 5 main types of Analog Sensors for the VEX PIC:

Light

Vex light sensor.png
The Light sensor, also known as the Reflection sensor, returns values ranging between 0 and 4095. 0 is the lightest reading and 4095 is the darkest.

#pragma config(Sensor, in1,    lightSensor,    sensorReflection)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
 
task main()
{
  wait1Msec(2000);                // wait 2 seconds before exectuing following code
  bMotorReflected[port2] = true;  // reflects direction of motor on port 2
 
  while(true)                     // infinite loop:
  {
    clearLCDLine(0);                                // clear the top VEX LCD line
    clearLCDLine(1);                                // clear the bottom VEX LCD line
 
    setLCDPosition(0,0);                            // set the VEX LCD cursor the first line, first space
    displayNextLCDString("Light Sensor:");          // display "Light Sensor:" on the top line
 
    setLCDPosition(1,0);                            // set the VEX LCD cursor the second line, first space
    displayNextLCDNumber(SensorValue(lightSensor)); // display the reading of the lightSensor sensor
 
    wait1Msec(50);                                  // wait 50 milliseconds to help display properly
  }
}

Potentiometer

Vex pot.png
Returns an analog value between 0 and 4095 (although mechanical stops my limit the values to between 5 and 4092).

#pragma config(Sensor, in1,    potentiometer,  sensorPotentiometer)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
 
task main()
{
  wait1Msec(2000);                // wait 2 seconds before exectuing following code
  bMotorReflected[port2] = true;  // reflects direction of motor on port 2
 
  while(true)                     // infinite loop:
  {
    clearLCDLine(0);                                  // clear the top VEX LCD line
    clearLCDLine(1);                                  // clear the bottom VEX LCD line
 
    setLCDPosition(0,0);                              // set the VEX LCD cursor the first line, first space
    displayNextLCDString("Potentiometer:");           // display "Potentiometer:" on the top line
 
    setLCDPosition(1,0);                              // set the VEX LCD cursor the second line, first space
    displayNextLCDNumber(SensorValue(potentiometer)); // display the reading of the potentiometer sensor
 
    wait1Msec(50);                                    // wait 50 milliseconds to help display properly
  }
}

Line Follower

Vex linefollower.png
Returns values ranging between 0 and 4095. 0 is the lightest reading and 4095 is the darkest.

#pragma config(Sensor, in1,    lineFollower,   sensorLineFollower)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
 
task main()
{
  wait1Msec(2000);                // wait 2 seconds before exectuing following code
  bMotorReflected[port2] = true;  // reflects direction of motor on port 2
 
  while(true)                     // infinite loop:
  {
    if(SensorValue(lineFollower) < 950) // if the lineFollower sensor reads a value less than 950:
    {
      // turn left:
      motor[port2] = 50;  // motor on port 2 is run at power level 50
      motor[port3] = 0;   // motor on port 3 is stopped at power level 0
    }
    else  // lineFollower sensor reads a value greater than or equal to 950:
    {
      motor[port2] = 0;   // motor on port 2 is stopped at power level 0
      motor[port3] = 50;  // motor on port 3 is run at power level 50
    }
  }
}

Gyro

Vex gyro.png
As the Gyro is turned, the values it returns are in tenths of degrees, positive and negative. Thus, a SensorValue of 3600 equals 360 degrees, or one full rotation. When the sensor is mounted horizontally, counter-clockwise movements will return values from 0 to -3600; clockwise movements will return values from 0 to 3600. Once the gyro completes one full revolution, the sensor value will “roll-over” to 0 by default (for example: …3597, 3598, 3599, 3600, 0, 1, 2, 3,…). To change the “roll-over” point, un-comment line 33 (from the code below) and change the value of “SensorFullCount” from 3600 to the desired value (7200, 18000, ect)

For more information on the Gyro sensor, check out the ROBOTC blog post: Programming the VEX Gyro in ROBOTC.

#pragma config(Motor, port2, rightMotor, tmotorNormal, openLoop)
#pragma config(Motor, port3, leftMotor, tmotorNormal, openLoop, reversed)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
 
/*+++++++++++++++++++++++++++++++++++++++++++++| Notes |++++++++++++++++++++++++++++++++++++++++++++
Gyro Based Turns - Basic
-This program instructs your robot to turn for the specified number of degrees in "degrees10".
-For best sensor results, clear out the gyro and manually configure it at the begging of the code.
-The Gyro is configured by default to provide values from 0 to -3600 for clockwise rotation,
and 0 to 3600 for counter-clockwise rotation
 
Robot Model(s): Swervebot
 
[I/O Port] [Name] [Type] [Description]
Motor Port 2 rightMotor VEX Motor Right side motor
Motor Port 3 leftMotor VEX Motor Left side motor
Analog Port 8 in8 VEX Gyro Top-center mounted,
away from the Cortex
--------------------------------------------------------------------------------------------------*/
 
task main()
{
  //Completely clear out any previous sensor readings by setting the port to "sensorNone"
  SensorType[in8] = sensorNone;
  wait1Msec(1000);
  //Reconfigure Analog Port 8 as a Gyro sensor and allow time for ROBOTC to calibrate it
  SensorType[in8] = sensorGyro;
  wait1Msec(2000);
 
  //Adjust SensorScale to correct the scaling for your gyro
  //SensorScale[in8] = 260;
  //Adjust SensorFullCount to set the "rollover" point. 3600 sets the rollover point to +/-3600
  //SensorFullCount[in8] = 3600;
 
  //Specify the number of degrees for the robot to turn (1 degree = 10, or 900 = 90 degrees)
  int degrees10 = 900;
 
  //While the absolute value of the gyro is less than the desired rotation...
  while(abs(SensorValue[in8]) < degrees10)
  {
    //...continue turning
    motor[rightMotor] = 25;
    motor[leftMotor] = -25;
  }
 
  //Brief brake to stop some drift
  motor[rightMotor] = -5;
  motor[leftMotor] = 5;
  wait1Msec(250);
}

Accelerometer

Vex accel.png
Returns an analog value between 0 and 4095. Each Accelerometer Sensor has 3 cables, X, Y, and Z. The ports you attach them to don't have to be in any particular order (however you WILL need to use 3 ports).

#pragma config(Sensor, in1,    xAxis,          sensorAccelerometer)
#pragma config(Sensor, in2,    yAxis,          sensorAccelerometer)
#pragma config(Sensor, in3,    zAxis,          sensorAccelerometer)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
 
task main()
{
  int nBiasValues[3];
 
  int X_Accel;
  int Y_Accel;
  int Z_Accel;
 
  wait1Msec(500); // bias values are being calculated
 
  /* store the bias values in an array so that they can be  
   * displayed in the ROBOTC global variables debug window */
  nBiasValues[0] = SensorBias[xAxis];
  nBiasValues[1] = SensorBias[yAxis];
  nBiasValues[2] = SensorBias[zAxis];
 
  while(true)
  {
    /* also store the actual sensor values so that they can be
     * easily displayed in the ROBOTC global variables debug window */
    X_Accel = SensorValue[xAxis];
    Y_Accel = SensorValue[yAxis];
    Z_Accel = SensorValue[zAxis];
 
    wait1Msec(100);
  }
}