Hey everyone,
Wanted to share what I've been hacking on for the last few months — figured the ebike-technical crowd is exactly the right audience.
It's an open-source 4.3" touch dashboard for any VESC-powered build — e-bike, e-skate, scooter, DIY EV, doesn't matter. Plugs into the VESC CAN bus and shows the usual stuff in real time: battery %, speed, voltage, current, motor / FET temperatures, odometer, trip, range, cruise indicator.

Hardware is a Waveshare ESP32-P4-WIFI6-Touch-LCD-4.3 (≈$45 from Waveshare) + a TJA1051 CAN transceiver + a small 12V→5V DC-DC. That's it for the dashboard. ESP32-P4 has plenty of muscle to do this without breaking a sweat — 800×480 native resolution, fluid LVGL UI, runs cool.
The dashboard also acts as a BLE bridge to VESC Tool (NUS protocol), so you can plug into the controller for tuning right from your phone / laptop without an extra Bluetooth module. Bridge stays alive even while the dashboard is running, so no swapping modes back and forth.
Cruise control + speed profiles via LISP
There's also a small VESC LISP script (`lisp/main.lisp`) that adds:
- Cruise control — press the PPM RX-pin button once to lock current speed, throttle/brake releases it. The dashboard reads cruise state over the LISP-poll channel and lights an indicator.
- Three speed profiles — 25 / 40 / 60 km/h presets (configurable), switched with the PPM TX-pin button. Different beep tones confirm each profile.
Both run on the VESC's built-in LISP runtime — no extra hardware, just load via VESC Tool → Lisp Scripting → Upload.
The bonus — wireless Android Auto on the same screen
This is where it gets a bit unusual. The same device also speaks the native Android Auto Wireless protocol. Pair your phone over Classic BT once and Google Maps / Spotify / Cycleway / whatever you use projects onto the same 4.3" screen.
- No phone app required (no Wireless Helper, no developer-mode tricks)
- Three-finger tap on the screen toggles between VESC dashboard and AA
- Phone auto-reconnects on every power-on after first pairing


ESP32-P4 / on-board C6 don't have Classic BT radio, so the AA path needs a separate ESP32-WROOM-32 module wired to the P4 over UART. Either solder a bare module to the board — the P4 flashes it itself over UART — or hook up a D1 Mini ESP32 dev board if you'd rather not solder. If you don't care about AA, leave the WROOM off; the dashboard runs standalone.
H.264 decode is software (esp_h264 on the P4) so the projection runs at roughly 10–15 fps native 800×480. Smooth enough for navigation; obviously not a Carplay-grade experience. Touch is forwarded to the phone, UI beeps work, navigation and music both play through the phone speakers (no audio sink on the head unit).
Works today:
- VESC RT data + LISP poll over CAN
- BLE NUS bridge for VESC Tool
- Settings UI with persisted prefs, in-PSRAM log viewer
- HTTP OTA + on-screen progress
- AA wireless projection + auto-reconnect to last phone
- Three-finger tap to switch between modes
- Embedded co-firmwares for ESP32-C6 (WiFi) and the BT agent — bundled into the main binary, auto-flashed over SDIO / UART
Not done:
- 3D-printed enclosure design (STL,STEP files coming)
- Media / Speech audio channels (no sink, dropped intentionally)
- Native nav rendering without AA
Source / license
GitHub: GitHub - payalneg/esp32p4-android-auto
Licensed under GPL-3.0. Repo has build/flash instructions, the LISP script with comments, and a roadmap.
Happy to answer questions, take pull requests, and especially keen to hear if anyone else is running it on something other than a bike — would love to see how it behaves on an EUC or a heavier scooter. CAN bitrate / controller ID are both configurable, so any VESC firmware should drop in.
Cheers!
Wanted to share what I've been hacking on for the last few months — figured the ebike-technical crowd is exactly the right audience.
It's an open-source 4.3" touch dashboard for any VESC-powered build — e-bike, e-skate, scooter, DIY EV, doesn't matter. Plugs into the VESC CAN bus and shows the usual stuff in real time: battery %, speed, voltage, current, motor / FET temperatures, odometer, trip, range, cruise indicator.

Hardware is a Waveshare ESP32-P4-WIFI6-Touch-LCD-4.3 (≈$45 from Waveshare) + a TJA1051 CAN transceiver + a small 12V→5V DC-DC. That's it for the dashboard. ESP32-P4 has plenty of muscle to do this without breaking a sweat — 800×480 native resolution, fluid LVGL UI, runs cool.
The dashboard also acts as a BLE bridge to VESC Tool (NUS protocol), so you can plug into the controller for tuning right from your phone / laptop without an extra Bluetooth module. Bridge stays alive even while the dashboard is running, so no swapping modes back and forth.
Cruise control + speed profiles via LISP
There's also a small VESC LISP script (`lisp/main.lisp`) that adds:
- Cruise control — press the PPM RX-pin button once to lock current speed, throttle/brake releases it. The dashboard reads cruise state over the LISP-poll channel and lights an indicator.
- Three speed profiles — 25 / 40 / 60 km/h presets (configurable), switched with the PPM TX-pin button. Different beep tones confirm each profile.
Both run on the VESC's built-in LISP runtime — no extra hardware, just load via VESC Tool → Lisp Scripting → Upload.
The bonus — wireless Android Auto on the same screen
This is where it gets a bit unusual. The same device also speaks the native Android Auto Wireless protocol. Pair your phone over Classic BT once and Google Maps / Spotify / Cycleway / whatever you use projects onto the same 4.3" screen.
- No phone app required (no Wireless Helper, no developer-mode tricks)
- Three-finger tap on the screen toggles between VESC dashboard and AA
- Phone auto-reconnects on every power-on after first pairing


ESP32-P4 / on-board C6 don't have Classic BT radio, so the AA path needs a separate ESP32-WROOM-32 module wired to the P4 over UART. Either solder a bare module to the board — the P4 flashes it itself over UART — or hook up a D1 Mini ESP32 dev board if you'd rather not solder. If you don't care about AA, leave the WROOM off; the dashboard runs standalone.
H.264 decode is software (esp_h264 on the P4) so the projection runs at roughly 10–15 fps native 800×480. Smooth enough for navigation; obviously not a Carplay-grade experience. Touch is forwarded to the phone, UI beeps work, navigation and music both play through the phone speakers (no audio sink on the head unit).
Works today:
- VESC RT data + LISP poll over CAN
- BLE NUS bridge for VESC Tool
- Settings UI with persisted prefs, in-PSRAM log viewer
- HTTP OTA + on-screen progress
- AA wireless projection + auto-reconnect to last phone
- Three-finger tap to switch between modes
- Embedded co-firmwares for ESP32-C6 (WiFi) and the BT agent — bundled into the main binary, auto-flashed over SDIO / UART
Not done:
- 3D-printed enclosure design (STL,STEP files coming)
- Media / Speech audio channels (no sink, dropped intentionally)
- Native nav rendering without AA
Source / license
GitHub: GitHub - payalneg/esp32p4-android-auto
Licensed under GPL-3.0. Repo has build/flash instructions, the LISP script with comments, and a roadmap.
Happy to answer questions, take pull requests, and especially keen to hear if anyone else is running it on something other than a bike — would love to see how it behaves on an EUC or a heavier scooter. CAN bitrate / controller ID are both configurable, so any VESC firmware should drop in.
Cheers!
