Arduino:void loop()给出了意外的结果

Arduino:void loop()给出了意外的结果,arduino,robot,Arduino,Robot,我正在开发一个简单的机器人(有4个轮子的底座),它可以向前移动,通过距离传感器检测物体,并用手臂拾取。物体是一个盒子,从上到下有某种把手,因此手臂被放在物体的把手下面,并向上抬起。我想要完成的任务是机器人应该向前移动并将对象放置在容器中(它也是一个物理对象),放置在某个指定的位置 机器人移动时,底座轮子上有4个直流电机,手臂由一个单独的直流电机控制 我想要的是: 机器人应该向前移动,直到它检测到物体 当检测到物体时,应停止车轮,并启动手臂向上提升物体 然后它应该向前移动,直到它检测到第二个物体,

我正在开发一个简单的机器人(有4个轮子的底座),它可以向前移动,通过距离传感器检测物体,并用手臂拾取。物体是一个盒子,从上到下有某种把手,因此手臂被放在物体的把手下面,并向上抬起。我想要完成的任务是机器人应该向前移动并将对象放置在容器中(它也是一个物理对象),放置在某个指定的位置

机器人移动时,底座轮子上有4个直流电机,手臂由一个单独的直流电机控制

我想要的是:

机器人应该向前移动,直到它检测到物体
当检测到物体时,应停止车轮,并启动手臂向上提升物体
然后它应该向前移动,直到它检测到第二个物体,即容器
当检测到第二个物体(容器)时,应停止车轮并激活手臂,将物体放入容器中

为此,我编写了以下代码

#define mp1 3
#define mp2 4
#define m2p1 5
#define m2p2 6

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

#define armPin1 9  // Pin 1 of arm
#define armPin2 10  // Pin 2 of arm

int maximumRange = 200; // Maximum range needed
int minimumRange = 18; // Minimum range needed
long duration, distance; // Duration used to calculate distance

int first = 0;

void setup()
{
  Serial.begin(9600);

 //Setting the pins of motors
 pinMode(mp1, OUTPUT);
 pinMode(mp2, OUTPUT);
 pinMode(m2p1, OUTPUT);
 pinMode(m2p2, OUTPUT);

 //Setting the pins of distance sensor
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);

 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

 pinMode(armPin1, OUTPUT);
 pinMode(armPin2, OUTPUT);
}// end setup method

long calculateDistance(){
  //Code of distance sensor
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20); 

  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);

 //Calculate the distance (in cm) based on the speed of sound.
 return duration/58.2;
}

void loop()
{
  distance = calculateDistance();

  while(distance > minimumRange) {
    forward();
    distance = calculateDistance();
  }

  while(distance <= minimumRange && first == 0){
    stopMotors();

    pickObject();

    distance = calculateDistance();
  }

  while(distance > minimumRange) {
    forward();
    distance = calculateDistance();
  }

  while(distance <= minimumRange && first == 1){
    stopMotors();

    putObject();

    distance = calculateDistance();
  }// end second while copied 

  first = 1;

}// end loop function

void pickObject(){
  digitalWrite(armPin1, LOW);
  digitalWrite(armPin2, HIGH);
}

void putObject(){
  digitalWrite(armPin1, HIGH);
  digitalWrite(armPin2, LOW);
}

void stopMotors(){
  digitalWrite(mp1, LOW);
  digitalWrite(mp2, LOW);
  digitalWrite(m2p1, LOW);
  digitalWrite(m2p2, LOW);
}

void forward(){
  digitalWrite(mp1, LOW);
  digitalWrite(mp2, HIGH);
  digitalWrite(m2p1, HIGH);
  digitalWrite(m2p2, LOW);
}
#定义mp1 3
#定义mp2 4
#定义m2p1 5
#定义m2p2 6
#定义echoPin 7//echoPin
#定义触发器引脚8//触发器引脚
#定义LED引脚13//板载LED
#定义臂销1 9//臂销1
#定义臂销2 10//臂销2
int maximumRange=200;//所需的最大范围
int最小范围=18;//所需的最小范围
长持续时间、距离;//用于计算距离的持续时间
int first=0;
无效设置()
{
Serial.begin(9600);
//设置电机的引脚
引脚模式(mp1,输出);
引脚模式(mp2,输出);
引脚模式(m2p1,输出);
引脚模式(m2p2,输出);
//设置距离传感器的针脚
引脚模式(trigPin,输出);
pinMode(echoPin,输入);
引脚模式(LED引脚,输出);//使用LED指示灯(如果需要)
引脚模式(armPin1,输出);
引脚模式(armPin2,输出);
}//端部设置方法
长计算站(){
//距离传感器编码
数字写入(trigPin,低电平);
延迟微秒(2);
数字写入(trigPin,高);
延迟微秒(20);
数字写入(trigPin,低电平);
持续时间=脉冲强度(echoPin,高);
//根据声速计算距离(以厘米为单位)。
返回时间/58.2;
}
void循环()
{
距离=计算距离();
同时(距离>最小范围){
前进();
距离=计算距离();
}
while(距离最小范围){
前进();
距离=计算距离();
}
而(距离这是你的问题:


循环函数不断运行,每次结束都会重新启动。您将第一个设置为1,但从未将其重新设置为0,因此它首先经过的每个循环都是1

while(distance <= minimumRange && first == 1){
    stopMotors();

    putObject();

    distance = calculateDistance();
  }// end second while copied 

  first = 1;
while(distance <= minimumRange && first == 1){
    stopMotors();

    putObject();

    distance = calculateDistance();
}// end second while copied 

first = 1;
while(distance这是您的问题:


循环函数不断运行,每次结束都会重新启动。您将第一个设置为1,但从未将其重新设置为0,因此它首先经过的每个循环都是1

while(distance <= minimumRange && first == 1){
    stopMotors();

    putObject();

    distance = calculateDistance();
  }// end second while copied 

  first = 1;
while(distance <= minimumRange && first == 1){
    stopMotors();

    putObject();

    distance = calculateDistance();
}// end second while copied 

first = 1;

while(distanceThe
loop
方法不断重复,直到电池耗尽或关闭机器人

我没有你的机器人,所以很难测试你的代码,但也许,恕我直言,你的方法并不完全正确

对于我的机器人,我使用基于行为的
。每个循环(每秒数百次)机器人都会询问有关环境及其内部状态的问题。根据答案,它会选择正确的行为

您使用的方法是基于行为的机器人的良好开端。以下是一些幻灯片,解释了所有这些:


希望它能有所帮助!

这个
循环
方法会不断重复,直到你的电池用完或机器人关机

我没有你的机器人,所以很难测试你的代码,但也许,恕我直言,你的方法并不完全正确

对于我的机器人,我使用基于行为的
。每个循环(每秒数百次)机器人都会询问有关环境及其内部状态的问题。根据答案,它会选择正确的行为

您使用的方法是基于行为的机器人的良好开端。以下是一些幻灯片,解释了所有这些:


希望能有所帮助!

我最初的答案与@Bmoore的诊断结果一致,但我现在相信
loop()
中的算法基本上是正确的


  • 我们在第一次迭代中,
    first==0
    。您输入
    while(distance>minimumRange)
    ,直到条件中断为止。
    distance
    现在是
    minimumRange)
    。你一直呆在里面直到病情发作。
    距离现在是
    我最初的答案与@Bmoore在诊断中的答案一致,但我现在相信你在
    循环()中的算法基本上是正确的


  • 我们在第一次迭代中,
    first==0
    。您输入
    while(distance>minimumRange)
    ,直到条件中断为止。
    distance
    现在是
    minimumRange)
    。你一直呆在里面直到条件解除。
    距离现在是
    循环函数不断运行,每次结束它都会重新启动。你将first设置为1,但从未将其重新设置为0,因此它首先经过的每个循环都是1

    while(distance <= minimumRange && first == 1){
        stopMotors();
    
        putObject();
    
        distance = calculateDistance();
      }// end second while copied 
    
      first = 1;
    
    while(distance <= minimumRange && first == 1){
        stopMotors();
    
        putObject();
    
        distance = calculateDistance();
    }// end second while copied 
    
    first = 1;
    

    while(distance循环函数持续运行,每次结束时它都会重新启动。您将first设置为1,但从未将其重新设置为0,因此它首先经过的每个循环都是1

    while(distance <= minimumRange && first == 1){
        stopMotors();
    
        putObject();
    
        distance = calculateDistance();
      }// end second while copied 
    
      first = 1;
    
    while(distance <= minimumRange && first == 1){
        stopMotors();
    
        putObject();
    
        distance = calculateDistance();
    }// end second while copied 
    
    first = 1;
    

    while(距离我写Arduino代码已经有一段时间了,但我想试试。你还没有指定它做错了什么。我猜它只是不停地移动?在任何情况下,请编辑你的问题以包含这些信息。@TheTerribleSwiftTomato:当它感觉到任何物体时,它会停止,但随后会向下移动手臂。)很长时间了。我已经有一段时间没有写Arduino公司了