ENC1000 User Guide: Difference between revisions
No edit summary |
|||
(30 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
__NOINDEX__ | |||
__NOTOC__ | |||
<metadesc>The Encoder Phidget reads a quadrature encoder at speeds of up to 100,000 quadrature cycles per second and connects to a port on your VINT Hub.</metadesc> | |||
[[Category:UserGuide]] | [[Category:UserGuide]] | ||
==Part 1: Setup== | |||
{{PT1 Deck Sequence}} | |||
== Part 2: Using Your Phidget == | |||
== | ===About=== | ||
Interface with any 5V quadrature encoder with the Quadrature Encoder Phidget. With an encoder, you can keep track of how far your motor has turned, which then allows you to control the position and velocity in your code. | |||
[[Image:ENC1000_About.jpg|link=|700px]] | |||
===Explore Your Phidget Channels Using The Control Panel=== | |||
You can use your Control Panel to explore your Phidget's channels. | |||
'''1.''' Open your Control Panel, and you will find the following channel: | |||
= | [[Image:ENC1000_Panel.jpg|link=|center]] | ||
'''2.''' Double click on the channel to open the example program. This channel belongs to the '''Encoder''' channel class: | |||
{ | {{UGC-Start}} | ||
{{UGC-Entry|Quadrature Encoder Phidget:| Reads the signal of a quadrature encoder| | |||
In your Control Panel, double click on "Quadrature Encoder Phidget": | |||
[[Image:ENC1000-Encoder.jpg|center|link=]]}} | |||
{{UGC-End}} | |||
{{UG-Part3}} | |||
== Part 4: Advanced Topics and Troubleshooting == | |||
{{UGC-Start}} | |||
{{UGC-Addressing}} | |||
{{UGC-Graphing}} | |||
{{UGC-DataInterval}} | |||
{{UGC-Firmware}} | |||
{{UGC-Entry|Setting IOMode|| | |||
The ENC1000 can connect to any of the [https://www.phidgets.com/?tier{{=}}1&catid{{=}}4&pcid{{=}}2 encoders] we sell without any modification just by setting the {{Code|IOMode}} property to '''Push-Pull''' . If you are trying to use your own encoder, you may need to change the IO mode to '''Open Collector''' or '''Line Driver''' mode. See the [[Encoder_Guide#Output_Circuit|Encoder Guide]] for more details on what to use. | |||
}} | |||
{{UGC-Entry|Connector|| | |||
The encoder input on the ENC1000 uses a 5-pin, 0.100 inch pitch locking connector. The connectors are commonly available - refer to the Table below for manufacturer part numbers. | |||
{{{!}}class {{=}} "wikitable" style{{=}}"text-align: center" | |||
{{!}} style{{=}}"background:#f0f0f0;"{{!}}'''Manufacturer ''' | |||
{{!}} style{{=}}"background:#f0f0f0;"{{!}}'''Part Number''' | |||
{{!}} style{{=}}"background:#f0f0f0;"{{!}}'''Description''' | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}50-57-9405 | |||
{{!}}5 Position Cable Connector | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}16-02-0102 | |||
{{!}}Wire Crimp Insert for Cable Connector | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}70543-0004 | |||
{{!}}5 Position Vertical PCB Connector | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}70553-0004 | |||
{{!}}5 Position Right-Angle PCB Connector (Gold) | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}70553-0039 | |||
{{!}}5 Position Right-Angle PCB Connector (Tin) | |||
{{!}}- | |||
{{!}}Molex | |||
{{!}}15-91-2055 | |||
{{!}}5 Position Right-Angle PCB Connector - Surface Mount | |||
{{!}}- | |||
{{!}}} | |||
Note: Most of the above components can be bought at [http://www.digikey.com/ Digikey]. | |||
}} | |||
{{UGC-Entry|Calculating Velocity|| | |||
When your program captures an encoder change event, it will receive two variables: {{Code|positionChange}} (measured in 'ticks', four of which equal one quadrature count for the ENC1000) and {{Code|timeChange}} (measured in milliseconds). You can use these values to easily compute the instantaneous velocity of the encoder. For example, our C# encoder example implements this method of velocity calculation: | |||
<syntaxhighlight lang=csharp> | <syntaxhighlight lang=csharp> | ||
void enc_change(object sender, Phidget22.Events.EncoderEncoderChangeEventArgs e) { | void enc_change(object sender, Phidget22.Events.EncoderEncoderChangeEventArgs e) { | ||
... | ... | ||
// Convert time change from | // Convert time change from milliseconds to minutes | ||
double timeChangeMinutes = e.TimeChange / | double timeChangeMinutes = e.TimeChange / 60000.0; | ||
// Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user) | // Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user) | ||
double rpm = ( | double rpm = (((double)e.PositionChange / CPR) / timeChangeMinutes); | ||
... | ... | ||
Line 97: | Line 98: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
This implementation may be useful if you are graphing the RPM on a line graph, but if it's being used to display the current RPM as a single number, it won't be very helpful because when the motor changes speed or direction frequently, it'll be hard to read the velocity as a meaningful value. This method can also be prone to variations in velocity if the encoder's CPR is low and the sampling rate is high. To solve these problems, you should decide on a time interval during which you'll gather data, and take a moving velocity calculation based on that data. You can use the Queue data type to make this easy: | |||
<syntaxhighlight lang=csharp> | <syntaxhighlight lang=csharp> | ||
Line 115: | Line 110: | ||
double totalPosition = 0; | double totalPosition = 0; | ||
double totalTime = 0; | double totalTime = 0; | ||
int n = 500; // sampling window size, duration is 500* | int n = 500; // sampling window size, duration is 500*t where t is the data interval of the ENC1000 | ||
// add the newest sample to the queue | // add the newest sample to the queue | ||
Line 138: | Line 133: | ||
} | } | ||
// Convert time change from | // Convert time change from milliseconds to minutes | ||
double timeChangeMinutes = | double timeChangeMinutes = e.TimeChange / 60000.0; | ||
// Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user) | // Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user) | ||
double rpm = ( | double rpm = (((double)e.PositionChange / CPR) / timeChangeMinutes); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | |||
{{ | {{UGC-End}} |
Latest revision as of 16:29, 1 June 2023
Part 1: Setup
Part 2: Using Your Phidget
About
Interface with any 5V quadrature encoder with the Quadrature Encoder Phidget. With an encoder, you can keep track of how far your motor has turned, which then allows you to control the position and velocity in your code.
Explore Your Phidget Channels Using The Control Panel
You can use your Control Panel to explore your Phidget's channels.
1. Open your Control Panel, and you will find the following channel:
2. Double click on the channel to open the example program. This channel belongs to the Encoder channel class:
In your Control Panel, double click on "Quadrature Encoder Phidget":
Part 3: Create your Program
Part 4: Advanced Topics and Troubleshooting
Before you open a Phidget channel in your program, you can set these properties to specify which channel to open. You can find this information through the Control Panel.
1. Open the Control Panel and double-click on the red map pin icon:
2. The Addressing Information window will open. Here you will find all the information you need to address your Phidget in your program.
See the Phidget22 API for your language to determine exact syntax for each property.
Note: Graphing and logging is currently only supported in the Windows version of the Phidget Control Panel.
In the Phidget Control Panel, open the channel for your device and click on the icon next to the data type that you want to plot. This will open up a new window:
If you need more complex functionality such as logging multiple sensors to the same sheet or performing calculations on the data, you'll need to write your own program. Generally this will involve addressing the correct channel, opening it, and then creating an Event Handler and adding graphing/logging code to it.
The quickest way to get started is to download some sample code for your desired programming language and then search google for logging or plotting in that language (e.g. "how to log to csv in python") and add the code to the existing change handler.
Filtering
You can perform filtering on the raw data in order to reduce noise in your graph. For more information, see the Control Panel Graphing page.
Graph Type
You can perform a transform on the incoming data to get different graph types that may provide insights into your sensor data. For more information on how to use these graph types, see the Control Panel Graphing page.
The Change Trigger is the minimum change in the sensor data needed to trigger a new data event.
The Data Interval is the time (in ms) between data events sent out from your Phidget.
The Data Rate is the reciprocal of Data Interval (measured in Hz), and setting it will set the reciprocal value for Data Interval and vice-versa.
You can modify one or both of these values to achieve different data outputs. You can learn more about these properties here.
Firmware Upgrade
MacOS users can upgrade device firmware by double-clicking the device row in the Phidget Control Panel.
Linux users can upgrade via the phidget22admin tool (see included readme for instructions).
Windows users can upgrade the firmware for this device using the Phidget Control Panel as shown below.
Firmware Downgrade
Firmware upgrades include important bug fixes and performance improvements, but there are some situations where you may want to revert to an old version of the firmware (for instance, when an application you're using is compiled using an older version of phidget22 that doesn't recognize the new firmware).
MacOS and Linux users can downgrade using the phidget22admin tool in the terminal (see included readme for instructions).
Windows users can downgrade directly from the Phidget Control Panel if they have driver version 1.9.20220112 or newer:
Firmware Version Numbering Schema
Phidgets device firmware is represented by a 3-digit number. For firmware patch notes, see the device history section on the Specifications tab on your device's product page.
- If the digit in the 'ones' spot changes, it means there have been bug fixes or optimizations. Sometimes these changes can drastically improve the performance of the device, so you should still upgrade whenever possible. These upgrades are backwards compatible, meaning you can still use this Phidget on a computer that has Phidget22 drivers from before this firmware upgrade was released.
- If the digit in the 'tens' spot changes, it means some features were added (e.g. new API commands or events). These upgrades are also backwards compatible, in the sense that computers running old Phidget22 drivers will still be able to use the device, but they will not be able to use any of the new features this version added.
- If the digit in the 'hundreds' spot changes, it means a major change has occurred (e.g. a complete rewrite of the firmware or moving to a new architecture). These changes are not backwards compatible, so if you try to use the upgraded board on a computer with old Phidget22 drivers, it will show up as unsupported in the Control Panel and any applications build using the old libraries won't recognize it either. Sometimes, when a Phidget has a new hardware revision (e.g. 1018_2 -> 1018_3), the firmware version's hundreds digit will change because entirely new firmware was needed (usually because a change in the processor). In this case, older hardware revisions won't be able to be upgraded to the higher version number and instead continue to get bug fixes within the same major revision.
The ENC1000 can connect to any of the encoders we sell without any modification just by setting the IOMode
property to Push-Pull . If you are trying to use your own encoder, you may need to change the IO mode to Open Collector or Line Driver mode. See the Encoder Guide for more details on what to use.
The encoder input on the ENC1000 uses a 5-pin, 0.100 inch pitch locking connector. The connectors are commonly available - refer to the Table below for manufacturer part numbers.
Manufacturer | Part Number | Description |
Molex | 50-57-9405 | 5 Position Cable Connector |
Molex | 16-02-0102 | Wire Crimp Insert for Cable Connector |
Molex | 70543-0004 | 5 Position Vertical PCB Connector |
Molex | 70553-0004 | 5 Position Right-Angle PCB Connector (Gold) |
Molex | 70553-0039 | 5 Position Right-Angle PCB Connector (Tin) |
Molex | 15-91-2055 | 5 Position Right-Angle PCB Connector - Surface Mount |
Note: Most of the above components can be bought at Digikey.
When your program captures an encoder change event, it will receive two variables: positionChange
(measured in 'ticks', four of which equal one quadrature count for the ENC1000) and timeChange
(measured in milliseconds). You can use these values to easily compute the instantaneous velocity of the encoder. For example, our C# encoder example implements this method of velocity calculation:
void enc_change(object sender, Phidget22.Events.EncoderEncoderChangeEventArgs e) {
...
// Convert time change from milliseconds to minutes
double timeChangeMinutes = e.TimeChange / 60000.0;
// Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user)
double rpm = (((double)e.PositionChange / CPR) / timeChangeMinutes);
...
}
This implementation may be useful if you are graphing the RPM on a line graph, but if it's being used to display the current RPM as a single number, it won't be very helpful because when the motor changes speed or direction frequently, it'll be hard to read the velocity as a meaningful value. This method can also be prone to variations in velocity if the encoder's CPR is low and the sampling rate is high. To solve these problems, you should decide on a time interval during which you'll gather data, and take a moving velocity calculation based on that data. You can use the Queue data type to make this easy:
Queue<double> positionChangeQueue = new Queue<double>();
Queue<double> timeChangeQueue = new Queue<double>();
void enc_change(object sender, Phidget22.Events.EncoderEncoderChangeEventArgs e) {
double totalPosition = 0;
double totalTime = 0;
int n = 500; // sampling window size, duration is 500*t where t is the data interval of the ENC1000
// add the newest sample to the queue
positionChangeQueue.Enqueue(e.PositionChange);
timeChangeQueue.Enqueue(e.TimeChange);
// If we've exceeded our desired window size, remove the oldest element from the queue
if ( positionChangeQueue.Count >= n ) {
positionChangeQueue.Dequeue();
timeChangeQueue.Dequeue();
}
// Calculate totals for position and time
foreach( double positionChange in positionChangeQueue ) {
totalPosition += positionChange;
}
foreach( double timeChange in timeChangeQueue ) {
totalTime += timeChange;
}
// Convert time change from milliseconds to minutes
double timeChangeMinutes = e.TimeChange / 60000.0;
// Calculate RPM based on the positionChange, timeChange, and encoder CPR (specified by the user)
double rpm = (((double)e.PositionChange / CPR) / timeChangeMinutes);
}