Xiaomi Mijia M365 Открытая прошивка для совместимой BMS

Внимание: Эта затея расчитана на людей, у которых имеются неплохие навыки работы с электроникой и микроконтроллерами!

Это программное обеспечение является альтернативой для вот такой BMS: SP15SV0001-LLT.
Разработано с использованем платформы Arduino, для сборки используется PlatformIO.
Запускается на микроконтроллере ATMega328p и управляет батарейным супервизором TI BQ769x0 по шине I2C.

По результату вы получите полноценную замену BMS для Xiaomi M365, которая будет поддерживать фирменный протокол BMS и все фичи, которые есть у оригинальной BMS, такие как:

Вся информация о батарее может быть просмотренна, используя родные приложения (такие как MiHome) или любые совместимые сторонние (такие как m365 Tools).

Вот пример сборки 12S4P батареи автором. Используются элементы NCR18650B: Ссылка.
Комплектующие, которые автор применял:

Предупреждение

На данной плате BMS установлен микроконтроллер ATMega328p без внешнего кварцевого резонатора, всвязи с этим приходится использовать внутренний 8МГц генератор.
Однако при 8МГц данный микроконтроллер не может организовать работу UART на скорости в 115200 бод, которая требуется для связи с контроллером Xiaomi M365, варианта решения этой проблемы два:

Аппаратная часть

Что потребуется?

Токовые шунты

С фабрики BMS приходит с десятью 4 мОм резисторами, соединенными параллельно. Это дает общее сопротивление около 0.4 мОм, чего недостаточно для правильного подсчёта емкости. Так же присутствует проблема с двойным делением напряжения на резисторах.

Самый простой способ разобраться с шунтами - выпаять 6 штук и оставить всего 4, это нам даст общее сопротивление в 1 мОм.
Решить проблему напряжения можно удалением еще двух мелких резисторов с верхней стороны платы, как указано на картинках: Нижняя сторона и Верхняя сторона.

Wiring

IMPORTANT: The M365 ESC - connects to P- of the BMS!

Otherwise the M365 will be damaged when you brake with a full battery due to overvoltage!

C- has to be used to charge the battery, otherwise the BMS offers no protection against faulty chargers/overvoltage!

Do not cut the big - trace on the M365 ESC or it will damage the BMS because of different GND potentials on UART!

Do not connect GND from the BMS to the M365 anywhere! P- is GND for the M365! The only extra wires going from the BMS to the M365 are RX and TX!

Software

Configuration

Depending on your battery you might want to configure some of the settings here: src/main.h

Compiling

This project uses PlatformIO, please check out their Documentation to get started.

ISP programming

Connect your ISP programmer to the BMS, you can (and should) keep the battery disconnected while programming.
Here's the pinout of the ISP header: Image

You can use PlatformIO to program the BMS.
You will probably have to adjust the upload_port (COM port) in the platformio.ini file.
Please do check out the Documentation from PlatformIO.

You can also use any other program to flash the .hex file generated by PlatformIO to your BMS.

Important

** Make sure NOT to change the fuses on your BMS! **

If you program wrong fuses you can brick your BMS.
For example: The BMS doesn't have an external oscillator, if you program fuses that try to use the external oscillator your BMS will be bricked until you connect an external oscillator to it!

The default fuses are: Low = 0xE2, High = 0xDA, Extended = 0xFD, Lockbits = 0xFE

Troubleshooting

Have you patched your M365 firmware for 76800 baud?

Make sure the temperature sensors are plugged in and all wires are connected properly.
B- needs to be connected to the battery -.

Reset the BMS by shorting GND with RST on the ISP header.

Run the configtool.py in an interactive python shell (IDLE on windows) and configure your COM port in there correctly first.
You'll probably have to install these two dependencies: cstruct and pyserial.
Check the source code for commands you can use, though you'll probably only need debug_print().
You can also use any serial terminal and send this string in HEX 55aa0322fa0500dbfe instead of debug_print().
Since the controller will enter sleep mode after 1 second of inactivity you'll have to send this twice quickly when using a serial terminal.

M365

After you've checked that your BMS works (voltage between + and P-) and communicates via UART (it print's BOOTED! when it boots) you can connect it with your M365.

The original BMS was connected to the top 3pin header on the M365 ESC: Image
You'll have to connect the ESC R pin to the BMS TX pin and the T pin to the RX pin.
The ESC L pin is + for the red/brake light on the back fender, you'll have to make your own cable for that.

Final words

Credits

A big part of the BQ769x0 code is taken from here: LibreSolar/bq769x0_mbed_lib.

Support

If you've spent at least an hour with your issue you can ask about it nicely in my M365 Telegram group.

Disclaimer

If you break anything it's your own fault.
Works for me™. is the only guarantee I can give you.

I am in no way affiliated with the company that makes the BMS. I just bought it, reversed some stuff and made this firmware.