Library for the Shield Bot by SeeedStudio

Dependents:   Seeed_Bot_Shield Seeed_BlueBot_demo Seeed_BlueBot_demo_test1 LAB03_Oppgav1 ... more

Fork of SeeedShieldBot by Components

Committer:
screamer
Date:
Thu Jul 31 14:29:50 2014 +0000
Revision:
7:887c729fd7c1
Parent:
2:118efce95f3c
Changed constructor to accept pin parameters (instead of static ones); Added turn_left/right() and stopLeft/Right();; Fixed documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
melse 0:227158f56a11 1 #include "SeeedStudioShieldBot.h"
melse 0:227158f56a11 2 #include "mbed.h"
melse 0:227158f56a11 3
melse 0:227158f56a11 4
screamer 7:887c729fd7c1 5 SeeedStudioShieldBot::SeeedStudioShieldBot(
screamer 7:887c729fd7c1 6 PinName mot1A, PinName mot1En, PinName mot1B,
screamer 7:887c729fd7c1 7 PinName mot2A, PinName mot2En, PinName mot2B,
screamer 7:887c729fd7c1 8 PinName sensor_right, PinName sensor_inright, PinName sensor_center, PinName sensor_inleft, PinName sensor_left
screamer 7:887c729fd7c1 9 ) :
screamer 7:887c729fd7c1 10 motor1A(mot1A), motor1En(mot1En), motor1B(mot1B),
screamer 7:887c729fd7c1 11 motor2A(mot2A), motor2En(mot2En), motor2B(mot2B),
screamer 7:887c729fd7c1 12 rightSensor(sensor_right), inRightSensor(sensor_inright), centreSensor(sensor_center), inLeftSensor(sensor_inleft), leftSensor(sensor_left)
screamer 7:887c729fd7c1 13 {
melse 0:227158f56a11 14 // Something should go here...
melse 0:227158f56a11 15 }
melse 0:227158f56a11 16
screamer 7:887c729fd7c1 17 void SeeedStudioShieldBot::right_motor(float speed)
screamer 7:887c729fd7c1 18 {
melse 0:227158f56a11 19 // The bit that's actually needed...
melse 0:227158f56a11 20 if (speed >= 0) {
melse 0:227158f56a11 21 motor1A = speed;
melse 0:227158f56a11 22 motor1B = 0;
screamer 7:887c729fd7c1 23 } else {
melse 0:227158f56a11 24 motor1A = 1 + speed;
melse 0:227158f56a11 25 motor1B = 1;
melse 0:227158f56a11 26 }
melse 0:227158f56a11 27 }
melse 0:227158f56a11 28
screamer 7:887c729fd7c1 29 void SeeedStudioShieldBot::left_motor(float speed)
screamer 7:887c729fd7c1 30 {
melse 0:227158f56a11 31 // Useful bit
melse 0:227158f56a11 32 if (speed >= 0) {
melse 0:227158f56a11 33 motor2A = speed;
melse 0:227158f56a11 34 motor2B = 0;
screamer 7:887c729fd7c1 35 } else {
melse 0:227158f56a11 36 motor2A = 1 + speed;
melse 0:227158f56a11 37 motor2B = 1;
melse 0:227158f56a11 38 }
melse 0:227158f56a11 39 }
melse 0:227158f56a11 40
melse 0:227158f56a11 41 // The following two functions turn the robot on the spot...
melse 0:227158f56a11 42
screamer 7:887c729fd7c1 43 void SeeedStudioShieldBot::left(float speed)
screamer 7:887c729fd7c1 44 {
melse 0:227158f56a11 45 left_motor(-speed);
melse 0:227158f56a11 46 right_motor(speed);
melse 0:227158f56a11 47 }
melse 0:227158f56a11 48
screamer 7:887c729fd7c1 49 void SeeedStudioShieldBot::right(float speed)
screamer 7:887c729fd7c1 50 {
melse 0:227158f56a11 51 left_motor(speed);
melse 0:227158f56a11 52 right_motor(-speed);
melse 0:227158f56a11 53 }
melse 0:227158f56a11 54
screamer 7:887c729fd7c1 55 void SeeedStudioShieldBot::turn_left(float speed)
screamer 7:887c729fd7c1 56 {
screamer 7:887c729fd7c1 57 left_motor(speed);
screamer 7:887c729fd7c1 58 right_motor(0);
screamer 7:887c729fd7c1 59 }
screamer 7:887c729fd7c1 60
screamer 7:887c729fd7c1 61 void SeeedStudioShieldBot::turn_right(float speed)
screamer 7:887c729fd7c1 62 {
screamer 7:887c729fd7c1 63 left_motor(0);
screamer 7:887c729fd7c1 64 right_motor(speed);
screamer 7:887c729fd7c1 65 }
screamer 7:887c729fd7c1 66
melse 0:227158f56a11 67 // Again, until we get PWM on the pin w/o PWM, there's no way we can really have this any other way than 1...
melse 0:227158f56a11 68 // This is the case for both forwards and backwards...
melse 0:227158f56a11 69
melse 0:227158f56a11 70 // FIXED, using jumper between pins 8 and 3 on top of the robot board... unfortunately it wastes an io pin, but is easier than using software IO.
melse 0:227158f56a11 71 // It also means that the 'lid' can't go on top.
melse 0:227158f56a11 72
screamer 7:887c729fd7c1 73 void SeeedStudioShieldBot::forward(float speed)
screamer 7:887c729fd7c1 74 {
melse 0:227158f56a11 75 if (speed == 0) {
melse 0:227158f56a11 76 left_motor(0);
melse 0:227158f56a11 77 right_motor(0);
screamer 7:887c729fd7c1 78 } else {
melse 0:227158f56a11 79 left_motor(speed);
melse 0:227158f56a11 80 right_motor(speed);
melse 0:227158f56a11 81 }
melse 0:227158f56a11 82 }
melse 0:227158f56a11 83
screamer 7:887c729fd7c1 84 void SeeedStudioShieldBot::backward(float speed)
screamer 7:887c729fd7c1 85 {
melse 0:227158f56a11 86 if (speed == 0) {
melse 0:227158f56a11 87 left_motor(0);
melse 0:227158f56a11 88 right_motor(0);
screamer 7:887c729fd7c1 89 } else {
melse 0:227158f56a11 90 left_motor(-speed);
melse 0:227158f56a11 91 right_motor(-speed);
melse 0:227158f56a11 92 }
melse 0:227158f56a11 93 }
melse 0:227158f56a11 94
screamer 7:887c729fd7c1 95 void SeeedStudioShieldBot::enable_right_motor()
screamer 7:887c729fd7c1 96 {
melse 0:227158f56a11 97 motor1En = 1;
melse 0:227158f56a11 98 }
melse 0:227158f56a11 99
screamer 7:887c729fd7c1 100 void SeeedStudioShieldBot::enable_left_motor()
screamer 7:887c729fd7c1 101 {
melse 0:227158f56a11 102 motor2En = 1;
melse 0:227158f56a11 103 }
melse 0:227158f56a11 104
screamer 7:887c729fd7c1 105 void SeeedStudioShieldBot::disable_right_motor()
screamer 7:887c729fd7c1 106 {
melse 0:227158f56a11 107 motor1En = 0;
melse 0:227158f56a11 108 }
melse 0:227158f56a11 109
screamer 7:887c729fd7c1 110 void SeeedStudioShieldBot::disable_left_motor()
screamer 7:887c729fd7c1 111 {
melse 0:227158f56a11 112 motor2En = 0;
melse 0:227158f56a11 113 }
melse 0:227158f56a11 114
melse 0:227158f56a11 115 // Give a value representative of the overall data received by the sensors...
melse 0:227158f56a11 116 // Output between +1 and -1.
melse 0:227158f56a11 117 // Positive is right, negative left...
screamer 7:887c729fd7c1 118 float SeeedStudioShieldBot::line_position()
screamer 7:887c729fd7c1 119 {
screamer 7:887c729fd7c1 120 float output = 0;
melse 0:227158f56a11 121 if (rightSensor == 1) {
melse 0:227158f56a11 122 output += 0.5;
melse 0:227158f56a11 123 }
melse 0:227158f56a11 124 if (inRightSensor == 1) {
melse 1:5c40f2a5e1ac 125 output += 0.5;
melse 0:227158f56a11 126 }
melse 0:227158f56a11 127 if (leftSensor == 1) {
melse 0:227158f56a11 128 output -= 0.5;
melse 0:227158f56a11 129 }
melse 0:227158f56a11 130 if (inLeftSensor == 1) {
melse 1:5c40f2a5e1ac 131 output -= 0.5;
melse 0:227158f56a11 132 }
screamer 7:887c729fd7c1 133
melse 0:227158f56a11 134 return output;
melse 0:227158f56a11 135 }
melse 0:227158f56a11 136
screamer 7:887c729fd7c1 137 void SeeedStudioShieldBot::stop(int motor)
screamer 7:887c729fd7c1 138 {
screamer 7:887c729fd7c1 139 if (motor == 1) {
screamer 7:887c729fd7c1 140 stopLeft();
screamer 7:887c729fd7c1 141 } else if (motor == 2) {
screamer 7:887c729fd7c1 142 stopRight();
screamer 7:887c729fd7c1 143 }
screamer 7:887c729fd7c1 144 }
screamer 7:887c729fd7c1 145
screamer 7:887c729fd7c1 146 void SeeedStudioShieldBot::stopLeft()
screamer 7:887c729fd7c1 147 {
melse 0:227158f56a11 148 motor1A = 0;
melse 0:227158f56a11 149 motor1B = 0;
screamer 7:887c729fd7c1 150 }
screamer 7:887c729fd7c1 151
screamer 7:887c729fd7c1 152 void SeeedStudioShieldBot::stopRight()
screamer 7:887c729fd7c1 153 {
melse 0:227158f56a11 154 motor2A = 0;
melse 0:227158f56a11 155 motor2B = 0;
melse 2:118efce95f3c 156 }
melse 2:118efce95f3c 157
screamer 7:887c729fd7c1 158 void SeeedStudioShieldBot::stopAll()
screamer 7:887c729fd7c1 159 {
screamer 7:887c729fd7c1 160 stopLeft();
screamer 7:887c729fd7c1 161 stopRight();
screamer 7:887c729fd7c1 162 }