> For the complete documentation index, see [llms.txt](https://delta-robotics.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://delta-robotics.gitbook.io/docs/hardware/thermoflex/tf-node-controller.md).

# TF Node Controller

The driver electronics for ThermoFlex and other Nitinol muscles, high-current output, current and resistance sensing, and control over USB serial or CAN

{% hint style="danger" %}
**The Node drives tens of amps into wire that reaches burn temperatures.** Use heavy-gauge wire and tight connections, keep hands clear of powered muscles, and keep a power cutoff within reach. Undersized wiring or a runaway heating cycle can melt connectors, burn skin, or start a fire. Read [Safety essentials](/docs/get-started/safety.md) before you power the board.
{% endhint %}

The ThermoFlex Node Controller is your desktop control lab for smart materials. It was built for shape memory alloys like Nitinol, and it also drives other Joule-heated actuators such as twisted-polymer (TCP) muscles (experimental; contact us to tune one). From a single contraction to a full shape-setting cycle, the Node gives you tight control over current, temperature, and timing, over a USB-C cable or a CAN network.

The Node measures current, voltage, and resistance. From those it estimates wire temperature and, experimentally, detects SMA phase changes. Under the hood it is an Arduino R4 Minima on a custom high-current shield, housed in a 3D-printed enclosure with a frosted acrylic top, compliant buttons, and visible status and power terminals. That is the Sick AF enclosure, and yes, that is the official name.

<figure><img src="https://1078621213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fm2yg571oTEEeXffjpREo%2Fuploads%2Fgit-blob-f6700bd2a90cb59f3f1147ee8249ff6055f47ea6%2FIMG_2907_edited_edited.png?alt=media" alt="" width="375"><figcaption><p>The TF Node Controller.</p></figcaption></figure>

## Specifications

{% hint style="info" %}
Electrical specifications are being revised. Updated Node information is on the way; the values below, including those marked TBD, are provisional and may change.
{% endhint %}

| Parameter                              | Min    | Max             |
| -------------------------------------- | ------ | --------------- |
| Input Voltage                          | 0 V    | 40 V            |
| Input Current                          | TBD    | 65 A continuous |
| Output Current (Shared across M1 + M2) | 0 A    | 60 A continuous |
| Output Current (Instantaneous Total)   | 0 A    | 110 A           |
| PWM Frequency                          | -      | 100 Hz          |
| Resistance Measurement                 | 100 mΩ | 5.00 Ω          |

## Interfaces

The Node exposes power, control, and sensing on labeled connectors.

| Interface             | Details                                                           |
| --------------------- | ----------------------------------------------------------------- |
| Power input           | XT60 male, within the input limits above                          |
| Muscle outputs        | Two XT60 female ports, labeled M1 and M2, sharing 60 A continuous |
| USB-C                 | Serial control, power, and firmware flashing, at 115200 baud      |
| CAN bus               | JST connector; daisy-chain up to 127 devices from one USB host    |
| Sensor ports          | Two JST ports for thermistors, strain gauges, and similar sensors |
| Potentiometer         | Onboard analog input for a manual setpoint or tuning              |
| Status LED and button | RGB status LED and a reprogrammable button                        |

## Serial command set

Drive the Node directly over its USB serial console at 115200 baud, or through the Python API. Type commands in lowercase with a space between parameters. A device is `all`, `m1`, `m2`, and so on; most commands default to all devices.

| Command      | Purpose                                               |
| ------------ | ----------------------------------------------------- |
| reset        | Stop a device and reset its settings to defaults      |
| set-enable   | Enable or disable the output of one or all devices    |
| set-mode     | Set the control mode of one or all devices            |
| set-setpoint | Set the target value for a device in the current mode |
| status       | Report system info for the Node and its devices       |
| stop         | Stop one or all devices                               |
| log-mode     | Turn continuous logging on or off for a device        |

### Control modes

`set-mode` and `set-setpoint` accept these modes, defined in the public TF Node firmware and protocol.

| Mode    | Regulates by                                               |
| ------- | ---------------------------------------------------------- |
| percent | Fraction of maximum power, from 0.0 to 1.0                 |
| amps    | Target output current                                      |
| volts   | Target output voltage                                      |
| ohms    | Target wire resistance, which tracks temperature and phase |
| train   | A shape-setting (training) routine                         |
| count   | A reserved mode used internally by the firmware            |

The serial console in a given firmware build may expose only a subset of these modes. Check the [public TF Node firmware](https://github.com/Delta-Robotics-Inc/TF-Node-Firmware) for what your version supports.

## Heartbeat auto-disable

The Node watches for commands from the host. If about 2 seconds pass with no command, it disables its outputs automatically. A crashed script, a closed program, or an unplugged USB cable will not leave a muscle heating on its own.

{% hint style="warning" %}
This heartbeat is a backstop, not a substitute for the precautions on the [Safety essentials](/docs/get-started/safety.md) page. Two seconds of full current can still overheat a muscle, so keep a power cutoff within reach.
{% endhint %}

## Firmware

The Node runs Delta's open TF Node firmware on its Arduino R4 Minima. Updates add control modes, sensing, and safety features over time. To flash the latest version, see [Firmware updates](/docs/software/firmware-updates.md).

## Further reading

* [Arduino R4 Minima documentation](https://docs.arduino.cc/hardware/uno-r4-minima)
* [CAN bus simple introduction](https://www.csselectronics.com/pages/can-bus-simple-intro-tutorial)

## Related pages

* [TF Mk.1 Muscle](/docs/hardware/thermoflex/tf-mk1-muscle.md): The muscle this Node was built to drive.
* [ThermoFlex Python API](/docs/software/thermoflex-python-api.md): Command the Node from Python.
* [Quickstart: your first flex](/docs/get-started/quickstart.md): Run your first contraction.
* [Safety essentials](/docs/get-started/safety.md): The hazards to respect first.
