Difference between revisions of "VEX2 Sensors Overview"

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

Revision as of 19:13, 15 February 2012

Main >> CORTEX >> Sensors Overview


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

The VEX 2.0 Cortex is equipped with 20 sensor ports. There are 8 Analog Sensor Ports and 12 Digital Sensor Ports. Note that unlike the VEX - PIC microcontroller, all Analog sensors must be in Analog ports, while all Digital sensors must be in Digital ports.

There are a variety of functions and variables used for configuring these ports and accessing their values.

Configuring sensors can be complicated. ROBOTC has a built-in wizard that can be used to configure the VEX 2.0 Cortex sensors. The wizard contains a number of PC windows that allow you to set the following fields for the sensor:

  • The variable name that you want to assign to the sensor. Using a name like “leftBumper” makes for a more readable program than 'dgtl3'!
  • The port that the sensor is connected to.
  • The type of sensor – touch, quadrature encoder, sonar, line follower, etc.



Analog Sensors

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

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)

#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);
  }
}