Andrea Torlai
Created November 5, 2024

Astrial - CAN

The goal of this tutorial is to communicate with CAN between 2 Astrial boards using the integrated CAN controller on Astrial and a CAN Hat.

23
Astrial - CAN

Things used in this project

Hardware components

Astrial
×1
Raspberry Pi Compute Module 4 IO Board
×1
Waveshare CM4-IO-BASE-A Board
×1
Waveshare RS485 CAN HAT (B)
×1
CAN FD 3 Click
×1
Female/Female Jumper Wires
Female/Female Jumper Wires
×10

Story

Read more

Schematics

CAN FD3 Click Schematic

Code

can_listen.py

Python
# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
#
# SPDX-License-Identifier: MIT

from can_lib.canio import Timer
from can_lib.canio import RemoteTransmissionRequest, Message
from can_lib import MCP2515 as CAN

mcp = CAN(baudrate=125000)

t = Timer(timeout=5)
next_message = None
message_num = 0
while True:
    # print occationally to show we're alive
    if t.expired:
        print(".", end="")
        t.rewind_to(1)
    with mcp.listen(timeout=1.0) as listener:
        message_count = listener.in_waiting()

        if message_count == 0:
            continue

        next_message = listener.receive()
        message_num = 0
        while not next_message is None:
            message_num += 1

            msg = next_message
            print("ID:", hex(msg.id), end=",")
            if isinstance(msg, Message):
                if len(msg.data) > 0:
                    print("Data:", end="")
                    message_str = ",".join(["0x{:02X}".format(i) for i in msg.data])
                    print(message_str)

            if isinstance(msg, RemoteTransmissionRequest):
                print("RTR_LEN:", msg.length)
            next_message = listener.receive()

can_send.py

Python
# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
#
# SPDX-License-Identifier: MIT
from can_lib.canio import Message, RemoteTransmissionRequest
from can_lib import MCP2515 as CAN
import time
NODE_ID = 0x12

can_bus = CAN(baudrate=125000)
while True:
   message = Message(id=NODE_ID, data=b'Hello', extended=True)
   send_success = can_bus.send(message)
   time.sleep(1)

Credits

Andrea Torlai
11 projects • 4 followers
Contact

Comments

Please log in or sign up to comment.