I would like to share my progress with hopefully providing another alternative for a somewhat useable Vextrix VX1 scooter BMS integration.
Vectrix VX1 is a maxi scooter which is highway capable and very suited for automotive battery integration. It was made for a few years in a few thousand unit run, most frames are almost 20 years old by now. Originally they shipped with nimh batteries, which died not long after on most units. Do not undertake this if you have no clue (or will to learn) how to work with high voltages, how to use a multimeter and preferably ability to replace SMD components - please take one of the well established routes out there, for example:
random chinese active balancer, no BMS
2x ant bms splitting pack in 2
PLND (Matteo) BMS or Frans BMS - both of which are nicely engineered and fully integrated in the vehilce. Frans Firmwares for MC and other modules are nice, and as I've read his BMS is also very nice
I have forked Johus Flying ADC BMS firmware, ESP web tool and CAN bootloader to better suit vehicle integration. VX1 runs on 250k baud, so need forks for all of these:
https://github.com/skrubis/VX1-stm32-CANBootloader (250k baud migration)
https://github.com/skrubis/FlyingAdcBms-VX1 (added vx1 integration)
https://github.com/skrubis/VX1-esp32-web-interface (migrated fully to platformio, made friendly with 250k baud)
Current status: shows bootscreen stats, shows errors on odometer from any node, allows custom temperature or udelta warning on telltales and display. Shows various stats on clock display if so desired by the user.
Should be receiving motor controller speed, current and voltage PGNs for plotting/logging and most notably kWh/100km calculation as my brain breaks in Ah calculations used for the scooter throughout.
Todo:
Emulate actual BMS PGNs and Power table reduction. Disable stock OBC if something goes wrong. Need much more testing for this and see how much of it is actually needed. Problem is there's usually 4 bms boards with not sure yet how many cells per unit and I am using 3 bms modules, so populating values is something my brain has not yet figured out, but should be no biggie. Need to still finish implementing configuration message sending and PGNs, but not sure how needed are those. Probably should add a TC charger messaging format from the master.
These 2 params are different from stock FW:
sleeptimeout - sets hours to go to sleep after
idlecurrent - allows for setting sleep/idle current in mA
These params are vehicle specific, most work on master node only, errors on any node:
VX1mode - enables vx1 "mode"
VX1drvCurr - used for config msg sending, not yet implemented
VX1regenCurr - used for config msg sending, not yet implemented
VX1spdLim - used for config msg sending, not yet implemented
VX1rpmLim - used for config msg sending, not yet implemented
VX1regenMaxU - used for config msg sending, not yet implemented
VX1regenMaxI - used for config msg sending, not yet implemented
VX1chrCellNo - used for config msg sending, not yet implemented
VX1chrCellMaxV - used for config msg sending, not yet implemented
VX1chrBattCap - used for config msg sending, not yet implemented
VX1enCanMsg - enable can messages to the vehicle
VX1BootLCDMsg - show "OI FLY / BMS" on odometer at boot
VX1enBootstats - show "utotal, udelta, soc, soh, tempmin, tempmax on odometer at boot
VX1msgInterval - how often to send can messages to vehicle
VX1paramMsgCount - how many times send config messages to vehicle, not yet implemented
VX1LCDClockStats - 0=Off, 1=Always, 2=Idle - shows stats on clock display
VX1LCDClockStatVal -0=soc, 1=uavg, 2=udelta, 3=tempmax, 4=power, 5=idcavg, 6=kWh/100km
VX1ErrWarn - show if any module has any error in shorthand on odometer + turn on telltale
VX1TempWarn - show temperature warning on telltale + current tempmax on odometer
VX1TempWarnPoint - treshold for temp warning
VX1TempWarnTest - allows to test temp warning
VX1uDeltaWarn - warn if udelta exceeds treshold on odometer + telltale
VX1uDeltaWarnTresh - treshold for udelta warning
VX1uDeltaWarnTest - allows to test delta warning
VX1SendConfigMsg - 0=off, 2=regVX1drvCurr, 3=VX1regenMaxU 4=VX1regenMaxI, 5=VX1chrCellNo, 6=VX1chrCellMaxV, 7=VX1chrBattCap / allows to send config msg to vehicle, not yet implemented
VX1EmulateBMSmsg - 0=off, 1=onlyPwrReq, 2=all, not yet implemented
VX1kWhResetDist - distance in km for kWh/100km value to roll over (less = more dynamic dash readout).
Spot values for plotting:
VX1speed - vehicle speed from Motor controller
VX1busVoltage - bus voltage from Motor controller
VX1busCurrent - bus current from Motor controller
VX1kWhper100km - approx calculated kWh/100km calculation from the above
How to use:
- follow flying adcBms wiki information: https://openinverter.org/wiki/16-cell_BMS
- source required amount of BMS boards from OI shop: https://openinverter.org/shop/index.php ... duct_id=74
- you will need jlink, st link or similar programmer for the boards.
- You may want an external current sensor, I am using HSTS016L 200A from aliexpress, as I want to monitor external eltek flatpack charger directly on battery bypassing motor controller.
- Install the forked bootloader to the bms board https://github.com/skrubis/VX1-stm32-CA ... loader.hex
- install the forked bms firmware to the bms board https://github.com/skrubis/FlyingAdcBms-VX1/actions (need to log in to get hex file)
- either use command line tool (viewtopic.php?t=2907) for config or esp32 board with canbus, i.e. lilygo esp32 can
- you need to use forked web tool if you go esp32 web tool: https://github.com/skrubis/VX1-esp32-web-interface
- do a bench test for bms assembly with external power supply
- Install in vehicle, possibly you want a small 3S li-ion battery or 4S lifepo4 battery fed through a schotky diode + about 4 ohm resistor to the battery and same 12V from vehicle through a schottky diode to the master BMS enable pin to allow for the BMS to balance cells while bike is off.
This project is provided as-is, without any express or implied warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, or non-infringement.
All CAN bus messages and PGNs referenced or used in this project are either:
Defined in the public SAE J1939 standard,
Commonly available through public forums, technical documentation, and community research, or
Independently observed through legal means without bypassing any security mechanisms or protections.
No proprietary firmware, OEM software, or copyrighted code has been copied, reverse-engineered, or distributed.
This project is intended solely for educational, research, and interoperability purposes. It is not certified for use in production vehicles or safety-critical systems.
Use of this project is entirely at your own risk. Interfacing with vehicle systems—especially those involving power electronics or battery management—can result in:
Vehicle malfunction or damage
Battery failure or fire
Injury or death
Voiding of warranties or violation of local laws
By using or modifying this project, you accept full responsibility for any consequences that arise. The authors shall not be held liable for any direct, indirect, incidental, special, or consequential damages resulting from the use, misuse, or inability to use this project or any derivative works.
If you believe that any content herein infringes upon your legal rights or intellectual property, please contact the authors with specific details. We are committed to addressing any valid concerns in a respectful and timely manner.