Skip to content

Commit 9667758

Browse files
committed
basic read/write registers seems to work
1 parent d82207f commit 9667758

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

src/servo/feetech/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub mod sts3215;
2+
pub mod scs0009;

src/servo/feetech/scs0009.rs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
use std::f64::consts::PI;
2+
3+
use crate::generate_servo;
4+
use crate::servo::conversion::Conversion;
5+
6+
generate_servo!(
7+
SCS0009, v1,
8+
reg: (model, r, 3, u16, None),
9+
reg: (id, rw, 5, u8, None),
10+
reg: (baudrate, rw, 6, u8, None),
11+
reg: (return_delay_time, rw, 7, u8, None), //RESERVED?
12+
reg: (response_status_level, rw, 8, u8, None),
13+
reg: (min_angle_limit, rw, 9, i16, AnglePosition),
14+
reg: (max_angle_limit, rw, 11, i16, AnglePosition),
15+
reg: (max_temperature_limit, rw, 13, u8, None),
16+
reg: (max_voltage_limit, rw, 14, u8, None),
17+
reg: (min_voltage_limit, rw, 15, u8, None),
18+
reg: (max_torque_limit, rw, 16, u16, TorqueLimit),
19+
reg: (phase, rw, 18, u8, None), //SPECIAL REG
20+
reg: (unloading_condition, rw, 19, u8, None),
21+
reg: (led_alarm_condition, rw, 20, u8, None),
22+
reg: (p_coefficient, rw, 21, u8, None),
23+
reg: (d_coefficient, rw, 22, u8, None),
24+
reg: (i_coefficient, rw, 23, u8, None),
25+
reg: (minimum_startup_force, rw, 24, u16, BigEndian_u16),
26+
reg: (cw_dead_zone, rw, 26, u8, None),
27+
reg: (ccw_dead_zone, rw, 27, u8, None),
28+
reg: (hysteresis_loop, rw, 27, u8, None),
29+
30+
reg: (protective_torque, rw, 37, u8, None),
31+
reg: (protection_time, rw, 38, u8, None),
32+
reg: (overload_torque, rw, 39, u8, None),
33+
34+
reg: (torque_enable, rw, 40, u8, None),
35+
36+
reg: (goal_position, rw, 42, i16, AnglePosition),
37+
reg: (goal_time, rw, 44, u16, BigEndian_u16),
38+
reg: (goal_speed, rw, 46, u16, Velocity),
39+
40+
reg: (lock, rw, 48, u8, bool),
41+
reg: (present_position, r, 56, i16, AnglePosition),
42+
reg: (present_speed, r, 58, u16, Velocity),
43+
reg: (present_load, r, 60, u16, BigEndian_i16),
44+
45+
reg: (present_voltage, r, 62, u8, None),
46+
reg: (present_temperature, r, 63, u8, None),
47+
48+
reg: (status, r, 65, u8, None),
49+
50+
reg: (moving, r, 66, u8, bool),
51+
52+
);
53+
54+
pub struct Velocity;
55+
56+
impl Conversion for Velocity {
57+
type RegisterType = u16;
58+
type UsiType = f64;
59+
60+
fn from_raw(raw: u16) -> f64 {
61+
// println!("DEBUG SPEED: {:?}", raw.to_be());
62+
if raw.to_be() > (1 << 15) {
63+
-300.0_f64.to_radians() / 1024.0 * (raw.to_be() & 0x3ff) as f64
64+
} else {
65+
300.0_f64.to_radians() / 1024.0 * (raw.to_be() & 0x3ff) as f64
66+
}
67+
}
68+
69+
fn to_raw(value: f64) -> u16 {
70+
((value / (300.0_f64.to_radians() / 1024.0)) as u16).to_be()
71+
}
72+
}
73+
74+
pub struct AnglePosition;
75+
76+
impl Conversion for AnglePosition {
77+
type RegisterType = i16;
78+
type UsiType = f64;
79+
80+
fn from_raw(raw: i16) -> f64 {
81+
300.0_f64.to_radians() * (((raw.to_be() & 0x3ff) - 511) as f64) / 1024.0
82+
}
83+
84+
fn to_raw(value: f64) -> i16 {
85+
let a = (1024.0 * (value) / (300.0_f64.to_radians()) + 511.0) as i16;
86+
a.to_be()
87+
}
88+
}
89+
90+
pub struct BigEndian_u16;
91+
impl Conversion for BigEndian_u16 {
92+
type RegisterType = u16;
93+
type UsiType = u16;
94+
95+
fn from_raw(raw: u16) -> u16 {
96+
raw.to_be()
97+
}
98+
99+
fn to_raw(value: u16) -> u16 {
100+
value.to_be()
101+
}
102+
}
103+
104+
pub struct BigEndian_i16;
105+
impl Conversion for BigEndian_i16 {
106+
type RegisterType = u16;
107+
type UsiType = i16;
108+
109+
fn from_raw(raw: u16) -> i16 {
110+
if raw.to_be() > (1 << 10) {
111+
-((raw.to_be() & 0x3ff) as i16)
112+
} else {
113+
(raw.to_be() & 0x3ff) as i16
114+
}
115+
}
116+
117+
fn to_raw(value: i16) -> u16 {
118+
value.to_be() as u16
119+
}
120+
}
121+
122+
pub struct TorqueLimit;
123+
impl Conversion for TorqueLimit {
124+
type RegisterType = u16;
125+
type UsiType = f64;
126+
127+
fn from_raw(raw: u16) -> f64 {
128+
raw.to_be() as f64 * 0.1
129+
}
130+
131+
fn to_raw(value: f64) -> u16 {
132+
(value.clamp(0.0, 100.0) as u16 * 10).to_be()
133+
}
134+
}

src/servo/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ crate::register_servo!(
2525
servo: (feetech, STS3215,
2626
(STS3215, 2307)
2727
),
28+
servo: (feetech, SCS0009,
29+
(SCS0009, 1280)
30+
),
2831
servo: (orbita, orbita2d_poulpe,
2932
(orbita2d_poulpe, 10020)
3033
),

0 commit comments

Comments
 (0)