• Hello ES! We could use some help to get us past the finish line on building the new knowledgebase for the forum.
    Can you donate? Please see our fundraising page. Thank you!

VOTOL serial communication protocol

recently I tried on Arduino, below codes tested fine with bluetooth as well as serial direct connection, the serial port/BT connects to pin 8 (Rx) and pin 9(Tx) of Arduino pro mini in my case. notice you need to cross connect from 8 to Tx of Serial port/BT, and 9 to Rx of Serial port/BT. the real time information (24 bytes) stored in Rdata[24], and show on serial monitor, you can insert your code in dataProcess() to show on OLED, LCD, etc.

C++
#include <Arduino.h>
#include <AltSoftSerial.h>
#define LED 13
AltSoftSerial AltSerial;
const byte Sdata[] = {0xc9, 0x14, 0x02, 0x53, 0x48, 0x4f, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x1e, 0xaa, 0x04, 0x67, 0x00, 0xf3, 0x52, 0x0d};
const size_t dataLength = 24;
const int flash_msec = 200;
byte Rdata[dataLength];
int index;
int arrIndex = 0;
unsigned long currentMillis;
void dataProcess()
{
for (int i = 0; i < 24; i++)
{
if(Rdata < 16)
{
Serial.print('0');
}
Serial.print(Rdata, HEX);
Serial.print(" ");
}
Serial.println();

}
void setup() {
// initialize serial communication at 9600 bits per second:
pinMode(LED, OUTPUT);
AltSerial.begin(9600);
Serial.begin(9600);
delay(200);
currentMillis = millis();
}


void loop()
{
if(millis()-currentMillis > flash_msec)
{
currentMillis = millis();
AltSerial.write(Sdata, dataLength);
}
if(AltSerial.available() >= dataLength){
AltSerial.readBytes(Rdata, dataLength);
dataProcess();
}



}
 
compared with SIF communication, I prefer the serial port, especially when no load testing at home. the resolution of SIF is only 1A, you have 0.1A at serial port.

with a bluetooth (slave mode) connecting directly on votol serial port, you can pick the data and show via another BT in mast mode binding with the salve BT, or you can connect via phone/PC to adjust the parameters just not at the same time will be ok.
 
Last edited:
compared with SIF communication, I prefer the serial port, especially when no load testing at home. the resolution of SIF is only 1A, you have 0.1A at serial port.

with a bluetooth (slave mode) connecting directly on votol serial port, you can pick the data and show via another BT in mast mode binding with the salve BT, or you can connect via phone/PC to adjust the parameters just now at the same time will be ok.
Yes, serial gives far more complete and useful data, you have no EMI issues. However you lose the mobile app connectivity that I really need. On my votol I use serial instead of SIF and do passthrough so that I can do bluetooth programming also.
 
tha

that is emi. first of all make sure the ground you are using to power up your esp32 comes directly from the votol. I am still having some emi issues with my 72680 fardriver when drawing big phase currents.
By ground, do you mean B- or should some other ground wire be used? For the LIN (or one-line?, 1-wire? SIF?), the controller has a single round connector - at least that's what the diagrams state.

I'm not exactly sure how the wiring works on the other port either. My EM260GTSP has 3 pins on the debug port - orange, blue and brown. The USB dongle that came with it has just orange and blue. Works fine with my PC, in both directions, with the settings of 115200 baudrate and CAN disabled.

I've been powering my Votol with a lab bench isolated PSU, and the dongle being connected to PC has the USB ground. If that's RS485, I think that can work without common ground? Is that the case here? If it was CAN, it would be more understandable...

In 12V lead acid systems and ICE engines, virtually every vehicle connects the ground to the chassis, engine, all mechanical parts. I'm not sure if going with this with the huge electric battery is a good idea, I thought most of those are left floating.
 
I think I get it now, the blue USB dongle isn't just transcoding serial, it does some internal processing to convert the input serial frames (24B) into two 8-byte CAN frames, and then returns the 3x8B response frames.
 
Just wondering is any chance to control the EM100 or EM150 by uart (from my micro-controller) ?
I mean throttle, brake signals are all from uart or CAN ?
cheers
Hey, Have you tried with any other micro-controller like arduino, esp32,... ?? If you are able to connect it and communicate between votol em100 controller and other microcontroller, I would like to know about it. I want to connect it.
 
I just want to thank you guys for sharing this data.
I am now controlling my KT LCD8H display with my votol em50-4 with the help of a little arduino nano board.
At the moment I'm using the serial programming port to get the data, but I intend to use the one-line output so I can keep a hc05 to the programming port and have access to the controller settings via bluetooth.
Hey,
How did you connect arduino nano board with votol controller? I want to connect esp32, But i am not able to do it. Can you please explain me?
 
Hi,
I am working on EV-bike with Votol Em-50s. I am using Arduino Nano to fetch different parameters (like voltage,current etc)from VOTOL via serial communication. I am using altsoftserial library and using pin #8 and pin #9 as TX and RX to communicate with votol. I am sending packets through arduino each second and in turn Votol send the relevant information. Firstly I was using 12VDC power supply and chop it to 5v through LM2596 buck convertor. The controller gave correct data for static testing of bike. But for road test EMI issues occur and it started giving garbage values.

So I fixed this issue by removing buck converter and taking 5v directly from Votol. After this my controller fetch correct data from Votol even on road test.

But I am still facing some issues after taking 5V directly from Votol controller.
  • The data still get corrupted sometimes when bike is running.
  • I have observe that after implementing my device at some instances my E-Bike speed did not increase even with a full throttle.
Guys, Please give your inputs on this. This task is super important.
 
The data still get corrupted sometimes when bike is running.
This will happen with serial. You can try using shielded cables and keep the cables as far from phase ones as possible, and as short as possible. The newer controllers use CAN and that's much more reliable.

I have observe that after implementing my device at some instances my E-Bike speed did not increase even with a full throttle.
You mean that when you're connected it won't accelerate, or that it doesn't show that it's accelerating?
 
This will happen with serial. You can try using shielded cables and keep the cables as far from phase ones as possible, and as short as possible. The newer controllers use CAN and that's much more reliable.
I’ve already used a shielded cable, but unfortunately, it didn’t solve the issue. The shielded cable length is about 2.5 feet. My Votol Em-50s give 0.12V at TX and 3.3V at RX when idle. So may I have to add a with my nano TX RX, so it does give garbage values or is it safe to go without voltage divider.
You mean that when you're connected it won't accelerate, or that it doesn't show that it's accelerating?

The problem doesn’t happen all the time, but when it does, the bike won’t go past 20 km/h, even when I give full throttle. It should normally reach 46 km/h. So it’s not just a display or communication issue, the controller is actually limiting the speed. The temporary fix I’ve been using is to power the bike off and on again, which brings it back to normal. But I’d like to find a proper solution, so I don’t have to reboot the bike every time this happens.

One thing I’m wondering, could this issue be related to powering my external device from the shared 5V line on the Votol controller? Is it safe and reliable to power a device from the Votol's 5V output, or could this be interfering with the controller’s normal operation?

Any insight on this issue would be appreciated.
 
I doubt that a nano would pull enough to cause any issues, but you can always temporarily unplug it and check if it persists. But if you have the serial data, aren't you getting controller state too? Are there any errors when it happens? Maybe it drops into a limited L gear?
 
bottom line is that either the controller is not sending that info or they are being sent at a different offset. you can compare 2 idle packages at 2 different enough voltage levels to see what changes in the received packages. also note that you might have voltage as increments of 0.5v or 0.1v... 2v. if you have a look at the fardriver documentation you will see how fardrivers do it. good luck
votol bluetooth work well no nide to buy wire
 
Hi Guys, I spend some time analyzed the VOTOL serial communication process, and decoded the parameters of rpm, battery voltage, battery current, temperature coefficient, etc so it helps integrate the coulomb-counter in speedo meter, DIY an Arduino based wireless meter or create a Android/ISO APP using Bluetooth connection. I'm working on a Android APP for myself now.

when you created the connect via serial port or BT, the host sends below HEX string asking VOTOL controller to send the data shown on Display page back:

c9 14 02 53 48 4f 57 00 00 00 00 00 aa 00 00 00 1e aa 04 67 00 f3 52 0d

after that the controller will send 24 byte string including the data we want:

c0 14 0d 59 42 02 14 00 0f 01 00 00 00 00 02 b8 5d 4b 22 d6 80 03 01 0d

among these 24 byte:
B0~B1:C0 14 is the head of string means data sent by controller
B5~B6:02 14 converts into fixed-point Dec is the battery voltage, for my case it is 53.2V
B7~B8: 00 0f converts into fixed-point Dec is the battery current, for my case is 1.5A
B14~B15: 02 b8 converts into integer is the rpm, for my case is 696
B16: 5d converts into Dec - 50 is the Controller temp, for my case is 43C
B17: 4b converts into Dec - 50 is the External temp, for my case is 25C
B18~B19: 22 d6 converts into integer is the temperature coefficient, for my case is 8918
the rest is still in decoding but it is enough for simple coulomb-counter purpose, if you do a simply math using the rpm and your tire size, you can get a very accurate speed value, which has fast response than GPS value, and you can get the distance as well.

Hope it helps

flute2k3
Is there anyone still surviving here? I tried this row code but my controller immediately error undervoltage. The spread of votol reply but always Undervoltage error
 
Is there anyone still surviving here? I tried this row code but my controller immediately error undervoltage. The spread of votol reply but always Undervoltage error
Yes, most of it works with newer controllers. If you're getting undervoltage, are you sure you're actually providing the controller with enough?
You might want to take a look at my repo where I have fresh code that has documentation for both the serial and CAN frames and working code: GitHub - bananu7/votol: Reverse engineering notes for Votol EM controller
 
hi everybody. You can tell me. the controller does not connect to the laptop. The port monitoring program shows that packets are being sent when a connection is requested, but no response is received from the controller. however, when I restart the controller, one packet arrives. I am attaching a screenshot.2.png
 
hi everybody. You can tell me. the controller does not connect to the laptop. The port monitoring program shows that packets are being sent when a connection is requested, but no response is received from the controller. however, when I restart the controller, one packet arrives. I am attaching a screenshot.View attachment 377924
Yeah, that's the most basic handshake. I haven't see the "LDGET" command myself. If you're able to, try sending

c9 14 02 53 48 4f 57 00 00 00 00 00 aa 00 00 00 18 aa 00 00 00 00 c4 0d
That's the "SHOW" command which should make the controller respond with error codes, if any. Do you see those being sent from the PC side?
 
bottom line is that either the controller is not sending that info or they are being sent at a different offset. you can compare 2 idle packages at 2 different enough voltage levels to see what changes in the received packages. also note that you might have voltage as increments of 0.5v or 0.1v... 2v. if you have a look at the fardriver documentation you will see how fardrivers do it. good luck
Hi I'm just writing to ask IF AT ALL possible for some help as me and my friend are at wits end trying to talk to our fardriver controller ill post a few picz... We have a Bluetooth module and usb that we've been trying to talk to termite on his Lappy...can't even get the throttle to do anything.. Plz help telegram me @Wakey6 or call my mobile plz would be much appreciateded!! 0422301271
I'll attach a few picks of what we working with..
 

Attachments

  • 20250923_213818.jpg
    20250923_213818.jpg
    1.3 MB · Views: 9
  • 20250923_220143.jpg
    20250923_220143.jpg
    958.2 KB · Views: 10
  • 20250919_170631.jpg
    20250919_170631.jpg
    1.8 MB · Views: 10
  • 20250919_164751.jpg
    20250919_164751.jpg
    3.1 MB · Views: 7
  • 20250919_164810.jpg
    20250919_164810.jpg
    1.8 MB · Views: 6
  • 20250919_164730.jpg
    20250919_164730.jpg
    1.9 MB · Views: 9
Yeah, that's the most basic handshake. I haven't see the "LDGET" command myself. If you're able to, try sending


That's the "SHOW" command which should make the controller respond with error codes, if any. Do you see those being sent from the PC side?
thanks for the information, I'll try to send a command package later, and I'll write about the results.
 
it doesn't work, there is no answer. I tried different cables on different chips. 4 pieces. and the secret brand selection menu doesn't help.
 
I would at least send any command to hex so that the controller would respond. and I will be glad that he is adequate and working.
 
I would at least send any command to hex so that the controller would respond. and I will be glad that he is adequate and working.
Sending by CAN directly has the benefit of bypassing the dongle completely. The dongle isn't a 1:1 passthrough, the CAN protocol and Serial protocol don't send exactly the same bytes.
 
I sent your command through the terminal program as to the serial port, but I don't know how to send it as for the can bus yet.
 
Back
Top