Skip to the content
PCBKitNew board
2 layersVotol display, the printed circuit board in 3D

Votol display

bananu7/votol15

Reverse engineering notes for Votol EM controller

Copper layers
2
Thickness
1.6 mm
Parts
5
Nets
43
Pads
55
Tracks, vias
0, 0
Routed
Not yet
KiCad
KiCad 9.0 (file 20241229)
Created
1 Feb 2025
Updated
28 Jul 2025

Overview

Votol display is an open-source printed circuit board by bananu7, from the bananu7/votol repository on GitHub. It is a 2-layer board with 5 parts on 43 nets.

Its parts include 2 ICs, 2 switches and 1 connector. It belongs with the lEDs and displays boards of this library.

README

README.md

bananu7/Votol

Hello. This is my repository for all things related to the Votol controllers I was able to gather and put together.

My use case and context

I'm converting a CRF250 MX motorcycle to electric power, using the Votol EM260SGTP controller. I want to have a bit more control over it that usual, so I decided to learn more about it. Unless otherwise noted, all descriptions, labels etc. apply to my specific controller. Different models of the controller can differ; make sure you understand the cable functions and model of yours.

Project structure

  • desktop/ - early beginnings of a desktop app that were meant to replace the original desktop programmer
  • embassy/ - firmware of the display controller that goes on the bike and communicates with Votol EM
  • reference/ - technical details and descriptions of the controller protocol

Log

2025-02-18

I did some more work on the miscellaneous features for the display. Got better frame decoding working, modularized things and importantly created a simulation mode that allows development without a controller connected (still on real hardware, though). I'm still not sure how I want to present all the available data or what peripherals to connect. Ideas list includes:

  • all main controller parameters (works for now: battery voltage, temperatures)
  • ride mode
  • all controller errors in readable format
  • temperature alerts
  • speed based on the RPM counter
  • trip computer: speed * time (distance traveled), current * time (amp-hours used), max/avg speed, max/avg current, moving time

Additional features based on peripheral hw:

  • RTC - clock :), configuration (maybe I could use internal RTC)
  • SD or flash - datalogger (trip computer but as series)
  • IMU, magnetometer - compass, lean-aware TC
  • front wheel speed sensor - TC, more accurate speed
  • GPS - time, datalogging position
  • BT - phone app, remote config and data reading

This is just a mental note to myself; it's unlikely I'll get to doing all of the above. Once I get the basic features working, I'll also upload the CAD files for the enclosure and print a prototype.

2025-02-13

I should've started this log immediately, but better late than never. I have already done quite a lot of work, but a lot still remains to be done. Dealing with the controller can roughly be grouped into two categories:

  1. Programming - setting up current and voltage limits, throttle rampup, engine phase config and hall config, as well as pin functions
  2. Using - happens in the vehicle
Programming

Programming by itself is reasonably straighforward. I need to write more about the programming setup in the reference section, but in short, the controller comes with a programming USB dongle. This dongle plugs into a two-pin port on the controller colored blue and orange. In my case, the two-pin interface is a 1M CAN bus, xceived using TJA1050, connecting to an STM microcontroller, then exposed to USB via an USB-to-serial converter.

The controller also comes with a desktop app that looks like it was written with MFC. The app seems to have been made for older, smaller controllers, and in fact doesn't even show the 260 on the list. To communicate, it opens a serial port at either 9600 or 115200 baud. There's also the CAN switch that in my case needed to be... disabled. I believe that it's mostly a consequence of historical debt and reuse. The app originally talked to the controller via serial; once they switched to CAN they were limited to 8-byte data frames, so they added the intermediate translator chip to the dongle, so that the old app can still talk to the new controller. Incidentally I've noticed that the serial data going back to the app is 24 bytes long, while the controller only responds with two can frames - so the translator chip must be doing some shuffling and filling in the blanks.

I have recorded some of the programming transactions, but haven't saved them. In order to properly reverse engineer the protocol, a whole communication scheme needs to be observed and the parameters isolated. That being said, as the app seems to work fine for now, this is of low priority. Perhaps one exciting possibility here would be to replace it with a web-based version talking serial over WebUSB. That would be a massive usability boost, but getting all controllers working correctly could be a challenge.

Using the controller

Much more interesting is what happens during use. I don't want to use the dongle, and CAN is actually a great interface for the vehicle use. The displays normally utilized with this controller use the separate LIN output, but I see zero reason to do that. CAN is more robust and offers much more functionality.

The controller exposes a lot of frames on the bus, none of which I've decoded yet. There's been some mentions from SIA that they're their internal protocol, but nothing concrete about it. I wouldd assume the usual parameters would be broadcasted continously, which would be great for display purposes.

At the same time, when the desktop app wants live data from the controller, it sends a special query packet. The controller "responds" by sending two frames containing the vitals; they are described in the reference folder. I was able to successfully read and decode those frames, and that's the current state in the embassy folder; operating on an STM32F103C8 microcontroller, using its onboard CAN controller and TJA1050 transceiver. On the other end, I plugged in a simple 8x8x4 LED matrix controlled by four MAX7219 chips in series, over SPI. Works great and the display of basic parameters has already been achieved.

Parts

5
QtyValueFootprintReferences
2SW_PushConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalSW1, SW2
1Conn_01x05_PinConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ1
1YAAJ_BluePillbluepill:YAAJ_BluePill_1U1
1~components:TJA_1050U2

Questions

What parts does the Votol display use?

5 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Votol display KiCad files?

From the bananu7/votol repository on GitHub, at the commit this page was made from: the board is display/v0/pcb/votol_display/votol_display.kicad_pcb and its schematic display/v0/pcb/votol_display/votol_display.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Votol display design in my own project?

Its repository states no licence, so its author keeps all rights: ask bananu7 before reusing the design.

Similar boards

  • 2 layers98 × 27 mmXy limit, the printed circuit board in 3D

    Xy limit

    opulo-inc/lumenpnp

    The LumenPnP is an open source pick and place machine.

    5 parts3.7k
  • 2 layers21 × 33 mm24g2usb pico2w, the printed circuit board in 3D

    24g2usb pico2w

    joypad-ai/joypad-os

    Universal controller firmware for building adapters, dongles, and custom controllers.

    5 parts1.7kApache-2.0
  • 2 layers53.2 × 59.6 mmA10 OLinuXino Lime Rev B SHIELD TEMPLATE, the printed circuit board in 3D

    A10 OLinuXino Lime Rev B SHIELD TEMPLATE

    OLIMEX/OLINUXINO

    OLINUXINO is Open Source / Open Hardware, low cost from EUR 24 Linux Industrial grade Single Board Computer capable to operate -25+85C

    5 parts1.5k
  • 2 layers30 × 11 mmMain control board servo tester, the printed circuit board in 3D

    Main control board servo tester

    jamro/tiny-engineer

    A small desktop robot that brings an AI coding assistant to life, physically acting out when it reads files, thinks, writes code, and finishes work.

    5 parts1.1k
  • 2 layers78.8 × 35.3 mmKiCadTest, the printed circuit board in 3D

    KiCadTest

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    5 parts915
  • 2 layers50 × 23 mmMiniCircuits LTCC, the printed circuit board in 3D

    MiniCircuits LTCC

    VanceVagell/kv4p-ht

    Open source handheld ham radio project KV4P-HT

    5 parts828GPL-3.0
  • 2 layers20.3 × 15.2 mmL0 light sensor, the printed circuit board in 3D

    L0 light sensor

    Luos-io/luos_engine

    Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

    5 parts546MIT