The Volvo V-Link project aims to implement Apple CarPlay / Android Auto as well as live vehicle information in an OEM-like fashion. The backbone of the project is the V-Link app which runs natively on RaspberryPi OS. This enables full support of an operating system without the need of installing any 3rd party images which would limit the capabilites of the Raspberry. A custom-made PCB builds the interface between the app and the car. Further information can be found down below.
Want to join development, got any tips for improvement or need help?
Table of Contents
- | Installation
- | V-Link Setup
- | Display Mod
- | Wiring
- | Audio
- | Disclaimer
- | Known Issues
- | Roadmap
Raspbian 11 Bullseye
Chromium 116
Python 3.9.2
#Download and Install
wget "https://github.com/LRYMND/v-link/releases/download/v2.1.0/Installer.sh"
chmod +x Installer.sh
./Installer.sh
#Test Hardware (Requires V-Link HAT)
python3 /home/$USER/v-link/HWT.py
#Execute
python3 /home/$USER/v-link/V-Link.py
/etc/network/interfaces
/etc/xdg/autostart/
/home/$USER/.config
/boot/config.txt (RaspberryPi 4)
/boot/firmware/config.txt (RaspberryPi 5)
source /home/$USER/v-link/venv/bin/activate
pip install -r /home/$USER/v-link/requirements.txt
git clone https://github.com/lrymnd/v-link.git
cd v-link
pip install -r requirements.txt
cd frontend
npm i & npm run build
cd /home/$USER/v-link/frontend
npm run vite
cd /home/$USER/v-link
python3 V-Link.py dev
Node v18.12.1
NPM 8.19.2
[V-LINK]
#Enable GPIO 0&1
disable_poe_fan=1
force_eeprom_read=0
#Enable devicetree overlays
dtparam=i2c_arm=on
dtoverlay=vlink
dtoverlay=mcp2515-can1,oscillator=16000000,interrupt=24
dtoverlay=mcp2515-can2,oscillator=16000000,interrupt=22
#Configure IGN logic
dtoverlay=gpio-shutdown,active_low=0,gpio_pull=up,gpio_pin=1
dtoverlay=gpio-poweroff,gpiopin=0
#No Splash on boot
disable_splash=1
(Don't forget to copy the custom overlays from the devicetree folder of this repository to /boot/overlays!)
Here you can find a list of the required hardware. The V-Link Hat is currently not being sold. If you are interested in how to get one I encourage you getting in contact via our Discord channel! The old method which involved more hardware and technical skill is documented further down below.
- V-Link Hat
- Raspberry Pi 4/5
- OEM P1 RTI Display Unit
- Carlinkit Adapter
As of now, Carplay is working reliably on the CPC200-CCPA while Android Auto works better on the CPC200-CCPM Dongle. In theory, Android Auto should work on the CCPA version as well but we had mixed results. Keep this in mind when choosing your Carlinkit Adapter.
If you want to use the original display, you can find a way to do so in the repositories from laurynas, however, its highly recommended to go the extra mile as it has a much better resolution and also supports touch input with an additional panel.
The V-Link Hat is attached to the Raspberry and builds the interface to the car. On this PCB you have terminals to hook up 12V, IGN, CAN etc. It also implements a safe shutdown functionality which gracefully turns off the Raspberry once ignition is off. In this state it draws a minimum of current so draining your cars battery won‘t be an issue. The LCD Touch Display and the Carlinkit Adapter are plugged into the HDMI / USB port of the raspberry and complete the setup.
In case you want to avoid the HAT and build the setup from scratch, please refer to branch 2.0.0 which includes the old schematics and installation instructions.
In order to mod your display to get a better resolution and touch support, you need to disassemble the case and take the OEM components out. Afterwards mount the new Screen in place. A custom 3D-printable bracket for easy installation is currently in the making!
One way to connect the HAT to the car is to wire it to the CEM. You can solder - or better re-crimp - the wires directly to the connector. That way you aren't splicing any harnesses and the mod can be undone without damaging anything. The idea is to have an additional harness to the HAT. Keep in mind to choose appropriate diameters for you wire so they can carry the load and still fit in the connector. This is especially critical with the CAN wiring. In the future we want to make this a bit more easy.
The connections below are the bare minimum for the app to function properly:
| Connection | CEM Connector | Pin | HAT |
| ----------- | ------------- | --- | ------- |
| CAN-H HS | B | 11 | CAN 1 H |
| CAN-L HS | B | 12 | CAN 1 L |
| GND | A | 28 | GND |
| IGN | A | 17 | IGN |
| 12V | E | 21 | VBAT |
(Borrowed from the original Volvo Electronic Wiring Diagrams)
In order to implement the steering wheel controls, you need to connect the HAT to the LIN bus of your car. The app will convert the signals from the steering wheel buttons to keyboard/mouse HID events.
The easiest place to find the LIN Bus is the "ICM Connector A" behind the waterfall. Either connect a DuPont wire to the associated pin or disassemble the ICM and solder a small wire to it.
| Button | Function |
| ------- | ------------------------- |
| 'back' | Hold down to close screen |
| 'enter' | Click to open screen |
| Button | Normal Mode | Mouse Mode |
| ---------- | ----------- | ------------------ |
| 'Enter' | Enter | Left Click |
| 'Joystick' | Navigate | Control mouse |
Holding down 'prev' button for 2 seconds toggles between normal and mouse mode. The button mappings, timeouts etc can be adjusted in the settings file.
Connect RTI_TX_PIN to the Serial pin of the HAT. Again, either use a DuPont wire or solder directly to the RTI PCB/connector. Don't forget to also connect pin 7 (GND) to a common grounding point.
When ignition is turned on, the RTI screen automatically folds up and you can use the joystick on the back of the steering wheel to navigate through CarPlay. When clicking on the 'Enter' button on the back of the steering wheel, the Raspberry sends an ASCII 'space' event (spacebar) to navigate the app. (CarPlay requires this instead of a left click or a return/enter)
The HAT has an input for up to 4 analog sensors. A preconfigured settings file for the Bosch 0261230482 sensor kit is provided and enables temperature and pressure readings in the app. The settings file for the analogue sensors are exposed like the CAN settings, so sensors can be added without making any changes to the code at all.
Also, to make life a bit easier, you can connect an USB extension cable to the Raspi and mount it to the removable tray behind the waterfall console. This way you can directly connect peripherals to it.
The current solution for getting audio to work in cars that don't have a factory aux port is a small module from Lithuania. This module is a mod for the radio to add an aux port. There is also a Bluetooth version available but since the phone is already wirelessly connected to the Carlinkit adapter dongle, an aux-cable seems pretty clean and less prone to failure.
This is no advertisement, just a clean and simple solution IMO. And since MOST-Bus is supported through the PiMost from ModernDayMods, it might be possible to send audio over the MOST network in the future. This is still under investigation. Feel free to join the Discord Server if you want to participate in development.
The use of this soft- and hardware is at your own risk. The author and distributor of this project is not responsible for any damage, personal injury, or any other loss resulting from the use or misuse of the setup described above. By using this setup, you agree to accept full responsibility for any consequences that arise from its use. It’s DIY after all!
- In a few cases, CarPlay will connect but the stream is not visible. Restarting the app resolves this.
- In a few cases, CAN bus communication is not working right away. Restarting the app resolves this.
- The LIN interface on the HAT is currently not functioning. A fix is in the making.
- Minor scaling issues in the UI thag will be addressed over time.
- Exposed setting files
- Fully responsive UI
- Implement LIN
- Implement ADC
- Custom hardware interface
- 3D-printed display mount
- Preconfiguration for different engines
- Improved wiring to the car
- Implement DTCs
- Implement MOST
(Louis) | (Tigo) |