Cyphal Arduino

Скачайте библиотеку libcypcal. В libcyphal-docs есть документация с примерами к этой библиотеке.

Если при компиляции кода в arduino возникнет ошибка на строки подключения canard.h, o1heap.h и т.п., то скопируйте все папки(их 5 штук) из libcxxcanard/libs/ в libcxxcanard/src

Давайте рассмотрим два примера - чтение напряжения и передача угла датчика мотора.

Перед написанием примера настоятельно рекомендуем прочитать документацию к регламентированным типам данных. Это существенно облегчит вам понимание особенностей типов и их адресации.

А также изучите пример из libcyphal-docs. Тут идет передача и чтение heartbeat. Все узлы Cyphal, имеющие node-ID, обязаны периодически публиковать это сообщение в закрепленном за ними топике.

Чтение напряжения из топика

Подключаем все нужные библиотеки и заголовочные файлы

#include <VBCoreG4_arduino_system.h>   // системный хэдер
#include <Libcanard2.h>                // базовые библиотеки (canard, uavcan, etc.)
#include <cyphal.h>                    // сам libcyphal
#include <uavcan/si/unit/voltage/Scalar_1_0.h> // тип сообщения, которе будем использовать
#include <uavcan/node/Heartbeat_1_0.h>
// Настройка fdcan из VBCoreG4
CanFD canfd;
FDCAN_HandleTypeDef* hfdcan1;
// Таймер, по прерыванию которого будем посылать сообщения
uint32_t uptime = 0;
HardwareTimer *timer = new HardwareTimer(TIM3);

SUBSCRIPTION_CLASS_MESSAGE - это макрос, который объявляет класс VoltageReader. Вы можете дать классу любое другое имя - VoltReader, Reader и т.д. Не забудьте в качестве 3 аргумента передать топик, в котором будет публиковаться сообщение с напряжением.

Описание всех макросов вы можете найти в файле cyphal/subscriptions/subscription.h

Функция, которая обрабатывает полученное сообщение:

Создадим указатель на класс VoltageReader

В setup() запустим can, cancyphal и настроим таймер

В сновном цикле вызываем функцию cyphal интерфейса - loop.

Напомним, что все узлы cyphal должны публиковать сообщение heartbeat. Наш узел это делает 1 раз в секунду по таймеру. Добавим в код функцию отправки сообщения и функцию прерывания

Все, программа готова. Полный listing кода:

Загружаем ее на плату, открываем SerialMonitor и командную строку. В командной строке отправим сообщение с желаемым напряжением в вольтах:

В Serial Monitor вы должны увидеть следующее

Передача угла датчика мотора

Здесь все очень похоже на передачу heartbeat. ДОБАВИТЬ ОТПРАВКУ HEARTBEAT В КОД