Pika Spark is a matchbox-sized high-performance micro robot control system combining an unprecedented amount of computing power and interfaces within an extremely small form factor. The Pika Spark has two (2) galvanically isolated CAN interfaces which can be used for communication with external devices. Galvanic isolation prevents ground-loops and increases overall system resilience and is an important feature in industrial-grade control systems.
This tutorial explains how-to both receive and transmit CAN frames using Pika Spark's fully galvanically isolated CAN interfaces.
Fig. 1: Pika Spark exchanging CAN frames w/ Zubax Babel USB-CAN converter
The standard Linxu CLI tools for both receiving and transmitting CAN frames are candump
and cansend
. Those (and a couple of other CAN-related tools such as canbusload
) are part of the can-utils
package. Since this package is not per-default installed on the Arduino Portenta X8s image we need to create a Dockerfile that contains these tools.
FROM debian:stable-slim
RUN apt-get update && \
apt-get install -y can-utils && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
In the next step a Docker image is built from the Dockerfile using docker build
.
docker build --pull --no-cache --tag pika_spark_can_utils_sh .
Now it's time to enable Pika Spark's CAN interface (we use can0
) and configure it for a bitrate of 250 kBit/s. Note: the following commands need to be run with super-user privileges (i.e. precede those commands with sudo
).
echo 160 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio160/direction
echo 0 > /sys/class/gpio/gpio160/value
ip link set can0 type can bitrate 250000
ip link set can0 up
As a final step run (docker run
) the newly created pika_spark_can_utils
container passing the CAN interface via --network host
and opening a interactive sh
.
sudo -u fio sudo docker run -it -u 0 --network host pika_spark_can_utils_sh sh
candump
By invoking candump can0
in the interactive shell of your running Docker container you can display (dump) all incoming CAN packets to stdout
. At the same time we are invoking cansend
on our PC to transmit some CAN frames using a USB/CAN dongle to the Pika Spark.
Pika Spark:
candump can0
Your PC:
cansend can0 123#DEAD
cansend can0 12345678#CAFE
cansend can0 12345678#DEAFBEEF
cansend
By invoking cansend can0 ID#DATA
in the interactive shell of your running Docker container you can trigger the transmission of both standard (11-Bit CAN-ID) and extended (29-Bit CAN-ID) CAN packets. At the same time we are invoking candump
on our PC to display (dump) all incoming CAN to stdout
.
Pika Spark:
cansend can0 123#DEAD
cansend can0 12345678#CAFE
cansend can0 12345678#DEAFBEEF
Your PC:
candump can0
In order to simplify receiving and transmitting CAN frames via one of Pika Spark's CAN interfaces ready-made bash scripts with integrated error handling and convenience features have been prepared.
git clone https://github.com/pika-spark/pika-spark-containers
cd pika-spark-containers/can-utils-sh
./docker-build.sh
sudo ./docker-run.sh can0 250000