Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. void AutonomousMovementDirector::run()
  2. {
  3.     uint32_t sound_sensor_left_value, sound_sensor_right_value;
  4.     while (1) {
  5.         respond_to_sound();
  6.         respond_to_obstacle();
  7.         movementController->move_forward(speed);
  8.     }
  9. }
  10.  
  11. void AutonomousMovementDirector::respond_to_sound()
  12. {
  13.     uint32_t sound_sensor_left_value = 0;
  14.     uint32_t sound_sensor_right_value = 0;
  15.  
  16.     if (
  17.         SoundSensor::get_sound_sensor_left()->queue.receive(&sound_sensor_left_value, 0)
  18.         || SoundSensor::get_sound_sensor_right()->queue.receive(&sound_sensor_right_value, 0)
  19.     ) {
  20.         if (sound_sensor_left_value > sound_sensor_right_value) {
  21.             movementController->turn_right(speed);
  22.             delay(500);
  23.         } else if (sound_sensor_left_value > sound_sensor_right_value) {
  24.             movementController->turn_left(speed);
  25.             delay(500);
  26.         }
  27.     }
  28. }
  29.  
  30. #define MS_PER_DIRECTION_OFFSET (10)
  31. void AutonomousMovementDirector::respond_to_obstacle()
  32. {
  33.     float distance_in_cm;
  34.     if (UltrasonicSensor::get_instance()->queue.receive(&distance_in_cm, 0)) {
  35.         if (distance_in_cm > 0) {
  36.             int8_t direction_offset = find_open_place();
  37.  
  38.             if (direction_offset < 0) {
  39.                 movementController->turn_left(speed/2);
  40.                 delay((uint16_t) MS_PER_DIRECTION_OFFSET * (-1 * direction_offset));
  41.             } else {
  42.                 movementController->turn_right(speed/2);
  43.                 delay((uint16_t) MS_PER_DIRECTION_OFFSET * direction_offset);
  44.             }
  45.         }
  46.     }
  47. }
  48.  
  49. /*
  50.  * Using the ultrasonic sensor that's attached to the servo, the closest direction that's not blocked is found.
  51.  *
  52.  * Returns the offset to that direction a negative number means it's to the left.
  53.  */
  54. int8_t AutonomousMovementDirector::find_open_place()
  55. {
  56.     float distance_in_cm = 0;
  57.     int8_t direction_offset = -100;
  58.  
  59.     UltrasonicSensor* ultrasonicSensor = UltrasonicSensor::get_instance();
  60.  
  61.     ultrasonicSensor->suspend(); // stop continuously polling
  62.     ultrasonicSensor->queue.receive(&distance_in_cm, 400);  // wait for current distance measurement to finish
  63.  
  64.     for (int8_t i=-90; i <= 90; i += 20) {
  65.         if (abs(i) >= abs(direction_offset)) // the closest open place has already been found, searching further is useless
  66.             break;
  67.  
  68.         Servo::get_instance()->set_position(i + 90);
  69.         delay(200);
  70.  
  71.         ultrasonicSensor->send_pulse(); // start distance measurement
  72.         ultrasonicSensor->queue.receive(&distance_in_cm, 400);  // wait until measurement is complete and get the result
  73.  
  74.         if (distance_in_cm == 0)  // distance == 0 means distance > 30
  75.             direction_offset = i;
  76.     }
  77.  
  78.     return direction_offset;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement