首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旋转马达型机器人

旋转马达型机器人
EN

Stack Overflow用户
提问于 2014-05-19 04:31:44
回答 2查看 158关注 0票数 0

我正在为一个使用Arduino的项目制作相扑机器人。我没有使用Arduino代码的经验,但我确实有java经验。也就是说,这个机器人有一个边缘检测器来防止它掉下来,一个L298驱动程序,等等。由于我缺乏经验,我不知道Arduino的代码是如何与方法等一起工作的。也就是说,我的主要问题是它是如何在延迟的情况下执行我的方法的?它是否被困在没有返回的方法中?不进去?执行晚些时候结束?目前,它似乎只是运行电机前进,而没有开关或关闭。我也检查过电线。(我为拙劣的问题道歉-堆叠流处女)。

代码语言:javascript
复制
int motor_forward = 10;
int motor_reverse = 9;
int motor2_forward = 13;
int motor2_reverse = 12;
int edgeDec1 = 7;
//int edgeDec2 = 6;

//the setup routine runs once when you press reset;
void setup(){
 //initialize the digital pin as an output.
 pinMode(motor_forward, OUTPUT);
 pinMode(motor_reverse,OUTPUT);
 pinMode(motor2_forward,OUTPUT);
 pinMode(motor2_reverse,OUTPUT);
 pinMode(edgeDec1,INPUT);

}
//the loop routine runs over and over again forever
void loop(){
  int indicator = random(2);

  delay(5000);//5 second delay
  //loop to prevent another 5 second delay
  while(true){
    if (indicator = 0){
      for(int x = 0; x < random(200); x++){
        Forward();
        EdgeDec();
        delay(10);
      }
    }
    else if ( indicator = 1){
       for(int x = 0; x < random(200); x++){
        TurnLeft();
        EdgeDec();
        delay(10);
      }
    }
     else if ( indicator = 2){
       for(int x = 0; x < random(200); x++){
        TurnRight();
        EdgeDec();
        delay(10);
      }
    }

  }

}
void Forward(){
  //right motor
  digitalWrite(motor_forward,1);//terminal d1 will be high
  digitalWrite(motor_reverse,0);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,1);//terminal d1 will be high
  digitalWrite(motor2_reverse,0);//terminal d2 will be low

}
//going in reverse
void Reverse(){
  //right motor
  digitalWrite(motor_forward,0);//terminal d1 will be low
  digitalWrite(motor_reverse,1);//terminal d2 will be high

  //left motor
  digitalWrite(motor2_forward,0);//terminal d1 will be low
  digitalWrite(motor2_reverse,1);//terminal d2 will be high

}
//rotating left
void TurnLeft(){
  //right motor
  digitalWrite(motor_forward,0);//terminal d1 will be high
  digitalWrite(motor_reverse,1);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,1);//terminal d1 will be high
  digitalWrite(motor2_reverse,0);//terminal d2 will be low

}
void TurnRight(){
  //right motor
  digitalWrite(motor_forward,1);//terminal d1 will be high
  digitalWrite(motor_reverse,0);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,0);//terminal d1 will be high
  digitalWrite(motor2_reverse,1);//terminal d2 will be low

}
void EdgeDec(){
  if(edgeDec1 == 1){
     Reverse();
     delay(700);
     TurnLeft();
     delay(1000);
     Forward();

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-19 10:38:10

您的代码中有一些错误/误解,所以我添加了一些简单的调试,在下载代码之后打开Tools>Serial监视器即可。在您的EdgeDec()函数(函数= Java方法)中有if(EdgeDec = 1),但是EdgeDec只是一个值为7的int,您想要的是读取编号为7的引脚的值- if(digitalRead(edgeDec1) == LOW)。

另外,我把你的逻辑从高(1)转到低(0),因为你没有把digitalRead引脚绑起来,要么低(使用外部电阻),要么高(使用Arduino的内部电阻)--读我在代码中的注释。不确定您在使用while(true)循环做什么--也许还需要进一步调试?不管怎样,希望它能帮上忙..。

代码语言:javascript
复制
int motor_forward = 10;
int motor_reverse = 9;
int motor2_forward = 13;
int motor2_reverse = 12;
int edgeDec1 = 7;
//int edgeDec2 = 6;
int indicator; // pulled this out of your loop - askchipbug

String repeatstring; //debugging variable, stops a debug string from repeating in Serial monitor when watching a loop - askchipbug

//the setup routine runs once when you press reset;
void setup(){
  Serial.begin(9600);           // set up Serial library at 9600 bps, using SerialMonitor to debug - askchipbug
  //initialize the digital pin as an output.
  pinMode(motor_forward, OUTPUT);
  pinMode(motor_reverse,OUTPUT);
  pinMode(motor2_forward,OUTPUT);
  pinMode(motor2_reverse,OUTPUT);
  pinMode(edgeDec1,INPUT_PULLUP); // set this high so it doesn't float about - askchipbug
  // you can use the internal 20k pullups with INPUT_PULLUP which means 1 = off, 0 = on
  // or you have to use external pulldown resistors to have 1 = on, 0 = off
  pr("setup completed"); // askchipbug

}
//the loop routine runs over and over again forever
void loop(){
  randomSeed(analogRead(0)); // seeds the random() function with a different number each time the loop runs - askchipbug
  indicator = random(2);  
  pr("indicator: " + String(indicator)); // askchipbug
  pr("5 second delay");
  delay(5000);//5 second delay
  //loop to prevent another 5 second delay
  while(true){
    if (indicator == 0){ //you had this set as indicator = 0 - askchipbug
      pr("indicator: " + String(indicator)); // askchipbug
      for(int x = 0; x < random(200); x++){
        Forward();
        EdgeDec();
        delay(10);
      }
    }
    else if ( indicator = 1){
      pr("indicator: " + String(indicator)); //askchipbug
      for(int x = 0; x < random(200); x++){
        TurnLeft();
        EdgeDec();
        delay(10);
      }
    }
    else if ( indicator = 2){
      pr("indicator: " + String(indicator));// askchipbug
      for(int x = 0; x < random(200); x++){
        TurnRight();
        EdgeDec();
        delay(10);
      }
    }
  }

}
void Forward(){
   //right motor
  pr("forward"); //askchipbug
  digitalWrite(motor_forward,1);//terminal d1 will be high
  digitalWrite(motor_reverse,0);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,1);//terminal d1 will be high
  digitalWrite(motor2_reverse,0);//terminal d2 will be low
}
//going in reverse
void Reverse(){
  pr("reverse"); //askchipbug
  //right motor
  digitalWrite(motor_forward,0);//terminal d1 will be low
  digitalWrite(motor_reverse,1);//terminal d2 will be high

  //left motor
  digitalWrite(motor2_forward,0);//terminal d1 will be low
  digitalWrite(motor2_reverse,1);//terminal d2 will be high
}
//rotating left
void TurnLeft(){
  pr("turn left"); //askchipbug
  //right motor
  digitalWrite(motor_forward,0);//terminal d1 will be high
  digitalWrite(motor_reverse,1);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,1);//terminal d1 will be high
  digitalWrite(motor2_reverse,0);//terminal d2 will be low
}
void TurnRight(){
  pr("turn right"); //askchipbug
  //right motor
  digitalWrite(motor_forward,1);//terminal d1 will be high
  digitalWrite(motor_reverse,0);//terminal d2 will be low

  //left motor
  digitalWrite(motor2_forward,0);//terminal d1 will be high
  digitalWrite(motor2_reverse,1);//terminal d2 will be low
}
void EdgeDec(){
  pr("edge detector: " + String(digitalRead(edgeDec1))); // read pin 7 - askchipbug
  if(digitalRead(edgeDec1) == LOW){ // remember we're using the internal pullups so LOW = on - askchipbug
    pr("edge detected!"); // askchipbug
    Reverse();
    delay(700);
    TurnLeft();
    delay(1000);
    Forward();
  }
}

//simple debug technique - use pr("something"); in your code - askchipbug
void pr(String txt){
  if(repeatstring != txt){
    //if the debug text is different, print it
    Serial.println(txt); //prints the text and adds a newline
    Serial.flush(); //waits for all the data to be printed
    delay(1000); //just pauses the scrolling text for 1 second, make bigger if you want a longer pause
    repeatstring = txt;
  }
}
票数 0
EN

Stack Overflow用户

发布于 2014-05-19 04:36:42

一般说来,Arduino中的delay方法被实现为只是在CPU上执行多个nop的周期,以弥补所需的延迟时间。它本质上是一个阻塞调用,因为它只是完全消耗了delay传递给的参数所指定的足够时间。

例如,假设您的处理器以100 the运行,然后基本上延迟1秒,则需要生成100个nop指令,处理器将执行这些指令。当然,假定这样的指令只需要一个时钟周期。考虑到Arduino Uno是从ATMEGA328p微处理器上运行的,您可能想看看数据表来了解更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23729744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档