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:
- Connect to the POE device on the CAN bus
- Click on the TILT_Starlink Node and navigate to the "Parameters" panel
- Fetch Parameters and set the following parameters:
- Click "Write" to save parameters to non-volatile memory for each parameter
- Reboot the device for changes to take effect as required
Verification
After configuration, verify the setup:
- Check Parameter Readback: Read the parameters back to confirm they were saved
- Test Hardpoint Command: Send a hardpoint command and observe the POE status change
- 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:
Linux:
Windows:
Complete directory structure:
Additional Resources
- DroneCAN Specification
- DSDL Repository
- PyDroneCAN Documentation
- Libcanard Implementation
- DroneCAN DSDL Compiler
- TILT Autonomy Support
Last updated: February 17, 2026