Skip to content

Commit 86dcea6

Browse files
authored
Merge pull request #7 from arduino-libraries/devel
0.2.0 - ready
2 parents 65a837e + d06a2ad commit 86dcea6

File tree

6 files changed

+50
-22
lines changed

6 files changed

+50
-22
lines changed

examples/firmware_01/firmware_01.ino

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ uint8_t code;
2828
uint8_t label;
2929
uint8_t control_type;
3030
uint8_t msg_size;
31-
31+
uint8_t ack_required=0;
32+
bool ack_check=false;
33+
uint8_t ack_code=0;
3234

3335
unsigned long tmotor=0;
3436
unsigned long tsend=0;
3537
unsigned long tsensor=0;
3638
unsigned long timu=0;
39+
unsigned long tack=0;
3740

3841

3942
float left, right, value;
@@ -73,6 +76,7 @@ void setup(){
7376
tsend=millis();
7477
tsensor=millis();
7578
timu=millis();
79+
tack=millis();
7680
}
7781

7882
void loop(){
@@ -154,21 +158,33 @@ void loop(){
154158
packeter.unpacketC1F(code, value);
155159
alvik.disablePositionControl();
156160
alvik.rotate(value);
161+
ack_required=MOVEMENT_ROTATE;
162+
ack_check=true;
157163
break;
158164

159165
case 'G':
160166
packeter.unpacketC1F(code, value);
161167
alvik.disablePositionControl();
162168
alvik.move(value);
169+
ack_required=MOVEMENT_MOVE;
170+
ack_check=true;
163171
break;
164172

165173
case 'Z':
166174
packeter.unpacketC3F(code, x, y, theta);
167175
alvik.resetPose(x, y, theta);
168176
break;
177+
178+
case 'X':
179+
packeter.unpacketC1B(code, ack_code);
180+
if (ack_code == 'K') {
181+
ack_check = false;
182+
}
183+
break;
169184
}
170185
}
171186

187+
// sensors publish
172188
if (millis()-tsensor>10){
173189
tsensor=millis();
174190
switch(sensor_id){
@@ -204,6 +220,7 @@ void loop(){
204220
}
205221
}
206222

223+
// motors update & publish
207224
if (millis()-tmotor>20){
208225
tmotor=millis();
209226
alvik.updateMotors();
@@ -218,24 +235,28 @@ void loop(){
218235
msg_size = packeter.packetC2F('v', alvik.getLinearVelocity(), alvik.getAngularVelocity());
219236
alvik.serial->write(packeter.msg, msg_size);
220237
// pose
221-
msg_size = packeter.packetC3F('s', alvik.getX(), alvik.getY(), alvik.getTheta());
238+
msg_size = packeter.packetC3F('z', alvik.getX(), alvik.getY(), alvik.getTheta());
222239
alvik.serial->write(packeter.msg, msg_size);
240+
}
223241

224-
if (alvik.getKinematicsMovement()!=MOVEMENT_DISABLED){
225-
if (alvik.isTargetReached()){
226-
if (alvik.getKinematicsMovement()==MOVEMENT_ROTATE){
227-
msg_size = packeter.packetC1B('x', 'R');
228-
}
229-
if (alvik.getKinematicsMovement()==MOVEMENT_MOVE){
230-
msg_size = packeter.packetC1B('x', 'M');
231-
}
232-
alvik.serial->write(packeter.msg, msg_size);
233-
//alvik.disableKinematicsMovement();
242+
// acknowledge
243+
if (millis()-tack > 100){
244+
tack = millis();
245+
if (ack_check && alvik.isTargetReached()){
246+
if (ack_required == MOVEMENT_ROTATE){
247+
msg_size = packeter.packetC1B('x', 'R');
248+
}
249+
if (ack_required == MOVEMENT_MOVE){
250+
msg_size = packeter.packetC1B('x', 'M');
234251
}
235-
236252
}
253+
else{
254+
msg_size = packeter.packetC1B('x', 0);
255+
}
256+
alvik.serial->write(packeter.msg, msg_size);
237257
}
238258

259+
// imu update
239260
if (millis()-timu>10){
240261
timu=millis();
241262
alvik.updateImu();

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Arduino Alvik Carrier
2-
version=0.1.2
2+
version=0.2.0
33
author=Arduino, Giovanni di Dio Bruno, Lucio Rossi
44
maintainer=Arduino <[email protected]>
55
sentence=Library and firmware for Arduino Alvik Carrier board

src/Arduino_AlvikCarrier.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ int Arduino_AlvikCarrier::begin(){
8787
beginLeds();
8888

8989
serial->begin(UART_BAUD);
90+
serial->flush();
9091

9192
// setup alternate functions
9293
AF_Tim2_pwm();
@@ -678,13 +679,17 @@ void Arduino_AlvikCarrier::updateKinematics(){
678679
drive(0, round(rotate_pid->getControlOutput()/10.0)*10);
679680
if (abs(rotate_pid->getError())<ROTATE_THREASHOLD){
680681
kinematics_achieved=true;
682+
disableKinematicsMovement();
683+
drive(0,0);
681684
}
682685
}
683686
if (kinematics_movement==MOVEMENT_MOVE){
684687
move_pid->update((kinematics->getTravel()-previous_travel)*move_direction);
685688
drive(round(move_pid->getControlOutput()/10.0)*10, 0);
686689
if (abs(move_pid->getError())<MOVE_THREADSHOLD){
687690
kinematics_achieved=true;
691+
disableKinematicsMovement();
692+
drive(0,0);
688693
}
689694

690695
}
@@ -746,10 +751,11 @@ void Arduino_AlvikCarrier::lockingRotate(const float angle){
746751
}
747752

748753
void Arduino_AlvikCarrier::rotate(const float angle){
754+
disableKinematicsMovement();
755+
kinematics_achieved=false;
749756
rotate_pid->reset();
750757
rotate_pid->setReference(kinematics->getTheta()+angle);
751758
kinematics_movement=MOVEMENT_ROTATE;
752-
kinematics_achieved=false;
753759
}
754760

755761
void Arduino_AlvikCarrier::lockingMove(const float distance){
@@ -779,6 +785,9 @@ void Arduino_AlvikCarrier::lockingMove(const float distance){
779785
}
780786

781787
void Arduino_AlvikCarrier::move(const float distance){
788+
disableKinematicsMovement();
789+
kinematics_achieved=false;
790+
782791
move_pid->reset();
783792
previous_travel=kinematics->getTravel();
784793
if (distance<0){
@@ -789,7 +798,6 @@ void Arduino_AlvikCarrier::move(const float distance){
789798
}
790799
move_pid->setReference(distance);
791800
kinematics_movement=MOVEMENT_MOVE;
792-
kinematics_achieved=false;
793801
}
794802

795803
void Arduino_AlvikCarrier::disableKinematicsMovement(){

src/Arduino_AlvikCarrier.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ class Arduino_AlvikCarrier{
234234
void lockingRotate(const float angle); // rotate of angle degrees
235235
void lockingMove(const float distance); // move of distance millimeters
236236

237-
void disableKinematicsMovement();
238-
bool isTargetReached();
237+
void disableKinematicsMovement(); // disable movements that requires kinematics
238+
bool isTargetReached(); // get true if a movement is accomplished
239239
uint8_t getKinematicsMovement(); // get which kind of motion is running in kinematic control
240240

241241

src/definitions/robot_definitions.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO;
4646
#define ROTATE_KD_DEFAULT 0.001
4747
#define ROTATE_CONTROL_PERIOD 0.02
4848
#define ROTATE_MAX_SPEED 45.0
49-
#define ROTATE_THREASHOLD 3
49+
#define ROTATE_THREASHOLD 1
5050

5151
#define MOVE_KP_DEFAULT 5.0
5252
#define MOVE_KI_DEFAULT 0.0
@@ -79,8 +79,8 @@ const float MOTION_FX_PERIOD = (1000U / MOTION_FX_FREQ);
7979

8080
// Library version
8181
#define VERSION_BYTE_HIGH 0
82-
#define VERSION_BYTE_MID 1
83-
#define VERSION_BYTE_LOW 2
82+
#define VERSION_BYTE_MID 2
83+
#define VERSION_BYTE_LOW 0
8484

8585

8686

src/robotics/kinematics.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ class Kinematics{
174174
delta_left=0.0;
175175
delta_right=0.0;
176176
delta_travel=0.0;
177-
178177
}
179178

180179
void resetTravel(){

0 commit comments

Comments
 (0)