Communication & Messaging
1 Interfacing
- The communication interfaces currently supported for the ANELLO products are listed below:
Serial (RS-422)
UART (3.3V)
1.1 Serial Communication Parameters
- Default Baud Rate:
460800
- Data Format:
Data Bits: 8
Stop Bits: 1
Parity: None
1.2 Time Synchronization
1.2.1 External Sync Pulse
All ANELLO products include the option for time synchronization via an external sync pulse, e.g. from external PPS signal. To enable external synchronization, the “Sync Pulse Enable” Unit Configuration must be enabled. Enabling the sync configuration requires the unit to be reset or repowered as the interrupt is set up during MCU initialization. When “Sync Pulse Enable” is on, the rising edge of the sync pulse is detected by an interrupt and time-tagged in the IMU message “T_Sync” field.
The sync pulse input can be sent up to 100 Hz with a pulse width of at least 5 ms. A voltage level of 3.3 V is standard, but voltages from 1.5 to 5 V are also supported. See Mechanicals to find the sync input pin for each product.
2 ASCII Data Output Messages
ANELLO has two message formats, ASCII and Binary. The structures of all ASCII messages use the following conventions:
The lead code identifier for each record is ‘#’
All data fields are delimited by a comma
Each log ends with a hexadecimal checksum preceded by an asterisk and followed by a line termination using the carriage return and line feed characters
The checksum is an XOR of all the bytes between # and *, written in hexadecimal (letters must be uppercase)
APIMU messages are transmitted at the output data rate (ODR) setting
2.1 APIMU Message
Field
Units
Description
0
APIMU
Sentence identifier
1
Time
ms
Time since power on
2
T_Sync
ms
Time at last sync rising edge (zero when sync config disabled)
3
AX
g
X-Axis Acceleration
4
AY
g
Y-Axis Acceleration
5
AZ
g
Z-Axis Acceleration
6
WX
deg/s
X-Axis Angular Rate (MEMS)
7
WY
deg/s
Y-Axis Angular Rate (MEMS)
8
WZ
deg/s
Z-Axis Angular Rate (MEMS)
9
OG_WX
deg/s
High Precicision X-Axis Angular Rate (ANELLO Optical Gyro)
10
OG_WY
deg/s
High Precicision Y-Axis Angular Rate (ANELLO Optical Gyro)
11
OG_WZ
deg/s
High Precicision Z-Axis Angular Rate (ANELLO Optical Gyro)
12
MAG_X
g
X-Axis Magnetic Field Measurement
13
MAG_Y
g
X-Axis Magnetic Field Measurement
14
MAG_Z
g
X-Axis Magnetic Field Measurement
15
Temp C
°C
Temperature
16
Status_X
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad
17
Status_Y
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad
18
Status_Z
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad
3 Binary Data Output Messages
3.1 IMU Message (X3)
The ANELLO binary packets use a 2-byte preamble followed by a 1-byte message type and a 1-byte length. There is also a 2-byte checksum after the payload.
Preamble
Message Type
Length information
Payload
Checksum
0xC5 0x50
IMU = 253
1-byte
Message structure defined below
2-byte
The payload for the binary output message is described below
Field
Type
Units
Description
0
MCU Time
uint64
ns
Time since power on
1
Sync Time
uint64
ns
Timestamp of input sync pulse (if enabled and provided)
2
AX1
int16
g=raw_int16*(accel_range*0.0000305)
Scaled sensor accel
3
AY1
int16
g=raw_int16*(accel_range*0.0000305)
Scaled sensor accel
4
AZ1
int16
g=raw_int16*(accel_range*0.0000305)
Scaled sensor accel
5
WX1
int16
dps=raw_int16*(mems_gyro_range*0.000035)
Scaled sensor rate
6
WY1
int16
dps=raw_int16*(mems_gyro_range*0.000035)
Scaled sensor rate
7
WZ1
int16
dps=raw_int16*(mems_gyro_range*0.000035)
Scaled sensor rate
8
OG_WX
int32
fog_dps = raw_int32 * (mems_gyro_range / 2^31)
Scaled sensor rate for FOG. MEMS gyro range is last 11 in MEMS Range field
9
OG_WY
int32
fog_dps = raw_int32 * (mems_gyro_range / 2^31)
Scaled sensor rate for FOG. MEMS gyro range is last 11 in MEMS Range field
10
OG_WZ
int32
fog_dps = raw_int32 * (mems_gyro_range / 2^31)
Scaled sensor rate for FOG. MEMS gyro range is last 11 in MEMS Range field
11
MAG_X
int16
mag_G = raw_int16 / 4096.0
Scaled magnetometer data
12
MAG_Y
int16
mag_G = raw_int16 / 4096.0
Scaled magnetometer data
13
MAG_Z
int16
mag_G = raw_int16 / 4096.0
Scaled magnetometer data
14
Temperature
int16
°C * 100
Scaled temperature data
15
MEMS Range
uint16
g and dps
First 5 bits accel range, next 11 bits rate range
16
FOG Range
uint16
dps
FOG range in degrees per second
17
Status_X
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad - Bits 4-7: RESERVED
18
Status_Y
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad - Bits 4-7: RESERVED
19
Status_Z
Bitfield
Status based on bits: - Bit 0: Gyro discrepency - Bit 1: Temperature uncontrolled - Bit 2: Over current error - Bit 3: SiPhOG supply voltage bad - Bits 4-7: RESERVED
4 Input Messages
4.1 APCFG Messages
The easiest way to configure an ANELLO unit is using the ANELLO Python Program, which saves all changes to non-volatile flash memory.
Alternatively, the unit can be configured using the APCFG message, which allows for both temporary (RAM) and permanent setting (FLASH) of configuration parameters.
#APCFG,<r/w/R/W>,<param1>,<value1>,…,<paramN>,<valueN>*checksum
Field
Description
0
APCFG
Sentence identifier
1
<read/write>
‘r’: read RAM, ‘w’: write RAM, ‘R’: read FLASH, ‘W’: write FLASH
2
<param>
Configuration parameter (APCFG code)
3
<value>
Configuration value, expressed in ASCII
4
checksum
XOR of bytes between # and * written in hexadecimal (letters must be uppercase)
For more details on configuration parameters and values, see Unit Configurations.
4.2 Ping Command
The Ping command can be used to test if the serial port is properly configured.
#APPNG*48
A correctly received ping command generates a response from the unit of:
#APPNG,0*54
4.3 Echo Command
The Echo command serves as an additional communication test for the serial port configuration as well as the checksum generator. For example:
#APECH,Echo! echo… ech… e…*77
A correctly received Echo command generates an identical response from the unit:
#APECH,Echo! echo… ech… e…*77.
4.4 Reset Command
The reset command allows the user to reset the system, e.g. after changing a configuration setting that requires a power cycle. No response message is generated; however, the system will reset causing the system output to be suspended briefly.
#APRST,0*58
5 Error Messages
If an incorrect command is sent to the unit, it responds with one of ten error responses. The error message format is:
#APERR,<error code>*CS
The following table lists the error code along with the corresponding description.
Error Code |
Description |
|---|---|
1 |
No start character (#) |
2 |
Read/Write indicator missing (from #APCFG or #APVEH) |
3 |
Incomplete message (checksum missing) |
4 |
Incorrect checksum |
5 |
Invalid preamble (AP) |
6 |
Invalid message type |
7 |
Invalid field |
8 |
Invalid value |
9 |
Flash locked |
10 |
Unexpected character (applies to APPID, APSTA, APVER, APSER, APFSN, and APFHW) |
11 |
Disabled command (applies to APODO) |
6 Checksum
6.1 Ascii Checksum
The ASCII checksum is an XOR of all characters between the start character ‘#’ and the checksum indicator ‘*’. The following python code snippet can be used to generate the correct checksum.
Specify the input message (generates the string: #APCFG,W,odr,2,msg,IMU*4B)
Generate the checksum for the inertial product input message
Print the complete message (starting field and checksum) to the screen
msg = bytearray(APCFG,W,odr,2,msg,IMU)
checksum = 0
for c in msg:
checksum = checksum ^ int(c)
print(#%s*%02X % (msg.decode(), checksum))
6.2 Binary Checksum
The 2 preamble bytes and the checksum itself are not included in the checksum calculation. Checksum is calculated as follows, where N is the number of bytes included in the checksum calculation:
CK_A = 0
CK_B = 0
for (I = 0; I < N; I++)
{
CK_A = CK_A + Buffer[I]
CK_B = CK_B + CK_A
}