VOTOL serial communication protocol

Does anyone know "1 line" speed protocol of votol use ? Is it 1 wire connection ? (Because I plan to use arduino to read speed from 1 line wire of Votol. Thanks
 
Does anyone know "1 line" speed protocol of votol use ? Is it 1 wire connection ? (Because I plan to use arduino to read speed from 1 line wire of Votol. Thanks
there is no speed data/protocol transmitted, you have to get the rpm and convert into speed using your wheel/tire size.
 
I'm trying to use the CAN.h library and SN65HVD230, but the data received doesn't make sense (250 kbps bus speed)
Anyone as able to communicate using CAN BUS interface module?
 
Does anyone know "1 line" speed protocol of votol use ? Is it 1 wire connection ? (Because I plan to use arduino to read speed from 1 line wire of Votol. Thanks
I would love to know to as I'm planing to do this on my fardriver as well.
 
I would love to know to as I'm planing to do this on my fardriver as well.
The question you quoted was answered right after it was asked. ;)


But... since yours is a Fardriver, completely different manufacturer from Votol, the answer to your question almost certainly wouldn't be in this thread.

Does your controller's manual show that you have a separate speed output? If so, then you could read that with an MCU and convert it to send to your display with the rest of the serial data.

If not, then you'd need the Fardriver data format / protocol / etc, which is probably not the same as Votol. (could be, but almost all controllers use separate proprietary data formats and datasets).
 
@amberwolf as far as I can tell, both Votol and Fardriver are under SiAECOSYS and all displays with one-line protocol seem to be advertised to work for both so I would assume the protocol would be pretty much the same.
I currently have a fardriver on my electric motorcycle (that only outputs to the display via one-line) and I'm planning to use an arduino to sniff the packages and send to the stock motorcycle display via RS485.
I will be ordering a votol for my ebike to replace my KT50A controller but I do love my KT LCD8H display so I will need to do something similar with that one also in order to send the packages to the display.

Both controllers have a separate single wire Lin Bus for display output.

Thank you.
 
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
 
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


AFAICT from the wiring diagrams I've seen so far, both brake and throttle are direct analog signals to their own discrete inputs.

If they also offer serial control of them (like Lebowski's brain chip does) then you'd have to find out what commands to send over the serial port for this from the documentation from the manufacturer (or other projects like this one)

@amberwolf as far as I can tell, both Votol and Fardriver are under SiAECOSYS and all displays with one-line protocol seem to be advertised to work for both so I would assume the protocol would be pretty much the same.

Well, if they're the same, then presumably both would be the same as the other answer, and no speed data is on the 1-line interface, just RPM as noted in the first post of this thread.

If you need direct speed data, my guess is you'll have to decode the data you actually see on your particular setup to see if there's anything left over from the already translated stuff in this thread (or other similar ones) that appears to change with the speed of the motor it's running, different from the RPM.
 
AFAICT from the wiring diagrams I've seen so far, both brake and throttle are direct analog signals to their own discrete inputs.

If they also offer serial control of them (like Lebowski's brain chip does) then you'd have to find out what commands to send over the serial port for this from the documentation from the manufacturer (or other projects like this one)



Well, if they're the same, then presumably both would be the same as the other answer, and no speed data is on the 1-line interface, just RPM as noted in the first post of this thread.

If you need direct speed data, my guess is you'll have to decode the data you actually see on your particular setup to see if there's anything left over from the already translated stuff in this thread (or other similar ones) that appears to change with the speed of the motor it's running, different from the RPM.
thanks. That's a good solution but need some time to do pcb assembly.
 
f you need direct speed data, my guess is you'll have to decode the data you actually see on your particular setup to see if there's anything left over from the already translated stuff in this thread (or other similar ones) that appears to change with the speed of the motor it's running, different from the RPM.
Sorry for the confusion, I didn't express myself properly. It's clear to me actual wheel speed is not being sent by the controller, only motor speed, no doubts there, I was more interested in the actual package format being broadcasted over the one line wire.
The information here about the serial protocol are very valuable to me, but in my specific application if I used the one line display output to get my data, I would then be able to keep a hc05 connected to the controller at all times.
 
Ah. Well I don't know what the one-line display format is, if it's not the same as the info in the first post for the regular serial/BT.

Is it possible that the manufacturer (SIAEcosys? MQCon?) has this information available, such as for OEMs to make EV systems from? A regular DIYer might not be able to get it, but another manufacturer might. ;)
 
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.
 
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.
hmm, i just wonder are you Valy Exe in facebook. I have some question want to ask you abt ur project. If u not, apologize for my mistake.
Thanks and have a nice day !
 
hmm, i just wonder are you Valy Exe in facebook. I have some question want to ask you abt ur project. If u not, apologize for my mistake.
Thanks and have a nice day !
Yep that's me. You can pm me on facebook, no problem.
 
I played around for a little bit with the one-line output on the votol and it seems to me like it's not really LIN Bus.
Thinking of the use case being a one-way transmission from the controller to display I think it's just a one-way UART.
Why would this company invest in using LIN bus when uart should be cheaper as it doesn't require any 12V psu and a lot less logic.
Using a multimeter the highest voltage I got was a bit over 2v over the single wire signal.
Judging by the output from the logic analyzer (pics kindly provided in the fardriver thread) fMax ~ 9.6 khz I used a 9600 baud and this is what I get:
1703140380501.jpeg
1703140316789.png
1703140307309.png

I've tried running it through a mcp2003 LIN transceiver with an arduino but the raw output was the same and no LIN frames were identified.
Also the votol specs state 0-5V for the single wire output.
The output changes with wheel movement, hitting the brake, so I might be on the right path.
However the data doesn't look right with mostly 00 and F0 on standby.
I will investigate further.
As this is my very first attempt with decoding stuff like this it's very likely that I'm doing something wrong, so if anyone can help guide me on the right path, please do.
Thanks.
 
I asked my aliexpress seler for documentation on the format used for "one-lin" and (for my surprise) he was kind enough to provide me this document. I am sharing this with everyone hoping it helps.
 

Attachments

  • 一线通液晶协议Y34&Y29_translate.docx
    34.7 KB · Views: 51
A little update. I played around a bit with the "one wire" display output and was able to decode the data with a simple arduino nano.
Here's some rough test code, nothing fancy, just a simple proof of concept but it works well for me.
Protocol documentation in previous post.



#define sif_pin 2
short battery = 0;
short current = 0;
short currentPercent = 0;
short rpm = 0;
long faultCode = 0;
bool regen = false;
bool brake = false;
unsigned long lastTime;
unsigned long lastDuration = 0;
byte lastCrc = 0;
byte data[12];
int bitIndex = -1;
void setup() {
Serial.begin(115200);
pinMode(sif_pin, INPUT);
lastTime = micros();
attachInterrupt(digitalPinToInterrupt(sif_pin), sifChange, CHANGE);
}
void loop() {
// put your main code here, to run repeatedly:
}
void sifChange() {
int val = digitalRead(sif_pin);
unsigned long duration = micros() - lastTime;
lastTime = micros();
if (val == LOW) {
if (lastDuration > 0) {
bool bitComplete = false;
float ratio = float(lastDuration) / float(duration);
if (round(lastDuration / duration) >= 31) {
bitIndex = 0;
} else if (ratio > 1.5) {
// bit value 0
bitClear(data[bitIndex / 8], 7 - (bitIndex % 8));
bitComplete = true;
} else if (1 / ratio > 1.5) {
// bit value 0
bitSet(data[bitIndex / 8], 7 - (bitIndex % 8));
bitComplete = true;
} else {
Serial.println(String(duration) + "-" + String(lastDuration));
}
if (bitComplete) {
bitIndex++;
if (bitIndex == 96) {
bitIndex = 0;
byte crc = 0;
for (int i = 0; i < 11; i++) {
crc ^= data;
}
if (crc != data[11]) {
Serial.println("CRC FAILURE: " + String(crc) + "-" + String(data[11]));
}
if (crc == data[11] && crc != lastCrc) {
lastCrc = crc;
for (int i = 0; i < 12; i++) {
Serial.print(data, HEX);
Serial.print(" ");
}
Serial.println();
battery = data[9];
battery = data[9];
current = data[6];
currentPercent = data[10];
rpm = ((data[7] << 8) + data[8]) * 1.91;
brake = bitRead(data[4], 5);
regen = bitRead(data[4], 3);

Serial.print("Battery %: " + String(battery));
Serial.print(" Current %: " + String(currentPercent));
Serial.print(" Current A: " + String(current));
Serial.print(" RPM: " + String(rpm));
if (brake) Serial.print(" BRAKE");
if (regen) Serial.print(" REGEN");
Serial.println();
}
}
}
}
}
lastDuration = duration;
}
 
guess a AD.

back to you question, have you set your baud rate to be 9600? I tested success every time. I've even written an Android APP to received the data with coulomb counters integrated, it works like a charm.
Could you please share your application or a link to it here? Thanks!
 
A little update. I played around a bit with the "one wire" display output and was able to decode the data with a simple arduino nano.
Here's some rough test code, nothing fancy, just a simple proof of concept but it works well for me.
Protocol documentation in previous post.



#define sif_pin 2
short battery = 0;
short current = 0;
short currentPercent = 0;
short rpm = 0;
long faultCode = 0;
bool regen = false;
bool brake = false;
unsigned long lastTime;
unsigned long lastDuration = 0;
byte lastCrc = 0;
byte data[12];
int bitIndex = -1;
void setup() {
Serial.begin(115200);
pinMode(sif_pin, INPUT);
lastTime = micros();
attachInterrupt(digitalPinToInterrupt(sif_pin), sifChange, CHANGE);
}
void loop() {
// put your main code here, to run repeatedly:
}
void sifChange() {
int val = digitalRead(sif_pin);
unsigned long duration = micros() - lastTime;
lastTime = micros();
if (val == LOW) {
if (lastDuration > 0) {
bool bitComplete = false;
float ratio = float(lastDuration) / float(duration);
if (round(lastDuration / duration) >= 31) {
bitIndex = 0;
} else if (ratio > 1.5) {
// bit value 0
bitClear(data[bitIndex / 8], 7 - (bitIndex % 8));
bitComplete = true;
} else if (1 / ratio > 1.5) {
// bit value 0
bitSet(data[bitIndex / 8], 7 - (bitIndex % 8));
bitComplete = true;
} else {
Serial.println(String(duration) + "-" + String(lastDuration));
}
if (bitComplete) {
bitIndex++;
if (bitIndex == 96) {
bitIndex = 0;
byte crc = 0;
for (int i = 0; i < 11; i++) {
crc ^= data;
}
if (crc != data[11]) {
Serial.println("CRC FAILURE: " + String(crc) + "-" + String(data[11]));
}
if (crc == data[11] && crc != lastCrc) {
lastCrc = crc;
for (int i = 0; i < 12; i++) {
Serial.print(data, HEX);
Serial.print(" ");
}
Serial.println();
battery = data[9];
battery = data[9];
current = data[6];
currentPercent = data[10];
rpm = ((data[7] << 8) + data[8]) * 1.91;
brake = bitRead(data[4], 5);
regen = bitRead(data[4], 3);

Serial.print("Battery %: " + String(battery));
Serial.print(" Current %: " + String(currentPercent));
Serial.print(" Current A: " + String(current));
Serial.print(" RPM: " + String(rpm));
if (brake) Serial.print(" BRAKE");
if (regen) Serial.print(" REGEN");
Serial.println();
}
}
}
}
}
lastDuration = duration;
}

I will try it
 
Back
Top