At the lowest level, UHF RFID works by running a series of "inventory rounds". Each inventory round takes 8-50ms. this time depends on many factors including how many tags respond, what is being done with each tag and how long the tags take to respond. Thus the Grokker can typically run 20-100 inventory rounds per second.
Before each inventory round the Grokker configures:
The power level is set in dBm (30 = 1 watt, 20 = 1 mW). Theoretically a higher power level will ave better performance, but in reality that is not always the case. The power can be configured in the SDK, and is normally set as a range (minimum, initial, maximum). For each inventory round the Grokker randomly chooses a value between minimumPowerLevel and maximumPowerLevel, centered at initialPowerLevel. The defaults for the Locate Distance (23/27/30) and for Inventory Distance (23/27/29) are the result of empirical testing to give the best read range in a variety of conditions, but performance depends on so many factors (type of tag, tag density, RF environment, ...) that other settings may be more optimal in some cases.
RFID frequency hops between channels, using a difference frequency for each inventory round. These channels and frequencies are regulated and vary between regions of the world. This is set in the Grokker and cannot be changed for regulatory reasons.
The reader can adjust its RF sensitivity, which affects how strong the return signal must be to be recognized. This is measured in dB, with a lower number being a higher sensitivity. This can be set in the SDK, but defaults to the highest sensitivity setting and we have not found situations where a lower sensitivity setting performs better.
Each inventory round starts by the reader transmitting a continuous carrier wave long enough for tags to harvest power and turn on. Then the reader sends a command to start an inventory round. There are lots of parameters for how to do the inventory:
None of these settings are configurable from the SDK. Many of the settings would affect the RF characteristics of the Grokker and thus changing them could affect regulatory compliance.
The inventory round will have 2^Q "slots". So a Q value of 4 means 16 slots. Each tag randomly picks a number between 0 and 2^Q, and will respond in that slot. If two tags respond in the same slot they will collide and neither will be read. Thus a higher Q value is better in a tag dense environment (less collisions) and a low Q number is better in tag sparse environments (faster inventory rounds, less time for errors). The Q value can be set in the SDK as a range (initial Q value, minimum and maximum Q values). The Grokker starts at the initial Q value, then varies this up or down for subsequent inventory rounds depending on how many tags respond in each round and how many collisions occur. This dynamic setting of the Q value yields a modest performance improvement in most situations.
There are four possible sessions: 0, 1, 2 and 3. The sessions differ in what tags do in subsequent inventory rounds after successfully being read. The SDK allows changing the session, and by default uses session 0 for the "Locate" modes and session 1 for the "Inventory" modes.
0 - no persistence
The tag will respond every inventory round
1 - short persistence
The tag is supposed to not respond again for 0.5 to 5 seconds. Session 1 provides a huge performance boost in tag dense environments when the application only cares to know the first time a tag is read.
2 - longer persistence
The tag is supposed to not respond again for an indefinite time as long as it is powered, and at least 2 seconds if it is not powered. While theoretically session 2 should be good for inventory in tag dense environments, empirical testing shows that session 1 usually works better.
- 3 - similar to 2, not commonly used
If a select mask is set, it is sent as part of starting each inventory round. If a select mask is set, only tags that match this mask will respond. A memory bank, starting offset and bit length are also sent, so that tags can be selected based on any part of any memory bank. The most common use is to select on a portion of the EPC. This can be set in the SDK.
After starting the inventory round, the reader iterates through all the slots by way of a "next slot" command. For each slot, the reader gives tags a bit of time to respond. If a response is received, the reader then reads the tag's EPC. If anything else needs to be done to the tag (such as reading or writing user data) the reader does that operation.
Tags implement the session persistence described above by toggling their session flags between an A and B state. This normally works, but empirical testing shows that occasionally tags can flip their state when they were not read completely. To account for this, the SDK has a "roundsWithNoFindsToToggleAB" setting. When this number of inventory rounds have been run with no tags found, the Grokker toggles to looking for "B" tags. This causes redundant reads, but allows all tags to be found. This setting has no effect in session 0. The default is 10 based on empirical testing.
As explained above, normally the Grokker will run 20-50 inventory rounds per second. In many use cases, performance will not suffer if inventory is run less frequently. The SDK allows setting a maximum number of inventory rounds per second, which can increase battery life since running inventory is the major use of power.
The UgiRfidConfiguration object is used for Grokker configuration.
A UgiRfidConfiguration object is created based on a built-in configuration. There are five built-in configurations (the syntax varies between languages, but the settings are the same):
These three configurations differ only in the power settings, LocateDistance has settings for optimum read range, LocateShortRange has lower lower settings and LocateVeryShortRange has very low power settings. These configurations are intended for low tag-density environments where you are trying to locate or identify a single object. All three use session 0 and will beep in a geiger-counter fashion.
These two configurations differ only in the power settings, InventoryDistance has settings for optimum read range and InventoryShortRange has lower lower settings. These configurations are intended for high tag-density environments where you are trying to inventory or count many items. Both use session 1 and will beep once for each new tag found.
This configuration will find a single tag. By default inventory will stop when a tag is found, but the singleFindContinueInventory field can be saet to true to keep inventory running. Also by default power will ramp from the minimum power level to the maximum power level, to maximize the probability that the closest tag will be found. This power ramping can be changed via the singleFindRampPowerMode field.
These are numeric values between 5 and 30, and are all power levels in dBm (30 = 1 watt, 20 = 1 mW). Each inventory round will use a lower level between minPowerLevel and maxPowerLevel, centered around initialPowerLevel.
- LocateDistance: initial = 27, min = 23, max = 30
- LocateShortRange: initial = 21, min = 17, max = 24
- LocateVeryShortRange: initial = 9, min = 5, max = 12
- InventoryDistance: initial = 27, min = 23, max = 29
- InventoryShortRange: initial = 21, min = 17, max = 24
- SingleFind: initial = 5, min = 5, max = 30
These are numeric values between 2 and 12. The Grokker starts at the initial Q value, then varies this up or down for subsequent inventory rounds depending on how many tags respond in each round and how many collisions occur.
- LocateDistance: initial = 4, min = 2, max = 7
- LocateShortRange: initial = 4, min = 2, max = 7
- LocateVeryShortRange: initial = 4, min = 2, max = 7
- InventoryDistance: initial = 3, min = 2, max = 7
- InventoryShortRange: initial = 3, min = 2, max = 7
- SingleFind: initial = 3, min = 2, max = 7
This is either 0, 1, 2 or 3 and controls a tag's "persistence" as described above.
- LocateDistance: 0
- LocateShortRange: 0
- LocateVeryShortRange: 0
- InventoryDistance: 1
- InventoryShortRange: 1
- SingleFind: 1
This is a numeric value between 0 and 50. It is described above in "session flags".
- LocateDistance: 0 (not used when using session 0)
- LocateShortRange: 0 (not used when using session 0)
- LocateVeryShortRange: 0 (not used when using session 0)
- InventoryDistance: 10
- InventoryShortRange: 10
- SingleFind: 10
This is a numeric value between -85 and -20 and is in dBm. It is described above, and normally should not be changed.
- LocateDistance: -85
- LocateShortRange: -85
- LocateVeryShortRange: -85
- InventoryDistance: -85
- InventoryShortRange: -85
- SingleFind: -85
This is a numeric value between 0 and 50. Zero means there is no maximum rounds per second. Any number other than zero will limit the number of inventory rounds run each second, which conserves power.
Default for all configurations: 0 (no maximum)
This is the type of beeping to do when tags are found. The options are:
- None: no beeping
- Geiger: "geiger counter" style beeping with short, fast beeps that are most frequent when tags are being found more often.
- First find: one longer beep when any tag is found for the first time
- LocateDistance: Geiger
- LocateShortRange: Geiger
- LocateVeryShortRange: Geiger
- InventoryDistance: FirstFind
- InventoryShortRange: FirstFind
- SingleFind: FirstFind
This is a numeric numeric value between 0 and 15, and is the volume level for beeps.
Default for all configurations: 15 (maximum)
This is a boolean value. If TRUE, then every time a tag is found it is reported from the Grokker to the reader. If it is FALSE, only the first find is reported.
- LocateDistance: TRUE
- LocateShortRange: TRUE
- LocateVeryShortRange: TRUE
- InventoryDistance: FALSE
- InventoryShortRange: FALSE
- SingleFind: FALSE
This is a numeric value between 5 and 30, and is a power level in dBm (30 = 1 watt, 20 = 1 mW). This is the power level used in an inventory round if trying to write to a tag (either EPC or user memory). This setting exists because the optimum power for writing a tag is empirically different than the optimum power for finding the tag.
Default for all configurations: 24
This is a numeric value between -85 and -20 and is in dBm. This is the sensitivity level used in an inventory round if trying to write to a tag (either EPC or user memory). This setting exists because the optimum sensitivity for writing a tag is empirically different than the optimum sensitivity for finding the tag.
Default for all configurations: -60
These fields are used to set a bit-wise mask to limit which tags respond to an inventory round. selectMask is a byte array that defaults to null. If selectMask is non-null, this mask is matched against the tags memory in the selectBank bank, starting at selectOffset with a length of selectMaskBitLength bits.
These are boolean (true/false) values. In listen-before-talk mode the Grokker will try to detect if another RFID reader is active on the same frequency before starting an inventory round. If so, another frequency will be chosen. This slows inventory but can increase performance if multiple readers are being used in close proximity. If setListenBeforeTalk is TRUE, then the "listen to talk" state is set to listenBeforeTalk, if setListenBeforeTalk is FALSE then the default is used.
Default for all configurations: use default (which is false for almost all regions)
If set to TRUE each tags RSSI (reverse signal strength indicator) will be returned in the UgiTag structure. The RSSI is a measure of the strength of the return signal from the tag and theoretically the RSSI can help determine how close a tag is to the reader, but this is challenging to use in practice. There are two RSSI values, I and Q, which both range from 1 to 15, and have to do with the phase of the return signal.
Default for all configurations: FALSE
These fields are used to automatically read USER, TID or RESERVED memory from each tag when the tag is first found. The defaults are all zero, which reads no memory, If the min/max is set for any of the memory banks, that bank will be read starting at offset 0. Often it is known exactly how many bytes are desired, if this is the case set min=max, which is the most efficient. The data will be in the user, tid or reserved fields of the UgiTag object.
detailedPerReadNumReads, detailedPerReadMemoryBank1, detailedPerReadWordOffset1
detailedPerReadData defaults to FALSE. If set to TRUE, detailed data is sent from the Grokker to the host for each tag read. This causes much more data to be sent between the Grokker and the host, so should not be used in a tag dense environment. The detailed data is sent in the inventoryTagFound and inventoryTagSubsequentFinds methods and includes:
- timestamp: when exactly the read happened
- frequency: the frequency that the read happened on
- rssiI, rssiQ: the RSSI of the tag find
If detailedPerReadNumReads is 1 or 2, readData1 is the value read from detailedPerReadMemoryBank1 at offset detailedPerReadWordOffset1.
If detailedPerReadNumReads is 2, readData2 is the value read from detailedPerReadMemoryBank1 at offset detailedPerReadWordOffset1.
These are useful for some types of sensor tags.
If set to TRUE, only one inventory round will be run. This is normally only used in testing scenarios.
Default for all configurations: FALSE
Causes the Grokker to find only a single tag.
- LocateDistance: FALSE
- LocateShortRange: FALSE
- LocateVeryShortRange: FALSE
- InventoryDistance: FALSE
- InventoryShortRange: FALSE
- SingleFind: TRUE
Causes the Grokker to continue inventory after finding a tag in SingleFind mode.
Default for all configurations: FALSE
Determines if and how power is ramped from minimum to maximum.
- NO_RAMP: Don't ramp power, just do normal power selection between minimum and maximum
- SLOW: Ramp power slowly (250 rounds from lowest to highest, about 4 seconds)
- MEDIUM: Ramp power medium (125 rounds from lowest to highest, about 2 seconds)
- FAST: Ramp power quickly (50 rounds from lowest to highest, about 1 second)
Default for SingleFind configuration: MEDIUM
Default for all configurations: NO_RAMP
Copyright © 2012-2016 U Grok It, Inc. connect@UGrokIt.com
U Grok It and the U Grok It logo are registered trademarks of U Grok It, Inc.
All other trademarks and copyrights are the property of their respective owners