Tutorials/Programming with the new VEX Integrated Encoder Modules

From ROBOTC API Guide
< Tutorials
Revision as of 16:18, 4 February 2014 by Vu Nguyen (Talk | contribs)

Jump to: navigation, search

Tut vex-motor-encoders 1.jpgROBOTC 3.06 now includes functionality to support the new VEX Integrated Encoder Modules!

The VEX Integrated Encoder Modules (IEMs) replace the plastic caps on the backs of 2-Wire Motors (269 and 393) with quadrature encoders. Unlike the existing VEX Shaft Encoders, they connect to the Cortex Microcontroller using the I2C port and provide feedback directly from the motor (with the added benefit of not hogging up your digital ports). These encoders will allow you to identify and control how fast the motors spin, how far the robot travels, and what direction it should move.

For more information and assembly instructions for the Integrated Motor Encoder for the VEX 2-wire 393 Motor, see this PDF Media:393.pdf.

For more information and assembly instructions for the Integrated Motor Encoder for the VEX 2-wire 269 Motor, see this PDF Media:269.pdf.

All of the basic Fischertechnik sensors meet these qualifying characteristics, making them perfect candidates for use with the VEX Cortex!

I2C Overview

As stated above, these new encoders connect to the single I2C port on the Cortex:

Tut vex-motor-encoders 2.jpg


Unlike the DIGITAL and ANALOG ports on the Cortex, having only one I2C port does not limit you to only one I2C device. I2C ports allow multiple devices to be connected in a manner frequently referred to as daisy-chaining:

Tut vex-motor-encoders 3.jpg


The Integrated Encoder Modules support this by having built-in sets of input and output pins. A 4-wire cable connects the Cortex to Motor 1, another 4-wire cable connects Motor 1 to Motor 2, another 4-wire cable connects Motor 2 to Motor 3, and so on. In fact, ROBOTC 3.06 will support up to 8 devices on the single I2C port!

Tut vex-motor-encoders 4.jpg


Programming Overview

Motors and Sensors Setup

ROBOTC has undergone substantial changes to support the new encoders. Some of the most visually noticeable changes are in the Motors and Sensors Setup. On the Motors tab, the Type drop-down box allows you to choose from the different motors available in the VEX Robotics System:

Tut vex-motor-encoders 5.png


This is significant because each of the new IEMs return a different number of encoder counts per revolution. Specifically, the IEM for the 2-wire 269 motor measures 240.448 counts per revolution of the motor output shaft. The 2-wire 393 motor measures 627.2 counts per revolution of the output shaft in its default high-torque configuration and 392 counts per revolution of the output shaft in its modified high-speed configuration.


Let’s take a look at a physical robot and configure it using the Motors and Sensors Setup.

Tut vex-motor-encoders 6.jpg


  • This robot has two 269 motors with encoders.
  • The right motor is connected on MOTOR port 1. The left motor is connected on MOTOR port 10.
  • The encoder on the right motor is the first device plugged into the I2C port.
  • The encoder on the left motor is the second device, daisy-chained off of the right motor.

Tut vex-motor-encoders 7.jpg


We can configure this in ROBOTC by going to the Robot > Motors and Sensors Setup menu.

Tut vex-motor-encoders 8.png


On the motors tab, we can enter all of the information necessary so that it matches our physical robot:

Tut vex-motor-encoders 9.png


Note that:

  • “rightMotor” was configured in port1 as a VEX 269 Motor.
  • rightMotor was “Reversed” so that positive power levels will allow the robot to move forward.
  • The “Encoder” box was checked and “I2C_1″ was chosen since it is the first device plugged in to the Cortex.
  • “leftMotor” was configured in port10 as a VEX 269 Motor.
  • The “Encoder” box was checked and “I2C_2″ was chosen since it is the second device along the daisy-chain.
  • It is not necessary that the order of your motor ports correspond with the order of the I2C ports, although doing so will reduce confusion. It is necessary that your Motors and Sensors Setup perfectly match the physical setup of your robot.


Additionally, you’ll notice that there is also a new “I2C Sensors” tab in the Motors and Sensors Setup:

Tut vex-motor-encoders 10.png


The additional configuration you can do here is optional. Like existing VEX Sensors, you can use this tab to name your I2C devices and monitor their values in the Sensor Debug Window. Note that these values are the raw values – not adjusted for polarity or the “Reversed” checkbox on the Motors tab.

When you’re done configuring your motors and encoders, you can press OK to apply your changes.


Function Library

In addition to the Motors and Sensors Setup, you’ll also notice new commands available in the Function Library. Most notably, we’ve included the nMotorEncoder[] command.

Tut vex-motor-encoders 11.png


Those of you familiar with the NXT system will be very familiar with the nMotorEncoder[] command. To those who are not, it acts very similarly to the SensorValue[] command you may be more used to. The nMotorEncoder[] command gives you read-write access the value of the encoder associated with the motor specified within the brackets.


Sample Code

For example, in the sample code below, the nMotorEncoder[] command is used to clear the values of the encoders on lines 19 and 20, and then also control the distance the robot moves in the while loop on line 23. This program will cause the robot to move forward for a specified number of encoder counts (1000), while displaying encoder values to the VEX LCD.

Sound Test:

#pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, I2C_1,     rightIEM,             sensorQuadEncoderOnI2CPort,        , AutoAssign)
#pragma config(Sensor, I2C_2,     leftIEM,                 sensorQuadEncoderOnI2CPort,        , AutoAssign)
#pragma config(Motor,     port1,                        rightMotor,         tmotorVex269, openLoop, reversed, encoder, encoderPort, I2C_1, 1000)
#pragma config(Motor,     port10,                    leftMotor,         tmotorVex269, openLoop, encoder, encoderPort, I2C_2, 1000)
//*!!Code automatically generated by 'ROBOTC' configuration wizard                             !!*//
 
task main
{
  wait1Msec(2000);
 
  //Setup the VEX LCD for displaying encoder values
  clearLCDLine(0);
  clearLCDLine(1);
  displayLCDString(0, 0, "R: ");
  displayLCDString(1, 0, "L: ");
 
  //Clear the encoders associated with the left and right motors
  nMotorEncoder[rightMotor] = 0;
  nMotorEncoder[leftMotor] = 0;
 
  //While less than 1000 encoder counts of the right motor
  while(nMotorEncoder[rightMotor] < 1000)
  {
    //Display the right and left motor encoder values
    displayLCDNumber(0, 3, nMotorEncoder[rightMotor], 6);
    displayLCDNumber(1, 3, nMotorEncoder[leftMotor], 6);
 
    //Move forward at half power
    motor[rightMotor] = 63;
    motor[leftMotor]    = 63;
  }
}


You can see the code running on an the robot here:

[youtube http://www.youtube.com/watch?v=LGynIouwrZM]


For a more detailed explanation of how this code and encoders work, you should check out the videos in the Movement > Shaft Encoders section of the VEX Cortex Video Trainer. For more information on the nMotorEncoder[] command and how it is used in the NXT system, check out this video.


Motors Debug Window

Yet another change in ROBOTC to support the new encoders was made in the Motors debug window, found by going to Robot > Debug Windows > Motors. ROBOTC will now display the Type of motor you have connected and the Encoder value as your robot runs.

Tut vex-motor-encoders 12.png


This window, unlike the Sensor Debug window, will take the motor “Reversed” setting and polarity into account; positive motor powers will always result in positive encoder values and negative motor powers will always result in negative encoder values. In other words, the Encoder column displays the same value that gets returned by the nMotorEncoder[] command.


Conclusion and Future Development

The new VEX Integrated Encoder Modules are a fantastic addition to the VEX Robotics System, which we’re thrilled to support in ROBOTC. That being the case, we have additional improvements with the encoders coming down the pipeline. With integrated encoders, we’ll be able to implement “Encoder Targets” and “PID Control” like we have available for the NXT Platform. With Encoder Targets, you’ll be able to specify a “target” encoder value for the motors to spin to, and the robot will actually slow to a stop at that value, rather than letting its momentum carry it too far. With PID, we’ll be able to use feedback from the encoders to constantly adjust the power levels of the motors so that their physical performance matches what you set in the code – all with no extra effort on your part! Again for lots of additional information on both Encoder Targets and PID Control, check out the Movement > Improved Movement section of Teaching ROBOTC for Mindstorms.

Finally, if the VEX IEM’s seem like something you’d like to have (and they should) you can purchase them for the 2-wire 393 Motors (Media:393.pdf), and the 2-wire 269 Motors (Media:269.pdf).