查看: 2464|回复: 0
打印 上一主题 下一主题

arduino 追踪小车

[复制链接]
跳转到指定楼层
沙发
发表于 2015-5-24 18:48:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近一直在尝试用舵机带动超声波传感器寻找目标,但由于扫描的角度和小车的转向精度不够,结果总是不尽人意。

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

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

思路是:
  • 设定左中右三个红外线传感器探测距离为:180mm、50mm、180mm;
  • 如果所有红外线传感器都没检测到信号,而且超声波探测的目标距离超过了最大范围(目前是300mm),说明目标不在前方,就慢速向右转圈寻找其他方向的目标;
  • 如果所有红外线传感器都没检测到信号,但超声波探测的目标距离小于最大范围,说明目标在前方,此时缓慢前进接近目标;
  • 如果左侧红外线检测到目标,说明目标在左侧,则迅速左转,面向目标;
  • 如果右侧红外线检测到目标,说明目标在右侧,则迅速右转,面向目标;
  • 如果中间的红外线检测到目标,说明目标就在正前方,而且距离合适,搜寻完成。

硬件列表:
  • Arduino Diecimila / ATmega168
  • Arduino Sensor Shield V5.0 传感器扩展板
  • 双 H 桥直流电机驱动板
  • 红外线距离传感器(博光 E18-D80NK)
  • DC-DC
  • 11.1V 1300mAH 聚合物锂电池
  • 乐高积木
  • EMAX 9g 舵机
  • 超声波传感器(最便宜的,35元那种)

来看小车的图片:





再来看视频: 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. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表