pub struct ServoSpec {
pub min_pulse: u32,
pub max_pulse: u32,
pub min_angle: f32,
pub max_angle: f32,
}
Expand description
Servo motor specification
Fields§
§min_pulse: u32
§max_pulse: u32
§min_angle: f32
§max_angle: f32
Implementations§
Source§impl ServoSpec
impl ServoSpec
Sourcepub fn mg996r() -> Self
pub fn mg996r() -> Self
Examples found in repository?
More examples
examples/basic.rs (line 8)
3fn main() {
4 println!("\n");
5 println!("--- Servo Controller Basic Example ---");
6
7 // MG996R spec create
8 let spec = ServoSpec::mg996r();
9
10 // MG996R 6 channels robot arms example
11 let mut servo0 = ServoChannel::new(0, "base", spec.clone());
12 let mut servo1 = ServoChannel::new(1, "shoulder", spec.clone());
13 let mut servo2 = ServoChannel::new(2, "elbow", spec.clone());
14 let mut servo3 = ServoChannel::new(3, "wrist_pitch", spec.clone());
15 let mut servo4 = ServoChannel::new(4, "wrist_roll", spec.clone());
16 let mut servo5 = ServoChannel::new(5, "gripper", spec.clone());
17
18 // angle init
19 servo0.set_angle(90.0);
20 servo1.set_angle(90.0);
21 servo2.set_angle(90.0);
22 servo3.set_angle(90.0);
23 servo4.set_angle(90.0);
24 servo5.set_angle(90.0);
25
26 println!(
27 "{}: angle {:.1}° → pulse {}",
28 servo0.name,
29 servo0.angle,
30 servo0.get_pulse()
31 );
32 println!(
33 "{}: angle {:.1}° → pulse {}",
34 servo1.name,
35 servo1.angle,
36 servo1.get_pulse()
37 );
38 println!(
39 "{}: angle {:.1}° → pulse {}",
40 servo2.name,
41 servo2.angle,
42 servo2.get_pulse()
43 );
44 println!(
45 "{}: angle {:.1}° → pulse {}",
46 servo3.name,
47 servo3.angle,
48 servo3.get_pulse()
49 );
50 println!(
51 "{}: angle {:.1}° → pulse {}",
52 servo4.name,
53 servo4.angle,
54 servo4.get_pulse()
55 );
56 println!(
57 "{}: angle {:.1}° → pulse {}",
58 servo5.name,
59 servo5.angle,
60 servo5.get_pulse()
61 );
62
63 // pulse -> angle convert test
64 servo0.set_pulse(350);
65 println!(
66 "{}: pulse {} → angle {:.1}°",
67 servo0.name,
68 servo0.get_pulse(),
69 servo0.angle
70 );
71 servo1.set_pulse(400);
72 println!(
73 "{}: pulse {} → angle {:.1}°",
74 servo1.name,
75 servo1.get_pulse(),
76 servo1.angle
77 );
78 servo2.set_pulse(450);
79 println!(
80 "{}: pulse {} → angle {:.1}°",
81 servo2.name,
82 servo2.get_pulse(),
83 servo2.angle
84 );
85 servo3.set_pulse(500);
86 println!(
87 "{}: pulse {} → angle {:.1}°",
88 servo3.name,
89 servo3.get_pulse(),
90 servo3.angle
91 );
92 servo4.set_pulse(550);
93 println!(
94 "{}: pulse {} → angle {:.1}°",
95 servo4.name,
96 servo4.get_pulse(),
97 servo4.angle
98 );
99 servo5.set_pulse(600);
100 println!(
101 "{}: pulse {} → angle {:.1}°",
102 servo5.name,
103 servo5.get_pulse(),
104 servo5.angle
105 );
106
107 println!("\n");
108 // increment / decrement
109 servo0.increment(10.0);
110 println!("{} incremented → {:.1}°", servo1.name, servo1.angle);
111
112 servo1.decrement(30.0);
113 println!("{} decremented → {:.1}°", servo1.name, servo1.angle);
114
115 servo2.increment(20.0);
116 println!("{} incremented → {:.1}°", servo2.name, servo2.angle);
117
118 servo3.decrement(40.0);
119 println!("{} decremented → {:.1}°", servo2.name, servo2.angle);
120
121 servo4.increment(20.0);
122 println!("{} incremented → {:.1}°", servo4.name, servo4.angle);
123
124 servo5.decrement(15.0);
125 println!("{} decremented → {:.1}°", servo5.name, servo5.angle);
126
127 // ServoSystem Add channels
128 let mut system = ServoSystem::new();
129 system.add_channel(servo0);
130 system.add_channel(servo1);
131
132 println!("\n--- ServoSystem status ---");
133 for servo in &system.channels {
134 println!(
135 "Channel {} ({}): angle {:.1}° → pulse {}",
136 servo.id,
137 servo.name,
138 servo.angle,
139 servo.get_pulse()
140 );
141 }
142
143 // get_channel_mut 예제
144 if let Some(shoulder) = system.get_channel_mut(1) {
145 shoulder.set_angle(120.0);
146 println!(
147 "\nafter update {}: angle {:.1}° → pulse {}",
148 shoulder.name,
149 shoulder.angle,
150 shoulder.get_pulse()
151 );
152 }
153}
Sourcepub fn angle_to_pulse(&self, angle: f32) -> u32
pub fn angle_to_pulse(&self, angle: f32) -> u32
Convert angle -> pulse
Sourcepub fn pulse_to_angle(&self, pulse: u32) -> f32
pub fn pulse_to_angle(&self, pulse: u32) -> f32
Convert pulse -> angle
Trait Implementations§
Source§impl<'de> Deserialize<'de> for ServoSpec
impl<'de> Deserialize<'de> for ServoSpec
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for ServoSpec
impl RefUnwindSafe for ServoSpec
impl Send for ServoSpec
impl Sync for ServoSpec
impl Unpin for ServoSpec
impl UnwindSafe for ServoSpec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more