# 107-Arduino-Cyphal: Bringing Cyphal to Arduino

**URL:** <https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692>\
**Category:** Applications & Usage\
**Created:** [June 20, 2022, 10:58am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692 "2022-06-20T10:58:27Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [June 20, 2022, 10:58am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/1 "2022-06-20T10:58:28Z")

</div>

Hello everyone ☕ 👋

I’d like to announce the availability of [107-Arduino-Cyphal](https://github.com/107-systems/107-Arduino-Cyphal) via [Arduino Library Manager](https://downloads.arduino.cc/libraries/logs/github.com/107-systems/107-Arduino-Cyphal/).

This library is the successor of [107-Arduino-UAVCAN](https://forum.opencyphal.org/t/arduino-uavcan-library/905).

It’s purpose is to provide a [libcanard](https://github.com/OpenCyphal/libcanard) based [OpenCyphal](https://opencyphal.org/) implementation for various Arduino platforms and was made necessary due to the [renaming of the project](https://forum.opencyphal.org/t/uavcan-v1-is-now-cyphal/1622). Furthermore the occasion was used to facelift the library, i.e. update to the latest versions of [libcanard](https://github.com/107-systems/107-Arduino-Cyphal/pull/149)/[o1heap](https://github.com/107-systems/107-Arduino-Cyphal/pull/148) as well as various other minor improvements (see [changelog](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/2.1.0)).

Cheers, Alex

---

<div class="post-metadata">

**Author:** ![scottdixon](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/scottdixon/32/39_2.png) [@scottdixon](https://forum.opencyphal.org/u/scottdixon)\
**Post date:** [June 21, 2022, 3:42am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/2 "2022-06-21T03:42:47Z")

</div>

Bravo! Thank you @aentinger for this exciting contribution.

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [September 16, 2022, 11:37am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/3 "2022-09-16T11:37:08Z")

</div>

Hi everyone ☕ 👋

Just a short heads-up that adding a convenient register API is underway ([#158](https://github.com/107-systems/107-Arduino-Cyphal/pull/158)) for [107-Arduino-Cyphal](https://github.com/107-systems/107-Arduino-Cyphal). Here a short sneak-preview:

CC @generationmake

---

<div class="post-metadata">

**Author:** ![generationmake](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/generationmake/32/611_2.png) [@generationmake](https://forum.opencyphal.org/u/generationmake)\
**Post date:** [September 17, 2022, 10:58pm UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/4 "2022-09-17T22:58:40Z")

</div>

Hi  
I have already tested it and it seems to work for read and write operations. So best to configure your nodes.  
examples will follow!  
Bernhard

---

<div class="post-metadata">

**Author:** ![pepeRossRobotics](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/peperossrobotics/32/1099_2.png) [@pepeRossRobotics](https://forum.opencyphal.org/u/pepeRossRobotics)\
**Post date:** [September 22, 2022, 10:04am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/5 "2022-09-22T10:04:28Z")

</div>

pretty cool! Cant wait to test it

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [September 28, 2022, 9:34am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/6 "2022-09-28T09:34:34Z")

</div>

With the release of [107-Arduino-Cyphal:v2.2.0](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/2.2.0) a convenient C++ API for dealing with the **OpenCyphal Register** feature has been added to the Arduino library.

Here’s how to use 107-Arduino-Cyphal’s register API:

First instantiate a couple of registers (plus a RegisterList object) which you’d like to use:

```C++
RegisterNatural8 reg_rw_uavcan_node_id ("uavcan.node.id", Register::Access::ReadWrite, Register::Persistent::No, OPEN_CYPHAL_NODE_ID, [&node_hdl](uint8_t const & val) { node_hdl.setNodeId(val); });
RegisterString reg_ro_uavcan_node_description ("uavcan.node.description", Register::Access::ReadWrite, Register::Persistent::No, "OpenCyphal-ToF-Distance-Sensor-Node");
RegisterNatural16 reg_ro_uavcan_pub_distance_id ("uavcan.pub.distance.id", Register::Access::ReadWrite, Register::Persistent::No, OPEN_CYPHAL_ID_DISTANCE_DATA, [&pub_distance_id](uint16_t const & val) { pub_distance_id = val; });
RegisterString reg_ro_uavcan_pub_distance_type("uavcan.pub.distance.type", Register::Access::ReadOnly, Register::Persistent::No, "uavcan.primitive.scalar.Real32.1.0");
RegisterList reg_list;

```

Secondly add those registers to the register list and subscribe to the relevant topics:

```C++
reg_list.add(reg_rw_uavcan_node_id);
reg_list.add(reg_ro_uavcan_node_description);
reg_list.add(reg_ro_uavcan_pub_distance_id);
reg_list.add(reg_ro_uavcan_pub_distance_type);
reg_list.subscribe(node_hdl);

```

Now you can access those registers using i.e. [yakut](https://github.com/OpenCyphal/yakut). A short video of a couple of register operations is shown below:

A fully implemented example for the register API can be found [here](https://github.com/107-systems/107-Arduino-Cyphal/blob/main/examples/OpenCyphal-ToF-Distance-Sensor-Node/OpenCyphal-ToF-Distance-Sensor-Node.ino).

**Enjoy!**

If there are any questions, don’t hesitate to fire off an [📧](mailto:consulting@lxrobotics.com) or ask an question within this forum.

Cheers, Alex

PS: If you are using [107-Arduino-MCP2515](https://github.com/107-systems/107-Arduino-MCP2515) to get your OpenCyphal CAN frames on the wire please updates to [107-Arduino-MCP2515:v1.3.5](https://github.com/107-systems/107-Arduino-MCP2515/releases/tag/1.3.5) as this version contains numerous OpenCyphal/CAN related bug fixes.

---

<div class="post-metadata">

**Author:** ![scottdixon](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/scottdixon/32/39_2.png) [@scottdixon](https://forum.opencyphal.org/u/scottdixon)\
**Post date:** [October 3, 2022, 2:50am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/7 "2022-10-03T02:50:52Z")

</div>

Great contribution Alexander! Thanks for keeping us in Arduino.

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [March 28, 2023, 3:44am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/8 "2023-03-28T03:44:31Z")

</div>

## Breaking News: [107-Arduino-Cyphal v3.0.0](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/3.0.0) w/ modern API and full Cyphal compliance has just been released!

This release represents a significant overhaul of the entire library. As a result, it is possible to create a fully Cyphal-compliant application by leveraging a powerful, compact, and concise API. These are the main characteristics:

- ROS/ROS2 style API with type erasure for creating `Publisher`’s, `Subscriptions`’s, `ServiceServer`’s and `ServiceClient`’s.

- **Run-time configurable** parameters, such as

- The library is free of Microcontroller/Arduino specific idioms, the library therefore **compiles for any architecture** (incl. your PC):

- [nunavut](https://github.com/OpenCyphal/nunavut) pre-generated **C++ headers**.

- Support for both **CAN** and **CAN FD** PHY layers.

- Implementation of the [Register API](https://github.com/OpenCyphal/public_regulated_data_types/tree/master/uavcan/register) supporting both RO and RW registers, as well as array and scalar types.

- Implementation of the [NodeInfo API](https://github.com/OpenCyphal/public_regulated_data_types/blob/master/uavcan/node/430.GetInfo.1.0.dsdl) for providing generic node information for i.e. [yakut](https://github.com/OpenCyphal/yakut).

- Provision of a [uavcan/node/port/List.1.0](https://uavcan/node/port/7510.List.1.0.dsdl) publisher which periodically publishes information on publisher and subscribed topics, as well as service servers and clients.

- Self-explaining [examples](https://github.com/107-systems/107-Arduino-Cyphal/tree/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/examples) for `Publisher`, `Subscriptions`, `ServiceServer` and `ServiceClient`.

- A number of **[full Cyphal compliant reference implementations](https://github.com/107-systems/107-Arduino-Cyphal/blob/main/README.md#reference-implementations)**.

- There are also **external support libraries** that provide Cyphal-specific key functionality:

Let’s take a closer look at each of these features:

## Declaration/Usage of a Cyphal-Node

The basic API entry point is a [Node](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.hpp#L41-L149) class instance, which must be provided with heap as well as a function pointer to a CAN transmit function:

```C++
Node::Heap<Node::DEFAULT_O1HEAP_SIZE> node_heap;
Node node_hdl(node_heap.data(), node_heap.size(), micros, [] (CanardFrame const & frame) { return mcp2515.transmit(frame); });

```

Processing happens inside [spinSome](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.cpp#L74-L79) which needs to be called regularly:

```C++
void loop()
{
  /* Process all pending OpenCyphal actions. */
  {
    CriticalSection crit_sec;
    node_hdl.spinSome();
  }
  /* ... */

```

Received CAN frames are passed to the application via [onCanFrameReceived](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.cpp#L88-L100):

```C++
void onReceiveBufferFull(CanardFrame const & frame)
{
  node_hdl.onCanFrameReceived(frame);
}

```

## Publisher

A `Publisher` can be created using the [create\_publisher](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.hpp#L79-L82) API:

```C++
/* Create a publisher with a fixed port id: */
const auto heartbeat_pub = node_hdl.create_publisher<uavcan::node::Heartbeat_1_0>
  (1*1000*1000UL /* = transmit timeout / usec */);

/* Create a publisher with a custom port id: */
CanardPortID const ANGLE_ID = 1001U;
const auto angle_pub = node_hdl.create_publisher<uavcan::si::unit::angle::Scalar_1_0>
  (ANGLE_ID, 1*1000*1000UL /* = transmit timeout / usec */);

```

which can then be used to publish messages:

```C++
uavcan::node::Heartbeat_1_0 msg;

msg.uptime = now / 1000;
msg.health.value = uavcan::node::Health_1_0::NOMINAL;
msg.mode.value = uavcan::node::Mode_1_0::OPERATIONAL;
msg.vendor_specific_status_code = 0;

heartbeat_pub->publish(msg);

```

or

```C++
uavcan::si::unit::angle::Scalar_1_0 angle_scalar;
angle_scalar.radian = (b_angle_deg - b_angle_offset_deg) * M_PI / 180.0f;
angle_pub->publish(angle_scalar);

```

## Subscription

A `Subscription` can be created using the [create\_subscription](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.hpp#L84-L87) API:

```C++
/* Create a subscription with a fixed port id: */
const auto heartbeat_subscription = node_hdl.create_subscription<Heartbeat_1_0>(onHeartbeat_1_0_Received);

/* Create a subscription with a custom port id: */
static CanardPortID const BIT_PORT_ID = 1620U;
const auto bit_subscription = node_hdl.create_subscription<Bit_1_0>(BIT_PORT_ID, onBit_1_0_Received);

```

Upon reception of such a transfer the callback provided during creation of the `Subscription` object is invoked:

```C++
void onBit_1_0_Received(Bit_1_0 const & msg)
{
  if(msg.value)
    digitalWrite(LED_BUILTIN, HIGH);
  else
    digitalWrite(LED_BUILTIN, LOW);
}

```

## Service Server

A `ServiceServer` can be created using the [create\_service\_server](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.hpp#L89-L92) API:

```C++
const auto ServiceServer execute_command_srv = node_hdl.create_service_server<ExecuteCommand::Request_1_1, ExecuteCommand::Response_1_1>(
  2*1000*1000UL,
  onExecuteCommand_1_1_Request_Received);

```

Upon reception of a service clients request the callback provided during creation of the `ServiceServer` object is invoked:

```C++
ExecuteCommand::Response_1_1 onExecuteCommand_1_1_Request_Received(ExecuteCommand::Request_1_1 const & req)
{
  ExecuteCommand::Response_1_1 rsp;

  if (req.command == 0xCAFE)
    rsp.status = ExecuteCommand::Response_1_1::STATUS_SUCCESS;
  else
    rsp.status = ExecuteCommand::Response_1_1::STATUS_NOT_AUTHORIZED;

  return rsp;
}

```

## Service Client

A `ServiceClient` can be created using the [create\_service\_client](https://github.com/107-systems/107-Arduino-Cyphal/blob/f4229007b64b9b05066f2b4de7f2b86bfaef5aa6/src/Node.hpp#L94-L97) API:

```C++
const auto srv_client = node_hdl.create_service_client<ExecuteCommand::Request_1_1, ExecuteCommand::Response_1_1>(
  2*1000*1000UL,
  onExecuteCommand_1_1_Response_Received);

```

Send an asynchronous request:

```C++
/* Request some coffee. */
std::string const cmd_param("I want a double espresso with cream!");
ExecuteCommand::Request_1_1 req;
req.command = 0xCAFE;
std::copy_n(cmd_param.begin(),
            std::min(cmd_param.length(), req.parameter.capacity()),
            req.parameter.begin());

if (!srv_client->request(27 /* remote node id */, req))
  Serial.println("Coffee request failed.");

```

Upon reception of a service servers response the callback provided during creation of the `ServiceClient` object is invoked:

```C++
void onExecuteCommand_1_1_Response_Received(ExecuteCommand::Response_1_1 const & rsp)
{
  if (rsp.status == ExecuteCommand::Response_1_1::STATUS_SUCCESS)
    Serial.println("Coffee successfully retrieved");
  else
    Serial.println("Error when retrieving coffee");
}

```

## Register API

The Register API enables node configuration:

```C++
/* R/W register value. */
CanardNodeID node_id = node_hdl.getNodeId();
CanardPortID counter_port_id = DEFAULT_COUNTER_PORT_ID;
uint16_t counter_update_period_ms = DEFAULT_COUNTER_UPDATE_PERIOD_ms;

/* Creating a registry. */
const auto node_registry = node_hdl.create_registry();

/* Creating RO and RW registers. */
const auto reg_ro_node_description = node_registry->route ("cyphal.node.description", {true}, []() { return "basic-cyphal-node"; });
const auto reg_ro_pub_counter_type = node_registry->route ("cyphal.pub.counter.type", {true}, []() { return "uavcan.primitive.scalar.Integer8.1.0"; });
const auto reg_rw_node_id = node_registry->expose("cyphal.node.id", {}, node_id);
const auto reg_rw_pub_counter_id = node_registry->expose("cyphal.pub.counter.id", {}, counter_port_id);
const auto reg_rw_pub_counter_update_period_ms = node_registry->expose("cyphal.pub.counter.update_period_ms", {}, counter_update_period_ms);

```

## NodeInfo API

The NodeInfo API provides relevant node information:

```C++
static auto node_info = node_hdl.create_node_info
(
  /* uavcan.node.Version.1.0 protocol_version */
  1, 0,
  /* uavcan.node.Version.1.0 hardware_version */
  1, 0,
  /* uavcan.node.Version.1.0 software_version */
  0, 1,
  /* saturated uint64 software_vcs_revision_id */
#ifdef CYPHAL_NODE_INFO_GIT_VERSION
  CYPHAL_NODE_INFO_GIT_VERSION,
#else
  0,
#endif
  /* saturated uint8[16] unique_id */
  OpenCyphalUniqueId(),
  /* saturated uint8[<=50] name */
  "107-systems.l3xz-leg-ctrl"
);

```

Note: **This release contains many breaking changes. If you are a corporation needing help to upgrade your [107-Arduino-Cyphal](https://github.com/107-systems/107-Arduino-Cyphal) based application feel free to reach out to [me](https://www.lxrobotics.com/about/) ([e-mail](mailto:consulting@lxrobotics.com)).**

CC @pavel.kirienko @scottdixon @generationmake

---

<div class="post-metadata">

**Author:** ![pavel.kirienko](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/pavel.kirienko/32/9_2.png) [@pavel.kirienko](https://forum.opencyphal.org/u/pavel.kirienko)\
**Post date:** [March 28, 2023, 8:34am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/9 "2023-03-28T08:34:27Z")

</div>

Outstanding. Hoping to see Cyphal/UDP support one day 😉

---

<div class="post-metadata">

**Author:** ![scottdixon](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/scottdixon/32/39_2.png) [@scottdixon](https://forum.opencyphal.org/u/scottdixon)\
**Post date:** [March 28, 2023, 8:50pm UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/10 "2023-03-28T20:50:19Z")

</div>

(clears weekend plans to play with Arduino!)

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [March 29, 2023, 3:31am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/11 "2023-03-29T03:31:27Z")

</div>

@generationmake has a board to get you started 😉 : [OpenCyphalPicoBase](https://github.com/generationmake/OpenCyphalPicoBase) 🙇‍♂️ .

---

<div class="post-metadata">

**Author:** ![scottdixon](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/scottdixon/32/39_2.png) [@scottdixon](https://forum.opencyphal.org/u/scottdixon)\
**Post date:** [March 30, 2023, 12:08am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/12 "2023-03-30T00:08:28Z")

</div>

I like that this board has a reserved pin for a “radiation detector” 😉

Anyone want to do a group buy on this board?

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [March 30, 2023, 4:21am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/13 "2023-03-30T04:21:51Z")

</div>

> [@scottdixon](#):
>
> I like that this board has a reserved pin for a “radiation detector” 😉

😆 That’s a leftover from the origins of this board, which started out as an auxiliary controller for the [L3X-Z hexapod robot](https://forum.opencyphal.org/t/l3x-z-a-opencyphal-enabled-hexapod-robot-for-elrob-2022/1682). One requirement of our selected scenario at [ELROB 2023](https://107-systems.org/l3xz-hexapod-robot-elrob2022/) was to be able to detect radioactive sources. Hence I purchased a simple (yet expensive) radiation sensor which provides a counts/minute (CPM) signal that was captured by that pin =) Clearly the documentation needs to be cleaned up a bit @generationmake 😉 .

For reference, here’s already a thread dedicated to the OpenCyphalPicoBase board: [https://forum.opencyphal.org/t/opencyphalpicobase-a-node-with-raspberry-pi-pico-and-mcp2515](https://forum.opencyphal.org/t/opencyphalpicobase-a-node-with-raspberry-pi-pico-and-mcp2515) .

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [April 17, 2023, 5:04am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/14 "2023-04-17T05:04:44Z")

</div>

Hi everyone ☕ 👋

I’d hereby like to announce the release of

## [107-Arduino-Cyphal-Support](https://github.com/107-systems/107-Arduino-Cyphal-Support)

a Arduino library which provides convenient plumbing to build a fully functional Cyphal node in combination with [107-Arduino-Cyphal](https://github.com/107-systems/107-Arduino-Cyphal).

Here’s a list of its current features:

- API for obtaining a **unique 64-bit ID**.

```C++
auto /* std::array<uint8_t, 16> */ const UNIQUE_ID = cyphal::support::UniqueId::instance().value();

```

- API for **persistent register storage and retrieval**.

```C++
/* Declaration of key/value storage. */
cyphal::support::platform::storage::littlefs::KeyValueStorage kv_storage(filesystem);

/* Load persistently stored registers from a non-volatile memory (EEPROM, flash, etc.). */
if (auto const opt_err = cyphal::support::load(kv_storage, *node_registry); opt_err.has_value())
{
  Serial.print("load failed with error code ");
  Serial.println(static_cast<int>(opt_err.value()));
}

/* Store persistent registers to a non-volatile memory (EEPROM, flash, etc.). */
if (auto const opt_err = cyphal::support::save(kv_storage, *node_registry); opt_err.has_value())
{
  Serial.print("save failed with error code ");
  Serial.println(static_cast<int>(opt_err.value()));
}

```

- API for performing **synchronous and asynchronous resets**.

```C++
/* Synchronous reset: */
cyphal::support::platform::reset_sync(std::chrono::milliseconds(5000));
/* Asynchronous reset: */
cyphal::support::platform::reset_async(std::chrono::milliseconds(5000));

```

## Video-Demo of node configuration via [yakut](https://github.com/opencyphal/yakut) utilizing persistent register storage, unique ID and reset API

### Resources

The following hardware and firmware were used for producing the demo:

- [Firmware](https://github.com/107-systems/l3xz-aux-ctrl-firmware/tree/786d9c736b90f4772082dfac1755f0f20d2ea377)
- [Hardware](https://github.com/generationmake/OpenCyphalPicoBase)

### What can be seen on that video?

Using yakut the node id is changed multiple times using yakut. After changing the node id the node is restarted (again via yakut) and can be observed coming back online with a the freshly configured node-id. Note that the node’s unique ID does never change (its a per MCU unique ID).

- After startup the initial node id in the video is 20.
- The node id is changed from 20 to 42, the changes are written persistent storage and the node is restarted.
- The node comes up again with a node ID of 42.
- The node id is changed from 42 to 1, the changes are written persistent storage and the node is restarted.
- The node comes up again with a node ID of 1.

CC @generationmake FYI @pavel.kirienko @scottdixon

---

<div class="post-metadata">

**Author:** ![scottdixon](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/scottdixon/32/39_2.png) [@scottdixon](https://forum.opencyphal.org/u/scottdixon)\
**Post date:** [April 17, 2023, 5:09pm UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/15 "2023-04-17T17:09:49Z")

</div>

This is really cool to see! Thanks!

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [August 9, 2023, 10:27am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/16 "2023-08-09T10:27:18Z")

</div>

Hi everyone ☕ 👋

I want to take the opportunity and announce the release of [107-Arduino-Cyphal:v3.3.0](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/3.3.0).

The most notable difference to the previous release is that now the new Arduino Core for **Renesas** ([ArduinoCore-renesas](https://github.com/arduino/ArduinoCore-renesas)) is also supported. Simply put, this means that `107-Arduino-Cyphal` can now be used with

- [Portenta C33](https://store.arduino.cc/products/portenta-c33) ✔ (R7FA6M5)
- [Uno R4 WiFi](https://store.arduino.cc/products/uno-r4-wifi) ✔ (R7FA4M1)
- [Uno R4 Minima](https://store.arduino.cc/products/uno-r4-minima) ✔ (R7FA4M1)

and custom designs employing those chips.

This has been possible because ArduinoCore-renesas supports **C++17** and is only the second of all (official and 3rd party) Arduino Cores to do so (107-Arduino-Cyphal requires C++17 since that’s a requirement for using the nunavut generated C++ headers with @pavel.kirienko register API code - otherwise C++14 would suffice).

Thanks to @generationmake for pushing me to extend library support for the new platform 🙇‍♂️ .

**Note** : You will also need to update to

- [107-Arduino-CriticalSection:v1.1.0](https://github.com/107-systems/107-Arduino-CriticalSection/releases/tag/1.1.0)
- [107-Arduino-MCP2515:v1.5.0](https://github.com/107-systems/107-Arduino-MCP2515/releases/tag/1.5.0)

---

<div class="post-metadata">

**Author:** ![generationmake](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/generationmake/32/611_2.png) [@generationmake](https://forum.opencyphal.org/u/generationmake)\
**Post date:** [August 9, 2023, 7:08pm UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/17 "2023-08-09T19:08:10Z")

</div>

It was a pleasure! 😉

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [August 23, 2023, 4:17am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/18 "2023-08-23T04:17:03Z")

</div>

Good Morning ☕ 👋

[107-Arduino-Cyphal:v3.4.0](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/3.4.0) has just been released.

It contains a breaking change insofar that all elements except the pre-generated DSDL are now encapsulated within the **cyphal** namespace. This prevents naming conflicts in larger software projects (let’s face it: **Publisher** , **Subscription** , **ServiceServer** , etc. are pretty generic names).

For examples on how to upgrade from the previous version of this library you can take a look at any of those PRs:

- [107-systems/l3xz-aux-ctrl-firmware#21](https://github.com/107-systems/l3xz-aux-ctrl-firmware/pull/21)
- [107-systems/l3xz-valve-ctrl-firmware#13](https://github.com/107-systems/l3xz-valve-ctrl-firmware/pull/13)
- [107-systems/l3xz-radiation-sensor-firmware#38](https://github.com/107-systems/l3xz-radiation-sensor-firmware/pull/38)
- [107-systems/l3xz-pressure-sensor-firmware#3](https://github.com/107-systems/l3xz-pressure-sensor-firmware/pull/3)
- [107-systems/l3xz-leg-ctrl-firmware#53](https://github.com/107-systems/l3xz-leg-ctrl-firmware/pull/53)
- [107-systems/OpenCyphalPicoBase-firmware#42](https://github.com/107-systems/OpenCyphalPicoBase-firmware/pull/42)

---

<div class="post-metadata">

**Author:** ![aentinger](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/aentinger/32/1428_2.png) [@aentinger](https://forum.opencyphal.org/u/aentinger)\
**Post date:** [January 16, 2024, 9:35am UTC](https://forum.opencyphal.org/t/107-arduino-cyphal-bringing-cyphal-to-arduino/1692/19 "2024-01-16T09:35:22Z")

</div>

Rejoice everyone ☕ 👋 for [107-Arduino-Cyphal:v3.5.0](https://github.com/107-systems/107-Arduino-Cyphal/releases/tag/3.5.0) has just been released.

Most changes are improvement in documentation and updating GitHub CI actions. There’s also fixing a couple of imperfections leading to a compilation error on Clang ([#259](https://github.com/107-systems/107-Arduino-Cyphal/pull/259)) and both libcanard ([#248](https://github.com/107-systems/107-Arduino-Cyphal/pull/248)) and libo1heap ([#250](https://github.com/107-systems/107-Arduino-Cyphal/pull/250)) are now integrated via git subtree (sadly no submodules in Arduino libraries) as well as allowing to provide a CRC parameter to the NodeInfo service ([#258](https://github.com/107-systems/107-Arduino-Cyphal/pull/258)).

Enjoy 😉
