SyncNode

Controlling complex experiments
made simple

When Arduino Isn't Enough, But A Custom FPGA Solution Is Overkill

64 channels • Microsecond resolution with nanosecond jitter • Unlimited branch nodes
Professional APIs for complex experiments

The Precision Gap

⚠️

Arduino's Limitation

  • Only 4-8 channels
  • ±50μs timing jitter
  • Recompile firmware for each change
  • No branch nodes or conditional logic
  • Limited event memory (hundreds to few thousand)
  • Software timing unreliable

SyncNode

  • 64 digital output channels
  • 1μs resolution, nanosecond jitter
  • Table-based protocols, no recompiling
  • Unlimited nested branch nodes
  • Unlimited event depth via streaming
  • Hardware-clocked synchronization
💰

FPGA Systems

  • <10ns precision (overkill)
  • Complex programming required
  • Steep learning curve
  • $5,000-$25,000+ price tag
  • Often unnecessary for most applications

Technical Specifications

Specification Arduino SyncNode FPGA Systems
Output Channels 4-8 64 digital outputs Varies (8-32 typical)
Timing Resolution Millisecond 1 microsecond Nanosecond
Timing Jitter ±50μs typical <10ns <10ns
Event Capacity Hundreds to few thousand 10,000+ event buffer
(unlimited via streaming)
Varies
Branch Nodes Limited/None Unlimited nested nodes Complex programming
Protocol Changes Recompile firmware Dynamic table uploads Reprogram FPGA
Multi-channel Sync Software (unreliable) Hardware clocked Hardware clocked
API Integration DIY Python Varies
Platform Support Varies Windows, Linux Varies
Connectivity USB/Serial PCIe or Ethernet Varies
Typical Price $25 + time* $4,995 $5,000-$25,000+

*Plus countless hours of debugging and integration

Python Integration Made Simple

Define your experimental protocols as data, not firmware. Update in seconds, not hours.

Quick Start

import fvs_syncnode as fvs

# Connect to device
device = fvs.SyncNode()

# Define a simple pulse sequence
sequence = device.create_sequence()
sequence.add_pulse(channel=1, start=0, duration=1000)      # 1ms pulse
sequence.add_pulse(channel=2, start=5000, duration=500)     # 500μs pulse
sequence.add_pulse(channel=1, start=10000, duration=2000)   # 2ms pulse

# Upload and execute
device.upload(sequence)
device.run()

Branch Nodes

# Create decision nodes in your protocol
branch_node = sequence.add_branch(
    input_channel=0
)

# Different paths from each node
branch_node.then(
    sequence_A  # High signal
).otherwise(
    sequence_B  # Low signal
)

Real-time decision nodes without software overhead

Multi-Channel Sync

# Coordinate 64 channels precisely
channels = [1, 2, 5, 10, 15]

# All channels synchronized
sequence.add_multi_pulse(
    channels=channels,
    start=0,
    duration=1000
)
# Guaranteed simultaneity

Hardware-clocked synchronization across all channels

Protocol Reuse

# Save and load protocols
sequence.save('cooling_protocol.json')

# Modify on the fly
sequence.set_parameter(
    'cooling_duration',
    new_value=1500
)
device.upload(sequence)

Iterate faster with data-driven protocols

Note: API examples shown are illustrative. Full documentation will be available with product release.

Integrated Peripheral Communication

Control analog signals and sensors directly—no external adapters needed

🔌

SPI & I²C Interfaces

  • Direct control of ADCs and DACs
  • Read pressure, temperature, and environmental sensors
  • Interface with digital potentiometers and switches
  • Synchronized with your timing protocols
📊

Analog Signal Control

  • Generate analog waveforms via integrated DACs
  • Read analog inputs for feedback control
  • Coordinate analog and digital sequences
  • Hardware-timed analog transitions
🎯

Built-In, Not Bolted-On

  • No external microcontrollers needed
  • Microsecond-synchronized peripheral control
  • Simplify your experimental setup
  • Reduce points of failure

Precision Data Logging

Hardware-timestamped events—not an afterthought

Know Exactly When Everything Happened

SyncNode records every event with hardware-generated timestamps synchronized to your system clock. No software delays, no timestamp interpolation, no guessing.

  • Hardware timestamps for every pulse, every branch node, every input event
  • Microsecond resolution event logging synchronized with your protocol
  • Automatic logging of branch decisions and parameter changes
  • Export to standard formats for analysis in Python, MATLAB, or your preferred tools

Too many control systems treat data logging as an afterthought—forcing you to cobble together timestamps from multiple sources or reconstruct event timing from software logs. With SyncNode, every event is timestamped in hardware at the moment it occurs.

Thinking About Switching Control Systems?

Let's discuss your migration path

I understand that switching control systems isn't trivial—you've built your experiment around your current setup, and migration has real costs in time and effort.

That's why I offer personalized migration support. Whether you're currently using Arduino, custom microcontrollers, commercial timing systems, or lab-built solutions, I can help you plan the transition, understand integration requirements, and get your experiment running with SyncNode.

Let's start a conversation about your current setup, timing requirements, and what migration would involve for your specific experiment.

Discuss Migration

Ready to Upgrade Your Experiments?

Get started with SyncNode