Advertisement
Cpt_Jellyfish

EEEE4008: ‘Recon-Scout’ Platform: Arduino MEGA (Slave) Code

May 13th, 2021
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.34 KB | None | 0 0
  1. //*** Maze Navigation with a Default Left Implementation
  2. //*** including I2C & Route Storage
  3.  
  4. //include libraries
  5. #include <SPI.h>
  6. #include <Wire.h>
  7. #include <nRF24L01.h>
  8. #include <RF24.h>
  9. #include <AccelStepper.h>
  10. #include <MultiStepper.h>
  11. #include "Ultrasonic.h"
  12.  
  13. String route = "";
  14. int stepCount = 0;
  15.  
  16. //variables for each window segment
  17. int distanceLeft;
  18. int distanceFront;
  19. int distanceRight;
  20.  
  21. //defining the ultrasonic sensor instances
  22. Ultrasonic uL(A1);
  23. Ultrasonic uF(A2);
  24. Ultrasonic uR(A3);
  25.  
  26. //constraints and other variables
  27. int corridorWidth = 38; //((wall-to-wall width(cm)/2)+tolerance), ensure it is well under 2*wall-to-wall width
  28.  
  29. bool prevForward = false; //previously moved forward?
  30.  
  31. int motor1Pos;
  32. int motor2Pos;
  33. int motor3Pos;
  34.  
  35. //stepper motor variables
  36. const int step1Pin = 8;
  37. const int dir1Pin = 7;
  38. const int step2Pin = 6;
  39. const int dir2Pin = 5;
  40. const int step3Pin = 4;
  41. const int dir3Pin = 3;  
  42.  
  43. AccelStepper motor1(1,step1Pin, dir1Pin); //1 is a driver interface
  44. AccelStepper motor2(1,step2Pin, dir2Pin);
  45. AccelStepper motor3(1,step3Pin, dir3Pin);
  46.  
  47. MultiStepper motors;
  48.  
  49. long positions[3]; //array of step positions  
  50.  
  51. void forwardX(){
  52.   stepCount = stepCount + int(200/1.1547);
  53.  
  54.   //forward 170mm  
  55.   positions[0] = 208;
  56.   positions[1] = -208;
  57.   positions[2] = 0;
  58.  
  59.   motor1.setCurrentPosition(0);
  60.   motor2.setCurrentPosition(0);
  61.   motor3.setCurrentPosition(0);
  62.  
  63.   motors.moveTo(positions);
  64.   motors.runSpeedToPosition();
  65. }
  66.  
  67. void stopMotors(){
  68.   //stop
  69.   motor1.setSpeed(0);
  70.   motor2.setSpeed(0);
  71.   motor3.setSpeed(0);
  72.   motors.run();
  73. }
  74.  
  75. void rotate90CC(){
  76.   // rotate 90 degrees left
  77.   route = route + "L,";
  78.   positions[0] = -183;
  79.   positions[1] = -183;
  80.   positions[2] = -183;
  81.  
  82.   motor1.setCurrentPosition(0);
  83.   motor2.setCurrentPosition(0);
  84.   motor3.setCurrentPosition(0);
  85.  
  86.   motors.moveTo(positions);
  87.   motors.runSpeedToPosition();
  88.   stepCount = 0;
  89. }
  90.  
  91. void rotate90C(){
  92.   route = route + "R,";
  93.   //rotate 90 degrees right
  94.   positions[0] = 183;
  95.   positions[1] = 183;
  96.   positions[2] = 183;
  97.  
  98.   motor1.setCurrentPosition(0);
  99.   motor2.setCurrentPosition(0);
  100.   motor3.setCurrentPosition(0);
  101.  
  102.   motors.moveTo(positions);
  103.   motors.runSpeedToPosition();
  104.   stepCount = 0;
  105. }
  106.  
  107. void goForward(){
  108.   //forwards
  109.   positions[0] = 20;
  110.   positions[1] = -20;
  111.   positions[2] = 0;
  112.  
  113.   motor1.setCurrentPosition(0);
  114.   motor2.setCurrentPosition(0);
  115.   motor3.setCurrentPosition(0);
  116.  
  117.   motors.moveTo(positions);
  118.   motors.runSpeedToPosition();
  119.   stepCount = stepCount + int(100/1.1547);
  120. }
  121.  
  122. void receiveEvent(int x) {
  123.   while (Wire.available()) { // loop through all but the last
  124.     stopMotors();
  125.     while (true){
  126.       //latch
  127.     }
  128.  
  129.     //uncomment for I2C transmission back to Raspberry Pi
  130.     //Wire.beginTransmission(4);
  131.     //Wire.write(route);
  132.     //Wire.endTransmission();
  133.   }
  134. }
  135.  
  136.                        
  137. void setup() {
  138.   Serial.begin(115200); //for troubleshooting - slows down the code
  139.  
  140.   //I2C setup
  141.   Wire.begin(0x8);
  142.   Wire.onReceive(receiveEvent);
  143.  
  144.   //stepper motor setup
  145.   motor1.setMaxSpeed(200);
  146.   motor2.setMaxSpeed(200);
  147.   motor3.setMaxSpeed(200);
  148.   motor1.setAcceleration(150);
  149.   motor2.setAcceleration(150);
  150.   motor3.setAcceleration(150);
  151.  
  152.   motors.addStepper(motor1);
  153.   motors.addStepper(motor2);
  154.   motors.addStepper(motor3);
  155. }
  156.  
  157. void loop() {
  158.  
  159.     //measure the distances
  160.     distanceLeft = uL.MeasureInCentimeters();
  161.     distanceFront = uF.MeasureInCentimeters();
  162.     distanceRight = uR.MeasureInCentimeters();
  163.  
  164.     Serial.print(distanceLeft);
  165.     Serial.print(",");
  166.     Serial.print(distanceFront);
  167.     Serial.print(",");
  168.     Serial.println(distanceRight);
  169.  
  170.     if (distanceLeft > corridorWidth){ //if left path avaliable
  171.       Serial.println("Left");
  172.       prevForward = false;
  173.  
  174.       //forward X amount
  175.       forwardX();
  176.       route = route + String(stepCount) + (",");
  177.          
  178.       //stop
  179.       //stopMotors();
  180.       delay(1000);
  181.  
  182.       //turn left
  183.       rotate90CC();
  184.  
  185.       //stop
  186.       stopMotors();
  187.       delay(1000);
  188.  
  189.       //forward X amount
  190.       forwardX();
  191.  
  192.       //stop
  193.       stopMotors();
  194.       delay(1000);
  195.     }          
  196.  
  197.     else if ((distanceLeft <= corridorWidth) && (distanceFront > corridorWidth)){ //else if a front path is avaliable
  198.       Serial.println("Front");
  199.       if (prevForward == false){
  200.         goForward();
  201.         prevForward = true;
  202.       }
  203.       else {
  204.         goForward();
  205.       }    
  206.     }
  207.  
  208.     else if ((distanceRight > corridorWidth) && (distanceFront <= corridorWidth) && (distanceLeft <= corridorWidth)){ //else if a right path is avaliable
  209.       Serial.println("Right");
  210.       prevForward = false;
  211.  
  212.       //forward X amount
  213.       forwardX();
  214.       route = route + String(stepCount) + (",");
  215.          
  216.       //stop
  217.       stopMotors();
  218.       delay(1000);
  219.  
  220.       //turn right
  221.       rotate90C();
  222.  
  223.       //stop
  224.       stopMotors();
  225.       delay(1000);
  226.  
  227.       //forward X amount
  228.       forwardX();
  229.     }
  230.  
  231.     else { //at a dead end so need to turn around
  232.       Serial.println("Dead End");
  233.       //stop
  234.       stopMotors();
  235.       delay(1000);
  236.  
  237.       //turn right
  238.       rotate90C();
  239.  
  240.       //stop
  241.       stopMotors();
  242.       delay(1000);
  243.  
  244.       //turn right
  245.       rotate90C();
  246.  
  247.       //stop
  248.       stopMotors();
  249.       delay(1000);
  250.     }
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement