Skip to content

DroneCAN API

Overview

DroneCAN is a lightweight protocol designed for reliable intra-vehicle communication in aerospace and robotic applications. DroneCAN is the successor to UAVCAN v0, providing improved compatibility and broader industry adoption.

TILT Autonomy DroneCAN Implementation

TILT Autonomy utilizes DroneCAN as the primary communication protocol for all smart-enabled products, providing real-time telemetry, configuration management, and remote control capabilities. Our implementation follows the DroneCAN specification while adding vendor-specific messages under the tilt namespace to ensure compatibility with the broader ecosystem. The following sections detail the message types, their structure, and integration requirements for each TILT product line.

Supported Message Types

Product Message Type ID Type Frequency Direction
Rugged PoE for Starlink
(Smart Fuse)
POE 21002 TILT 2Hz (configurable) Device → Host
Rugged PoE for Starlink (Smart Fuse) uavcan.equipment.hardpoint.Command 1070 Standard On demand Host → Device

UAVCAN Message Definitions

TILT specific DroneCAN message for POE Telemetry

The following DSDL file defines the message structure for the Smart Fuse Starlink POE system. This file should be placed in your DSDL compilation directory (or dronecan gui tool working directory for dsdls) under the vendor namespace tilt.

Example installation paths: - macOS/Linux: ~/uavcan_vendor_specific_types/com/tilt/equipment/21002.POE.uavcan - Windows: C:\Users\<username>\uavcan_vendor_specific_types\com\tilt\equipment\21002.POE.uavcan

Download: /com/tilt/equipment/21002.POE.uavcan

#
# TILT POE stats
#

uint8 poe_id

float16 output_voltage   # [Volt]
float16 output_current   # [Amp]
float16 output_power     # [Watt]
float16 temperature      # [Celcius]

uint8 status            # Health Status (INIT = 0, ENABLED = 1, FAILURE = 2, OVERTEMP = 3)

Standard DroneCAN Messages

The Smart Fuse POE also responds to standard DroneCAN messages for control purposes.

Hardpoint (Relay) Command - POE Control

The POE can be remotely enabled and disabled using the standard uavcan.equipment.hardpoint.Command message (ID 1070).

Message Structure:

uint8 hardpoint_id    # Hardpoint identifier (use 0 for POE control)
uint16 command        # Command value (0 = disable, 1 = enable)

POE Control Commands:

  • command = 0: Disable POE output (power off Starlink)
  • command = 1: Enable POE output (power on Starlink)

Configuration Parameters

The Smart Fuse POE provides configurable parameters for relay control and hardpoint command response.

Required Parameters

To enable hardpoint relay control, configure the following parameters:

Parameter Value Description
RELAY1_FUNCTION 10 Maps relay to DroneCAN Hardpoint ID 0 (function 10-25 → hardpoint 0-15)
RELAY1_PIN GPIO number GPIO pin connected to POE enable circuit this is default and shouldn't need to be changed
RELAY1_DEFAULT 0 or 1 Default relay state on boot (0=off, 1=on) Should be 1 for POE to auto enable
TILT_CAN_RATE_MS 500 POE telemetry broadcast rate in milliseconds (default: 500ms = 2Hz)

Hardware-Specific GPIO Mappings:

POE Model Hardware GPIO Pin Physical Pin Logic
TILT_Starlink Single POE 3 PE11 Active-high (FET control)
TILT_ISOPOE Four-port IEEE 1 PB0 Active-low (52V regulator enable)

Configuration Steps

Using DroneCAN GUI Tool:

  1. Connect to the POE device on the CAN bus
  2. Click on the TILT_Starlink Node and navigate to the "Parameters" panel
  3. Fetch Parameters and set the following parameters:
    RELAY1_FUNCTION = 10          # Maps to Hardpoint ID 0 as requried
    RELAY1_PIN = 3                # For TILT_Starlink (use 1 for TILT_ISOPOE)
    RELAY1_DEFAULT = 1            # Start with POE enabled
    TILT_CAN_RATE_MS = 500        # Telemetry rate: 500ms = 2Hz (default)
    
  4. Click "Write" to save parameters to non-volatile memory for each parameter
  5. Reboot the device for changes to take effect as required

Verification

After configuration, verify the setup:

  1. Check Parameter Readback: Read the parameters back to confirm they were saved
  2. Test Hardpoint Command: Send a hardpoint command and observe the POE status change
  3. Monitor Telemetry: Verify the POE status field (21002.POE) reflects ENABLED/DISABLED states

Example python script

#!/usr/bin/env python3
"""
╔════════════════════════════════════════════════════════════════════════════╗
║                    TILT AUTONOMY - POE Verification Tool                   ║
║                  Rugged PoE for Starlink - Smart Fuse Model                ║
╚════════════════════════════════════════════════════════════════════════════╝

Control and Telemetry Verification Script
Verifies DroneCAN communication with TILT POE devices

Copyright (c) TILT Autonomy
Website: https://tiltautonomy.com
Support: support@tiltautonomy.com
"""
import dronecan
import time
import os

# Set DSDL paths
os.environ['DRONECAN_DSDL_PATH'] = os.path.expanduser('~/dronecan_workspace/dsdl')

# Import required messages
from uavcan.equipment.hardpoint import Command
from tilt import POE

# Create node
node = dronecan.make_node('can0', node_id=100, bitrate=1000000)

# Store latest telemetry
latest_telemetry = {'received': False}

def handle_poe_telemetry(event):
    """Handle incoming POE telemetry"""
    msg = event.message
    latest_telemetry['received'] = True

    status_names = {0: 'INIT', 1: 'ENABLED', 2: 'FAILURE', 3: 'OVERTEMP'}

    print("\n" + "="*50)
    print("  TILT POE TELEMETRY")
    print("="*50)
    print(f"  POE ID:     {msg.poe_id}")
    print(f"  Voltage:    {msg.output_voltage:.2f} V")
    print(f"  Current:    {msg.output_current:.2f} A")
    print(f"  Power:      {msg.output_power:.2f} W")
    print(f"  Temp:       {msg.temperature:.1f} °C")
    print(f"  Status:     {status_names.get(msg.status, 'UNKNOWN')} ({msg.status})")
    print("="*50)

# Register telemetry handler
node.add_handler(POE, handle_poe_telemetry)

print("\n" + "="*60)
print("  TILT AUTONOMY - Rugged PoE for Starlink")
print("  Verification & Control Script")
print("="*60)

# Send enable command
print("\n[1/3] Sending ENABLE command to TILT POE...")
cmd = Command()
cmd.hardpoint_id = 0
cmd.command = 1
node.broadcast(cmd)

# Wait for telemetry
print("[2/3] Waiting for TILT POE telemetry (3 seconds)...")
for i in range(30):
    node.spin(timeout=0.1)
    if latest_telemetry['received']:
        break

if not latest_telemetry['received']:
    print("\n⚠️  WARNING: No telemetry received from TILT POE")
    print("    Check:")
    print("      - POE device is connected to CAN bus")
    print("      - DSDL files installed: ~/uavcan_vendor_specific_types/com/tilt/equipment/")
    print("      - POE firmware is broadcasting telemetry at 1Hz")
    print("      - CAN bus termination is correct (120Ω)")
    print("\n    Support: support@tiltautonomy.com")
else:
    print("✓ [3/3] TILT POE telemetry verified successfully!")

# Continue monitoring
print("\nMonitoring TILT POE... Press Ctrl+C to exit")
try:
    while True:
        node.spin(timeout=0.1)
except KeyboardInterrupt:
    print("\n\n" + "="*60)
    print("  Shutting down TILT POE Control...")
    print("="*60)

    # Send disable command
    cmd = Command()
    cmd.hardpoint_id = 0
    cmd.command = 0
    node.broadcast(cmd)
    print("✓ Sent DISABLE command to TILT POE")

    time.sleep(0.5)
    print("\nThank you for using TILT Autonomy products!")
    print("Visit: https://tiltautonomy.com\n")

For DroneCAN GUI Tool

Directory Structure

The DroneCAN GUI Tool requires custom vendor-specific types to be placed in a specific directory structure in your home directory. The tool automatically scans this location on startup.

File naming convention: <DataTypeID>.<TypeName>.uavcan (e.g., 21002.POE.uavcan)

macOS:

/Users/<username>/uavcan_vendor_specific_types/com/tilt/equipment/21002.POE.uavcan

Linux:

/home/<username>/uavcan_vendor_specific_types/com/tilt/equipment/21002.POE.uavcan

Windows:

C:\Users\<username>\uavcan_vendor_specific_types\com\tilt\equipment\21002.POE.uavcan

Complete directory structure:

uavcan_vendor_specific_types/
└── com/
    └── tilt/
        └── equipment/
            └── 21002.POE.uavcan

Additional Resources


Last updated: February 17, 2026