Skip to content

Commit 65a837e

Browse files
authored
Merge pull request #6 from arduino-libraries/devel
0.1.2 - kinematics
2 parents b2d1b4a + 109f41f commit 65a837e

File tree

7 files changed

+257
-45
lines changed

7 files changed

+257
-45
lines changed

Diff for: examples/firmware_01/firmware_01.ino

+88-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
1010
*/
1111

12+
// WIP -> preliminary firmware
13+
1214

1315
#include "Arduino_AlvikCarrier.h"
1416
#include "sensor_line.h"
@@ -35,20 +37,24 @@ unsigned long timu=0;
3537

3638

3739
float left, right, value;
40+
float linear, angular;
3841
uint8_t leds;
3942

4043
uint8_t sensor_id = 0;
4144

4245

4346
uint8_t pid;
4447
float kp, ki, kd;
48+
float x, y, theta;
4549

4650
uint8_t servo_A, servo_B;
4751

4852

4953
void setup(){
5054
Serial.begin(115200);
5155
alvik.begin();
56+
alvik.disableIlluminator();
57+
alvik.setLeds(COLOR_ORANGE);
5258
alvik.setLedBuiltin(HIGH);
5359
line.begin();
5460
tof.begin();
@@ -59,6 +65,7 @@ void setup(){
5965
alvik.serial->write(packeter.msg,msg_size);
6066

6167
alvik.setLedBuiltin(LOW);
68+
alvik.setLeds(COLOR_BLACK);
6269

6370

6471
code=0;
@@ -77,20 +84,51 @@ void loop(){
7784
switch (code){
7885
case 'J':
7986
packeter.unpacketC2F(code,left,right);
87+
alvik.disableKinematicsMovement();
88+
alvik.disablePositionControl();
8089
alvik.setRpm(left, right);
8190
break;
91+
92+
case 'V':
93+
packeter.unpacketC2F(code,linear,angular);
94+
alvik.disableKinematicsMovement();
95+
alvik.disablePositionControl();
96+
alvik.drive(linear,angular);
97+
break;
98+
8299
case 'W':
83100
packeter.unpacketC2B1F(code,label,control_type,value);
84-
if ((label == 'L') && (control_type == 'V')) {
85-
alvik.motor_control_left->setRPM(value);
101+
alvik.disableKinematicsMovement();
102+
if (label=='L'){
103+
switch (control_type){
104+
case 'V':
105+
alvik.disablePositionControlLeft();
106+
alvik.setRpmLeft(value);
107+
break;
108+
case 'P':
109+
alvik.setPositionLeft(value);
110+
break;
111+
case 'Z':
112+
alvik.resetPositionLeft(value);
113+
break;
114+
}
86115
}
87-
else if ((label == 'R') && (control_type == 'V'))
88-
{
89-
alvik.motor_control_right->setRPM(value);
116+
if (label=='R'){
117+
switch (control_type){
118+
case 'V':
119+
alvik.disablePositionControlRight();
120+
alvik.setRpmRight(value);
121+
break;
122+
case 'P':
123+
alvik.setPositionRight(value);
124+
break;
125+
case 'Z':
126+
alvik.resetPositionRight(value);
127+
break;
128+
}
90129
}
91-
92130
break;
93-
131+
94132
case 'S':
95133
packeter.unpacketC2B(code,servo_A,servo_B);
96134
alvik.setServoA(servo_A);
@@ -111,6 +149,23 @@ void loop(){
111149
alvik.setKPidRight(kp,ki,kd);
112150
}
113151
break;
152+
153+
case 'R':
154+
packeter.unpacketC1F(code, value);
155+
alvik.disablePositionControl();
156+
alvik.rotate(value);
157+
break;
158+
159+
case 'G':
160+
packeter.unpacketC1F(code, value);
161+
alvik.disablePositionControl();
162+
alvik.move(value);
163+
break;
164+
165+
case 'Z':
166+
packeter.unpacketC3F(code, x, y, theta);
167+
alvik.resetPose(x, y, theta);
168+
break;
114169
}
115170
}
116171

@@ -152,9 +207,33 @@ void loop(){
152207
if (millis()-tmotor>20){
153208
tmotor=millis();
154209
alvik.updateMotors();
210+
alvik.updateKinematics();
211+
// joint speed
155212
msg_size = packeter.packetC2F('j', alvik.getRpmLeft(),alvik.getRpmRight());
156213
alvik.serial->write(packeter.msg,msg_size);
157-
214+
// joint position
215+
msg_size = packeter.packetC2F('w', alvik.getPositionLeft(),alvik.getPositionRight());
216+
alvik.serial->write(packeter.msg, msg_size);
217+
// robot speed
218+
msg_size = packeter.packetC2F('v', alvik.getLinearVelocity(), alvik.getAngularVelocity());
219+
alvik.serial->write(packeter.msg, msg_size);
220+
// pose
221+
msg_size = packeter.packetC3F('s', alvik.getX(), alvik.getY(), alvik.getTheta());
222+
alvik.serial->write(packeter.msg, msg_size);
223+
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();
234+
}
235+
236+
}
158237
}
159238

160239
if (millis()-timu>10){
@@ -163,4 +242,4 @@ void loop(){
163242
msg_size = packeter.packetC6F('i', alvik.getAccelerationX(), alvik.getAccelerationY(), alvik.getAccelerationZ(), alvik.getAngularVelocityX(), alvik.getAngularVelocityY(), alvik.getAngularVelocityZ());
164243
alvik.serial->write(packeter.msg,msg_size);
165244
}
166-
}
245+
}

Diff for: examples/kinematics/kinematics.ino

+29-13
Original file line numberDiff line numberDiff line change
@@ -9,63 +9,79 @@
99
1010
*/
1111

12-
// WIP
12+
// This example shows how to implement kinematics commands and retrieve odometry data from Arduino_AlvikCarrier class
1313

1414
#include "Arduino_AlvikCarrier.h"
1515

1616
Arduino_AlvikCarrier alvik;
1717

1818
unsigned long tmotor=0;
1919
unsigned long ttask=0;
20+
unsigned long tled=0;
2021
uint8_t task=0;
22+
bool led_value = false;
2123

2224
void setup() {
2325
Serial.begin(115200);
2426
alvik.begin();
2527
ttask=millis();
2628
tmotor=millis();
29+
tled=millis();
2730
task=0;
2831
}
2932

3033
void loop() {
3134
if (millis()-tmotor>20){
3235
tmotor=millis();
3336
alvik.updateMotors();
34-
alvik.kinematics->inverse(alvik.motor_control_left->getRPM(),alvik.motor_control_right->getRPM());
35-
alvik.kinematics->updatePose();
37+
alvik.updateKinematics();
3638
Serial.print("\t");
37-
Serial.print(alvik.kinematics->getLinearVelocity());
39+
Serial.print(alvik.getLinearVelocity());
3840
Serial.print("\t");
39-
Serial.print(alvik.kinematics->getAngularVelocity());
41+
Serial.print(alvik.getAngularVelocity());
4042
Serial.print("\t");
41-
Serial.print(alvik.kinematics->getX());
43+
Serial.print(alvik.getX());
4244
Serial.print("\t");
43-
Serial.print(alvik.kinematics->getY());
45+
Serial.print(alvik.getY());
4446
Serial.print("\t");
45-
Serial.print(alvik.kinematics->getTheta());
47+
Serial.print(alvik.getTheta());
4648
Serial.print("\n");
4749
}
4850

49-
if (millis()-ttask>2000){
51+
if ((millis()-ttask>5000)||alvik.isTargetReached()){
5052
ttask=millis();
5153
switch (task){
5254
case 0:
5355
alvik.rotate(90);
5456
break;
5557
case 1:
56-
alvik.drive(40,0);
58+
alvik.disableKinematicsMovement();
59+
alvik.drive(0,0);
5760
break;
5861
case 2:
59-
alvik.rotate(-90);
62+
alvik.move(100);
6063
break;
6164
case 3:
62-
alvik.drive(-40,0);
65+
alvik.disableKinematicsMovement();
66+
alvik.drive(0,0);
6367
break;
6468
}
6569
task++;
6670
if (task>3){
6771
task=0;
6872
}
6973
}
70-
74+
75+
if (millis()-tled>200){
76+
tled=millis();
77+
led_value=!led_value;
78+
if (task==1){
79+
alvik.setLedLeftGreen(false);
80+
alvik.setLedLeftRed(led_value);
81+
}
82+
if (task==3){
83+
alvik.setLedLeftRed(false);
84+
alvik.setLedLeftGreen(led_value);
85+
}
86+
}
7187
}

Diff for: library.properties

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

0 commit comments

Comments
 (0)