Skip to content

Commit 276df74

Browse files
committed
Now motor control supports position control
1 parent d7bd281 commit 276df74

File tree

5 files changed

+193
-142
lines changed

5 files changed

+193
-142
lines changed

examples/position/position.ino

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,60 +15,73 @@
1515

1616
Arduino_AlvikCarrier alvik;
1717

18-
PidController pid(1.2,0,1.0,20,50);
19-
20-
2118
unsigned long tmotor=0;
2219
unsigned long ttask=0;
2320
uint8_t task=0;
2421
float reference;
2522
float position;
26-
float error;
2723

2824
void setup() {
2925
Serial.begin(115200);
3026
alvik.begin();
31-
ttask=millis();
32-
tmotor=millis();
33-
task=0;
34-
reference=0;
35-
position=0;
36-
error=0;
27+
ttask = millis();
28+
tmotor = millis();
29+
task = 0;
30+
reference = 0;
31+
position = 0;
3732
}
3833

3934
void loop() {
4035
if (millis()-tmotor>20){
41-
tmotor=millis();
36+
tmotor = millis();
4237
alvik.updateMotors();
43-
position=alvik.motor_control_left->getTravel()*360.0;
44-
pid.update(position);
45-
alvik.motor_control_left->setRPM(pid.getControlOutput());
38+
position = alvik.motor_control_left->getPosition();
4639
Serial.print(reference);
4740
Serial.print("\t");
48-
Serial.println(position);
41+
Serial.print(position);
42+
Serial.print("\n");
4943
}
5044

5145
if (millis()-ttask>5000){
52-
ttask=millis();
46+
ttask = millis();
5347
switch (task){
5448
case 0:
55-
reference=90;
49+
reference = 90;
5650
break;
5751
case 1:
58-
reference=0;
52+
reference = 0;
5953
break;
6054
case 2:
61-
reference=-90;
55+
reference = -90;
6256
break;
6357
case 3:
64-
reference=0;
58+
reference = 0;
59+
break;
60+
case 4:
61+
reference = 360;
62+
break;
63+
case 5:
64+
reference = 45;
65+
break;
66+
case 6:
67+
reference = -270;
68+
break;
69+
case 7:
70+
reference = 0;
71+
break;
72+
case 8:
73+
reference = 5;
74+
break;
75+
case 9:
76+
reference = 10;
6577
break;
6678
}
67-
pid.setReference(reference);
79+
alvik.motor_control_left->setPosition(reference);
6880
task++;
69-
if (task>3){
81+
if (task>9){
7082
task=0;
7183
}
7284
}
7385

7486
}
87+

src/Arduino_AlvikCarrier.cpp

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,38 @@ Arduino_AlvikCarrier::Arduino_AlvikCarrier(){
1919
wire = new TwoWire(I2C_1_SDA, I2C_1_SCL);
2020

2121
// I2C external bus
22-
ext_wire = new TwoWire(I2C_2_SDA,I2C_2_SCL);
22+
ext_wire = new TwoWire(I2C_2_SDA, I2C_2_SCL);
2323

2424
// uart to esp32
25-
serial = new HardwareSerial(UART_RX,UART_TX);
25+
serial = new HardwareSerial(UART_RX, UART_TX);
2626

2727
// RGB leds
28-
led1 = new RGBled(LED_1_RED,LED_1_GREEN,LED_1_BLUE);
29-
led2 = new RGBled(LED_2_RED,LED_2_GREEN,LED_2_BLUE);
28+
led1 = new RGBled(LED_1_RED, LED_1_GREEN, LED_1_BLUE);
29+
led2 = new RGBled(LED_2_RED, LED_2_GREEN, LED_2_BLUE);
3030

3131
// motors
32-
motor_left = new DCmotor(MOTOR_LEFT_A,MOTOR_LEFT_A_CH, MOTOR_LEFT_B, MOTOR_LEFT_B_CH,MOTOR_LEFT_FLIP);
33-
motor_right = new DCmotor(MOTOR_RIGHT_A,MOTOR_RIGHT_A_CH,MOTOR_RIGHT_B,MOTOR_RIGHT_B_CH,MOTOR_RIGHT_FLIP);
32+
motor_left = new DCmotor(MOTOR_LEFT_A, MOTOR_LEFT_A_CH, MOTOR_LEFT_B, MOTOR_LEFT_B_CH, MOTOR_LEFT_FLIP);
33+
motor_right = new DCmotor(MOTOR_RIGHT_A, MOTOR_RIGHT_A_CH, MOTOR_RIGHT_B, MOTOR_RIGHT_B_CH, MOTOR_RIGHT_FLIP);
3434

3535
// encoders
36-
encoder_left = new Encoder(TIM3,ENC_LEFT_FLIP);
37-
encoder_right = new Encoder(TIM5,ENC_RIGHT_FLIP);
36+
encoder_left = new Encoder(TIM3, ENC_LEFT_FLIP);
37+
encoder_right = new Encoder(TIM5, ENC_RIGHT_FLIP);
3838

3939
// motor control
40-
motor_control_left = new MotorControl(motor_left,encoder_left,MOTOR_KP_DEFAULT,MOTOR_KI_DEFAULT,MOTOR_KD_DEFAULT,MOTOR_CONTROL_PERIOD);
41-
motor_control_right = new MotorControl(motor_right,encoder_right,MOTOR_KP_DEFAULT,MOTOR_KI_DEFAULT,MOTOR_KD_DEFAULT,MOTOR_CONTROL_PERIOD);
40+
motor_control_left = new MotorControl(motor_left, encoder_left,
41+
MOTOR_KP_DEFAULT, MOTOR_KI_DEFAULT, MOTOR_KD_DEFAULT,
42+
MOTOR_CONTROL_PERIOD, CONTROL_MODE_LINEAR, MOTOR_CONTROL_STEP,
43+
POSITION_KP_DEFAULT, POSITION_KI_DEFAULT, POSITION_KD_DEFAULT,
44+
POSITION_CONTROL_PERIOD, POSITION_MAX_SPEED);
45+
46+
motor_control_right = new MotorControl(motor_right, encoder_right,
47+
MOTOR_KP_DEFAULT, MOTOR_KI_DEFAULT, MOTOR_KD_DEFAULT,
48+
MOTOR_CONTROL_PERIOD, CONTROL_MODE_LINEAR, MOTOR_CONTROL_STEP,
49+
POSITION_KP_DEFAULT, POSITION_KI_DEFAULT, POSITION_KD_DEFAULT,
50+
POSITION_CONTROL_PERIOD, POSITION_MAX_SPEED);
4251

4352
// color sensor
44-
apds9960 = new APDS9960(*wire,APDS_INT);
53+
apds9960 = new APDS9960(*wire, APDS_INT);
4554

4655
// servo
4756
servo_A = new Servo();
@@ -57,16 +66,16 @@ Arduino_AlvikCarrier::Arduino_AlvikCarrier(){
5766
imu = new LSM6DSOSensor(wire, LSM6DSO_I2C_ADD_L);
5867
ipKnobs = &iKnobs;
5968
imu_delta_time = MOTION_FX_ENGINE_DELTATIME;
60-
sample_to_discard=0;
69+
sample_to_discard = 0;
6170

6271
// version
6372
version_high = VERSION_BYTE_HIGH;
6473
version_mid = VERSION_BYTE_MID;
6574
version_low = VERSION_BYTE_LOW;
6675

6776
// kinematics
68-
kinematics = new Kinematics(WHEEL_TRACK_MM,WHEEL_DIAMETER_MM);
69-
kinematics_movement=0;
77+
kinematics = new Kinematics(WHEEL_TRACK_MM, WHEEL_DIAMETER_MM);
78+
kinematics_movement = 0;
7079

7180
}
7281

@@ -125,9 +134,9 @@ int Arduino_AlvikCarrier::begin(){
125134
}
126135

127136
void Arduino_AlvikCarrier::getVersion(uint8_t &high_byte, uint8_t &mid_byte, uint8_t &low_byte){
128-
high_byte=version_high;
129-
mid_byte=version_mid;
130-
low_byte=version_low;
137+
high_byte = version_high;
138+
mid_byte = version_mid;
139+
low_byte = version_low;
131140
}
132141

133142

@@ -136,7 +145,7 @@ void Arduino_AlvikCarrier::getVersion(uint8_t &high_byte, uint8_t &mid_byte, uin
136145
/******************************************************************************************************/
137146

138147
int Arduino_AlvikCarrier::beginAPDS(){
139-
pinMode(APDS_LED,OUTPUT);
148+
pinMode(APDS_LED, OUTPUT);
140149
enableIlluminator();
141150
if (!apds9960->begin()){
142151
return ERROR_APDS;
@@ -150,13 +159,13 @@ void Arduino_AlvikCarrier::updateAPDS(){
150159
}
151160
//digitalWrite(APDS_LED,HIGH);
152161
if (apds9960->colorAvailable()){
153-
apds9960->readColor(bottom_red,bottom_green,bottom_blue,bottom_clear);
162+
apds9960->readColor(bottom_red, bottom_green, bottom_blue, bottom_clear);
154163
}
155164
//digitalWrite(APDS_LED,LOW);
156165
}
157166

158167
void Arduino_AlvikCarrier::setIlluminator(uint8_t value){
159-
digitalWrite(APDS_LED,value);
168+
digitalWrite(APDS_LED, value);
160169
}
161170

162171
void Arduino_AlvikCarrier::enableIlluminator(){
@@ -208,11 +217,11 @@ void Arduino_AlvikCarrier::setServoB(int position){
208217
/******************************************************************************************************/
209218

210219
int Arduino_AlvikCarrier::beginI2Cselect(){
211-
pinMode(SELECT_I2C_BUS,OUTPUT);
220+
pinMode(SELECT_I2C_BUS, OUTPUT);
212221
}
213222

214223
void Arduino_AlvikCarrier::setExternalI2C(uint8_t state){
215-
digitalWrite(SELECT_I2C_BUS,state);
224+
digitalWrite(SELECT_I2C_BUS, state);
216225
}
217226

218227
void Arduino_AlvikCarrier::connectExternalI2C(){
@@ -348,14 +357,14 @@ void Arduino_AlvikCarrier::updateTouch(){
348357
}
349358

350359
bool Arduino_AlvikCarrier::getAnyTouchPressed(){
351-
if (touch_sensor->touched(touch_status,TOUCH_PAD_GUARD)){
360+
if (touch_sensor->touched(touch_status, TOUCH_PAD_GUARD)){
352361
return true;
353362
}
354363
return false;
355364
}
356365

357366
bool Arduino_AlvikCarrier::getTouchKey(const uint8_t key){
358-
if (touch_sensor->touched(touch_status,key)&&touch_sensor->touched(touch_status,TOUCH_PAD_GUARD)){
367+
if (touch_sensor->touched(touch_status, key)&&touch_sensor->touched(touch_status, TOUCH_PAD_GUARD)){
359368
return true;
360369
}
361370
return false;
@@ -411,23 +420,23 @@ bool Arduino_AlvikCarrier::getTouchDelete(){
411420
/******************************************************************************************************/
412421

413422
int Arduino_AlvikCarrier::beginLeds(){
414-
pinMode(LED_BUILTIN,OUTPUT);
423+
pinMode(LED_BUILTIN, OUTPUT);
415424
// turn off leds
416425
led1->clear();
417426
led2->clear();
418427
return 0;
419428
}
420429

421430
void Arduino_AlvikCarrier::setLedBuiltin(const uint8_t value){
422-
digitalWrite(LED_BUILTIN,value);
431+
digitalWrite(LED_BUILTIN, value);
423432
}
424433

425434
void Arduino_AlvikCarrier::setLedLeft(const uint32_t color){
426435
led1->set(color);
427436
}
428437

429438
void Arduino_AlvikCarrier::setLedLeft(const uint32_t red, const uint32_t green, const uint32_t blue){
430-
led1->set(red,green,blue);
439+
led1->set(red, green, blue);
431440
}
432441

433442
void Arduino_AlvikCarrier::setLedLeftRed(const uint32_t red){
@@ -447,7 +456,7 @@ void Arduino_AlvikCarrier::setLedRight(const uint32_t color){
447456
}
448457

449458
void Arduino_AlvikCarrier::setLedRight(const uint32_t red, const uint32_t green, const uint32_t blue){
450-
led2->set(red,green,blue);
459+
led2->set(red, green, blue);
451460
}
452461

453462
void Arduino_AlvikCarrier::setLedRightRed(const uint32_t red){
@@ -468,8 +477,8 @@ void Arduino_AlvikCarrier::setLeds(const uint32_t color){
468477
}
469478

470479
void Arduino_AlvikCarrier::setLeds(const uint32_t red, const uint32_t green, const uint32_t blue){
471-
setLedLeft(red,green,blue);
472-
setLedRight(red,green,blue);
480+
setLedLeft(red, green, blue);
481+
setLedRight(red, green, blue);
473482
}
474483

475484
void Arduino_AlvikCarrier::setAllLeds(const uint8_t value){
@@ -613,26 +622,26 @@ void Arduino_AlvikCarrier::errorLed(const int error_code){
613622

614623
void Arduino_AlvikCarrier::drive(const float linear, const float angular){
615624
kinematics->forward(linear, angular);
616-
setRpm(kinematics->getLeftVelocity(),kinematics->getRightVelocity());
625+
setRpm(kinematics->getLeftVelocity(), kinematics->getRightVelocity());
617626
}
618627

619628
void Arduino_AlvikCarrier::rotate(const float angle){
620-
float initial_angle=kinematics->getTheta();
621-
float final_angle=angle+initial_angle;
622-
float error=angle;
623-
unsigned long t=millis();
629+
float initial_angle = kinematics->getTheta();
630+
float final_angle = angle+initial_angle;
631+
float error = angle;
632+
unsigned long t = millis();
624633
while(abs(error)>2){
625634
if (millis()-t>20){
626-
t=millis();
635+
t = millis();
627636
updateMotors();
628637
kinematics->inverse(motor_control_left->getRPM(),motor_control_right->getRPM());
629638
kinematics->updatePose();
630-
error=final_angle-kinematics->getTheta();
639+
error = final_angle-kinematics->getTheta();
631640
}
632641
if (angle>0){
633-
drive(0,40);
642+
drive(0, 40);
634643
}else{
635-
drive(0,-40);
644+
drive(0, -40);
636645
}
637646
}
638647
drive(0,0);
@@ -644,26 +653,26 @@ void Arduino_AlvikCarrier::rotate(const float angle){
644653

645654

646655
void Arduino_AlvikCarrier::move(const float distance){
647-
float initial_travel=kinematics->getTravel();
648-
float final_travel=abs(distance)+initial_travel;
649-
float error=abs(distance);
650-
unsigned long t=millis();
656+
float initial_travel = kinematics->getTravel();
657+
float final_travel = abs(distance)+initial_travel;
658+
float error = abs(distance);
659+
unsigned long t = millis();
651660

652661
while(error>2){
653662
if (millis()-t>20){
654-
t=millis();
663+
t = millis();
655664
updateMotors();
656-
kinematics->inverse(motor_control_left->getRPM(),motor_control_right->getRPM());
665+
kinematics->inverse(motor_control_left->getRPM(), motor_control_right->getRPM());
657666
kinematics->updatePose();
658-
error=final_travel-kinematics->getTravel();
667+
error = final_travel-kinematics->getTravel();
659668
}
660669
if (distance>0){
661-
drive(40,0);
670+
drive(40, 0);
662671
}else{
663-
drive(-40,0);
672+
drive(-40, 0);
664673
}
665674
}
666-
drive(0,0);
675+
drive(0, 0);
667676
updateMotors();
668677
motor_control_left->brake();
669678
motor_control_right->brake();
@@ -673,7 +682,7 @@ void Arduino_AlvikCarrier::move(const float distance){
673682

674683

675684
void Arduino_AlvikCarrier::updateKinematics(){
676-
kinematics->inverse(motor_control_left->getRPM(),motor_control_right->getRPM());
685+
kinematics->inverse(motor_control_left->getRPM(), motor_control_right->getRPM());
677686
kinematics->updatePose();
678687
if (kinematics_movement!=0){
679688
// do controls

src/definitions/robot_definitions.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO;
2626
#define MOTOR_KI_DEFAULT 450.0
2727
#define MOTOR_KD_DEFAULT 0.0
2828
#define MOTOR_CONTROL_PERIOD 0.02
29+
#define MOTOR_CONTROL_STEP 5.0
2930

3031
#define POSITION_KP_DEFAULT 1.0
3132
#define POSITION_KI_DEFAULT 0.0
32-
#define POSITION_KD_DEFAULT 0.1
33+
#define POSITION_KD_DEFAULT 0.0001
3334
#define POSITION_CONTROL_PERIOD 0.02
3435
#define POSITION_MAX_SPEED 30.0
3536

0 commit comments

Comments
 (0)