@@ -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+
1124StackchanSERVO::StackchanSERVO () {}
1225
1326StackchanSERVO::~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
4460void 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
8097void 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
103121void StackchanSERVO::moveY (servo_param_s servo_param_y) {
@@ -106,10 +124,18 @@ void StackchanSERVO::moveY(servo_param_s servo_param_y) {
106124}
107125void 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
123152void 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
143174void StackchanSERVO::motion (Motion motion_number) {
0 commit comments