Turn signals looking from the top down

If you haven't already noticed, I'm pretty seriously excited about e-scooters, in particular the Xiaomi M365. One thing it could really use, however, is turn signals. It's not really safe to take your hands off the handlebars while turning, so I got inspired to do a hack project to integrate some signals into the scooter. This means tapping into the existing battery and making sure all add-ons fit in the footboard.

I put this together with an Arduino, a handlebar-mounted set of buttons, and four LED knob-looking round lights attached to the scooter's footboard.

Key Items

Design of interface

Single push left or right button toggles the respective blinker on/off.

The foremost need is the ability to toggle the left or right signals. This means some type horizontal control. At first I built a prototype with this button set, but I deemed it too flimsy and very much not water resistant, which is a hard requirement for me.

After more research, I decided two momentary horizontal buttons could actually be a better interface anyway, leading me to this unit. As a bonus it has indicator lights. It's somewhat heavy, however, so I may reapproach this later.

Hold either button to cycle through background mode.

The 'background' mode, active when not actually signaling, has a dim running lights setting, possibly with a slow blink, for visibility/safety. I bound the left button to that option and the right button to steady auxiliary lights.

Hold both left and right buttons to toggle hazards.

More of a gimmick but if you're stopped and can push both buttons at once, I implemented hazards.

Separate button for the horn

After scooting for awhile, I've learned a horn is an absolute necessity. I cannot easily count the amount of times a car has almost turned into me. Mounting the horn itself is a separate challenge, as I wanted everything to integrate as tightly as possible into the stock scooter body. But I'm keeping it in mind for the future.

Arduino Implementation

The program that reflects this lives in this repo:

mcnelson/xiaomi-m365-arduino-turn-signals

I implemented this using PlatformIO.

  • Run platformio run to compile src/main.ino.

  • Plug in your Arduino and run platformio run -t upload to compile & upload.

  • Run platformio device monitor to see any debug output such as:

    Serial.println("Started.");
    

'Schematic'

Here's an attempt at a schematic/wiring diagram. Warning, may have mistakes, I am not an electrical engineer,

Wiring diagram

The power source

XT30 spliced

I used the XT30 pigtails to make a sort of Y-cable to drive the Arduino and the lights. This avoids having to install a second battery.

Location of XT30 connection

The voltage coming out of the battery ranges from 30-42V. I ran the output from the spliced cable into the DC-DC converter and adjusted its output to 12V via the potentiometer. While it would be convenient to run the arduino off of the Scooter's 5V supply, I found that the board required a 12V supply to output enough voltage, 4.5V, to properly switch the turn signals via the MOSFETs. The drawback to this is the board is still running even when the scooter is off, but I plan to read the scooter's +5V pin with the Arduino and put it to sleep when not receiving a signal.

Tapping into the scooter's 5V

The 4-pin B04B-PASK socket closest to the edge of the driver board is where the bluetooth module plugs in (BLE). The outermost pins on it are +5V (T6) and ground (T9). As I wasn't able to find this particular connection online to make a Y-cable, I decided the next best thing would be to solder a pigtail into it from the bottom.

I unplugged everything from the driver board and pulled it out. It's pretty obvious where things plug in. Still, had to be very careful because the bottom of the board's metal casing is layered in thermal paste for good heat dissipation on the frame.

Borrowing some scooter power

The Arduino in the Footboard

I used a small square of a disused Ikea cutting board to mount the FET switches and DC converter. The primary reason for its skinny design is to fit it in the connector piece that joins the footboard with the stem.

Turns out, wires take up more room than they look! There is only barely enough room to put it in there. Like I said, my priority with this project was seamless integration, so that's all fine with me.

Finished boards ready to be crammed in

The arduino board barely fits above the driver board, in the space by the charging port.

Boards in

Installing the lights

After debating for several weeks, I decided to start with a left and right blinker located towards the back just short of the wheel nut covers. The location is integrated, secure, and easy to run wires.

I wanted to install a second set on the ends of the handlebars, but internal design of them made centering and securing the lights challenging.

That leaves a spot in the front of the footboard as the next most logical and integrated place. However, if placing it as far forward as possible, that aligns the light's nut against the driver board where there is no space for the wiring that has to come out the end of it. I plan to revisit this in the future.

Drilling the holes for the turn signals

The holes are easy to drill and require cutting the light hollow bolts with hacksaw to allow them to fit. I used a simple foam O-ring as a separator and sealer. The other side of the bolt is not inside the footboard, so they don't have to seal out water, but I just wanted to test them out as the other set of lights would need this.

Partially in

I ran the wiring through the existing brake light gasket. I cut it slightly from the top, and used electrical tape to seal it as best possible. There's probably a better way, but this works for now!

Putting the light in

Wiring running through the brake light wire gasket

Connecting the handlebar buttons

The final part was connecting the handlebar buttons and buzzer to the arduino in the footboard. I decided to use an ethernet cable to run through the stem. That gave me 8 wires that were all color coded:

  • Brown - Ground
  • Brown striped - Speaker
  • Green - Left button
  • Green striped - Right button
  • Orange - Left button LED
  • Orange striped - Right button LED
  • Blue - Horn
  • Blue striped - Available

The handlebars disassembled really well. Xiaomi designed them with finesse.

Disassembly of handlebars

The plate that has the power button on it is just glued in place. I carefully pried it up, and then all remaining screws were pretty obvious.

Handlebar connections

Just a matter of soldering according to the key, routing the button wiring into the space behind the headlight, and smushing the excess wiring and buzzer into the space directly under the power button.

Handlebars done

I cut most of the casing off of the two heavy gauge button cables so that they would fit in the gap running into the bluetooth module, and lightly wrapped the exposed wires with electrical tape. Don't mind the rubber bands in the photo.

Working demo

And here's the somewhat finished product, tested for a couple of weeks now. Next up is adding a horn and learning more about how MOSFETs work so that I can also use the white LEDs in the signal lights.

Photos

Not all photos are in this post. See all of them here: Photos of each step of the way

Follow-up work

  • Nov 25: Added a 5A fuse between the battery splice and the DC DC converter. Surely don't want to have to take apart the BMS to replace a fuse should a short occur.

  • Nov 25: Fed the scooter's 5V into Arduino pin 2, one of the hardware interrupt pins. Working on putting the Arduino to sleep when the pin reads LOW, and waking it up again via the interrupt. That way, it switches with the scooter.

  • Dec 7: Rethinking a few things. Having an issue with the scooter's controls causing the arduino inputs to go LOW. I believe it is electrical noise, going to install some stronger pullup resistors. Inspired to use a FET or relay to toggle the whole mod with the scooter's 5V. And testing out microswitches on the grip.

More blog posts