Cansniffer Example
Link to cansniffer/code.py
This example covers a simple tool for listening to all CAN Id's streaming on the bus and measure simple statistics about the streamed messages. The example is inspired by the cansniffer command line tool from can-utils.
You should read through the Hello Main Loop example first, as some required concepts are explained there.
Please note that USB serial connections can sometimes be unstable.
This example is intended to demonstrate the concept of reading CAN messages from the Amiga
with the microcontroller kit and should not be considered a robust alternative to
using a productized CAN transceiver and SocketCAN
based utilities (e.g., can-utils
).
Parts required
- farm-ng microcontroller kit (w/ USB-C cable)
CansnifferApp Breakdown
Here we create CansnifferApp
as a very simple example of the
types of AppClass
you can create.
In our app, we create a TickRepeater
that will cause our print
statements to execute every 1000 ms (every second).
In those print statements (in CansnifferApp.iter()
), we first
clear the console with:
print("\033[2J", end="")
then print metrics about the CAN bus that are already measured by
default in MainLoop
, returned by the debug_str()
method.
print(self.main_loop.debug_str())
These statistics include transmission and receive CAN errors, as well as all CAN Id's received by the microcontroller's CAN interface, with statistics on the time between received messages for each CAN Id.
You could also add memory statistics to the printed lines
by adding the following line to the CansnifferApp
constructor:
self.main_loop.show_mem = True
CAN Introduction
In general, we mostly follow the CANopen standards. A recommended reading is the CSS Electronics CANopen tutorial.
Some of the third-party, auxiliary components we have integrated into the system do not allow for strict adherence to the CANopen standards. For our core system, we adhere closely to the standards.
In this standard, messages are passed using function codes based on their use. Each component has a node ID identifier used to identify either the intended recipient or the source component of each message sent on the CAN bus. In this way, the CAN Id (COB-ID) encodes both the type of message and either the intended recipient or the source of each message.
If you are unfamiliar with CAN bus, but are familiar with publisher/subscriber frameworks, one way to think about this is that every component is publishing to the CAN bus. Every other component on the CAN bus can subscribe to those messages, or ignore them.
The first CANopen standard to familiarize yourself with before interacting with the Amiga dev kit is the PDO Service used for sharing realtime information. Our dashboard is in constant communication with the pendant and all motor controllers.
We stream requests on the RPDO1
channel, and respond on the
TPDO1
channel.
For example, key examples of our PDO sets include:
Source | Destination | node id | RPDO Request | TPDO response |
---|---|---|---|---|
Pendant | Dashboard | Pendant | Joystick, buttons | LEDs, backlight |
Dashboard | Motor Controller (x4) | Motor Controller ID | Status, rpm | Status, voltage, rpm, current |
Auto controller | Dashboard | Dashboard | State, speed, angular rate | State, speed, angular rate |
When possible, the RPDO requests are followed and the values
measured when following these requests are sent as a TPDO
response.
When the requests cannot be followed, the reason should be
inferable from the TPDO response.
The Hello World Auto-mode (hello_main_loop)
provides the ability to interact
directly with the Auto controller / dashboard PDO set of RPDO
request & TPDO response.
To test this, try requesting control of the robot when it is
NOT in an AUTO READY
state.
Instructions
Steps 1 - 3 are explained in greater detail in the Hello Auto Mode introductory example.
-
Connect your farm-ng microcontroller kit to your PC.
-
From
amiga-dev-kit/circuitpy/
, drop thecode.py
file and thelib/
folder directly into the root of the mountedCIRCUITPY
drive.noteThis assumes you have already cloned the amiga-dev-kit repo.
cd <to_your_base_directory>
git clone git@github.com:farm-ng/amiga-dev-kit.git -
Open the serial console.
-
You should now see the can statistics printed and updated every 1000 ms.
If the serial console is blank, click into the serial console,
cancel the current execution with crtl+C
, and soft reboot the
microcontroller with ctrl+D
.