UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
ServoSpeed.hpp
[詳解]
1
//
2
// サーボの動く速さを調整するクラス
3
//
4
// Copyright (c) 2022-2023 fujimoto ryo
5
// Copyright (c) 2022 udonrobo
6
//
7
8
//
9
// 非常停止時に瞬時に止めることができる
10
// 稼働速度は選択できるが、速度を上げすぎるとサーボが追い付かなくなるので注意
11
//
12
13
#pragma once
14
15
#include <stdint.h>
16
#include "
Math.hpp
"
17
18
namespace
Udon
19
{
20
22
enum class
ServoChoose
: uint8_t
23
{
24
_20kg
,
25
_30kg
,
26
_60kg
,
27
};
28
31
class
ServoSpeed
32
{
33
bool
status =
true
;
34
unsigned
int
loopCycle, servo_preset = 0, target_angle = 0;
35
float
move_angle = 0, next_angle = 0, value = 0, speed = 0, last_angle;
36
37
public
:
42
ServoSpeed
(
unsigned
int
LoopCycle,
ServoChoose
Choose,
43
unsigned
int
Last_Angle = 0)
44
{
45
loopCycle = LoopCycle / 100;
46
last_angle = next_angle =
static_cast<
float
>
(Last_Angle);
47
switch
(Choose)
48
{
49
case
ServoChoose::_20kg
:
50
// 20kgservo
51
servo_preset = 180;
52
break
;
53
case
ServoChoose::_30kg
:
54
// 30kgservo
55
servo_preset = 180;
56
break
;
57
case
ServoChoose::_60kg
:
58
// 60kgservo
59
servo_preset = 270;
60
break
;
61
}
62
}
63
65
void
update
()
66
{
67
/*変化量の計算は少数で行い、計算後は整数型で返す*/
68
last_angle = next_angle;
// 前周期のデータを保管しておく
69
move_angle =
70
static_cast<
float
>
(target_angle) -
static_cast<
float
>
(last_angle);
71
if
(move_angle == 0)
72
{
73
status =
true
;
74
}
75
else
76
{
77
status =
false
;
78
value =
Udon::Constrain
(speed /
static_cast<
float
>
(loopCycle),
79
Udon::Abs
(move_angle) * -1,
Udon::Abs
(move_angle)) *
80
(move_angle < 0 ? -1 : 1);
81
next_angle += value;
82
next_angle =
Udon::Constrain
(next_angle, 0.0f,
static_cast<
float
>
(servo_preset));
83
}
84
}
85
89
void
setAngle
(
unsigned
int
r,
float
s)
90
{
91
target_angle = r;
92
speed = s;
93
}
94
96
void
stop
() { next_angle = last_angle; }
97
100
bool
getStatus
()
const
{
return
status; }
101
104
unsigned
int
getAngle
()
const
105
{
106
return
static_cast<
unsigned
int
>
(next_angle);
107
}
108
111
float
speedValue
()
const
{
return
speed; }
112
};
113
}
// namespace Udon
Math.hpp
Udon::ServoSpeed::getStatus
bool getStatus() const
サーボの状態を返す
Definition
ServoSpeed.hpp:100
Udon::ServoSpeed::update
void update()
サーボの状態を更新する関数 毎周期実行する
Definition
ServoSpeed.hpp:65
Udon::ServoSpeed::stop
void stop()
非常停止 今周期のデータを捨てる
Definition
ServoSpeed.hpp:96
Udon::ServoSpeed::setAngle
void setAngle(unsigned int r, float s)
サーボの次の動きをセットする
Definition
ServoSpeed.hpp:89
Udon::ServoSpeed::ServoSpeed
ServoSpeed(unsigned int LoopCycle, ServoChoose Choose, unsigned int Last_Angle=0)
ServoSpeedのコンストラクタ
Definition
ServoSpeed.hpp:42
Udon::ServoSpeed::speedValue
float speedValue() const
現在設定されているサーボの稼働速度を返す
Definition
ServoSpeed.hpp:111
Udon::ServoSpeed::getAngle
unsigned int getAngle() const
次の目標角度取得
Definition
ServoSpeed.hpp:104
Udon
Definition
Bit.hpp:12
Udon::Abs
constexpr T Abs(const T &rhs)
絶対値を返す (std::abs)
Definition
Math.hpp:110
Udon::Constrain
constexpr A Constrain(const A &amt, const B &low, const C &high)
値を指定された範囲内に収める (std::clamp)
Definition
Math.hpp:69
Udon::ServoChoose
ServoChoose
サーボの種類選択
Definition
ServoSpeed.hpp:23
Udon::ServoChoose::_30kg
@ _30kg
Definition
ServoSpeed.hpp:25
Udon::ServoChoose::_60kg
@ _60kg
Definition
ServoSpeed.hpp:26
Udon::ServoChoose::_20kg
@ _20kg
Definition
ServoSpeed.hpp:24