1-800-859-6265   FAX: +1 (586) 731-2274

The easy way to program ValueCAN 4 in python using Raspberry Pi (Linux)

March 15, 2021

To help Linux developers speed up development, Intrepid Control Systems announced an open source API called libicsneo earlier this year. It can be used with python_ics to integrate Intrepid vehicle networking hardware to any Python application running Linux, Mac or Windows. In this tutorial you will learn how to Transmit and Receive high speed CAN or CAN FD messages using Raspberry Pi with any Intrepid tools such as ValueCAN 4series. Please reference the API for list of supported hardware. We will be using ValueCAN 4–2 two channel of CAN or CAN FD.

Hardware Setup

Connect ValueCAN 4–2 using DB-9F to OBD-II cable to neoOBD2 Simulator (optional) to receive or transmit CAN messages instead of a car.

Before you get started make sure you have the following dependencies

  • CMake 3.2 or above
  • GCC 4.7 or above, 4.8+ recommended
  • libusb-1.0–0-dev
  • build-essential is recommended

    Build libicsneo project and link libicsneoleagacy.so file to your Python project.

    Open Terminal

    Clone libicsneo git repository

    git clone “https://github.com/intrepidcs/libicsneo.git”

    Check to see if you have install all dependencies

    cd libicsneo/
    git submodule update — recursive — init
    sudo apt install build-essential ninja cmake libusb

    Create a build folder and make the project

    mkdir -p build && cd build && cmake .. & make

    Installing python_ics

    To install python_ics you can use either of this command

    sudo python3 -m pip install python_ics 


    sudo pip3 install python_ics

    Create a new Python project and copy paste the example code from the python_ics or you can download the open_device_example.py from github page https://github.com/intrepidcs/python_ics/blob/master/examples/open_device_example.py

    Open Python IDE and link libicsneolegacy.so by adding this line at the top of your script


    Run your Python file

    Note if you don’t see your device, try turning off the raspberry Pi and turn back on with device plugged in.

    Receive Messages

    Use this function to Receive CAN messages

    def receive_can(device):    
        msgs, error_count = ics.get_messages(device)
        print("Received {} messages with {} errors.".format(len(msgs), error_count))
        for i, m in enumerate(msgs):
           print('Message #{}\t'.format(i+1), end='')
           print('\tArbID: {}\tData: {}'.format(hex(m.ArbIDOrHeader), [hex(x) for x in m.Data]))

    Transmit Messages

    Use this function to Transmit CAN messages

    def transmit_can(device):
        msg = ics.SpyMessage()
        msg.ArbIDOrHeader = 0x01 # CAN Arbitration ID
        msg.Data = (1,2,3,4,5,6,7,8) # Data Bytes go here
        msg.NetworkID = ics.NETID_HSCAN # First channel of CAN
            # msg parameter here can also be a tuple of messages
        ics.transmit_messages(device, msg)

    So to recap:

    • Build libicsneo project
    • install python_ics
    • link libicsneolegacy.so file on your python project

    You can read the full documentation for libicsneo at https://libicsneo.readthedocs.io/en/latest/ and Python documentation at https://python-ics.readthedocs.io/en/2.15/.

You May Also Like…