Difference between revisions of "VEX Sensors Overview"

From ROBOTC API Guide
Jump to: navigation, search
(Analog Sensors)
 
(5 intermediate revisions by one user not shown)
Line 1: Line 1:
 +
<yambe:breadcrumb self="Sensors Overview">VEX|PIC</yambe:breadcrumb>
 +
<br />
  
{| style="font-family:Verdana, Genega, sans-sarif; font-size:80%;color:gray;" width="100%" cellpadding="0%" cellspacing="0" border="0"
+
{|
 
|-
 
|-
|  
+
|''For ROBOTC PIC Sensor ''functions'', check out the [[VEX_Functions_Sensors|PIC Sensor Functions]] page!''<br />
''[[Main_Page|Main]] >> [[VEX_Main|PIC]] >> [[VEX:_Sensors_Overview|Sensors Overview]] ''
+
<br />
|-
+
|}
+
  
 +
The VEX is equipped with 16 sensor ports. These can be either analog (e.g. voltage level from a photocell detecting light intensity) or digital (e.g. a touch or switch sensor).  Analog sensors should be connected to lower numbers ports and digital sensors connected to higher numbered ports. This is restriction in the VEX hardware where analog sensors are assigned ports 1 to N where N is the total number of ports.<br />
  
{| class="wikiText"
+
There are a variety of functions and variables used for configuring these ports and accessing their values.<br />
|-
+
|''For ROBOTC PIC Sensor ''functions'', check out the [[VEX:_Functions_-_Sensors|PIC Sensor Functions]] page!''
+
|-
+
|}
+
  
 +
Configuring sensors can be complicated. ROBOTC has a built-in wizard that can be used to configure the VEX 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 IN3!
|-
+
*The port that the sensor is connected to.
|style="vertical-align:top"| __TOC__
+
*The type of sensor – touch, wheel encoder, sonar, line follower, light brightness, etc.
 +
<br />
 
|-
 
|-
 
|}
 
|}
 +
<br />
  
 +
{{tl|1|}}
 +
<br />
  
 
== Analog Sensors ==
 
== Analog Sensors ==
 
{| style="font-family:Verdana, Geneva, sans-serif; color:black; background-color:#FFFFFF; text-align:left; font-size:100%;" width="100%" cellpadding="5%" cellspacing="0" border="0"
 
{| style="font-family:Verdana, Geneva, sans-serif; color:black; background-color:#FFFFFF; text-align:left; font-size:100%;" width="100%" cellpadding="5%" cellspacing="0" border="0"
|-
 
|There are 5 main types of Analog Sensors for the VEX PIC:
 
 
|-
 
|-
 
|
 
|
=== Light ===
+
:'''Raw Value''' - Returns an analog value between 0 and 1023 - Used for testing new sensors or reading raw data from sensors.
[[File:Vex light sensor.png]]
+
<br />
+
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.
+
<br />
+
  
{|
+
:'''Reflection''' - Returns an analog value between 0 and 1023.
  |-
+
  |
+
<syntaxhighlight lang="ROBOTC">
+
#pragma config(Sensor, in1,    lightSensor,    sensorReflection)
+
//*!!Code automatically generated by 'ROBOTC' configuration wizard              !!*//
+
  
task main()
+
:'''Line Follower''' - Returns an analog value between 0 and 1023.
{
+
  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
+
  }
+
}
+
</syntaxhighlight>
+
  |-
+
  |}
+
 
|-
 
|-
|
+
|}
 
+
=== Potentiometer ===
+
[[File:Vex pot.png]]
+
<br />
+
Returns an analog value between 0 and 4095 ''(although mechanical stops my limit the values to between 5 and 4092)''.
+
 
<br />
 
<br />
  
{|
+
== Digital Sensors ==
  |-
+
{| style="font-family:Verdana, Geneva, sans-serif; color:black; background-color:#FFFFFF; text-align:left; font-size:100%;" width="100%" cellpadding="5%" cellspacing="0" border="0"
  |
+
<syntaxhighlight lang="ROBOTC">
+
#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
+
  }
+
}
+
</syntaxhighlight>
+
  |-
+
  |}
+
 
|-
 
|-
|
+
|There are 5 main types of Analog Sensors for the VEX PIC:
=== Line Follower ===
+
[[File:vex_linefollower.png]]
+
<br />
+
Returns values ranging between 0 and 4095.  0 is the lightest reading and 4095 is the darkest.
+
<br />
+
 
+
{|
+
  |-
+
  |
+
<syntaxhighlight lang="ROBOTC">
+
#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
+
    }
+
  }
+
}
+
</syntaxhighlight>
+
  |-
+
  |}
+
 
|-
 
|-
 
|
 
|
 +
:'''Touch'''- Returns a digital value. A "1" means a closed circuit and a "0" means an open circuit.
  
=== Gyro ===
+
:'''Rotation''' - A digital sensor that returns a counter value keeping track of how many "counts" the encoder has seen. This sensor will increment regardless of direction. The VEX rotation sensor uses this type of sensor.
[[File:vex_gyro.png]]
+
<br />
+
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: [http://www.robotc.net/blog/2011/10/13/programming-the-vex-gyro-in-robotc/ Programming the VEX Gyro in ROBOTC].''
+
:'''SONAR''' - Returns an analog value in inches (i.e. a value of 20 means 20 inches away). A value of "-1" means the sensor does not receive a "reflection". The sonar sensor requires the "Input" wire to be attached the interrupt port int1 or int2 to function properly.
<br />
+
  
{|
+
:'''Quadrature Encoder''' - A digital sensor that returns a counter value keeping track of how many "counts" the encoder has seen. This sensor will increment when traveling in the forward of direction and decrement when traveling in the reverse direction.The Quadrature Encoder requires one of the input wires be attached the interrupt port "int3" through "int6" to function properly.
  |-
+
  |
+
<syntaxhighlight lang="ROBOTC">
+
#pragma config(Motor, port2, rightMotor, tmotorNormal, openLoop)
+
#pragma config(Motor, port3, leftMotor, tmotorNormal, openLoop, reversed)
+
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
+
  
/*+++++++++++++++++++++++++++++++++++++++++++++| Notes |++++++++++++++++++++++++++++++++++++++++++++
+
:'''Digital In''' - This will make the sensor port act as just a digital input, very similar to a touch sensor.
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
+
:'''Digital Out''' - This will cause the sensor port to send out a digital high ("1") signal. Useful for using the controller to power 5V devices.
 
+
[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);
+
}
+
</syntaxhighlight>
+
  |-
+
  |}
+
|-
+
|
+
 
+
=== Accelerometer ===
+
[[File:vex_accel.png]]
+
<br />
+
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)''.
+
<br />
+
 
+
{|
+
  |-
+
  |
+
<syntaxhighlight lang="ROBOTC">
+
#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);
+
  }
+
}
+
</syntaxhighlight>
+
  |-
+
  |}
+
|-
+
|
+
 
|-
 
|-
 
|}
 
|}
 
<br />
 
<br />

Latest revision as of 20:31, 30 April 2012

PIC → Sensors Overview


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


The VEX is equipped with 16 sensor ports. These can be either analog (e.g. voltage level from a photocell detecting light intensity) or digital (e.g. a touch or switch sensor). Analog sensors should be connected to lower numbers ports and digital sensors connected to higher numbered ports. This is restriction in the VEX hardware where analog sensors are assigned ports 1 to N where N is the total number of 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 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 IN3!
  • The port that the sensor is connected to.
  • The type of sensor – touch, wheel encoder, sonar, line follower, light brightness, etc.




Analog Sensors

Raw Value - Returns an analog value between 0 and 1023 - Used for testing new sensors or reading raw data from sensors.
Reflection - Returns an analog value between 0 and 1023.
Line Follower - Returns an analog value between 0 and 1023.


Digital Sensors

There are 5 main types of Analog Sensors for the VEX PIC:
Touch- Returns a digital value. A "1" means a closed circuit and a "0" means an open circuit.
Rotation - A digital sensor that returns a counter value keeping track of how many "counts" the encoder has seen. This sensor will increment regardless of direction. The VEX rotation sensor uses this type of sensor.
SONAR - Returns an analog value in inches (i.e. a value of 20 means 20 inches away). A value of "-1" means the sensor does not receive a "reflection". The sonar sensor requires the "Input" wire to be attached the interrupt port int1 or int2 to function properly.
Quadrature Encoder - A digital sensor that returns a counter value keeping track of how many "counts" the encoder has seen. This sensor will increment when traveling in the forward of direction and decrement when traveling in the reverse direction.The Quadrature Encoder requires one of the input wires be attached the interrupt port "int3" through "int6" to function properly.
Digital In - This will make the sensor port act as just a digital input, very similar to a touch sensor.
Digital Out - This will cause the sensor port to send out a digital high ("1") signal. Useful for using the controller to power 5V devices.