Advertisement
andretafta

NodeMCU Obstacle Avoidance with Servo

Sep 6th, 2021
1,870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Servo.h>
  2. #define SERVORIGHT   50
  3. #define SERVOCENTRE  100
  4. #define SERVOLEFT    150
  5. #define SERVOPIN     16
  6. #define TRIGPIN      2    
  7. #define ECHOPIN      0    
  8.  
  9. #define RightMotorSpeedPin 4
  10. #define RightMotorDirPin   2
  11. #define LeftMotorSpeedPin  5
  12. #define LeftMotorDirPin    0
  13.  
  14. int Speed = 100;  // max 1024
  15. int TSpeed = 90;  //Turning Speed
  16. Servo servo;
  17.  
  18. void stoped()
  19. {
  20.   //Apply speed zero for stopping motors
  21.  
  22.     analogWrite(RightMotorSpeedPin, 0);
  23.     analogWrite(LeftMotorSpeedPin, 0);
  24.     Serial.println("Stop");
  25. }
  26.  
  27. void forward()
  28. {
  29.     analogWrite(RightMotorSpeedPin, Speed);
  30.     analogWrite(LeftMotorSpeedPin, Speed);
  31.     digitalWrite(RightMotorDirPin, HIGH);
  32.     digitalWrite(LeftMotorDirPin, HIGH);
  33.     Serial.println("forward");
  34. }
  35.  
  36. void back()
  37. {
  38.     analogWrite(RightMotorSpeedPin, Speed);
  39.     analogWrite(LeftMotorSpeedPin, Speed);
  40.     digitalWrite(RightMotorDirPin, LOW);
  41.     digitalWrite(LeftMotorDirPin, LOW);
  42.     Serial.println("Back");
  43. }
  44.  
  45. void left()
  46. {
  47.     analogWrite(RightMotorSpeedPin, TSpeed);
  48.     analogWrite(LeftMotorSpeedPin, TSpeed);
  49.     digitalWrite(RightMotorDirPin, LOW);
  50.     digitalWrite(LeftMotorDirPin, HIGH);
  51.     Serial.println("Left");
  52. }
  53.  
  54. void right()
  55. {
  56.     analogWrite(RightMotorSpeedPin, TSpeed);
  57.     analogWrite(LeftMotorSpeedPin, TSpeed);
  58.     digitalWrite(RightMotorDirPin, HIGH);
  59.     digitalWrite(LeftMotorDirPin, LOW);
  60.     Serial.println("right");
  61. }
  62.  
  63. int stopCount = 0;
  64.  
  65. int ping()
  66. {
  67.     // pause for 50ms between scans
  68.     delay(50);
  69.  
  70.     // send ping
  71.     digitalWrite(TRIGPIN, LOW);
  72.     delayMicroseconds(2);
  73.     digitalWrite(TRIGPIN, HIGH);
  74.     delayMicroseconds(10);
  75.     digitalWrite(TRIGPIN, LOW);
  76.  
  77.     // read echo
  78.     long duration = pulseIn(ECHOPIN, HIGH);
  79.  
  80.     // convert distance to cm
  81.     unsigned int centimetres = int(duration / 2 / 29.1);
  82.  
  83.     return centimetres;
  84. }
  85.  
  86. char scan()
  87. {
  88.     // ping times in microseconds
  89.     unsigned int left_scan, centre_scan, right_scan;
  90.     char choice;
  91.  
  92.     // scan left
  93.     servo.write(SERVOLEFT);
  94.     delay(300);
  95.     left_scan = ping();
  96.  
  97.     // scan right
  98.     servo.write(SERVORIGHT);
  99.     delay(600);
  100.     right_scan = ping();
  101.  
  102.     // scan straight ahead
  103.     servo.write(SERVOCENTRE);
  104.     delay(300);
  105.     centre_scan = ping();
  106.  
  107.     if (left_scan>right_scan && left_scan>centre_scan)
  108.     {
  109.         choice = 'L';
  110.     }
  111.     else if (right_scan>left_scan && right_scan>centre_scan)
  112.     {
  113.         choice = 'R';
  114.     }
  115.     else {
  116.       choice = 'C';
  117.     }
  118.  
  119.     return choice;
  120. }
  121.  
  122. void setup() {
  123.   // put your setup code here, to run once:
  124.    Serial.begin(9600);
  125.     Serial.println("Obstacle Avoiding Car v1.0");
  126.     // set the servo data pin
  127.     servo.attach(SERVOPIN);
  128.  
  129.     pinMode(RightMotorSpeedPin, OUTPUT);
  130.     pinMode(LeftMotorSpeedPin, OUTPUT);
  131.     pinMode(RightMotorDirPin, OUTPUT);
  132.     pinMode(LeftMotorDirPin, OUTPUT);
  133.     digitalWrite(RightMotorSpeedPin, LOW);
  134.     digitalWrite(LeftMotorSpeedPin, LOW);
  135.     digitalWrite(RightMotorDirPin, HIGH);
  136.     digitalWrite(LeftMotorDirPin, HIGH);
  137.     // set the trig pin to output (send sound waves)
  138.     pinMode(TRIGPIN, OUTPUT);
  139.  
  140.     // set the echo pin to input (receive sound waves)
  141.     pinMode(ECHOPIN, INPUT);
  142. }
  143.  
  144. void loop() {
  145.   // put your main code here, to run repeatedly:
  146.     // get distance from obstacle straight ahead
  147.     unsigned int distance = ping();
  148.     Serial.print("Distance: "); Serial.println(distance);
  149.     if (distance < 30 && distance > 0)
  150.     {
  151.         if (distance < 10)
  152.         {
  153.             // turn around
  154.             Serial.println("Turn around...");
  155.            // display.drawString(10, 40, "Turn around...") ;        
  156.             back();
  157.             delay(300);
  158.             left();
  159.             delay(700);
  160.         }
  161.         else
  162.         {
  163.             // stop both motors
  164.             Serial.println("Motor stop...");
  165.             stoped();
  166.            
  167.             // scan for obstacles
  168.             char turn_direction = scan();
  169.  
  170.             // turn left/right or ignore and go straight
  171.             if (turn_direction == 'L')
  172.             {
  173.               Serial.println("Turn left...");
  174.                 left();
  175.                 delay(500);
  176.             }
  177.             else if (turn_direction == 'R')
  178.             {
  179.               Serial.println("Turn right...");
  180.                 right();
  181.                 delay(500);
  182.             }
  183.             else if (turn_direction == 'C')
  184.             {
  185.               stopCount++;
  186.               if(stopCount > 3){
  187.                 stopCount = 0;
  188.                 Serial.println("Turn back...");
  189.                 right();
  190.                 delay(700);
  191.               }
  192.              
  193.             }
  194.         }
  195.     }
  196.     else
  197.     {
  198.         // no obstacle, keep going forward
  199.         Serial.println("No obstacle, keep going forward...");
  200.         forward();
  201.     }
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement