Modbus RTU Registers - GEOSNAKE C6 Firmware
π‘ Communication overviewβ
- Protocol: Modbus RTU
- Speed: 9600, 19200, 38400, 57600, 115200 bps (configurable)
- Format: 8 data, 1 stop, no parity
- Slave ID: 1-247 (configurable, default: 1)
- Supported functions: FC03 (Read Holding Registers), FC06 (Write Single Register), FC05 (Write Single Coil)
π’ Signed data format (signed values)β
Many registers contain negative values (temperature, acceleration, magnetic field, angles). These values are stored in two's complement format:
Signed 32-bit values (2 registers)β
Most measured values (acceleration, magnetic field, angles) are stored as a signed int32 split into 2 registers:
- High word (upper 16 bits): first register
- Low word (lower 16 bits): second register
Reconstructing a signed int32:
FUNCTION read_signed_int32(high_reg, low_reg):
value = (high_reg << 16) | low_reg
// Convert to signed (two's complement)
IF value > 0x7FFFFFFF THEN // if bit 31 = 1 (negative number)
value = value - 0x100000000
END IF
RETURN value
END FUNCTION
Example:
- high=0xFFFF, low=0xFFFE β 0xFFFFFFFE β -2 (signed)
- high=0x0000, low=0x0064 β 0x00000064 β +100 (signed)
Signed 16-bit values (1 register)β
Some values (e.g. temperature 0x066E) are a signed int16 in a single register:
Signed int16 conversion:
FUNCTION read_signed_int16(reg):
IF reg > 32767 THEN // if bit 15 = 1 (negative number)
RETURN reg - 65536
END IF
RETURN reg
END FUNCTION
Example:
- 0x09F6 (2550) β +2550 β +25.50Β°C (divided by 100)
- 0xFBFF (64511) β -1025 β -10.25Β°C (divided by 100)
πΊοΈ Register mapβ
π Basic registers (0x0000-0x000F)β
| Address | Register | Description | Type | R/W |
|---|---|---|---|---|
| 0x0000 | Status | Status register | uint16 | R |
| 0x0001 | FW Version | Firmware version | uint16 | R |
| 0x0002 | HW Version | Hardware version | uint16 | R |
π§ Alternative baudrate and address (0x0080-0x0082)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0080 | Baudrate High | Baudrate high word (32-bit baudrate) | uint16 | R/W | bps |
| 0x0081 | Baudrate Low | Baudrate low word (32-bit baudrate) | uint16 | R/W | bps |
| 0x0082 | Device Address | Device Modbus address (alternative) | uint16 | R/W | 1-255 |
Note: Registers 0x0080-0x0082 are an alternative way of setting the baudrate and address. The baudrate is stored as a 32-bit value split into 2 registers. Supported values: 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 bps.
π ADXL355 Accelerometerβ
βοΈ ADXL355 configuration (0x0600-0x0603)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0600 | ADXL Status | ADXL355 measurement status | uint16 | R/W | 0=idle, 1=start, 2=done |
| 0x0601 | ADXL Points | Number of samples per measurement | uint16 | R/W | 24-1024 |
| 0x0602 | ADXL Range | Accelerometer range | uint16 | R/W | 0=Β±2g, 1=Β±4g, 2=Β±8g |
| 0x0603 | ADXL ODR | Output Data Rate | uint16 | R/W | Hz |
| 0x0609 | ADXL Temp Raw | Raw ADXL355 temperature | uint16 | R | raw ADC |
ADXL355 parameter explanationβ
ADXL Status (0x0600):
0= Idle - no measurement in progress1= Start - starts a new measurement2= Done - measurement completed, data available
ADXL Points (0x0601):
- Number of samples for statistical processing (average, minimum, maximum)
- Range: 24-1024 samples
- More samples = more accurate results, but a longer measurement
- Typical value: 100-500 samples
ADXL Range (0x0602):
0= Β±2g - highest precision, for small accelerations1= Β±4g - medium range2= Β±8g - largest range, for large accelerations- Important: The range affects the conversion of RAW values (see below)
ADXL ODR (0x0603) - Output Data Rate:
- Sensor sampling frequency in Hz
- Higher ODR = faster measurement, but higher noise
- Lower ODR = slower measurement, but lower noise
- Typical values: 125, 250, 500, 1000, 2000, 4000 Hz
ADXL Temp Raw (0x0609):
- Raw value from the ADXL355 temperature ADC sensor
- Conversion formula:
Temp_Β°C = (RAW - 1852) / (-9.05) - Example: RAW = 1852 β 0Β°C, RAW = 1942 β -10Β°C, RAW = 1762 β +10Β°C
- For a more accurate temperature use register 0x066E (already converted to Β°C with 0.01Β°C resolution)
π ADXL355 data - Average (0x060A-0x060F)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x060A | ADXL Avg X High | X-axis average (high byte) | int32_h | R | raw |
| 0x060B | ADXL Avg X Low | X-axis average (low byte) | int32_l | R | raw |
| 0x060C | ADXL Avg Y High | Y-axis average (high byte) | int32_h | R | raw |
| 0x060D | ADXL Avg Y Low | Y-axis average (low byte) | int32_l | R | raw |
| 0x060E | ADXL Avg Z High | Z-axis average (high byte) | int32_h | R | raw |
| 0x060F | ADXL Avg Z Low | Z-axis average (low byte) | int32_l | R | raw |
Converting ADXL355 RAW values to g unitsβ
Signed values: Each axis is stored as a signed int32 in 2 registers. See the "Signed data format" section.
The conversion depends on the configured range (register 0x0602):
// First read the range from register 0x0602
range = READ_HOLDING_REGISTER(address=0x0602, slave_id=1)
// Then read the RAW value (signed int32 from 2 registers)
raw_value = read_signed_int32(high_reg, low_reg)
// Conversion by range:
IF range == 0 THEN // Β±2g range
g = raw_value Γ 3.9e-6
ELSE IF range == 1 THEN // Β±4g range
g = raw_value Γ 7.8e-6
ELSE IF range == 2 THEN // Β±8g range
g = raw_value Γ 15.6e-6
END IF
Calculation example:
- Range = 0 (Β±2g), RAW = 256410 β g = 256410 Γ 3.9e-6 = 1.00g
- Range = 1 (Β±4g), RAW = 256410 β g = 256410 Γ 7.8e-6 = 2.00g
- Range = 2 (Β±8g), RAW = -128205 β g = -128205 Γ 15.6e-6 = -2.00g
Relationship between range and resolution:
- Β±2g: 1 LSB = 3.9 Β΅g (highest resolution)
- Β±4g: 1 LSB = 7.8 Β΅g
- Β±8g: 1 LSB = 15.6 Β΅g (lowest resolution)
π ADXL355 data - Minimum (0x0610-0x0615)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0610 | ADXL Min X High | X-axis minimum (high byte) | int32_h | R | raw |
| 0x0611 | ADXL Min X Low | X-axis minimum (low byte) | int32_l | R | raw |
| 0x0612 | ADXL Min Y High | Y-axis minimum (high byte) | int32_h | R | raw |
| 0x0613 | ADXL Min Y Low | Y-axis minimum (low byte) | int32_l | R | raw |
| 0x0614 | ADXL Min Z High | Z-axis minimum (high byte) | int32_h | R | raw |
| 0x0615 | ADXL Min Z Low | Z-axis minimum (low byte) | int32_l | R | raw |
Signed values: See the "Signed data format" section. Conversion: See the "Converting ADXL355 RAW values to g units" section above - the conversion depends on the range (0x0602)
π ADXL355 data - Maximum (0x0616-0x061B)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0616 | ADXL Max X High | X-axis maximum (high byte) | int32_h | R | raw |
| 0x0617 | ADXL Max X Low | X-axis maximum (low byte) | int32_l | R | raw |
| 0x0618 | ADXL Max Y High | Y-axis maximum (high byte) | int32_h | R | raw |
| 0x0619 | ADXL Max Y Low | Y-axis maximum (low byte) | int32_l | R | raw |
| 0x061A | ADXL Max Z High | Z-axis maximum (high byte) | int32_h | R | raw |
| 0x061B | ADXL Max Z Low | Z-axis maximum (low byte) | int32_l | R | raw |
Signed values: See the "Signed data format" section. Conversion: See the "Converting ADXL355 RAW values to g units" section above - the conversion depends on the range (0x0602)
π§² MLX90393 Magnetometerβ
βοΈ MLX90393 configuration (0x0604-0x0605, 0x0630-0x0632)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0604 | MLX Status | MLX90393 measurement status | uint16 | R/W | 0=idle, 1=start, 2=done |
| 0x0605 | MLX Points | Number of samples per MLX measurement | uint16 | R/W | 1-1024 |
| 0x0630 | MLX Gain | Sensor gain | uint16 | R/W | 0-7 |
| 0x0631 | MLX OSR | Oversampling | uint16 | R/W | 0-3 |
| 0x0632 | MLX Filter | Digital filter | uint16 | R/W | 0-7 |
MLX90393 parameter explanationβ
MLX Status (0x0604):
0= Idle - no measurement in progress1= Start - starts a new measurement2= Done - measurement completed, data available
MLX Points (0x0605):
- Number of samples for statistical processing (average)
- Range: 1-1024 samples
- More samples = more accurate results, but a longer measurement
- Typical value: 10-100 samples
MLX Gain (0x0630) - Gain:
0= 1.0x (default gain)1= 1.33x2= 1.67x3= 2.0x4= 2.5x5= 3.0x6= 4.0x7= 5.0x- Higher gain = higher sensitivity for weak magnetic fields
- Lower gain = larger measurement range, less saturation
MLX OSR (0x0631) - Oversampling Ratio:
0= OSR_0 (fastest measurement, highest noise)1= OSR_12= OSR_23= OSR_3 (slowest measurement, lowest noise)- Higher OSR = better signal-to-noise ratio, but a slower measurement
MLX Filter (0x0632) - Digital filter:
0= FILTER_0 (no filtering)1= FILTER_12= FILTER_23= FILTER_34= FILTER_45= FILTER_5 (default)6= FILTER_67= FILTER_7 (maximum filtering)- Higher filter = smoother data, but a slower response to changes
π§² MLX90393 data - Average (0x061C-0x0621)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x061C | MLX Avg X High | X-axis average (high byte) | int32_h | R | Β΅T |
| 0x061D | MLX Avg X Low | X-axis average (low byte) | int32_l | R | Β΅T |
| 0x061E | MLX Avg Y High | Y-axis average (high byte) | int32_h | R | Β΅T |
| 0x061F | MLX Avg Y Low | Y-axis average (low byte) | int32_l | R | Β΅T |
| 0x0620 | MLX Avg Z High | Z-axis average (high byte) | int32_h | R | Β΅T |
| 0x0621 | MLX Avg Z Low | Z-axis average (low byte) | int32_l | R | Β΅T |
Signed values: Each axis is stored as a signed int32 in 2 registers. See the "Signed data format" section. Units: The values are directly in Β΅T (microtesla), they do not require any further conversion.
π§ System configurationβ
βοΈ System registers (0x0622-0x0628)β
| Address | Register | Description | Type | R/W | Values |
|---|---|---|---|---|---|
| 0x0622 | Device Address | Device Modbus address | uint16 | R/W | 1-247 |
| 0x0623 | Baudrate Index | Baudrate index | uint16 | R/W | 1-5* |
| 0x0624 | WiFi Status | WiFi status | uint16 | R/W | 0=OFF, 1=ON |
| 0x0625 | BT Status | Bluetooth status | uint16 | R/W | 0=OFF, 1=ON |
| 0x0626 | Restart Trigger | Device restart | uint16 | R/W | 0=NONE, 1=RESTART |
| 0x0627 | HTTP Status | HTTP sending status | uint16 | R/W | 0=OFF, 1=ON |
| 0x0628 | Debug Level | Debug output level | uint16 | R/W | 0-3* |
*Baudrate indexes:
- 1 = 9600 bps
- 2 = 19200 bps
- 3 = 38400 bps
- 4 = 57600 bps
- 5 = 115200 bps
*Debug levels:
- 0 = OFF (no debug messages)
- 1 = ERRORS (errors only)
- 2 = INFO (errors + information)
- 3 = VERBOSE (everything, including details)
π ADXL355 multiplied data (0x0650-0x0661)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0650 | ADXL Min Mult X High | X minimum multiplied (high) | int32_h | R | - |
| 0x0651 | ADXL Min Mult X Low | X minimum multiplied (low) | int32_l | R | - |
| 0x0652 | ADXL Min Mult Y High | Y minimum multiplied (high) | int32_h | R | - |
| 0x0653 | ADXL Min Mult Y Low | Y minimum multiplied (low) | int32_l | R | - |
| 0x0654 | ADXL Min Mult Z High | Z minimum multiplied (high) | int32_h | R | - |
| 0x0655 | ADXL Min Mult Z Low | Z minimum multiplied (low) | int32_l | R | - |
| 0x0656 | ADXL Max Mult X High | X maximum multiplied (high) | int32_h | R | - |
| 0x0657 | ADXL Max Mult X Low | X maximum multiplied (low) | int32_l | R | - |
| 0x0658 | ADXL Max Mult Y High | Y maximum multiplied (high) | int32_h | R | - |
| 0x0659 | ADXL Max Mult Y Low | Y maximum multiplied (low) | int32_l | R | - |
| 0x065A | ADXL Max Mult Z High | Z maximum multiplied (high) | int32_h | R | - |
| 0x065B | ADXL Max Mult Z Low | Z maximum multiplied (low) | int32_l | R | - |
| 0x065C | ADXL Avg Mult X High | X average multiplied (high) | int32_h | R | - |
| 0x065D | ADXL Avg Mult X Low | X average multiplied (low) | int32_l | R | - |
| 0x065E | ADXL Avg Mult Y High | Y average multiplied (high) | int32_h | R | - |
| 0x065F | ADXL Avg Mult Y Low | Y average multiplied (low) | int32_l | R | - |
| 0x0660 | ADXL Avg Mult Z High | Z average multiplied (high) | int32_h | R | - |
| 0x0661 | ADXL Avg Mult Z Low | Z average multiplied (low) | int32_l | R | - |
Signed values: See the "Signed data format" section. Multiplied values: These registers contain values in g units multiplied by a factor of 10000000 (10 million) for higher precision during transmission.
- To get the value in g:
g = signed_int32 / 10000000- Example: signed_int32 = 10000000 β 1.0g, signed_int32 = -5000000 β -0.5g Note: These values are already in physical g units (not RAW), they do not need conversion by range.
π OTA Firmware Update (0x0300-0x0307, 0x0400+)β
| Address | Register | Description | Type | R/W | Values |
|---|---|---|---|---|---|
| 0x0300 | OTA Control | Control commands | uint16 | W | 0=idle, 1=start, 3=end, 4=abort |
| 0x0301 | OTA Status | Current state | uint16 | R | 0=idle, 1=ready, 2=writing, 3=success, 4=error |
| 0x0302 | OTA Size High | FW size (high word) | uint16 | R/W | bytes |
| 0x0303 | OTA Size Low | FW size (low word) | uint16 | R/W | bytes |
| 0x0304 | OTA Written High | Bytes written (high word) | uint16 | R | bytes |
| 0x0305 | OTA Written Low | Bytes written (low word) | uint16 | R | bytes |
| 0x0306 | OTA Error Code | Error code | uint16 | R | - |
| 0x0307 | OTA Chunk Size | Max chunk size | uint16 | R | 240 bytes |
| 0x0400+ | OTA Data | Firmware data (FC16) | bytes | W | Firmware chunks |
π ADXL355 angles (0x0662-0x066E)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0662 | AngleX High | AngleX angle (high byte) | int32_h | R | 0.0001Β° |
| 0x0663 | AngleX Low | AngleX angle (low byte) | int32_l | R | 0.0001Β° |
| 0x0664 | AngleY High | AngleY angle (high byte) | int32_h | R | 0.0001Β° |
| 0x0665 | AngleY Low | AngleY angle (low byte) | int32_l | R | 0.0001Β° |
| 0x0666 | AngleZ High | AngleZ angle (high byte) | int32_h | R | 0.0001Β° |
| 0x0667 | AngleZ Low | AngleZ angle (low byte) | int32_l | R | 0.0001Β° |
| 0x0668 | Pitch Calc High | Calculated pitch (high byte) | int32_h | R | 0.0001Β° |
| 0x0669 | Pitch Calc Low | Calculated pitch (low byte) | int32_l | R | 0.0001Β° |
| 0x066A | Roll Calc High | Calculated roll (high byte) | int32_h | R | 0.0001Β° |
| 0x066B | Roll Calc Low | Calculated roll (low byte) | int32_l | R | 0.0001Β° |
| 0x066C | Tilt Calc High | Calculated tilt (high byte) | int32_h | R | 0.0001Β° |
| 0x066D | Tilt Calc Low | Calculated tilt (low byte) | int32_l | R | 0.0001Β° |
| 0x066E | Temp Celsius | ADXL355 temperature | int16 | R | 0.01Β°C |
Angles (0x0662-0x066D): All angles are a signed int32 (2 registers). See the "Signed data format" section.
- Registers 0x0662-0x0667: Old angles (angleX/Y/Z)
- Registers 0x0668-0x066D: New calculated angles (pitch/roll/tilt magnitude)
- Resolution: 0.0001Β° (divide the signed int32 by 10000)
- Example: signed_int32 = 450000 β 45.0000Β°, signed_int32 = -123456 β -12.3456Β°
Temperature (0x066E): Signed int16 (1 register), resolution 0.01Β°C. See the "Signed data format - Signed 16-bit values" section.
- Example: 2550 β +25.50Β°C, -1025 β -10.25Β°C
π Device identifiers (0x0700-0x070F)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0700 | Chip ID [63:48] | Chip ID highest word | uint16 | R | - |
| 0x0701 | Chip ID [47:32] | Chip ID high word | uint16 | R | - |
| 0x0702 | Chip ID [31:16] | Chip ID low word | uint16 | R | - |
| 0x0703 | Chip ID [15:0] | Chip ID lowest word | uint16 | R | - |
| 0x0704 | MAC [47:32] | MAC address high word | uint16 | R | - |
| 0x0705 | MAC [31:16] | MAC address middle word | uint16 | R | - |
| 0x0706 | MAC [15:0] | MAC address low word | uint16 | R | - |
| 0x0707 | CPU Cores | Number of CPU cores | uint16 | R | cores |
| 0x0708 | CPU Freq | CPU frequency | uint16 | R | MHz |
| 0x0709 | Flash Size | Flash memory size | uint16 | R | KB |
| 0x070A | Free Heap | Free RAM | uint16 | R | KB |
| 0x070B | Uptime High | Uptime high word | uint16 | R | s |
| 0x070C | Uptime Low | Uptime low word | uint16 | R | s |
| 0x070D | Sketch Size | Firmware size | uint16 | R | KB |
| 0x070E | Free Sketch | Free space for firmware | uint16 | R | KB |
| 0x070F | Chip Revision | ESP32-C6 chip revision | uint16 | R | - |
π‘ WiFi client IP address (0x0710-0x0713)β
| Address | Register | Description | Type | R/W | Unit |
|---|---|---|---|---|---|
| 0x0710 | WiFi IP [31:24] | Client IP address (highest byte) | uint16 | R | - |
| 0x0711 | WiFi IP [23:16] | Client IP address | uint16 | R | - |
| 0x0712 | WiFi IP [15:8] | Client IP address | uint16 | R | - |
| 0x0713 | WiFi IP [7:0] | Client IP address (lowest byte) | uint16 | R | - |
Note: If the device is not connected to WiFi as a client (STA or APSTA), the registers return 0.
π Supported Modbus functionsβ
FC03 - Read Holding Registersβ
Reading values from registers. All registers in the table above.
Example of reading the device ID:
Request: [01] [03] [07 00] [00 04] [CRC]
ID FC ADDR COUNT CRC
Response: [01] [03] [08] [12 34] [56 78] [9A BC] [DE F0] [CRC]
ID FC BC REG1 REG2 REG3 REG4 CRC
FC06 - Write Single Registerβ
Writing to selected registers:
| Address | Register | Description | Range |
|---|---|---|---|
| 0x0080 | Baudrate High | Baudrate high word | 32-bit value |
| 0x0081 | Baudrate Low | Baudrate low word | 32-bit value |
| 0x0082 | Address Alt | Modbus ID (alternative) | 1-255 |
| 0x0600 | ADXL Control | Start ADXL355 measurement | 0=NONE, 1=START |
| 0x0601 | ADXL Points | ADXL355 sample count | 24-1024 |
| 0x0602 | ADXL Range | Accelerometer range | 0-2 |
| 0x0603 | ADXL ODR | Output Data Rate | per sensor |
| 0x0604 | MLX Control | Start MLX90393 measurement | 0=NONE, 1=START |
| 0x0605 | MLX Points | MLX90393 sample count | 1-1024 |
| 0x0622 | Address | Modbus ID | 1-247 |
| 0x0623 | Baudrate Index | Baudrate index | 1-5 |
| 0x0624 | WiFi | WiFi configuration | 0=OFF, 1=ON |
| 0x0625 | Bluetooth | Bluetooth configuration | 0=OFF, 1=ON |
| 0x0626 | Restart | Device restart | 0=NONE, 1=RESTART |
| 0x0627 | HTTP | HTTP sending | 0=OFF, 1=ON |
| 0x0628 | Debug Level | Debug level | 0-3 |
| 0x0630 | MLX Gain | MLX90393 gain | 0-7 |
| 0x0631 | MLX OSR | MLX90393 oversampling | 0-3 |
| 0x0632 | MLX Filter | MLX90393 filter | 0-7 |
| 0x0300 | OTA Control | OTA control | 0/1/3/4 |
| 0x0302 | OTA Size High | OTA size high | bytes |
| 0x0303 | OTA Size Low | OTA size low | bytes |
Example of setting the baudrate (index):
Request: [01] [06] [06 23] [00 05] [CRC] ; Set 115200 bps (index 5)
ID FC ADDR VALUE CRC
Response: [01] [06] [06 23] [00 05] [CRC] ; Echo
Example of starting an ADXL355 measurement:
Request: [01] [06] [06 00] [00 01] [CRC] ; Start measurement
ID FC ADDR VALUE CRC
Response: [01] [06] [06 00] [00 01] [CRC] ; Echo
FC05 - Write Single Coilβ
Coil control (start measurement):
| Address | Coil | Description | Values |
|---|---|---|---|
| 0x000D | Start Measurement | Start ADXL + MLX measurement | 0x0000=NONE, 0xFF00=START |
Example of starting a measurement:
Request: [01] [05] [00 0D] [FF 00] [CRC] ; Start measurement
ID FC ADDR VALUE CRC
Response: [01] [05] [00 0D] [FF 00] [CRC] ; Echo
Note: FC05 at address 0x0D starts a measurement of both sensors (ADXL355 and MLX90393) at the same time.
π§ Troubleshootingβ
Common errorsβ
- Invalid register address - The register does not exist or is not implemented
- Timeout - Check the baudrate and Modbus ID
- CRC error - Problems with the communication cable or interference
- Invalid Modbus ID - Check the slave address setting
π Diagnosticsβ
# Communication test
modpoll -m rtu -b 19200 -p none -s 1 -r 1 -c 1 /dev/ttyUSB0
# Read the device ID (4 registers)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0700 -c 4 /dev/ttyUSB0
# Read the MAC address (3 registers)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0704 -c 3 /dev/ttyUSB0
# Set the baudrate to 115200 (via index)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0623 -c 1 5 /dev/ttyUSB0
# Read the debug level
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0628 -c 1 /dev/ttyUSB0
# Set the debug level to VERBOSE (3)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0628 -c 1 3 /dev/ttyUSB0
# Start an ADXL355 measurement
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0600 -c 1 1 /dev/ttyUSB0
# Read the ADXL355 measurement status
modpoll -m rtu -b 19200 -p none -s 1 -r 0x0600 -c 1 /dev/ttyUSB0
# Read the ADXL355 average values (6 registers X,Y,Z)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x060A -c 6 /dev/ttyUSB0
# Read the MLX90393 average values (6 registers X,Y,Z)
modpoll -m rtu -b 19200 -p none -s 1 -r 0x061C -c 6 /dev/ttyUSB0
β οΈ Safety notesβ
- Device identifiers are read-only
- Changing the baudrate requires restarting the communication (not restarting the device)
- Changing the Modbus address (0x0622 or 0x0082) takes effect immediately
- WiFi/BT changes require a device restart (register 0x0626)
- Use appropriate timeout values (min. 1000ms)
- Always verify the current values by reading before writing
- Registers 0x0080-0x0082 provide alternative access to the baudrate/address
π Summary of the main addressesβ
| Area | Address | Description |
|---|---|---|
| Status | 0x0000-0x0002 | Status, FW, HW version |
| Baudrate Alt | 0x0080-0x0082 | Alternative baudrate/address |
| ADXL Config | 0x0600-0x0603 | ADXL355 configuration |
| MLX Config | 0x0604-0x0605, 0x0630-0x0632 | MLX90393 configuration |
| ADXL Data | 0x060A-0x061B | ADXL355 average, min, max |
| MLX Data | 0x061C-0x0621 | MLX90393 average |
| System | 0x0622-0x0628 | Address, baudrate, WiFi, BT, HTTP, debug |
| ADXL Mult | 0x0650-0x0661 | ADXL multiplied values |
| ADXL Angles | 0x0662-0x066E | Angles and temperature |
| Device ID | 0x0700-0x070F | Chip ID, MAC, CPU info |
| WiFi IP | 0x0710-0x0713 | Client IP address |
| OTA | 0x0300-0x0307 | OTA firmware update |