RFID Configuration

Background

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

Before each inventory round the Grokker configures:

Power level

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.

Frequency

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.

Sensitivity

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.

Starting an inventory round

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:

Low level RF: modulation techniques, bit rates, hold times, ...

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.

Q value

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.

Session

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.

Select mask

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.

Iterating through the slots during an inventory round

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.

Between Inventory Rounds
Session flags

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.

Maximum rounds per second

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.

Specifications and more information

The official spec document is here but at 152 pages it is a challenging read. If you are interested in learning more, this book is an easier approach (but is still long).

Configuration Parameters

The UgiRfidConfiguration object is used for Grokker configuration.

Built-in types

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):

LocateDistance, LocateShortRange, LocateVeryShortRange

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.

InventoryDistance, InventoryShortRange

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.

SingleFind

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.

Fields in UgiRfidConfiguration
initialPowerLevel / minPowerLevel / maxPowerLevel

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.

Defaults:

initialQValue, minQValue, maxQValue

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.

Defaults:

session

This is either 0, 1, 2 or 3 and controls a tag's "persistence" as described above.

Defaults:

roundsWithNoFindsToToggleAB

This is a numeric value between 0 and 50. It is described above in "session flags".

Defaults:

sensitivity

This is a numeric value between -85 and -20 and is in dBm. It is described above, and normally should not be changed.

Defaults:

maxRoundsPerSecond

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)

soundType

This is the type of beeping to do when tags are found. The options are:

Defaults:

volume

This is a numeric numeric value between 0 and 15, and is the volume level for beeps.

Default for all configurations: 15 (maximum)

reportSubsequentFinds

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.

Defaults:

powerLevelWrite

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

sensitivityWrite

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

selectMask, selectBank, selectMaskBitLength, selectOffset

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.

setListenBeforeTalk, listenBeforeTalk

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)

reportRssi

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

minUserBytes, maxUserBytes
minReservedBytes, maxReserBytes
minTidBytes, maxTidBytes

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.

detailedPerReadData
detailedPerReadNumReads, detailedPerReadMemoryBank1, detailedPerReadWordOffset1
detailedPerReadMemoryBank2, detailedPerReadWordOffset2

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:

continual

If set to TRUE, only one inventory round will be run. This is normally only used in testing scenarios.

Default for all configurations: FALSE

singleFindMode

Causes the Grokker to find only a single tag.

Defaults:

singleFindContinueInventory

Causes the Grokker to continue inventory after finding a tag in SingleFind mode.

Default for all configurations: FALSE

singleFindRampPowerMode

Determines if and how power is ramped from minimum to maximum.

Values:

Default for SingleFind configuration: MEDIUM

Default for all configurations: NO_RAMP