Arduino制作螺旋

时间:2015-06-02 18:44:19

标签: arduino robotics

我有一个机器人扫地机,我正在创建它检测到墙壁和转弯,当达到一定距离,所以它没有击中。然而,这些动作非常随意,我希望设备开始制作一个小圆圈,然后再增大一个。它似乎陷入了一个大小的圈子,可能会有一点增长。我创建了多个大小的圆形函数,但它似乎没有抓住。提前谢谢。任何帮助,无论多小都会非常感激。

#include<NewPing.h>
#define MOTOR_A 0 
#define MOTOR_B 1
#define TRIGGER_PIN 5
#define ECHO_PIN 4
#define MAX_DISTANCE 200

#define CW 0 
#define CCW 1 

const byte PWMA = 3; 
const byte PWMB = 11; 
const byte DIRA = 12; 
const byte DIRB = 13; 

NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 


void setup() {
  // put your setup code here, to run once:
setupArdumoto(); 
}

void loop() {
  delay(50); 
  unsigned int uS= sonar.ping();

  if(uS/US_ROUNDTRIP_CM>50||uS/US_ROUNDTRIP_CM==0)
  {
    forward(); 
    curve();
    //stopArdumoto(MOTOR_A);
    // stopArdumoto(MOTOR_B);
  }
  else if(uS/US_ROUNDTRIP_CM>=90)
  {
    smallerCurve();
  }

 else if(uS/US_ROUNDTRIP_CM>=110)
 {
   smallestCurve();
 }
  else if(uS/US_ROUNDTRIP_CM<20)
  { 
    //turnRight(100); 
    delay(500); 
  }
  // put your main code here, to run repeatedly:

}
void driveArdumoto(byte motor, byte dir, byte spd) 
{
  if(motor == MOTOR_A)
  {
    digitalWrite(DIRA, dir);
    analogWrite(PWMA, spd); 
  }
  else if(motor==MOTOR_B)
  {
    digitalWrite(DIRB,dir); 
    analogWrite(PWMB, spd); 
  }
}
void curve() 
{
 driveArdumoto(MOTOR_A, CW, 200);
 driveArdumoto(MOTOR_B, CW, 150);
}
void smallerCurve()
{
 driveArdumoto(MOTOR_A, CW, 200);
 driveArdumoto(MOTOR_B, CW, 120);
}
void smallestCurve()
{
 driveArdumoto(MOTOR_A, CW, 200);
 driveArdumoto(MOTOR_B, CW, 100);
}
void forward()
{
  driveArdumoto(MOTOR_A,CW,170);
  driveArdumoto(MOTOR_B,CW,170); 
}

void turnRight(byte spd)
{
  stopArdumoto(MOTOR_B); 
  driveArdumoto(MOTOR_A,CW,250); 
}
void turnLeft(byte spd) 
{
   stopArdumoto(MOTOR_A); 
   driveArdumoto(MOTOR_B,CW,250); 
}
void stopArdumoto(byte motor)
{
    driveArdumoto(motor, 0,0); 
}

void setupArdumoto()
{
   pinMode(PWMA,OUTPUT);
   pinMode(PWMB,OUTPUT);
   pinMode(DIRA,OUTPUT);
   pinMode(DIRB,OUTPUT); 

   digitalWrite(PWMA, LOW);
   digitalWrite(PWMB, LOW);
   digitalWrite(DIRA, LOW);
   digitalWrite(DIRB, LOW);
}

1 个答案:

答案 0 :(得分:0)

现在已经很晚了,但我认为您的代码很少会执行smallerCurve();smallestCurve();,因为如果uS/US_ROUNDTRIP_CM大于50,则首先if中的代码将会执行uS/US_ROUNDTRIP_CM >= 90执行并跳转uS/US_ROUNDTRIP_CM >= 110else-if的代码,只有当它介于0和20之间时才会执行不同的操作。照顾好if,一旦你在else执行了一段代码,你就会跳过else,而你的第一个else会占用你的所有剩余部分码。 事实上,一个好的编译器不会编译这个drive Ardumoto,因为它们是不可缓存的代码。

此外,您可以通过一些简单的操作来改进代码。小心forward功能并且不经常使用它,{{1}}没有时间移动你的机器人。在两次动作之间使用延迟。