极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11484|回复: 2

超声波避障小车问题求教

[复制链接]
发表于 2015-11-12 10:11:53 | 显示全部楼层 |阅读模式
我的小车主要问题就是停不下来,会直接撞上前面的障碍物,感觉超声波没在判断,程序如下,有高手帮我分析分析吗?

  1. #include <Servo.h>
  2. #define L1 7
  3. #define L2 8
  4. #define R1 12
  5. #define R2 13
  6. #define C0 5
  7. #define C1 6
  8. Servo myservo;
  9. int rightDistance;
  10. int leftDistance;
  11. int middleDistance;
  12. const int Trig=2;
  13. const int Echo=3;

  14. void forward()
  15. {
  16.       digitalWrite(L1,HIGH);
  17.       digitalWrite(L2,LOW);
  18.       analogWrite(C0,150);
  19.       digitalWrite(R1,HIGH);
  20.       digitalWrite(R2,LOW);
  21.       analogWrite(C1,150);
  22. }

  23. void back()
  24. {
  25.       digitalWrite(L1,LOW);
  26.       digitalWrite(L2,HIGH);
  27.       analogWrite(C0,150);
  28.       digitalWrite(R1,LOW);
  29.       digitalWrite(R2,HIGH);
  30.       analogWrite(C1,150);
  31. }

  32. void turnLeft()
  33. {
  34.       digitalWrite(L1,LOW);
  35.       digitalWrite(L2,HIGH);
  36.       analogWrite(C0,150);
  37.       digitalWrite(R1,HIGH);
  38.       digitalWrite(R2,LOW);
  39.       analogWrite(C1,150);
  40. }

  41. void turnRight()
  42. {
  43.       digitalWrite(L1,HIGH);
  44.       digitalWrite(L2,LOW);
  45.       analogWrite(C0,150);
  46.       digitalWrite(R1,LOW);
  47.       digitalWrite(R2,HIGH);
  48.       analogWrite(C1,150);
  49. }

  50. void gostop()
  51. {
  52.       digitalWrite(L1,LOW);
  53.       digitalWrite(L2,LOW);
  54.       analogWrite(C0,0);
  55.       digitalWrite(R1,LOW);
  56.       digitalWrite(R2,LOW);
  57.       analogWrite(C1,0);
  58. }

  59. int Distance_test()
  60. {
  61.   digitalWrite(Trig,LOW);
  62.   delayMicroseconds(2);
  63.   digitalWrite(Trig, HIGH);
  64.   delayMicroseconds(10);
  65.   digitalWrite(Trig, LOW);
  66.   float cm=pulseIn(Echo, HIGH);
  67.   cm= cm/58.0;
  68.   cm = (int(cm * 100.0)) / 100.0;
  69.   return (int)cm;
  70. }

  71. void setup()
  72. {
  73.   myservo.attach(9);
  74.   Serial.begin(9600);     // 初始化串口
  75.   pinMode(Echo,INPUT);
  76.   pinMode(Trig,OUTPUT);
  77.   pinMode(L1,OUTPUT);
  78.   pinMode(L2,OUTPUT);
  79.   pinMode(R1,OUTPUT);
  80.   pinMode(R2,OUTPUT);
  81.   pinMode(C0,OUTPUT);
  82.   pinMode(C1,OUTPUT);
  83.   gostop();
  84. }
  85. void loop()
  86. {
  87. myservo.write(90);
  88. delay(1000);
  89. middleDistance=Distance_test();
  90. Serial.print(middleDistance);
  91. Serial.println("cm");
  92. delay(1000);
  93. if(middleDistance<=20)
  94. {
  95.   gostop();
  96.   delay(500);
  97.   myservo.write(30);
  98.   delay(1000);
  99.   rightDistance=Distance_test();
  100.   delay(1000);
  101.   myservo.write(90);
  102.   delay(1000);
  103.   myservo.write(150);
  104.   delay(1000);
  105.   leftDistance=Distance_test();
  106.   delay(1000);
  107.   myservo.write(90);
  108.   delay(1000);
  109.   middleDistance=Distance_test();
  110.   delay(1000);
  111.   if(rightDistance<=10&&leftDistance<=10)
  112.   {
  113.     back();
  114.     delay(50);
  115.   }
  116.   else if(rightDistance>leftDistance)
  117.   {
  118.     turnRight();
  119.     delay(50);
  120.   }
  121.   else if(rightDistance<leftDistance)
  122.   {
  123.     turnLeft();
  124.     delay(50);
  125.   }
  126.   else
  127.   {
  128.     forward();
  129.   }
  130. }
  131. else
  132. {
  133.   forward();
  134. }
  135. }

复制代码
回复

使用道具 举报

发表于 2015-11-12 10:56:14 | 显示全部楼层

myservo.write(90);
delay(1000);
middleDistance=Distance_test();
Serial.print(middleDistance);
Serial.println("cm");
delay(1000);
if(middleDistance<=20)


测距前后,你的程序各停了1秒钟,总计超过2秒,距离<20cm才转,是不是2秒已经跑的超过20cm了,
来不及停了?
回复 支持 反对

使用道具 举报

发表于 2015-11-12 18:12:24 | 显示全部楼层
要停下来啊,不要一直走啊,我做的是三个超声波的避障,就完全没问题啊,你的时间太长,没有必要,而且,最好看着串口显示的数据来调小车,不要一味的找程序。
串口的数据,对比才能发现到底是哪里错了。再去解决问题。
加油吧 。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 15:57 , Processed in 0.061818 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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