# DroneCAN BMS node
BMS node reads data from BMS 16i (opens new window) and sends it as DroneCAN message.
# 1. Hardware specification

# 2. Wire
The node has several connectors which are described in the table below.
| № | Connector | Description |
|---|---|---|
| 1 | CAN1A, CAN1B (UCANPHY Micro or JST-GH 4) | This CAN socket is used for communication with DroneCAN/Cyphal network. The baudrate is 1000000. |
| 2 | CAN2A, CAN2B (UCANPHY Micro or JST-GH 4) | This CAN socket is used for reading data from BMS. The baudrate is 250000. |
| 3 | SWD | STM32 firmware updating using programmer-sniffer. |
| 4 | USB | Do not use it. |
BMS 16i is powered directly from the monitored battery and works independently.
Example of connection is shown below.

# 3. Main function description
The node converts CAN frames from the BMS 16i in his format on the CAN2 socket and sends DroneCAN BatteryInfo on the CAN1 socket.
The node reads 3 CAN frames from the BMS (package0, package1 and package2).
The reading data are:
- total voltage,
- total current,
- temperature,
- 3 flags: bms error, is used and overheat.
The node also estimates an average power and charging level in percents.
The result publish rate is 3 Hz. More specifically, the node sends message when it received something from the BMS. If there is no data, the node will send nothing.
3.1 Charging level
There are 2 option how to fill the charging level.
If bms_estimate_percent is disabled (= 0), the node parses this value from the BMS directly.
If bms_estimate_percent is enabled (= 1), the node linearly estimates this value himself. You should specify the following parameters:
bms_cell_num,bms_cell_min_voltage_mv,bms_cell_max_voltage_mv,
If total voltage is less than bms_cell_num * bms_cell_min_voltage_mv, the charging level will be 0%.
If total voltage is more than bms_cell_num * bms_cell_max_voltage_mv, the charging level will be 100%.
Otherwise the charging level will be linearly estimated between 0 and 100%.
# 4. Led indication
This board has an internal led that may allow you to understand possible problems. It blinks from 1 to 10 times within 4 seconds. By counting the number of blinks you can define the code of current status.
| Number of blinks | Color | Health | Description |
|---|---|---|---|
| 1 | Green | OK | Everything is ok. |
| 5 | RED | ERROR | Either the node receive nothing from BMS for at least 1 second or it receive ERROR status |
| 6 | RED | CRITICAL | There is a problem on the periphery initialization level. Probably you load the wrong firmware. |
# 5. DroneCAN Interface
Device get info from i2c and publish to CAN.
| № | Type | Message |
|---|---|---|
| 1 | publisher | uavcan.equipment.power.BatteryInfo (opens new window) |
| 2 | publisher | uavcan.protocol.debug.LogMessage (opens new window) |
Besides required and highly recommended functions such as NodeStatus and GetNodeInfo this node also supports the following application-level functions:
| № | type | message |
|---|---|---|
| 1 | RPC-service | uavcan.protocol.param (opens new window) |
| 2 | RPC-service | uavcan.protocol.RestartNode (opens new window) |
| 3 | RPC-service | uavcan.protocol.GetTransportStats (opens new window) |
# 6. DroneCAN Parameters
| № | Parameter name | Parameter Type | Description |
|---|---|---|---|
| 0 | id | Integer | Node identifier. Should be unique in the network |
| 1 | bms_std_addr | Integer | BMS standard CAN address |
| 2 | bms_ext_addr | Integer | BMS extended CAN address |
| 3 | bms_battery_id | Integer | Battery identifier (BatteryInfo message) |
| 4 | bms_instance | Integer | Instance (BatteryInfo message) |
| 5 | bms_power_filter_size | Integer | Moving average power estimator filter size |
| 5 | bms_cell_num | Integer | Number of cells. It is used for charging percent estimation. |
| 6 | bms_cell_max_voltage_mv | Integer | Max cell voltage. It is used for charging percent estimation. |
| 7 | bms_cell_min_voltage_mv | Integer | Min cell voltage. It is used for charging percent estimation. |
| 8 | bms_estimate_percent | Integer | Enable or disable charging percent estimation. |
| 9 | bms_self_test | Integer | Disable (0) or enable (1) self testing |
| 10 | log_level | Integer | Logging level from 0 (debug) to 3 (critical only) |
| 11 | name | String | Custom node name |
# 6.1. Log level
According to the LogLevel (opens new window) message, we have 4 log levels:
- debug
- info
- warning
- errors
log_level parameter might have values described in the table below.
| Param value | DEBUG | INFO | WARNING | ERROR | Description |
|---|---|---|---|---|---|
| 0 | + | + | + | + | Log everything |
| 1 | - | + | + | + | At least INFO level |
| 2 | - | - | + | + | At least WARNING level |
| 3 | - | - | - | + | At least ERROR level |
| 4 | - | - | - | - | Disable logging |
0 - log everything, 1 - discard less than info level, 2 - discard less than warn level, 3 -log only errors, 4 - disable logging
# 6.2. Node name customization
By default this node has Unknown name. Change name parameter value to set the desired name.
# 7. Versions
Here is a list with released stable version of the firmware.
| Version | Date | SHA | Link |
|---|---|---|---|
| v0.8.12 | Oct 02, 2022 | e5bdc5c | bms_v0.8.12_e5bdc5c.bin |
| v0.8.13 | Oct 03, 2022 | d39df80 | bms_v0.8.13_d39df80.bin |
| v0.8.15 | Oct 10, 2022 | 9a4d7f7 | bms_v0.8.15_9a4d7f7.bin |
# 8. Debug on table
It is recommended to try and configure the device with gui_tool.

# 9. PX4 integration
Enable UAVCAN and set UAVCAN_SUB_BAT to 1.
