c++ - 带有超声波传感器(避障)代码的手势控制汽车无法正常工作

标签 c++ arduino arduino-uno

我正在做一个项目,我正在用三个超声波传感器制作一个手势控制的汽车,所以这是我写的代码,但代码没有正常工作。左、右或前传感器应该在它与障碍物之间的距离小于 6 厘米时,它应该相应地躲避障碍物,但它不是那样工作的,而是向后退并停止,一次又一次地重复这一过程。

基本上,此代码应按如下方式工作:

  1. 从 HT12D 获取输入
  2. 检查引脚 10、引脚 11、引脚 12 或引脚 13 是高电平还是低电平,即 1 或 0
  3. Arduino 将接受此输入并做出相应的决定。

代码如下:

#include <NewPing.h>
#define Q0 0//connect pin 10 of HT12D to arduino D0
#define Q1 1//connect pin 11 of HT12D to arduino D1
#define Q2 2//connect pin 12 of HT12D to arduino D2
#define Q3 3//connect pin 13 of HT12D to arduino D3
#define TRIGGER_PIN 4//connect trigpin of ultrasonic sensor 1 to arduino D4
#define TRIGGER_PIN1 5//connect trigpin of ultrasonic sensor 2 to arduino D5
#define TRIGGER_PIN2 6//connect trigpin of ultrasonic sensor 3 to arduino D6
#define ECHO_PIN 7//connect echopin of ultrasonic sensor 1 to arduino D7
#define ECHO_PIN1 8//connect echopin of ultrasonic sensor 2 to arduino D8
#define ECHO_PIN2 9//connect echopin of ultrasonic sensor 3 to arduino D9
#define P1 10//connect D10 of arduino to pin 2 of L293D
#define P2 11//connect D11 of arduino to pin 7 of L293D
#define P3 12//connect D12 of arduino to pin 15 of L293D
#define P4 13//connect D13 of arduino to pin 10 of L293D
#define MAX_DISTANCE 200//Maximum distance we want to ping (in cm)
long duration, distance, RightSensor, FrontSensor, LeftSensor;

void setup() 
{
  Serial.begin (9600);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(TRIGGER_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(TRIGGER_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(Q0, INPUT);
pinMode(Q1, INPUT);
pinMode(Q2, INPUT);
pinMode(Q3, INPUT);
pinMode(P1, OUTPUT);
pinMode(P2, OUTPUT);
pinMode(P3, OUTPUT);
pinMode(P4, OUTPUT);

}

void loop() 
{ 
NewPing sonar(TRIGGER_PIN, ECHO_PIN);//pings fornt sensor
RightSensor = distance;
NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1);//pings right sensor
LeftSensor = distance;
NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2);//pings left sensor
FrontSensor = distance;

Serial.print(LeftSensor);
Serial.print(" - ");
Serial.print(FrontSensor);
Serial.print(" - ");
Serial.println(RightSensor);
if(RightSensor>5 && LeftSensor>5 && FrontSensor>5)//if the bot is in safe zone then
  {
    if(Q0==1 && Q1==0 && Q2==1 && Q3==0)
    forward_();
    else if(Q0==0 && Q1==1 && Q2==0 && Q3==1)
     backward_();
    else if(Q0==1 && Q1==0 && Q2==0 && Q3==1)
     right_();
    else if(Q0==0 && Q1==1 && Q2==1 && Q3==0)
     left_(); 
  }
else if(FrontSensor<=5)
 {
   if(LeftSensor>5 && RightSensor<5)
   {
    backward_();
    delay(250);
    left_();
    delay(500);
   }
   else if(RightSensor>5 && LeftSensor<5)
   {
   backward_();
   delay(250);
   right_();
   delay(500);
   }
   else if(RightSensor<5 && LeftSensor<5)
   {
   backward_();
   delay(250);
   stop_();
   delay(500);
 }
}
else if(LeftSensor<=5)
 {
  right_();
  delay(250);
  backward_();
  delay(500);
 }
else if(RightSensor<=5)
{
  left_();
  delay(250);
  backward_();
  delay(500);
}

}

void stop_()
{
  Serial.println("");
  Serial.println("STOP");
  digitalWrite(P1,LOW);
  digitalWrite(P2,LOW);
  digitalWrite(P3,LOW);
  digitalWrite(P4,LOW);
}
void forward_()
{
  Serial.println("");
  Serial.println("FORWARD");
  digitalWrite(P1,HIGH);
  digitalWrite(P2,LOW);
  digitalWrite(P3,HIGH);
  digitalWrite(P4,LOW);
}
void backward_()
{
  Serial.println("");
  Serial.println("BACKWARD");
  digitalWrite(P1,LOW);
  digitalWrite(P2,HIGH);
  digitalWrite(P3,LOW);
  digitalWrite(P4,HIGH);
}
void left_()
{
  Serial.println("");
  Serial.println("LEFT");
  digitalWrite(P1,LOW);
  digitalWrite(P2,HIGH);
  digitalWrite(P3,HIGH);
  digitalWrite(P4,LOW);
}
void right_()
{
  Serial.println("");
  Serial.println("RIGHT");
  digitalWrite(P1,HIGH);
  digitalWrite(P2,LOW);
  digitalWrite(P3,LOW);
  digitalWrite(P4,HIGH);
}

最佳答案

您实际上从未测量过距离,这会导致所有右/前/左传感器的值都小于 5。

你的代码哪里出错了:

NewPing sonar(TRIGGER_PIN, ECHO_PIN);//pings fornt sensor
RightSensor = distance;

变量“distance”已声明,但从未赋值。我很惊讶你没有收到编译错误。

根据 NewPing 库的文档(阅读 here - 请这样做!):

首先创建一个NewPing对象。您做对了 - NewPing sonar(TRIGGER_PIN, ECHO_PIN);。但是,这不是“执行 ping”,而是创建一个可用于执行 ping 的对象。因此,您应该在 void setup() 中执行此操作。您只需创建声纳一次(嗯,一次 3 次,即:前、左和右),然后每次都对同一个对象执行 ping 操作。

接下来,在 void loop() 中,您可以使用 RightSensor = sonar.ping_cm(); 进行测量,这会 ping 传感器并返回以厘米为单位的距离。

关于c++ - 带有超声波传感器(避障)代码的手势控制汽车无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955583/

相关文章:

c++ - 函数指针中的协变类型

c - 如何在arduino中使用标准c头文件

arduino - 如何通过 adafruit mcp23017.h 库使用多个 mcp23017 芯片

c++ - Arduino:将函数传递给类,返回字符串

c - 使用Arduino生成黄金码调制的正弦波

parse-platform - 将 Arduino Uno 与以太网扩展板连接到 parse.com 数据库

构造函数的 C++ 语法 "' Object1 a (1, Object1(2) )''

c++ - 如何防止以 A 类之外的任何其他方式制作 B 类对象

c++ dtor释放_bstr_t内存

c++ - 串行监视器不显示来自设置或主程序的代码 - 波特率 9600