---
import '../../styles/global.css';
---
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>Servo Control API - PoKeys Core Library</title>
<style>
aside .sidebar-nav a {
display: block !important;
width: 100% !important;
}
aside .sidebar-nav {
display: flex !important;
flex-direction: column !important;
}
</style>
</head>
<body class="bg-gray-900 text-white">
<nav class="fixed top-0 left-0 right-0 z-50 bg-gray-900/80 backdrop-blur-md border-b border-gray-800 h-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-full">
<div class="flex justify-between items-center h-full">
<a href="/core/" class="text-2xl font-bold bg-gradient-to-r from-blue-400 to-purple-500 bg-clip-text text-transparent">
PoKeys
</a>
<div class="hidden md:flex space-x-8">
<a href="/core/" class="text-gray-300 hover:text-white transition-colors">Home</a>
<a href="/core/getting-started" class="text-gray-300 hover:text-white transition-colors">Getting Started</a>
<a href="/core/examples/" class="text-gray-300 hover:text-white transition-colors">Examples</a>
<a href="/core/api/" class="text-white font-semibold">API Reference</a>
</div>
</div>
</div>
</nav>
<div class="flex min-h-screen pt-16">
<aside class="w-80 bg-gray-800/50 border-r border-gray-700 overflow-y-auto flex-shrink-0">
<div class="p-6">
<a href="/core/api/" class="text-blue-400 hover:text-blue-300 mb-4 inline-block">← Back to API Reference</a>
<h2 class="text-xl font-bold mb-6 text-white">API Reference</h2>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Core APIs</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/device" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Device Management
</a>
<a href="/core/api/connection" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Connection & Enumeration
</a>
<a href="/core/api/models" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Device Models
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">I/O Operations</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/digital-io" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Digital I/O
</a>
<a href="/core/api/analog-io" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Analog I/O
</a>
<a href="/core/api/pin-functions" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Pin Functions
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Control Systems</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/pwm" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
PWM Control
</a>
<a href="/core/api/encoders" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Encoders
</a>
<a href="/core/api/pulse-engine" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Pulse Engine v2
</a>
<a href="/core/api/servo-control" class="block px-3 py-2 text-white bg-gray-700/50 rounded-md transition-colors">
Servo Control
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Communication</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/spi" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
SPI Protocol
</a>
<a href="/core/api/i2c" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
I2C Protocol
</a>
<a href="/core/api/uart" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
UART Serial
</a>
<a href="/core/api/can" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
CAN Bus
</a>
<a href="/core/api/onewire" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
1-Wire Protocol
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Matrix Operations</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/matrix-keyboard" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Matrix Keyboard
</a>
<a href="/core/api/led-matrix" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
LED Matrix
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Display & Sensors</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/lcd" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
LCD Display
</a>
<a href="/core/api/sensors" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
EasySensors
</a>
<a href="/core/api/rtc" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Real-Time Clock
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Error Handling</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/errors" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Error Types
</a>
<a href="/core/api/result-handling" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Result Handling
</a>
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-3">Types & Utilities</h3>
<div class="space-y-1 sidebar-nav">
<a href="/core/api/types" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Core Types
</a>
<a href="/core/api/constants" class="block px-3 py-2 text-gray-300 hover:text-white hover:bg-gray-700/50 rounded-md transition-colors">
Constants
</a>
</div>
</div>
</div>
</aside>
<main class="flex-1 p-8 min-h-screen">
<div class="max-w-4xl">
<div class="mb-12">
<div class="flex items-center gap-4 mb-6">
<span class="px-3 py-1 bg-emerald-600/20 text-emerald-300 text-sm rounded-full">Servo Control</span>
</div>
<h1 class="text-4xl font-bold mb-4 bg-gradient-to-r from-emerald-400 to-teal-500 bg-clip-text text-transparent">
Servo Control API
</h1>
<p class="text-xl text-gray-400">
High-level servo control with position and speed modes, built on 25MHz PWM precision
</p>
</div>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-4 text-white">Overview</h2>
<div class="bg-gray-800 rounded-lg p-6">
<p class="text-gray-300 mb-4">
The Servo Control API provides high-level servo motor control built on top of the 25MHz PWM system.
Supports both position servos (180° and 360°) and continuous rotation speed servos with type-safe configuration.
</p>
<div class="grid md:grid-cols-2 gap-6">
<div>
<h3 class="text-lg font-semibold mb-2 text-emerald-400">Servo Types</h3>
<ul class="text-gray-300 space-y-1 text-sm">
<li>• <strong>180° Position</strong> - Standard position servo (0-180°)</li>
<li>• <strong>360° Position</strong> - Multi-turn position servo (0-360°)</li>
<li>• <strong>360° Speed</strong> - Continuous rotation servo</li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-2 text-teal-400">Key Features</h3>
<ul class="text-gray-300 space-y-1 text-sm">
<li>• Type-safe servo configuration</li>
<li>• Automatic PWM period setup (20ms)</li>
<li>• Calibrated position and speed control</li>
<li>• Built on 25MHz PWM precision</li>
</ul>
</div>
</div>
</div>
</section>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-6 text-white">ServoConfig Types</h2>
<div class="bg-gray-800 rounded-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">180° Position Servo</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">ServoConfig::one_eighty(pin: u8, pos_0: u32, pos_180: u32) -> Self</code></pre>
</div>
<p class="text-gray-300 mb-4">
Creates configuration for a standard 180-degree position servo.
</p>
<div class="bg-gray-900 rounded p-4">
<h4 class="font-semibold text-yellow-400 mb-2">Example</h4>
<pre class="text-gray-300"><code>// Configure 180-degree servo on pin 22
let servo = ServoConfig::one_eighty(22, 25000, 50000);
device.configure_servo(servo.clone())?;
// Move to different positions
device.set_servo_angle(&servo, 0.0)?; // 0 degrees
device.set_servo_angle(&servo, 90.0)?; // 90 degrees
device.set_servo_angle(&servo, 180.0)?; // 180 degrees</code></pre>
</div>
</div>
<div class="bg-gray-800 rounded-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">360° Speed Servo</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">ServoConfig::three_sixty_speed(
pin: u8,
stop: u32,
clockwise: u32,
anti_clockwise: u32
) -> Self</code></pre>
</div>
<p class="text-gray-300 mb-4">
Creates configuration for a continuous rotation speed servo.
</p>
<div class="bg-gray-900 rounded p-4">
<h4 class="font-semibold text-yellow-400 mb-2">Example</h4>
<pre class="text-gray-300"><code>// Configure speed servo based on datasheet timing
// Counterclockwise: 1-1.5ms, Stop: 1.5ms, Clockwise: 1.5-2ms
let speed_servo = ServoConfig::three_sixty_speed(21, 37500, 50000, 25000);
device.configure_servo(speed_servo.clone())?;
// Control speed (-100 to +100)
device.set_servo_speed(&speed_servo, 50.0)?; // 50% clockwise
device.set_servo_speed(&speed_servo, -25.0)?; // 25% counterclockwise
device.stop_servo(&speed_servo)?; // Stop rotation</code></pre>
</div>
</div>
</section>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-6 text-white">Device API Functions</h2>
<div class="bg-gray-800 rounded-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">configure_servo</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">pub fn configure_servo(&mut self, config: ServoConfig) -> Result<()></code></pre>
</div>
<p class="text-gray-300 mb-4">
Configures a servo with the specified configuration. Automatically sets PWM period to 20ms if not already set.
</p>
</div>
<div class="bg-gray-800 rounded-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">set_servo_angle</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">pub fn set_servo_angle(&mut self, config: &ServoConfig, angle: f32) -> Result<()></code></pre>
</div>
<p class="text-gray-300 mb-4">
Sets servo to specific angle. Range depends on servo type (0-180° or 0-360°).
</p>
</div>
<div class="bg-gray-800 rounded-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">set_servo_speed</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">pub fn set_servo_speed(&mut self, config: &ServoConfig, speed: f32) -> Result<()></code></pre>
</div>
<p class="text-gray-300 mb-4">
Sets speed for continuous rotation servos. Range: -100.0 to 100.0 (negative = counterclockwise).
</p>
</div>
<div class="bg-gray-800 rounded-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-emerald-400">stop_servo</h3>
<div class="mb-4">
<pre class="bg-gray-900 rounded p-4 overflow-x-auto"><code class="text-gray-300">pub fn stop_servo(&mut self, config: &ServoConfig) -> Result<()></code></pre>
</div>
<p class="text-gray-300 mb-4">
Stops continuous rotation servo by setting it to neutral position.
</p>
</div>
</section>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-6 text-white">Timing Calibration</h2>
<div class="bg-gray-800 rounded-lg p-6">
<p class="text-gray-300 mb-4">
Servo timing is based on 25MHz clock cycles. Standard servo timing uses 20ms period (500,000 cycles).
</p>
<div class="grid md:grid-cols-2 gap-6">
<div>
<h3 class="text-lg font-semibold mb-3 text-emerald-400">Standard Timing</h3>
<ul class="text-gray-300 space-y-1 text-sm font-mono">
<li>• 1.0ms (25,000 cycles) - 0° position</li>
<li>• 1.5ms (37,500 cycles) - Center/Stop</li>
<li>• 2.0ms (50,000 cycles) - 180° position</li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-3 text-teal-400">Custom Calibration</h3>
<div class="bg-gray-900 rounded p-3">
<pre class="text-gray-300 text-xs"><code>// Custom calibrated servo
let servo = ServoConfig::one_eighty(
22,
60000, // Custom 0° position
12000 // Custom 180° position
);</code></pre>
</div>
</div>
</div>
</div>
</section>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-4 text-white">Complete Example</h2>
<div class="bg-gray-800 rounded-lg p-6">
<div class="bg-gray-900 rounded p-4">
<pre class="text-gray-300"><code>use pokeys_lib::*;
fn main() -> Result<()> {`{`}
let mut device = connect_to_device(0)?;
// Configure 180-degree position servo
let position_servo = ServoConfig::one_eighty(22, 25000, 50000);
device.configure_servo(position_servo.clone())?;
// Configure continuous rotation speed servo
let speed_servo = ServoConfig::three_sixty_speed(21, 37500, 50000, 25000);
device.configure_servo(speed_servo.clone())?;
// Control position servo
for angle in [0.0, 45.0, 90.0, 135.0, 180.0] {`{`}
device.set_servo_angle(&position_servo, angle)?;
println!(\"Position servo at {`{`}{`}`}°\", angle);
std::thread::sleep(std::time::Duration::from_secs(1));
{`}`}
// Control speed servo
device.set_servo_speed(&speed_servo, 50.0)?; // 50% clockwise
std::thread::sleep(std::time::Duration::from_secs(2));
device.set_servo_speed(&speed_servo, -30.0)?; // 30% counterclockwise
std::thread::sleep(std::time::Duration::from_secs(2));
device.stop_servo(&speed_servo)?; // Stop
Ok(())
{`}`}</code></pre>
</div>
</div>
</section>
<section class="mb-12">
<h2 class="text-2xl font-bold mb-4 text-white">Best Practices</h2>
<div class="bg-gray-800 rounded-lg p-6">
<div class="space-y-4">
<div>
<h3 class="text-lg font-semibold mb-2 text-green-400">Calibration</h3>
<ul class="text-gray-300 space-y-1 text-sm">
<li>• Test actual servo movement ranges before deployment</li>
<li>• Use custom timing values for non-standard servos</li>
<li>• Verify servo datasheet specifications</li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-2 text-blue-400">Safety</h3>
<ul class="text-gray-300 space-y-1 text-sm">
<li>• Never exceed servo manufacturer's pulse width limits</li>
<li>• Implement soft start/stop for mechanical systems</li>
<li>• Monitor servo current for overload protection</li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-2 text-purple-400">Performance</h3>
<ul class="text-gray-300 space-y-1 text-sm">
<li>• Use ServoConfig for type-safe operations</li>
<li>• Limit simultaneous servo movements to 6 (hardware PWM channels)</li>
<li>• Consider power supply capacity for multiple servos</li>
</ul>
</div>
</div>
</div>
</section>
</div>
</main>
</div>
</body>
</html>