Skip to content

Commit 45aae84

Browse files
authored
Merge pull request #23 from arduino-libraries/feature_position
ack on wheel position 1.0.3
2 parents 905768e + 6c1baf1 commit 45aae84

File tree

7 files changed

+49
-3
lines changed

7 files changed

+49
-3
lines changed

examples/firmware/firmware.ino

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ void loop(){
122122
break;
123123
case 'P':
124124
alvik.setPositionLeft(value);
125+
ack_required=MOVEMENT_LEFT;
126+
ack_check=true;
125127
break;
126128
case 'Z':
127129
alvik.resetPositionLeft(value);
@@ -136,6 +138,8 @@ void loop(){
136138
break;
137139
case 'P':
138140
alvik.setPositionRight(value);
141+
ack_required=MOVEMENT_RIGHT;
142+
ack_check=true;
139143
break;
140144
case 'Z':
141145
alvik.resetPositionRight(value);
@@ -149,6 +153,8 @@ void loop(){
149153
packeter.unpacketC2F(code,position_left, position_right);
150154
alvik.disableKinematicsMovement();
151155
alvik.setPosition(position_left, position_right);
156+
ack_required=MOVEMENT_POSITION;
157+
ack_check=true;
152158
break;
153159

154160

@@ -280,13 +286,22 @@ void loop(){
280286
msg_size = packeter.packetC3B(0x7E, version[0], version[1], version[2]);
281287
alvik.serial->write(packeter.msg,msg_size);
282288
}
283-
if (ack_check && alvik.isTargetReached()){
289+
if (ack_check && (alvik.isTargetReached() || alvik.isPositionReached() || alvik.isPositionLeftReached() || alvik.isPositionRightReached())){
284290
if (ack_required == MOVEMENT_ROTATE){
285291
msg_size = packeter.packetC1B('x', 'R');
286292
}
287293
if (ack_required == MOVEMENT_MOVE){
288294
msg_size = packeter.packetC1B('x', 'M');
289295
}
296+
if (ack_required == MOVEMENT_POSITION){
297+
msg_size = packeter.packetC1B('x', 'P');
298+
}
299+
if (ack_required == MOVEMENT_LEFT){
300+
msg_size = packeter.packetC1B('x', 'P');
301+
}
302+
if (ack_required == MOVEMENT_RIGHT){
303+
msg_size = packeter.packetC1B('x', 'P');
304+
}
290305
}
291306
else{
292307
msg_size = packeter.packetC1B('x', 0);

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Arduino_AlvikCarrier
2-
version=1.0.2
2+
version=1.0.3
33
author=Arduino, Giovanni di Dio Bruno, Lucio Rossi
44
maintainer=Arduino <info@arduino.cc>
55
sentence=Library and firmware for Arduino Alvik Carrier board

src/Arduino_AlvikCarrier.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,10 @@ float Arduino_AlvikCarrier::getPositionLeft(){
362362
return motor_control_left->getPosition();
363363
}
364364

365+
bool Arduino_AlvikCarrier::isPositionLeftReached(){
366+
return motor_control_left->isPositionReached();
367+
}
368+
365369
void Arduino_AlvikCarrier::setPositionRight(const float degrees){
366370
motor_control_right->setPosition(degrees);
367371
}
@@ -370,6 +374,10 @@ float Arduino_AlvikCarrier::getPositionRight(){
370374
return motor_control_right->getPosition();
371375
}
372376

377+
bool Arduino_AlvikCarrier::isPositionRightReached(){
378+
return motor_control_right->isPositionReached();
379+
}
380+
373381
void Arduino_AlvikCarrier::setPosition(const float left_deg, const float right_deg){
374382
setPositionLeft(left_deg);
375383
setPositionRight(right_deg);
@@ -380,6 +388,10 @@ void Arduino_AlvikCarrier::getPosition(float & left_deg, float & right_deg){
380388
right_deg = getPositionRight();
381389
}
382390

391+
bool Arduino_AlvikCarrier::isPositionReached(){
392+
return isPositionLeftReached() && isPositionRightReached();
393+
}
394+
383395
void Arduino_AlvikCarrier::resetPositionLeft(const float initial_position){
384396
motor_control_left->resetPosition(initial_position);
385397
}

src/Arduino_AlvikCarrier.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,13 @@ class Arduino_AlvikCarrier{
172172
void setKPidRight(const float kp, const float ki, const float kd); // set PID parameters for right wheel
173173
void setPositionLeft(const float degrees); // set position in degrees on left wheel
174174
float getPositionLeft(); // get left wheel position in degrees
175+
bool isPositionLeftReached(); // return true if left wheel position is reached
175176
void setPositionRight(const float degrees); // set position in degrees on right wheel
176177
float getPositionRight(); // get right wheel position in degrees
178+
bool isPositionRightReached(); // return true if right wheel position is reached
177179
void setPosition(const float left_deg, const float right_deg); // set positions on both wheels
178180
void getPosition(float & left_deg, float & right_deg); // get both wheels position
181+
bool isPositionReached(); // return true if both wheels position are reached
179182
void resetPositionLeft(const float initial_position=0.0); // reset/set value of position for left wheel
180183
void resetPositionRight(const float initial_position=0.0); // reset/set value of position for right wheel
181184
void disablePositionControlLeft(); // disable the position control on left wheel

src/definitions/robot_definitions.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO;
3737
#define POSITION_KD_DEFAULT 0.0001
3838
#define POSITION_CONTROL_PERIOD 0.02
3939
#define POSITION_MAX_SPEED 30.0
40+
#define POSITION_THRESHOLD 10
4041

4142

4243

@@ -58,6 +59,9 @@ const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO;
5859
#define MOVEMENT_DISABLED 0
5960
#define MOVEMENT_ROTATE 1
6061
#define MOVEMENT_MOVE 2
62+
#define MOVEMENT_LEFT 3
63+
#define MOVEMENT_RIGHT 4
64+
#define MOVEMENT_POSITION 5
6165

6266

6367
#define LIFT_THRESHOLD 80
@@ -88,7 +92,7 @@ const float MOTION_FX_PERIOD = (1000U / MOTION_FX_FREQ);
8892
// Library version
8993
#define VERSION_BYTE_HIGH 1
9094
#define VERSION_BYTE_MID 0
91-
#define VERSION_BYTE_LOW 2
95+
#define VERSION_BYTE_LOW 3
9296

9397

9498

src/motor_control/motor_control.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ MotorControl::MotorControl(DCmotor * _motor, Encoder * _encoder, const float _kp
3535
pos_controller_period = _pos_controller_period;
3636
pos_max_velocity = _pos_max_velocity;
3737
position_control_enabled = false;
38+
is_position_reached = false;
3839

3940

4041

@@ -168,6 +169,9 @@ void MotorControl::update(){
168169
if (position_control_enabled){
169170
pos_pid->update(position);
170171
setRPM(round(pos_pid->getControlOutput()/10.0)*10);
172+
if (abs(pos_pid->getError())<POSITION_THRESHOLD){
173+
is_position_reached = true;
174+
}
171175
}
172176
}
173177

@@ -210,6 +214,7 @@ void MotorControl::enablePositionControl(){
210214

211215
void MotorControl::disablePositionControl(){
212216
position_control_enabled = false;
217+
is_position_reached = false;
213218
}
214219

215220
bool MotorControl::isPositionControlEnabled(){
@@ -230,5 +235,10 @@ float MotorControl::getPosition(){
230235
void MotorControl::setPosition(const float degree){
231236
pos_pid->setReference(degree);
232237
enablePositionControl();
238+
is_position_reached = false;
239+
}
240+
241+
bool MotorControl::isPositionReached(){
242+
return is_position_reached;
233243
}
234244

src/motor_control/motor_control.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class MotorControl{
4343
float pos_controller_period;
4444
float pos_max_velocity;
4545
bool position_control_enabled;
46+
bool is_position_reached;
4647

4748
float position;
4849
float angle;
@@ -112,6 +113,7 @@ class MotorControl{
112113
void setPosition(const float degree); // set the reference for position control
113114
float getPosition(); // get the actual angle in degrees of motor
114115
void resetPosition(const float p0=0.0); // reset/set the position value
116+
bool isPositionReached();
115117

116118
float getError();
117119

0 commit comments

Comments
 (0)