因仑“3+1”工程特种兵精英论坛

标题: arduino 追踪小车 [打印本页]

作者: 刘登辉    时间: 2015-5-24 18:48
标题: arduino 追踪小车
最近一直在尝试用舵机带动超声波传感器寻找目标,但由于扫描的角度和小车的转向精度不够,结果总是不尽人意。

来看段视频: http://v.youku.com/v_show/id_XMjUzNDcxNzky.html

于是修改了项目,将小车重构,放弃四个轮子改用两个(小车灵活性大大提高),以红外线为主,超声波为辅,从目前来看效果很不错。

思路是:

硬件列表:

来看小车的图片:

[attach]3504[/attach]

[attach]3505[/attach]

再来看视频: http://v.youku.com/v_show/id_XMjU0NDkzNDM2.html

最后是源代码:

  1. #include <MazeSensor.h>
  2. #include <BaseCar.h>
  3. #include <Ultrasonic.h>
  4. #include <Servo.h>



  5. // for Ultrasonic
  6. const int TRIGGER_PIN = 1;
  7. const int RESPONSE_PIN = 2;

  8. // for Maze Sensor
  9. const int LEFT_PIN = 7;
  10. const int MIDDLE_PIN = 4;
  11. const int RIGHT_PIN = 8;

  12. // for detect Servo
  13. const int DETECT_SERVO_PIN = 9;

  14. // for car
  15. const int I11_PIN = A1;  // 15
  16. const int I12_PIN = A2;  // 16
  17. const int I21_PIN = A3;  // 17
  18. const int I22_PIN = A4;  // 18
  19. const int MOTO1_PIN = 3;
  20. const int MOTO2_PIN = 11;





  21. // log
  22. const boolean VERBOSE = true;
  23. const int SERIAL_SPEED = 9600;

  24. // for Ultrasonic
  25. const int MAX_DISTANCE = 300;
  26. const double C = 0.96;

  27. // for detect Servo
  28. const int DETECT_SERVO_CENTER_POS = 80;

  29. // speed
  30. const int SPEED_VAL = 150;
  31. const int SPEED_VAL_SLOW = 100;

  32. // direction adjustment
  33. const int ADJ = 0;





  34. // sensor
  35. MazeSensor sensor(LEFT_PIN, MIDDLE_PIN, RIGHT_PIN);

  36. // car control
  37. BaseCar car(MOTO1_PIN, MOTO2_PIN, I11_PIN, I12_PIN, I21_PIN, I22_PIN);

  38. // ultrasonic
  39. Ultrasonic us(TRIGGER_PIN, RESPONSE_PIN, C);

  40. // servo
  41. Servo servo;

  42. boolean targetFound = false;




  43. void setup() {
  44.   // init servo
  45.   servo.attach(DETECT_SERVO_PIN);
  46.   changeDetectServoPos(DETECT_SERVO_CENTER_POS);
  47.   // log
  48.   if (VERBOSE) {
  49.     Serial.begin(SERIAL_SPEED);
  50.   }
  51. }


  52. void loop() {
  53.   int distance = us.getDistance();
  54.   int pos = detectBlockPos();
  55.   if (VERBOSE) {
  56.     Serial.print("pos = ");
  57.     Serial.print(pos);
  58.     Serial.print(", distance = ");
  59.     Serial.println(distance);
  60.   }
  61.   if (pos == 0) {
  62.     if (distance > MAX_DISTANCE) {
  63.       Serial.println("target lost, searching...");
  64.       car.rotateRight(SPEED_VAL_SLOW, ADJ);
  65.     } else {
  66.       Serial.println("target found but leaving now, following...");
  67.       car.forward(SPEED_VAL_SLOW, ADJ);
  68.     }
  69.   } else {
  70.     switch(pos) {
  71.       case 1: // left
  72.         Serial.println("target on left, turn left...");
  73.         car.rotateLeft(SPEED_VAL, ADJ);
  74.         break;
  75.       case 3: // right
  76.         Serial.println("target on right, turn left...");
  77.         car.rotateRight(SPEED_VAL, ADJ);
  78.         break;
  79.       case 2: // middle
  80.         // goal
  81.         Serial.println("target caught, haha!");
  82.         car.standBy();
  83.         break;
  84.     }
  85.   }
  86. }


  87. int detectBlockPos() {
  88.   // get sensor status
  89.   SensorStatus s = sensor.getStatus();
  90.   if ((!s.left_flag) && (!s.middle_flag) && (!s.right_flag)) {
  91.     // 0:no
  92.     return 0;
  93.   } else if ((s.left_flag) && (!s.middle_flag) && (!s.right_flag)) {
  94.     // 1:left
  95.     return 1;
  96.   } else if ((!s.left_flag) && (s.middle_flag) && (!s.right_flag)) {
  97.     // 2:middle
  98.     return 2;
  99.   } else if ((!s.left_flag) && (!s.middle_flag) && (s.right_flag)) {
  100.     // 3:right
  101.     return 3;
  102.   } else if ((s.left_flag) && (s.middle_flag) && (s.right_flag)) {
  103.     // 4:all
  104.     return 4;
  105.   } else if ((s.left_flag) && (s.middle_flag) && (!s.right_flag)) {
  106.     // 5:left & middle
  107.     return 5;
  108.   } else if ((!s.left_flag) && (s.middle_flag) && (s.right_flag)) {
  109.     // 6:right & middle
  110.     return 6;
  111.   }
  112. }


  113. void changeDetectServoPos(int pos) {
  114.   servo.write(pos);
  115. }
复制代码








欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4