Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. const unsigned int numInputs = 5;
  4. unsigned char pins[] = {
  5. 7,6,5,4,3};
  6. unsigned char startButton = 2;
  7. unsigned char LED = 11;
  8. unsigned int avals [numInputs];
  9.  
  10. unsigned int* farLeft = &avals[0];
  11. unsigned int* left = &avals[1];
  12. unsigned int* middle = &avals[2];
  13. unsigned int* right = &avals[3];
  14. unsigned int* farRight = &avals[4];
  15.  
  16. Servo servoRight;
  17. Servo servoLeft;
  18.  
  19. int roboSpeed = 10;
  20.  
  21. enum Mode {
  22. m_normal = 0, m_turn_left, m_turn_right, m_turn_left_crossing, m_turn_right_crossing };
  23. enum ModeNextCrossing {
  24. m_take_left_turn = 0, m_take_right_turn, m_ignore_next };
  25.  
  26. Mode mode = m_normal;
  27. ModeNextCrossing modeNextCrossing = m_take_left_turn;
  28.  
  29. boolean started = false;
  30.  
  31. void setup(void) {
  32. Serial.begin(115200);
  33.  
  34. // Initialize pins
  35. for (int i = 0; i < numInputs; i++) {
  36. pinMode(pins[i], INPUT);
  37. }
  38. pinMode(startButton, INPUT_PULLUP);
  39. servoLeft.attach(12);
  40. servoRight.attach(13);
  41. }
  42.  
  43. void loop() {
  44. // Once startButton was pressed, switch to "started" mode
  45. //if (!digitalRead(startButton)) {
  46. // started = true;
  47. //}
  48.  
  49. if (!digitalRead(startButton)) {
  50. started = !started;
  51. if (!started) {
  52. mode = m_normal;
  53. }
  54. delay(500);
  55. }
  56.  
  57. if (!started) {
  58. // If not started, stop servos
  59. servoRight.writeMicroseconds(1500);
  60. servoLeft.writeMicroseconds(1500);
  61. }
  62. else {
  63. // Read inputs from infrared sensors (and print them and the button state)
  64. for (int i = 0; i < numInputs; i++) {
  65. avals[i] = !digitalRead(pins[i]);
  66. //Serial.print(avals[i]);
  67. }
  68. //Serial.print(digitalRead(startButton));
  69. //Serial.println("=============");
  70.  
  71. // Strategy: If middle IR sees black, drive forward. If left, but not far
  72. // left sees black, steer left (drive around left wheel, same for right wheel).
  73. // If only far left/right IR sensor sees black, steer right/left while
  74. // driving backwards. In other cases drive forward.
  75. // Overall speed is set to 10% to not overshoot the black lines
  76.  
  77. if (mode == m_normal) {
  78. driveNormalMode();
  79. }
  80. else if (mode == m_turn_left) {
  81. driveTurnLeft();
  82. }
  83. else if (mode == m_turn_right) {
  84. driveTurnRight();
  85. }
  86. else if (mode == m_turn_left_crossing) {
  87. driveTurnLeftCrossing();
  88. }
  89. else if (mode == m_turn_right_crossing) {
  90. driveTurnRightCrossing();
  91. }
  92.  
  93. }
  94. }
  95.  
  96. void drive(int percLeft, int percRight) {
  97. servoRight.writeMicroseconds(1500 - percRight * 2);
  98. servoLeft.writeMicroseconds(1500 + percLeft * 2);
  99. }
  100.  
  101. void driveNormalMode() {
  102. if (modeNextCrossing != m_ignore_next && *middle && (*left || *right)) {
  103. if (modeNextCrossing == m_take_left_turn) {
  104. mode = m_turn_left_crossing;
  105. }
  106. else {
  107. mode = m_turn_right_crossing;
  108. }
  109. }
  110. else if (*middle) {
  111. drive(roboSpeed, roboSpeed);
  112. }
  113. /*else if (*left && !*middle) {
  114. drive(0, roboSpeed);
  115. }
  116. else if (*right && !*farRight) {
  117. drive(roboSpeed, 0);
  118. }*/
  119. else if (*left) {
  120. //drive(-roboSpeed, 0);
  121. mode = m_turn_left;
  122. }
  123. else if (*right) {
  124. //drive(0, -roboSpeed);
  125. mode = m_turn_right;
  126. }
  127. else {
  128. drive(roboSpeed, roboSpeed);
  129. }
  130.  
  131. if (*farLeft && *farRight && !*left && !*right && *middle) { // TODO: Check this
  132. started = false;
  133. mode = m_normal;
  134. }
  135. else if (*farRight) {
  136. modeNextCrossing = m_take_right_turn;
  137. }
  138. else if (*farLeft) {
  139. modeNextCrossing = m_take_left_turn;
  140. }
  141. }
  142.  
  143. void driveTurnLeftCrossing() {
  144. Serial.println("driveTurnLeftCrossing");
  145. drive(-roboSpeed*0, roboSpeed);
  146. if (*middle + *left + *right == 0) {
  147. mode = m_normal;
  148. modeNextCrossing = m_ignore_next;
  149. }
  150. }
  151.  
  152. void driveTurnRightCrossing() {
  153. drive(roboSpeed, -roboSpeed*0);
  154. if (*middle + *left + *right == 0) { // *middle && !*left && !*right
  155. mode = m_normal;
  156. modeNextCrossing = m_ignore_next;
  157. }
  158. }
  159.  
  160. // Other helper functions
  161.  
  162. // void driveForward(int perc) {
  163. // servoRight.writeMicroseconds(1500 - perc * 2);
  164. // servoLeft.writeMicroseconds(1500 + perc * 2);
  165. // }
  166. // void turnLeft(int perc) {
  167. // servoRight.writeMicroseconds(1500 - perc * 2);
  168. // servoLeft.writeMicroseconds(1500 - perc * 2);
  169. // }
  170. // void turnRight(int perc) {
  171. // servoRight.writeMicroseconds(1500 + perc * 2);
  172. // servoLeft.writeMicroseconds(1500 + perc * 2);
  173. // }
  174. // void stopDriving() {
  175. // servoRight.writeMicroseconds(1500);
  176. // servoLeft.writeMicroseconds(1500);
  177. // }
  178.  
  179. // boolean allWhite() {
  180. // for (int i = 0; i < 5; i++) {
  181. // if (avals[i] == 1)
  182. // return false;
  183. // }
  184. // return true;
  185. // }
  186.  
  187. void driveTurnLeft() {
  188. drive(-roboSpeed, roboSpeed);
  189. if (*middle) {
  190. mode = m_normal;
  191. }
  192. }
  193.  
  194. void driveTurnRight() {
  195. drive(roboSpeed, -roboSpeed);
  196. if (*middle) {
  197. mode = m_normal;
  198. }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement