ROBOTC VEX Cortex Inspection Guide
ROBOTC VEX Cortex Inspection Guide
1. Plug one end of the USB A-to-A cable into the Cortex. Plug the other end of the USB A-to-A cable
into a USB port on the computer.
2. Open ROBOTC for Cortex and PIC. ROBOTC will automatically recognize which USB port
your robot is connected to.
The Cortex Master CPU Integrity section displays the Firmware Version of the Master CPU
Firmware, and whether it is up to date. If it is not up to date, you can download the Master
Firmware by going to Robot > Download Firmware > Master CPU Firmware > Standard File.
Note that if you download the Master CPU Firmware, you will have to re-sync the Cortex with
the VEXnet Joysticks.
The Cortex User CPU Integrity section displays the Firmware version of the ROBOTC User
Firmware, and whether it is up to date. If it is not up to date, you can download the ROBOTC
Firmware by going to Robot > Download Firmware > ROBOTC Firmware > Standard File.
Note that if you download the ROBOTC Firmware you will also have to redownload your
program to the robot.
Note: The VEX Cortex Software Inspection screen contains many other pieces of useful
information for making your robot competition-ready. Be sure to check the screen for any issues
before your competition!
The VEXnet Joystick Integrity section displays the Firmware Version of the VEXnet Joystick and
whether it is up to date. If it is not up to date, you can download the VEXnet Joystick Firmware
by going to Robot > Download Firmware > VEXnet Joystick Firmware > Standard File. Note
that if you download the VEXnet Joystick Firmware you will also have to re-sync the joysticks
with the Cortex and re-calibrate the joystick values.
Note: The VEX Cortex Software Inspection screen contains many other pieces of useful
information for making your robot competition-ready. Be sure to check the screen for any issues
before your competition!
task main()
{
//User code goes here
}
In a VEX competition, however, the robots need to communicate with the field control system, so
programming is a little different. To keep things simple, ROBOTC comes with built-in Competition
and Driver Skills templates. The templates contains three main sections, each mapped to specific
portions of the competition, where teams should place their code.
2. To begin programming in a Competition Template, go to File > New... and select Competition Template.
Shown below are the contents of the Competition.c file with brief descriptions, but with the comments
removed. Additional details are available throughout the document.
task usercontrol() All code for the user control portion of the
{ competition should be placed within the while()
loop of the usercontrol task. The while() loop
while(true) repeats all commands within its curly brackets
{ for the duration of the user control portion of
//Place user control code here the competition, ensuring that the transmitter
data and any other values are up-to-date. The
UserControlCodePlaceholderForTesting(); UserControlCodePlaceholderForTesting
} function can be removed once you place your
own code within the task.
}
#pragma competitionControl(Competition)
#pragma autonomousDuration(20)
#pragma userControlDuration(120)
#pragma autonomousDuration(time_in_seconds) -
Defines the duration of the autonomous phase of a VEX competition for VEX PIC robots using the 75
MHz crystals. To use the competition template in a User Control-only competition, you can set the
duration to zero. This line can be deleted or commented-out if you are using the VEX Cortex or a VEX 1.5
(VEXnet Upgraded PIC) based robot.
#pragma userControlDuration(time_in_seconds) -
Defines the duration of the user control phase of a VEX competition for robots using the 75 MHz crystals.
To use the competition template in an Autonomous-only competition, you can set the duration to
zero. This line can be deleted or commented-out if you are using the VEX Cortex or a VEX 1.5 (VEXnet
Upgraded PIC) based robot.
The durations of VEX Cortex and VEX 1.5 based robots are determined solely by the Field Control
system. When programming VEX Cortex or VEX 1.5 based robots, so you can comment-out or
delete the autonomousDuration() and userControlDuration() pragma statements.
void pre_autonomous()
{
//Place pre-autonomous code here
}
Note: This code executes only once and runs before the competition begins.
Autonomous Period
Place your autonomous code inside this task. During the autonomous period, the robot performs the
pre-programmed actions once, or until it is disabled by the field control system (or for the length of
time specified in the autonomousDuration(time) pragma statement, for VEX PIC based robots
using the 75 MHz Cystals). The AutonomousCodePlaceholderForTesting(); function is only a
placeholder and should be replaced with your own code.
task autonomous()
{
//Place autonomous code here
AutonomousCodePlaceholderForTesting();
}
task usercontrol()
{
while(true)
{
//Place user control code here
UserControlCodePlaceholderForTesting();
}
}
#pragma competitionControl(Competition)
#pragma autonomousDuration(20)
#pragma userControlDuration(120)
#include “Vex_Competition_Includes.c”
void forwardUntilTouch()
While it’s not technically required,
{ it’s good programming practice to
while(SensorValue[bumper] == 0) place user-defined functions and/or
{ global variables below the pragma
and include statements, and above the
motor[port2] = 63; template-included functions and tasks.
motor[port3] = 63;
}
motor[port2] = 0;
motor[port3] = 0;
}
void pre_autonomous()
{
bMotorReflected[port2] = true; This sets the motor connected to VEX
} Port 2 to spin in reverse.
task autonomous()
{
forwardUntilTouch(); Commands in the autonomous period
motor[port6] = 31; are executed once (assuming there are no
wait1Msec(250); loops in the code). Also, notice that the
AutonomousCodePlaceholder-
motor[port6] = 0; ForTesting function has been removed.
}
task usercontrol()
{
while(true)
{
motor[port2] = vexRT[Ch2]; Commands in the while(true)
motor[port3] = vexRT[Ch3]; loop of the user control period
are executed until the end of
motor[port6] = vexRT[Ch6]/4; the match. Also, notice that the
} UserControlCodePlaceholder-
} ForTesting function has been
removed from the loop.
Using the ROBOTC Driver Skills Template is very similar to using the ROBOTC Competition Template.
The two templates are nearly identical; the only difference between the two are comments in the code,
the autonomous duration is set to zero seconds by default, the user control duration is set to sixty
seconds by default, and basic remote control commands are already placed within the while(true) loop
of the user control section of the program.
2. To begin programming in a Driver Skills Template, go to File > New... and select Driver Skills Template.
3. A new file named DriverSkills.c will appear. Before making any changes to the template, go to File,
select Save As... and save this program in a location and under a name you will remember.
#pragma platform(VEX)
#pragma competitionControl(Competition)
void pre_autonomous()
{ Any initialization code, such as setting
servo positions or clearing encoder
//Place pre-autonomous code here values can be placed within the
} pre_autonomous() function.
task autonomous()
The autonomous task can be ignored when
{ programming for a Driver Skills competition,
//Leave this section alone but do NOT delete it.
AutonomousCodePlaceholderForTesting();
}
task usercontrol() All code for the user control portion of the
{ competition should be placed within the while()
loop of the usercontrol task. The while() loop
while(true) repeats all commands within its curly brackets
{ for the duration of the user control portion of the
//Place user control code here competition, ensuring that the remote control
values sent to the robot are continually updated.
UserControlCodePlaceholderForTesting();
motor[port2] = vexRT[Ch1]; The pre-existing code within the loop can
be replaced with your own code. The
motor[port3] = vexRT[Ch4]; UserControlCodePlaceholderForTesting
} function should also be removed.
}
Setup
1. Leaving the POWER switch in the OFF position, connect your Cortex to the computer using the USB
A-to-A cable. Once the cable is attached, move the POWER switch to the ON position.
Setup
Finally, to program
directly over the USB
A-to-A cable, select the
option that specifys the
USB Wired Cable.
Press OK to finalize
your settings.
Note: The Platform Type can also be modified by going to the Robot menu in ROBOTC, selecting Platform
Type, and choosing one of the available options. Also, the Automatic Selection option should be used if you
will be switching between VEXnet using the USB-to-Serial Programming Cable, and the USB A-to-A Cable.
Setup
Setup
4. Download Progress
A Download Progress window will appear and begin the download process. When the window
closes, the firmware download is complete. A ROBOTC Message will appear, and remind you to
also download the ROBOTC Firmware.
Note: You only need to download the Master CPU Firmware once,
when you first start using a VEX Cortex with ROBOTC, or when you
upgrade to a newer version of ROBOTC. Switching programs or
download methods does not require a re-download.
Setup
5. Download Progress
A Download Progress window will appear and begin the download process. When the window closes,
the firmware download is complete.
Note: You only need to download the ROBOTC Firmware once, when you first start using a VEX Cortex
with ROBOTC, or when you upgrade to a newer version of ROBOTC.
End of Lesson
Once the Download Progress window closes, the ROBOTC Firmware download is complete.
Your VEX Cortex is now ready to be programmed in ROBOTC.
If you are also using the VEXnet Joysticks, you can follow the provided instructions in the VEXnet
Joysticks Setup document. Otherwise, move on to the Downloading Sample Programs over USB
guide to learn how to download sample code, and verify that your setup is fully functional.
Setup
1. Begin by installing 6 AAA batteries in the VEXnet Joystick. You will need a small Phillips screwdriver to
remove the battery cover.
Setup
Setup
3. Download Progress
A Download Progress window will appear and begin the download process. When the window
closes, the firmware download is complete.
Note: You only need to download the VEXnet Joystick Firmware once, when you first start using a
VEX Cortex with ROBOTC, or when you upgrade to a newer version of ROBOTC.
Move on to the next section to learn how to create a wireless link between the VEXnet Joystick and
VEX Cortex.
Setup
In this section, you will learn how to pair a VEX Cortex Microcontroller to a VEXnet Joystick,
allowing them to communicate over VEXnet. This section assumes that you have already updated
the master firmware on the VEX Cortex and VEXnet Remote Control.
VEXnet is an 802.11 WiFi communication system between the VEX Cortex and VEXnet Remote Control.
VEXnet features include:
• Easy to connect (No IP addresses, MAC addresses, passwords, or special security modes)
• Multiple layers of security built-in and always on
• No wireless access point needed; each VEXnet pair makes its own private network
• Hundreds of robots can operate at once; every VEXnet robot has a hidden unique ID
• Optional tether for wired communication
• Optional 9V battery backup to maintain wireless link during a main 7.2V power loss
• LED scheme displays the status of the Robot, VEXnet link, and Game (Competition Mode)
1. Begin by verifying that both the Cortex and VEXnet Joystick are connected to charged batteries.
Setup
3. Power the Cortex ON. After a few seconds, ROBOT and VEXnet LEDs will blink green,
indicating that the Cortex and VEXnet Joystick have successfully paired.
Setup
5. Remove the USB A-to-A cable from the VEXnet Joystick and Cortex.
6. Insert VEXnet USB Keys into both the VEXnet Joystick and Cortex.
Note:
It does not matter which VEXnet USB
Key you insert into the Cortex versus
the VEXnet Joystick. Pairing the Cortex
and VEXnet Joystick establishes the
link; the VEXnet USB Keys simply act as
antennas for the link.
Setup
End of Section: Creating a Wireless Link between the VEXnet Joystick and VEX Cortex
Your VEXnet Joystick and VEX Cortex can now communicate over the VEXnet USB Keys. Move on to
the next section to calibrate the values your VEXnet Joystick sends out.
Setup
This section contains the procedure for calibrating the VEXnet Remote Control joysticks.
Some steps are time-sensitive, so it’s recommended that you read through the instructions once
before following along.
The VEXnet Remote Control includes two joysticks (each having an X and Y-axis), 8 buttons on
the front, and 4 additional trigger buttons on the top. Inside, there is also 3-Axis accelerometer,
capable of providing X-Y-Z acceleration values. Values from the joysticks, buttons, and
accelerometer are sent as a constant stream of information over VEXnet to the robot, enabling a
user to control the robot in real-time.
To ensure that the VEXnet Joystick sends out accurate joystick values, the joysticks must be
calibrated before their first use, and after any firmware updates are applied.
You will need:
• A VEXnet Joystick with batteries
• A VEX Cortex with robot battery
• A small Allen wrench (1/16” or smaller) or paper clip
1. Power on the VEXnet Joystick and VEX Cortex. Allow them to sync over VEXnet.
Setup
3. While keeping the 6U trigger button pressed in, use your Allen wrench or paper clip to press in the
internal CONFIG button until the JOYSTICK LED blinks red and green.
Setup
4. Move both joysticks through their full ranges of motion. When the remote control detects
that the joysticks have been fully rotated, the JOYSTICK LED stops blinking red and green,
and switches to a solid green.
Setup
5. Save
Press the 8U button to save the joystick calibration
on your remote control. The JOYSTICK LED will
blink green for a few seconds.
Additional Information
• If the calibration is not saved, the process will timeout after 10 seconds and
the VEXnet LED will blink red.
• To cancel a calibration, press the 7U button. The calibration process will be
discontinued and the VEXnet LED will blink red.
• Once the calibration is discontinued or saved, all of the remote control LEDs
will resume their normal function.
• The joysticks must be calibrated any time the firmware on the remote control
is downloaded.
Setup
Troubleshooting
Issue: Slow blinking green ROBOT light on the Cortex
Solution: Download the Cortex Master Firmware using ROBOTC.
Issue: Slow blinking ROBOT green light on the VEXnet Joystick
Solution: Push and hold CONFIG button for about 5 seconds, until the status
LEDs starts blinking green. Release it, wait for another 5 seconds, and then turn
the VEXnet Joystick OFF and then back ON. If that fails, download the VEXnet
Joystick Firmware using ROBOTC.
Issue: Yellow or red ROBOT light on the Cortex
Solution: Make sure you are using fully charged Robot battery.
Issue: Yellow or red ROBOT light on the VEXnet Joystick, even though they are
both green on the Cortex.
Solution: Power cycle both the VEXnet Joystick and CORTEX.
Reference
Reserved Words
Motors
Motor control and some fine-tuning commands.
motor[output] = power;
This turns the referenced VEX motor output either on or off and simultaneously sets its power level.
The VEX has 8 motor outputs: port1, port2... up to port8. The VEX supports power
levels from -127 (full reverse) to 127 (full forward). A power level of 0 will cause the motors to stop.
Before:
motor[port3]= 127; //port3 - Full speed forward
motor[port2]= 127; //port2 - Full speed reverse
After:
bMotorReflected[port2]= 1; //Flip port2’s direction
motor[port3]= 127; //port3 - Full speed forward
motor[port2]= 127; //motorA - Full speed forward
Timing
The VEX allows you to use Wait commands to insert delays into your program. It also supports
Timers, which work like stopwatches; they count time, and can be reset when you want to start or
restart tracking time elapsed.
wait1Msec(wait_time);
This code will cause the robot to wait a specified number of milliseconds before executing the
next instruction in a program. “wait_time” is an integer value (where 1 = 1/1000th of a second).
Maximum wait_time is 32768, or 32.768 seconds.
Reserved Words • 1
ROBOTC
Reference
Reserved Words
wait10Msec(wait_time);
This code will cause the robot to wait a specified number of hundredths of seconds before
executing the next instruction in a program. “wait_time” is an integer value (where 1 = 1/100th of
a second). Maximum wait_time is 32768, or 327.68 seconds.
motor[port3]= 127; //port3 - full speed forward
wait10Msec(200); //Wait 2 seconds
motor[port3]= 0; //port3 - off
time1[timer]
This code returns the current value of the referenced timer as an integer. The resolution for “time1”
is in milliseconds (1 = 1/1000th of a second).
The maximum amount of time that can be referenced is 32.768 seconds (~1/2 minute)
The VEX has 4 internal timers: T1, T2, T3, and T4
int x; //Integer variable x
x=time1[T1]; //Assigns x=value of Timer 1 (1/1000 sec.)
time10[timer]
This code returns the current value of the referenced timer as an integer. The resolution for
“time10” is in hundredths of a second (1 = 1/100th of a second).
The maximum amount of time that can be referenced is 327.68 seconds (~5.5 minutes)
The VEX has 4 internal timers: T1, T2, T3, and T4
int x; //Integer variable x
x=time10[T1]; //Assigns x=value of Timer 1 (1/100 sec.)
time100[timer]
This code returns the current value of the referenced timer as an integer. The resolution for
“time100” is in tenths of a second (1 = 1/10th of a second).
The maximum amount of time that can be referenced is 3276.8 seconds (~54 minutes)
The VEX has 4 internal timers: T1, T2, T3, and T4
Reserved Words • 2
ROBOTC
Reference
Reserved Words
ClearTimer(timer);
This resets the referenced timer back to zero seconds.
The VEX has 4 internal timers: T1, T2, T3, and T4
SensorValue(sensor_input)
SensorValue is used to reference the integer value of the specified sensor port.
Values will correspond to the type of sensor set for that port.
The VEX has 16 analog/digital inputs: in1, in2... to in16
Sounds
The VEX can play sounds and tones using an external piezoelectric speaker attached to a motor
port.
PlayTone(frequency, duration);
This plays a sound from the VEX internal speaker at a specific frequency (1 = 1 hertz) for
a specific length (1 = 1/100th of a second).
PlayTone(220, 500); //Plays a 220hz tone for 1/2 second
Reserved Words • 3
ROBOTC
Reference
Reserved Words
Radio Control
ROBOTC allows you to control your robot using input from the Radio Control Transmitter.
bVexAutonomousMode
Set the value to either 0 for radio enabled or 1 for radio disabled (autonomous mode). You can
also use “true” for 1 and “false” for 0.
bVexAutonomousMode = 0; //enable radio control
vexRT[joystick_channel]
This command retrieves the value of the specified channel being transmitted.
If the RF receiver is plugged into Rx 1, the following values apply:
Reserved Words • 4
ROBOTC
Reference
Reserved Words
Miscellaneous
Miscellaneous useful commands that are not part of the standard C language.
srand(seed);
Defines the integer value of the “seed” used in the random() command to generate a random
number. This command is optional when using the random() command, and will cause the same
sequence of numbers to be generated each time that the program is run.
srand(16); //Assign 16 as the value of the seed
random(value);
Generates random number between 0 and the number specified in its parenthesis.
random(100); //Generates a number between 0 and 100
Control Structures
Program control structures in ROBOTC enable a program to control its flow outside of the typical
top to bottom fashion.
task main(){}
Creates a task called “main” needed in every program. Task main is responsible for holding the
code to be executed within a program.
while(condition){}
Used to repeat a {section of code} while a certain (condition) remains true. An infinite while loop
can be created by ensuring that the condition is always true, e.g. “1==1” or “true”.
while(time1[T1]<5000)//While the timer is less than 5 sec...
{
motor[port3]= 127;//...motor port3 runs at 100%
}
if(condition){}/else{}
With this command, the program will check the (condition) within the if statement’s parentheses
and then execute one of two sets of code. If the (condition) is true, the code inside the if statement’s
curly braces will be run. If the (condition) is false, the code inside the else statement’s curly braces
will be run instead. The else condition is not required when using an if statement.
if(sensorValue(bumper) ==1)//the bumper is used as...
{ //...the condition
motor[port3]= 0; //if it’s pressed port3 stops
}
else
{
motor[port3]= 127; //if it’s not pressed port3 runs
}
Reserved Words • 5
ROBOTC
Reference
Reserved Words
Data Types
Different types of information require different types of variables to hold them.
int
This data type is used to store integer values ranging from -32768 to 32768.
int x; //Declares the integer variable x
x = 765; //Stores 765 inside of x
The code above can also be written:
int x = 765; //Declares the integer variable x and...
//...initializes it to a value of 765
bool
This data type is used to store boolean values of either 1 (also true) or 0 (also false).
bool x; //Declares the bool variable x
x = 0; //Sets x to 0
char
This data type is used to store a single ASCII character, specified between a set of single quotes.
char x; //Declares the char variable x
x = ‘J‘; //Stores the character J inside of x
Reserved Words • 6
ROBOTC
Reference
A “debugger” is a programming tool that enables you to quickly write and correct code, and
allows you to interact with all of the inputs (sensors, timers, ect.) and ouputs (motors, LED’s,
ect.) connected to your VEX microcontroller.
ROBOTC has a debugging capability that enables unparalleled, interactive access to the robot
as your program is running. Using the debugger will significantly reduce the time it takes to write
programs and find erros in your code. With ROBOTC’s real-time debugger you can:
• Adding code to turn on different LED’s as the microcontroller executes different sections of
code. You then try to determine from the LED’s what is being executed within your program.
• Adding “print” statements to your code at various points in the program, if your
microcontroller has a display device. By examining the display, you can (hopefully) determine
what is happening in your program.
Both of the above techniques are available in ROBOTC, but a real-time debugger eliminates the
need to resort to them. There’s no need to add code to debug your program!
Reference
Start / Stop
Pressing the Start button will start the program execution on your robot controller, and the text on
button will change to “Stop”. Pressing the Stop button will stop the program execution.
Suspend
Pressing the Suspend button will suspend (pause) the program execution on your robot controller.
Step Into
Pressing the Step Into button will execute the next command in your program.
Clear All
The Clear All button will reset all of the values being displayed by the other debug windows.
Once
Pressing the Once button will update the values in the other debugger windows once.
Note: For continuous value updates on the other debug windows, make sure the button says
Pause Refresh, and not Continuous.
Reference
Index
The index of the variable, in memory.
Variable
The name of the variable, defined in the program.
Value
The value of the variable during program execution. Values will update automatically if the
Program Debug window is set to update continuously.
The Global Variables window can be opened by going to the Robot menu, Debug Windows,
and selecting Global Variables.
Reference
Index
The index of the timer (T1-T4).
Timer
Name of the timer. “nSysTime” is the amount of time the controller has been powered on.
“nPgmTime” is the amount of time the current program has run. Timer1 through Timer4
can be reset and monitored in your programs.
Time
Displays the elapsed time.
The Timers window can be opened by going to the Robot menu, Debug Windows, and
selecting Timers.
Reference
Index
The index of where the current device is located (port1-port10).
Motor
Current name of the motor. These names can be customized through the Motors
and Sensor Setup window.
Value
Displays the current power level of the motor.
The Motors window can be opened by going to the Robot menu, Debug Windows,
and selecting Motors.
Reference
Index
The index of where the current device is located (in1 - in8 for ANALOG Ports 1 - 8,
and dgtl1 - dgtl12 for DIGITAL Ports 1 - 12).
Device
Current name of the sensor. These names can be customized through the Motors and
Sensor Setup window.
Type
Displays the type of the current sensor. The type must be set using the Motors and
Sensor Setup window.
Value
Displays the current value of the sensor.
Reference
Digital sensors (Bumper, Limit, Encoder, Ultrasonic) can be configured on the “VEX 2.0 Digital Sensors
1-12” tab, and analog sensors (Light, Line Follower, Potentiometer, Accelerometer) can be configured
on the “VEX 2.0 Analog Sensors 1-8” tab. To configure a sensor, first locate the row that aligns with
where the sensor is plugged in on the Cortex. For example, “dgtl2” is short for DIGITAL Port 2 on the
Cortex. Next, give the sensor a custom name and define its sensor type in the dropdown menu. After
applying your chages, redownload your program to the microcontroller to have the changes take
effect in the Sensor debug window.
Reference
For additional information on these debug windows, along with the ones covered in this
document, view the ROBOTC Debugger section of the built-in ROBOTC Help documentation.