Xiaomi Pro X2 - Build Thread

Absolutely stellar work Darren!

Love the 3dp balance wire guide.

There is a VESC compatible firmware for the stock controller; GitHub - Koxx3/SmartESC_STM32_v2: M365_MC_WB
I bought 5 controllers for cheap to play around with.

I like the looks of that MCPCB DC-DC, thanks for the tip.

What kind of cells you are using?
Thanks. I did see the VESC port but I didn't use it because I didn't want to mess about with a laptop whilst trying to tune the controllers. If I was using the Xiaomi controllers to power another EV or non stock motors I would definitely use the VESC firmware as there is no auto config via SHFW.

I am using the new low IR variant of the LG MJ1, these are OK for 12A peaks if configured correctly. I was originally going to use VTC5 but when I compared them side by side the loses at 12A were not so far apart that it would be worth sacrificing the added capacity and this gap would close even further as the SOC decays faster on the lower capacity VTC5.
 
I designed a custom 10A 5525 DC charge port, this was much more difficult than it looks. The stock 8mm one might be OK but I decided to change it out for this one as it's rated for the current, charging current is continuous so it's quite important. I didn't go for the typical XT30 as it's not round and more often than not requires line of sight, the DC5525 is way more convenient. I managed to keep the magnetic port cover too which is really nice.IMG_1496.JPGIMG_1497.JPG
 
The rear motor and brake light connectivity. The rear motor will need to be disconnected for servicing so I wanted it to be able to disconnect it easily and simply without messing about with the cables etc. The peak phase current will be around 60A so I used 3x Wago 221s stacked together, a more traditional MR60 was completely out of the question because it will not fit through the motor cable hole in the chassis. For the motor signal cables I used an OTG micro USB breakout PCB and bare male terminal, the male micro USB connector without the plastic housing is no wider than the motor cable itself so it will fit through the hole in the chassis allowing for a really quick disconnect, USB C is bidirectional connector so it would require either 2 sets of cables or possibly trying more than once to connect it the right way around, too much bulk or hassle. I used a regular 2 pin JST for the brake light and designed a small enclosure for everything. I am going to use flat cables for the signals and phases and I will run them down the side of the chassis behind a printed panel, this will make use of all the space whilst making the cable runs neater. IMG_1595.JPGIMG_1596.JPGIMG_1597.JPG
IMG_1599.JPGIMG_1600.JPG
IMG_1520.JPGIMG_1521.JPG
 
Last edited:
Rear motor connectivity and flat phase cables finished. All of the cables run behind the printed panel so they are kept out of the way without taking any usable space. The rear motor can be removed by simply unplugging the USB and unclipping the Wago connectors.IMG_1602 2.JPGIMG_1604.JPGIMG_1606.JPG
 
Last edited:
Looking good! I love the flat, fat, phase wires. Great use of space!
Thanks. Each phase is 0.5x8mm so ~11AWG. I could have used the stock cables by just buying a replacement motor cable and extending them but I have a lot of spare copper and I wanted them hidden with the lowest voltage drop possible. When finished the phase current will be around 100A total and split 60/40 biased towards the rear.
 
Crazy good work,

Which spot welder are you using?
Its nickel copper sandwich copper 3mm and nickel how much thick?
Are you using and copper paste for welding?
 
Crazy good work,

Which spot welder are you using?
Its nickel copper sandwich copper 3mm and nickel how much thick?
Are you using and copper paste for welding?
I use a Kweld with a custom LS MTRON ultra capacitor made from 3x LSUC 002R8P 3000F EA. It's really old now and I know there are much more powerful welders available but it still does 2kA without an issue and this is all I need. I made the display from a redundant iPhone, it isn't really needed anymore but it was useful when I was tuning/calibrating the circuit resistance as it allows me to set any welding voltage between 6-8.1V and it's also useful for monitoring each cell/capacitor. I charge it from a 2S 8.4V 8A charger and I set the BMS HVP to 8V so I never enter the CV phase of charging, doing this allows me to keep the charge power at 64W and the voltage of the capacitor at 8V, this is how I get a consistent 2kA and low pulse time with a small charger. I don't use paste for anything as it's far too messy and I can weld any thickness I want with it by simply adding more layers. I use a machine to cut the nickel into uniform squares and I weld into the corner of the squares to increase the weld energy, ideally you would use a piece of material no bigger than the weld area but that would be too difficult to place and handle so I use the corner of 5mm squares instead. I typically use 0.1mm material for everything copper/nickel/steel/stainless but sometimes I use 0.15mm if I only need 1 layer, I never bother with 0.2mm as it's more difficult to work with, you need a very low circuit resistance and high current or a gas welder to layer 0.2mm reliably plus it's much more difficult to cut.
IMG_0471.JPGScreenshot 2025-11-30 at 05.49.46.png
 
Last edited:
Here is my new brake setup, it's a fully programmable progressive ebrake on a stock lever and controller. I have been testing it throughly over the last 3 months on my single motor 1S and it's extremely good. I bought a right handed lever which is designed for the German version of the original M365 and I connected only this hall sensor to the controller, I disconnected my old left handed lever but left it physically connected to the mechanical brake. I have a German display with 2 ports for hall sensors but decided to keep the mechanical and electrical systems completely separate as the mechanical brake is only used if the ebrake were to fail and adding another sensor would increase the probability of a failure or an error so I simply used one. The result of separating the two systems and using a custom brake curve via the firmware is a buttery smooth braking experience, the lever feels sublime and the braking is accurate and predictable, it's absolutely nothing like the original stock brake which feels notchy, sticky and inaccurate. I also overhauled the mechanical system with a new caliper, brake line housing, brake cable, pads and rotor. This noticeably improved the mechanical braking, it feels more powerful and a lot less sticky. Here are my SHFW settings for the ebrake, don't directly copy these as your battery and motor combination will probably be different so you will need to make your own curve, I don't use any other enhancements like "brake boost" as this will only add potential noise or closed loop errors which I don't want happening whilst braking, I did test it and it doesn't make a very noticeable difference so it's really not worth it in my opinion. I don't really like auto braking either as it decreases efficiency over just coasting. It's also worth mentioning that SHFW doesn't solely rely on regenerative braking so you can also use it with non programable batteries or fully charged batteries.

Right handed lever:
https://www.aliexpress.com/item/1005006120280858.html

Brake cable assembly:
https://www.aliexpress.com/item/1005009793090623.html

Caliper:
https://www.aliexpress.com/item/1005009731654932.html

Fully programmable ebrake via SHFW
Screenshot_20251202_224838_ScooterHacking Utility.jpg

German right handed ebrake with stiffer spring, new caliper and 140mm rotor mounting hardware.
IMG_1717.JPG

My single motor 52V Xiaomi 1S with ebrake and mechanical brake
IMG_1524.JPG
 
Last edited:
I did a quick test fit. I still need to finish the cables for the display and controller. I also mounted the DC-DC converter to the chassis with some thermal paste and the temperature dropped from ~75°C to 25°C which was only 4°C above ambient. I measured the efficiency too and it's about 90% with a 58V input and 6V 3A output.IMG_1619.JPG
 
Controllers have been conformally coated, the heatsinks have been pressed and epoxied into position and the cabling is almost finished. I didn't use potting compound as it adds a lot of weight and the battery compartment it sealed with a gasket, the FETs are directly thermally connected to the chassis like with the stock controller so heat will not be an issue.
IMG_1631.JPG
IMG_1633.JPG
IMG_1632.JPG
 
Last edited:
Crazy clean
Thanks. The actual density isn't very high, there is a lot of wasted space because the stock controllers use TO-220 FETs and single sided PCBs. The main advantage is the cost and being able to keep the stock footprint, for a 3kW+ (5kW@72V) dual motor controller it's incredibly cheap, the total for all the parts used is ~$38 and it's a direct bolt in replacement. Thanks to SHFW these controllers support a fully programmable throttle, programmable progressive ebrake, field weakening, motor overmodulation, motor RPM limiting, programmable display, voltage calibration, profiles, programmable lighting, programable hall sensors, PID tuning and it's compatible with all of the cheap Xiaomi stock accessories. It's also programable via the bluetooth app and it's free.


ScooterHacking Utility
62482764.png
 
Last edited:
Dang it I sold an M365 2 months ago and bought a kukirin...
Yes the Xiaomi M365 is a really dated now. The main reason I did this project is because I want to one day upcycle ewaste and refresh it into something usable for people who are less fortunate. With training they could repurpose our ewaste and make something reasonable with it. The EU, USA and UK are producing lots of solar panels, batteries and small rental EV waste and recycling technology and development has not yet caught up with production rates so they often pay for it to be removed, I figure why not let the people that do not have much upcycle it whilst proper recycling technology and methods are still in development.90.jpeg
 
The controller and cables are 100% complete. When I first powered it up I needed to clear the "no bms communication" and "abnormal voltage" errors by flashing a temporary custom firmware and then I flashed SHFW. Once SHFW was installed everything was working but the rear motor was spinning in reverse because it is mounted in reverse so the 2 outer hall sensors and phases needed to also be reversed. After doing this I tested the display to make sure it could control both of the controllers, this worked fine. I couldn't go much further because the Monorim rear wheel motor adaptor didn't have enough clearance between the spacer and the brake rotor mounting plate so it was rubbing slightly and causing some vibration, this is the reason I am not keen on Monorim products. I have ordered some precision shims from Aliexpress and once they arrive I will finish tuning it.IMG_1634.JPG
IMG_1660.JPG
IMG_1661.JPG
 
Last edited:
Custom 16W headlight and mount. I designed a universal mounting bracket which can accept any type of typical headlight mount, it replaces the stock clear reflector. I made a 2 core round cable and bought a set of stock grommets so I could use the large double holed one from the opposite side and run both the motor cable and the new headlight cable through it, I also made some custom sized cable clips so the cables can be tethered together. I used a aluminium go pro mount because I wasn't sure if a printed one would gradually slip over time. The custom headlight is not programable as it cannot be controlled via the controller but it's easy to switch it on or off. I will still use the stock headlight as a DRL and it's also useful as a visual indicator as it can be programmed for different boot/startup sequences. Because there are two displays to control 2 controllers there is a spare 5V 2W programable output, this would be ideal for puddle/ambient lighting, I am not going to use it myself but it's an option for those who need it or like RGB disco lights, if you don't need the DRL or headlight you could use both outputs for a total of 4WIMG_1716.JPG.IMG_1637.JPGIMG_1636.JPGIMG_1677.JPG
 
Last edited:
I have swapped out all screws on the scooter which are used frequently or are used for adjustment, I swapped them with more modern black stainless 6 lobe Torx as the old 5 side hex (beyond M3) are absolute rubbish in my opinion and the cost of the screws is insignificant when compared to trying to remove a screw with a chewed up head. Because the 6 point design is so much stronger you can use a lower profile head as you don't need the huge cap head to increase the strength, this not only looks nice but it's really useful for mounting brake rotors with tight clearances. I have been testing a new anaerobic glue/thread lock too recently and it's really good for small EV stuff like M3-M8 screws, I can't really afford to maintain the whole Loctite catalog as they need replacing but these ones cost just a few $ each. I have tested 222 against my genuine Loctite 248 and the 222 is better in every way, it cures sooner, it requires less for the same torque, the screw can be reused without reapplication and it works on screws that have not been thoroughly cleaned/degreased from the factory.

Old 5 sided hex. You can see just how easy your tool will slip on this.
IMG_1642.JPG

6 lobe Torx. Just look at those beautiful sharp angles.
IMG_1641.JPG

Aliexpress anaerobic glues, ones worth considering for EV projects.
https://www.aliexpress.com/item/1005007987790483.html

This one is my favourite:
Screenshot 2025-12-13 at 05.22.48.png

Low viscosity, ideal for wicking:
Screenshot 2025-12-13 at 05.23.26.png

High strength and high oil resistance, good for oily conditions:
Screenshot 2025-12-13 at 05.23.45.png
 
Last edited:
I spent $15 on this stealth kit to replace all the broken and worn out parts. I purchased 3 front reflectors so that I can install 2 of them on the rear as the front ones have enough space to fit over the motor axle nut and they also have clearances for the motor cable which should hopefully give it an OE aesthetic when finished. I don't really like too many accented details which is why I have kept everything black wherever possible. IMG_1647.JPG
 
OE vs clone controllers. I noticed that I no longer have access to PID tuning and hall tuning via the SHFW, the app still shows the option tabs but it's without any values, my guess is that the clone controllers are slightly different or they are using fake micro processors. I have also noticed the phase current settings missing, the shunts are on the PCB but without access to the phase settings you cannot fine tune the torque bias or field weakening so it can only be done by battery current which is rather crude. If this becomes an issue when I start tuning the field weakening and torque split I will build another pair of controllers from OE PCBs. When I had a closer look it looks like the packages have been resurfaced and wiped clean and then relabelled, this could be part of the manufacturing process or they could just be fake. I have tested it on OE hardware and I can access the PID tuning, hall sensors tuning and phase current settings without an issue so it definitely has something to do with the clones. You can buy second hand OE controllers for the same price as a new clone so it's not really worth using the clones. Even if you don't want to tune the PIDs you will probably want to adjust the phase frequency as this can be used to give the scooter a personalised unique sound from its resonant frequency or to make it silent and efficient. You will probably miss the hall tuning too because this is used to add or remove slack in the throttle and brake. There are worse controllers out there like the Geehy MCU versions which have poor quality FETs but there really isn't any reason to not use second hand OE V3 controllers because the price is exactly the same. I would apply the same principle to the displays as these are also not very expensive or rare. Enlarge the picture and you can see what looks like laser resurfacing. EDIT: I embarrassingly didn't toggle "expert view" in the app which is why I couldn't access any of the main functions. I was wrong in assuming the microprocessor was fake, the function tabs were still accessible and not greyed out or anything so I just assumed that the firmware/app couldn't access those pins, another reason which made me believe they were fake was the odd markings on the components. I would however still use second hand V3 OE controllers if I were to do it again as all of the firmwares available will be designed around this and in general the component quality is usually much better with less chance of QC issues. IMG_1475.JPGScreenshot_20260104_212722_ScooterHacking Utility.jpg
 
Last edited:
Custom displays and 2 to 1 display/data cable. One display will be a master which will control the power on/off, modes and display the speed and temp etc while the second display is just used to share the throttle and brake signal to the second controller. I would have liked to have put the secondary display in the deck but there isn't really much room for it so it will need to be tucked into the steering column. I couldn't find a solution to run two sets of cables through the steering tube and deck so I made this custom 2 to 1 data cable. The brake cable and this custom cable can now be routed through with the stock grommets so the additional set of cables will not be noticeable and the holes will be sealed the same as the OE.

Primary display
IMG_1670.JPG
Slave display
IMG_1667.JPGIMG_1658.JPG
 
Last edited:
Basic settings and tune. I set all the simple parameters like battery voltage, battery capacity, ADC calibration, speed, throttle mode, wheel size, battery current, phase current, system timeout duration and display data etc. This is needed to avoid any errors, unexpected shutdowns and generally to make everything as accurate as possible when doing the main tune. The motors need to be under load to tune the power so that will need to wait until I finish the rear mud guard.IMG_1674.JPG
Screenshot_20260104_184634_ScooterHacking Utility.jpgScreenshot_20260104_185458_ScooterHacking Utility.jpg
Screenshot_20260104_185557_ScooterHacking Utility.jpgScreenshot_20260104_184808_ScooterHacking Utility.jpg
Screenshot_20260104_185223_ScooterHacking Utility.jpgScreenshot_20260104_185426_ScooterHacking Utility.jpg
Screenshot_20260104_214350_ScooterHacking Utility.jpgScreenshot_20260104_213829_ScooterHacking Utility.jpg
 

Attachments

  • Screenshot_20260104_185458_ScooterHacking Utility.jpg
    Screenshot_20260104_185458_ScooterHacking Utility.jpg
    315.6 KB · Views: 2
  • Screenshot_20260104_185223_ScooterHacking Utility.jpg
    Screenshot_20260104_185223_ScooterHacking Utility.jpg
    325.2 KB · Views: 5
Last edited:
Axle spacer trim pieces and mud guard. I bought 2 packs of reflectors for the US version of the Pro as these are red rather than yellow and then I made some adaptors so the front reflector could be installed on the rear, this covers the axle nut and covers a large part of the motor cable too. I needed to buy a larger bracket to mount the mud guard as the original one was not long enough and I needed to make a spacer with a guide for the brake LED cable to keep it from rubbing on the wheel, it wasn't possible to use the stock connector because it's too close to the tire so I moved it to the side where it has plenty of clearance. I made new mounting holes in the chassis so now the mud guard can be easily removed without removing the reflectors to access the screws, the mud guard is much stronger like this rather than the way it was originally. If you don't have the V2 mud guard which comes on the Pro 2 and 1S I highly recommend getting one as the brake light output power is higher and it can be mounted securely with screws which stops it from shaking around. The brake light is programable via SHFW which allows you to set it high or low or for different sequences or events, the V1 rear light still has this option but it's not worth it as it's so dim, on my 1S it's set to strobe on bootup if the PIN code is wrong and then it functions as a regular high/low brake light when the motor is active. You can also see where I relocated the tire fill valve, this allows you to use a standard 140mm floating MTB rotor without any clearance problems.
IMG_1746.JPG
IMG_1745.JPG
IMG_1747.jpg
IMG_1719.JPGIMG_1713.JPGIMG_1714.JPG

IMG_1726.JPG
IMG_1727.JPG
IMG_1721.JPGIMG_1722.JPG
 

Attachments

  • IMG_1747.jpg
    IMG_1747.jpg
    4 MB · Views: 2
Last edited:
Back
Top