极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15319|回复: 3

求助,超声波避障小车编程问题

[复制链接]
发表于 2015-8-27 05:40:11 | 显示全部楼层 |阅读模式
设想的情况是小车在探测到障碍物时能够停下来,然后转向,但是实测时,小车会一直撞到障碍物上,然后大概过上1秒才能有反应,这种情况咋么破?
小车装4个传感器, 前方两个为F1,F2, 左右各为L,R,原定探测距离20CM时反应,各种撞墙,后来放大到35,还是一样会撞上。
代码是ardublock生成的,大神帮忙看下哪里有问题。
代码如下:
int _ABVAR_4_R;
int _ABVAR_1_F1;
int _ABVAR_2_F2;
int _ABVAR_3_L;
int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  int duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  return duration;
}


void setup()
{
digitalWrite( 8 , LOW );

_ABVAR_2_F2 = 0;
digitalWrite( 12 , LOW );

Serial.begin(9600);
pinMode( 2 , OUTPUT);
_ABVAR_3_L = 0;
digitalWrite( 10 , LOW );

pinMode( 5 , OUTPUT);
_ABVAR_1_F1 = 0;
pinMode( 3 , OUTPUT);
_ABVAR_4_R = 0;
pinMode( 4 , OUTPUT);
digitalWrite( 6 , LOW );

}

void loop()
{
_ABVAR_1_F1 = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 10 , 11 ) ;
delay( 75 );
Serial.print( "Distance F1(cm):" );
Serial.print( _ABVAR_1_F1 );
Serial.println("");
_ABVAR_2_F2 = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 8 , 9 ) ;
delay( 75 );
Serial.print( "Distance F2(cm):" );
Serial.print( _ABVAR_2_F2 );
Serial.println("");
_ABVAR_3_L = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 12 , 13 ) ;
delay( 75 );
Serial.print( "Distance L(cm):" );
Serial.print( _ABVAR_3_L );
Serial.println("");
_ABVAR_4_R = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 6 , 7 ) ;
delay( 75 );
Serial.print( "Distance R(cm):" );
Serial.print( _ABVAR_4_R );
Serial.println("");
digitalWrite( 2 , LOW );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , LOW );
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 30 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 61 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , LOW );
digitalWrite( 3 , HIGH );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 61 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 30 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 30 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 82 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 123 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 245 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 123 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , LOW );
digitalWrite( 3 , HIGH );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 82 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 30 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) >= ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , LOW );
digitalWrite( 3 , HIGH );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 163 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , LOW );
digitalWrite( 3 , HIGH );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 123 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 163 );
}
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) < ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) < ( 25 ) ) && ( ( _ABVAR_4_R ) >= ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 123 );
}
else
{
if (( ( ( ( _ABVAR_1_F1 ) < ( 35 ) ) && ( ( _ABVAR_2_F2 ) >= ( 35 ) ) ) && ( ( ( _ABVAR_3_L ) >= ( 25 ) ) && ( ( _ABVAR_4_R ) < ( 25 ) ) ) ))
{
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , HIGH );
delay( 123 );
}
}
}
{
}
}
}
}
}
}
}
}
}
}
}
}
}
}

回复

使用道具 举报

 楼主| 发表于 2015-8-27 06:20:03 | 显示全部楼层
补充一下,反应迟滞问题已经解决了,但是小车自重比较大,在应有的测试距离上还没等反应就撞墙了,怎么加一个合适的制动程序啊?那个大神指点一下,以前进为例,直接在
digitalWrite( 2 , HIGH );
digitalWrite( 3 , LOW );
digitalWrite( 4 , HIGH );
digitalWrite( 5 , LOW );
delay( 30 );后面加
digitalWrite( 2 , LOW );
digitalWrite( 3 , LOW );
digitalWrite( 4 , LOW );
digitalWrite( 5 , LOW );
delay( 30 );
本想让小车间歇性前进,可是不管用~~~
回复 支持 反对

使用道具 举报

发表于 2015-8-27 11:43:08 | 显示全部楼层
你的检测完到停下来之间的代码似乎有多处delay, 这些delay的时间小车都在前进。建议去掉这些delay,仅仅在loop函数最后delay
4个变量不知道具体含义,没仔细看代码有没逻辑问题
回复 支持 反对

使用道具 举报

发表于 2015-12-25 08:30:38 | 显示全部楼层
我觉的你这个程序是顺序执行,如果最后一个成立时,你小车在执行第一个代码,那么中间的多个delay就是你小车反应慢的原因
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 03:33 , Processed in 0.038064 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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