Skip to content

Commit a759024

Browse files
committed
Add SCS0009 ServoEasing
1 parent 21892ea commit a759024

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

src/Stackchan_servo.cpp

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ long convertSCS0009Pos(int16_t degree) {
88
return map(degree, 0, 300, 1023, 0);
99
}
1010

11+
// シリアルサーボ用のEasing関数
12+
float quadraticEaseInOut(float p) {
13+
//return p;
14+
if(p < 0.5)
15+
{
16+
return 2 * p * p;
17+
}
18+
else
19+
{
20+
return (-2 * p * p) + (4 * p) - 1;
21+
}
22+
}
23+
1124
StackchanSERVO::StackchanSERVO() {}
1225

1326
StackchanSERVO::~StackchanSERVO() {}
@@ -21,6 +34,7 @@ void StackchanSERVO::attachServos() {
2134
_sc.WritePos(AXIS_X + 1, convertSCS0009Pos(_init_param.servo[AXIS_X].start_degree + _init_param.servo[AXIS_X].offset), 1000);
2235
_sc.WritePos(AXIS_Y + 1, convertSCS0009Pos(_init_param.servo[AXIS_Y].start_degree + _init_param.servo[AXIS_Y].offset), 1000);
2336
vTaskDelay(1000/portTICK_PERIOD_MS);
37+
2438
} else {
2539
// SG90 PWM
2640
if (_servo_x.attach(_init_param.servo[AXIS_X].pin,
@@ -39,6 +53,8 @@ void StackchanSERVO::attachServos() {
3953
_servo_x.setEasingType(EASE_QUADRATIC_IN_OUT);
4054
_servo_y.setEasingType(EASE_QUADRATIC_IN_OUT);
4155
}
56+
_last_degree_x = _init_param.servo[AXIS_X].start_degree;
57+
_last_degree_y = _init_param.servo[AXIS_Y].start_degree;
4258
}
4359

4460
void StackchanSERVO::begin(stackchan_servo_initial_param_s init_param) {
@@ -75,6 +91,7 @@ void StackchanSERVO::moveX(int x, uint32_t millis_for_move) {
7591
synchronizeAllServosStartAndWaitForAllServosToStop();
7692
_isMoving = false;
7793
}
94+
_last_degree_x = x;
7895
}
7996

8097
void StackchanSERVO::moveX(servo_param_s servo_param_x) {
@@ -98,6 +115,7 @@ void StackchanSERVO::moveY(int y, uint32_t millis_for_move) {
98115
synchronizeAllServosStartAndWaitForAllServosToStop();
99116
_isMoving = false;
100117
}
118+
_last_degree_y = y;
101119
}
102120

103121
void StackchanSERVO::moveY(servo_param_s servo_param_y) {
@@ -106,10 +124,18 @@ void StackchanSERVO::moveY(servo_param_s servo_param_y) {
106124
}
107125
void StackchanSERVO::moveXY(int x, int y, uint32_t millis_for_move) {
108126
if (_servo_type == SCS) {
109-
_sc.WritePos(AXIS_X + 1, convertSCS0009Pos(x + _init_param.servo[AXIS_X].offset), millis_for_move);
110-
_sc.WritePos(AXIS_Y + 1, convertSCS0009Pos(y + _init_param.servo[AXIS_Y].offset), millis_for_move);
127+
int increase_degree_x = x - _last_degree_x;
128+
int increase_degree_y = y - _last_degree_y;
129+
uint32_t division_time = millis_for_move / SERIAL_EASE_DIVISION;
111130
_isMoving = true;
112-
vTaskDelay(millis_for_move/portTICK_PERIOD_MS);
131+
//M5_LOGI("SCS: %d, %d, %d", increase_degree_x, increase_degree_y, division_time);
132+
for (float f=0.0f; f<1.0f; f=f+(1.0f/SERIAL_EASE_DIVISION)) {
133+
int x_pos = _last_degree_x + increase_degree_x * quadraticEaseInOut(f);
134+
int y_pos = _last_degree_y + increase_degree_y * quadraticEaseInOut(f);
135+
_sc.WritePos(AXIS_X + 1, convertSCS0009Pos(x_pos + _init_param.servo[AXIS_X].offset), division_time);
136+
_sc.WritePos(AXIS_Y + 1, convertSCS0009Pos(y_pos + _init_param.servo[AXIS_Y].offset), division_time);
137+
//vTaskDelay(division_time);
138+
}
113139
_isMoving = false;
114140
} else {
115141
_servo_x.setEaseToD(x + _init_param.servo[AXIS_X].offset, millis_for_move);
@@ -118,6 +144,9 @@ void StackchanSERVO::moveXY(int x, int y, uint32_t millis_for_move) {
118144
synchronizeAllServosStartAndWaitForAllServosToStop();
119145
_isMoving = false;
120146
}
147+
_last_degree_x = x;
148+
_last_degree_y = y;
149+
//M5_LOGI("SCS: %d, %d", _last_degree_x, _last_degree_y);
121150
}
122151

123152
void StackchanSERVO::moveXY(servo_param_s servo_param_x, servo_param_s servo_param_y) {
@@ -138,6 +167,8 @@ void StackchanSERVO::moveXY(servo_param_s servo_param_x, servo_param_s servo_par
138167
synchronizeAllServosStartAndWaitForAllServosToStop();
139168
_isMoving = false;
140169
}
170+
_last_degree_x = servo_param_x.degree;
171+
_last_degree_y = servo_param_y.degree;
141172
}
142173

143174
void StackchanSERVO::motion(Motion motion_number) {

src/Stackchan_servo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include <ESP32Servo.h>
1111
#include <ServoEasing.h>
1212
#include <SCServo.h>
13+
#include <M5Unified.h>
14+
#define SERIAL_EASE_DIVISION 5 // シリアルサーボのEasing分割数
1315

1416
enum Motion {
1517
nomove, // 動かない
@@ -54,6 +56,8 @@ class StackchanSERVO {
5456
void attachServos();
5557
stackchan_servo_initial_param_s _init_param;
5658
bool _isMoving;
59+
int _last_degree_x; // 前回のX軸の角度
60+
int _last_degree_y; // 前回のY軸の角度
5761
public:
5862
StackchanSERVO();
5963
~StackchanSERVO();

0 commit comments

Comments
 (0)