PiCCANTE Car Controller Area Network Tool for Exploration
PiCCANTE is a powerful hacking tool for accessing, exploring, and manipulating vehicle CAN bus networks, built on the affordable Raspberry Pi Pico platform. Designed for researchers, security professionals, and automotive enthusiasts looking to dive deep into vehicle systems without expensive proprietary equipment.
PiCCANTE is designed to be a dead-simple, dirt-cheap, and readily-available hardware platform for vehicle research and exploration.
As cars become more and more computerized, manufacturers keep locking them behind proprietary tools and restrictive systems, even connect vehicles to the internet, yet they still rely on communication standards from the 1980s.
Car hacking and independent research grows increasingly important to discover security vulnerabilities, reverse engineer vehicle systems, and empower owners with custom tools for diagnostics and tuning that support the Right to Repair movement.
The project leverages Raspberry Pi Pico (2 [W]) development boards, selected for their exceptional affordability, global availability, impressive specifications, and well-documented open-source SDK.
Keep it D.I.R.T.Y π
- Dead-Simple π¨
- Simple enough for perfboard soldering with minimal components.
- No fiddling around with compilers and SDKs: Pre-built firmware releases for immediate use.
- Inexpensive π°
- Minimal hardware requirements to keep costs dirt-cheap.
- Based on affordable, off-the-shelf components.
- Readily-Available π
- Fully open-source hardware and software.
- Uses widely available Raspberry Pi Pico boards.
- Tool-Compatible π
- Seamless integration with existing CAN tools.
- Your-First Choice π‘
- Driverless across all major operating systems.
- Easy to use for beginners and experts alike.
- π Documentation
- β Up to 3Γ CAN 2.0B interfaces (2Γ on RP2040 (Pico[W]), 3Γ on RP2350 (Pico 2[W]))
- β
1Γ USB-CDC PiCCANTE command + GVRET (binary only) interface
- Compatible with SavvyCAN and other automotive tools
- β
Up to 3Γ USB-CDC SLCAN interfaces (dedicated to each CAN channel)
- SocketCAN compatible via can-utils (Linux)
- β LED status indicators
- β Command line interface for configuration and diagnostics
- β Auto (Deep) sleep on idle + Wakeup on CAN activity.
- β
WiFi support (on Pico W models)
- β
Create WiFi access point (
wifi ap <ssid> <password> <channel>
) - β
Connect to existing WiFi networks (
wifi connect <ssid> <password>
) - β WiFi status and configuration commands
- β PiCCANTE configuration + GVRET interface as Telnet server
- β
Create WiFi access point (
- β
Web-based configuration interface (on Pico W models)
- β Fully responsive on desktop and mobile
- β Full device configuration
- β Device Monitoring
- π Integrated Web CLI:
- π Live CAN-bus monitoring
- π ELM327 commands
- π MITM mode configuration
- β Bluetooth support (on Pico W models)
- βοΈ (partial) ELM327 emulator
- βοΈ Partially implemented AT command set
- Setup up CAN bus, auto protocol detection and filters (π) are missing.
Configure the CAN bus beforehand - this is a hacking-tool, you should now your vehicles CAN bus settings.
- Setup up CAN bus, auto protocol detection and filters (π) are missing.
- β Support for USB, Bluetooth or WiFi communication
- β
PID request and response
- β 11bit and 29bit addressing
- β Multi-Frame PID support (ISO-TP)
- β Fast mode when number of answered frames is known
- β Report vehicle battery voltage (if ADC is connected)
- π Adaptive Timeouts
- βοΈ Partially implemented AT command set
- β 3D printable case designs for creating PiCCANTE based OBD-II dongles
- π Data logging to SD card
- π MITM mode for advanced analysis / vehicle tuning
- π (Software) CAN filters
- 1Γ Raspberry Pi Pico (any model, RP2040 or RP2350)
- Note: The Pico 2 W (RP2350) is recommended for full feature support, including WiFi and Bluetooth.
- 1-3Γ CAN transceivers (readily available SN65HVD or any other 3.3V compatible transceiver)
- Note: Most readily available transceiver breakout-boards have a 120 Ohm terminating Resistor on them, when connecting to an existing (terminated) CAN bus this needs to be removed.
- USB cable
- Perfboard (Double sided, 18x24 - 60mm x 50mm)
- [OPTIONAL] or custom PCB π
- Soldering iron
- Basic soldering skills
- [Optional] Low dropout Buck-Converter module and OBD Plug for directly connecting to the vehicle's OBD-II port
- [Optional] Schotky diode for safe dual power supply (eg. 1N5817, others will do as well)
- [Optional] SD card module/slot for data logging
- [Optional] 100kOhm + 10kOhm resistors for voltage divider to measure the vehicle's battery voltage
- [Optional] 3D printed case for the Pico and transceivers
# Set up SLCAN interface
sudo slcand -o -s6 -t hw -S 3000000 /dev/ttyACM1 can0
sudo ip link set up can0
# Monitor CAN traffic
candump can0
- Connect PiCCANTE to USB
- Open SavvyCAN
- Go to Connection β‘οΈ Open Connection Window β‘οΈ Add device Connection
- Select "Serial Connection (GVRET)" and choose the appropriate COM port / TTY
- Click "Create New Connection"
PiCCANTE is simple enough to be soldered onto double-sided perfboard.
The initial prototype fits on a 60mm x 50mm board with:
- Pi Pico (2 W)
- 3x CAN transceivers (SN65HVD)
- buck-converter
- SD card slot
- Voltage divider for measuring the vehicle's battery voltage
- Schottky diode for safe dual power supply (1N5817)
A 3D printable case is available in the hardware/case/perfboard/ directory.
Even though the hardware is soldered onto perfboard, the case is just as large as a regular credit card.
Show Case
- 3D printer
- ABS/ASA or PETG filament
- 3x M3 screws
- 3x M3 heatset inserts
- 1x male OBD-II connector (I used this one)
- Wires

More can be found in hardware
A custom PCB designs follow at a later date.
Pre-compiled binaries for all official Raspberry Pi Pico boards are available as CI action artifacts in the GitHub repository.
When connected via USB, PiCCANTE exposes up to 4Γ USB-CDC interfaces:
- 1Γ Combined PiCCANTE command + GVRET (binary) interface
- Always the first exposed CDC device.
- Also exposed via telnet if enabled on WiFi enabled boards.
- Up to 3Γ SLCAN interfaces (dedicated to each CAN channel)
atz - Enable ELM mode (if ELM327-Emulator is on USB)
binary - Toggle GVRET binary mode (binary <on|off>)
can_bitrate - Change CAN bus bitrate (can_bitrate <bus> <bitrate>)
can_disable - Disable CAN bus (can_disable <bus>)
can_enable - Enable CAN bus with specified bitrate (can_enable <bus> <bitrate>)
can_status - Show status of CAN buses
echo - Toggle command echo (echo <on|off>)
elm - Configure ELM327 interface and mode (elm <usb|bt PIN|wifi> <can0|can1|can2>)
help - Display this help message
idle_timeout - Set idle timeout in minutes (idle_timeout disable|<minutes>)
led_mode - Set LED mode (led_mode <0-3>) 0=OFF, 1=Power, 2=CAN Activity
log_level - Set log level (log_level <0-3>). 0=DEBUG, 1=INFO, 2=WARNING, 3=ERROR
reset - Reset the system (reset)
save - Save current settings to flash
set_num_busses - Set number of CAN buses (can_num_busses [number])
settings - Show current system settings
sleep - Enter deep sleep mode (sleep)
sys_stats - Display system information and resource usage (sys_stats [cpu|heap|fs|tasks|uptime|adc|wifi])
telnet - Enable or disable Telnet and set port (telnet enable|disable | telnet <port
version - Display version information (version)
wifi - Manage WiFi settings (wifi info | wifi connect <ssid> <password> | wifi ap <ssid> <password> <channel> | wifi disable)
The Raspberry Pi Pico has no native CAN support. The PIO can2040 implementation we're using only supports CAN 2.0B.
However, if you need CAN FD or other bus types, feel free to open a PR supporting a CAN controller (like MCP2518FD).
Yes! PiCCANTE is designed to be cross-platform. It works with any operating system as a standard USB device with no special drivers required.
For SLCAN interfaces, Linux users can use can-utils to provide a SocketCAN interface, while all platforms support the GVRET/SLCAN interface through tools like SavvyCAN.
Up to 3 CAN buses on the RP2350 (Pico 2/2W) and up to 2 CAN buses on the RP2040 (original Pico/Pico W).
Each bus has a dedicated USB-CDC SLCAN interface.
PiCCANTE gives you a fully open-source solution at a fraction of the cost of commercial tools.
You get complete control over the hardware and software, the ability to customize for specific needs, and valuable learning experience about CAN networks and embedded systems.
-
Issue: CAN bus not receiving data
Solutions:- Verify CAN status with
can_status
command - Verify wiring and bitrate settings
- Check for proper bus termination resistance (remove resistor on the transceiver if connected to an existing CAN-bus)
- Verify CAN status with
-
Issue: LED not lighting up / blinking
Solutions:- Check USB connection and power
- Check led_mode command on the first USB CDC device
PiCCANTE is built using the Raspberry Pi Pico SDK and follows standard Pico development practices. This section covers how to set up your development environment, build the project, and extend its functionality.
- Raspberry Pi Pico SDK
- CMake (3.13 or newer) [Windows: bundled with PicoSDK]
- C/C++ compiler (GCC ARM) [Windows: bundled with PicoSDK]
- Visual Studio Code with the Pico extension (recommended)
-
Install the Pico SDK:
Follow the instructions in the Pico SDK documentation to install the SDK
-
Clone PiCCANTE:
git clone git@github.com:Alia5/PiCCANTE.git cd PiCCANTE git submodule update --init --recursive
-
Configure with CMake:
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
-
Build the project:
cmake --build build --config Release
- Open the PiCCANTE folder in VS Code
- Press F1 and select "CMake: Configure"
- Press F7 to build the project
- To flash, connect a Pico in BOOTSEL mode and press F5
Contributions to PiCCANTE are welcome! Whether it's bug reports, feature requests, documentation improvements, or code contributions, your help makes this project better.
- Bug Reports: Open an issue describing the problem and steps to reproduce it
- Feature Requests: Open an issue describing the desired functionality
- Code Contributions: Fork the repository, make your changes, and submit a pull request
PiCCANTE is designed to be extensible. Here are some key areas where you might want to extend functionality:
- Adding new commands: Extend the command interpreter to add custom commands.
- Implementing new protocols: Add new protocol handlers in their respective directories.
- Car-specific tools: Fork PiCCANTE to create a car-specific tool and diagnostics dongle.
- Custom gauges: Fork PiCCANTE and use it as a base controller to implement custom gauges.
- Custom data logging: Implement custom data logging to SD card to monitor your vehicle on a track day.
PiCCANTE - PiCCANTE Car Controller Area Network Tool for Exploration
Copyright (C) 2025 Peter Repukat
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.