我有一个机器人扫地机,我正在创建它检测到墙壁和转弯,当达到一定距离,所以它没有击中。然而,这些动作非常随意,我希望设备开始制作一个小圆圈,然后再增大一个。它似乎陷入了一个大小的圈子,可能会有一点增长。我创建了多个大小的圆形函数,但它似乎没有抓住。提前谢谢。任何帮助,无论多小都会非常感激。
#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);
}
答案 0 :(得分:0)
现在已经很晚了,但我认为您的代码很少会执行smallerCurve();
或smallestCurve();
,因为如果uS/US_ROUNDTRIP_CM
大于50,则首先if
中的代码将会执行uS/US_ROUNDTRIP_CM >= 90
执行并跳转uS/US_ROUNDTRIP_CM >= 110
和else-if
的代码,只有当它介于0和20之间时才会执行不同的操作。照顾好if
,一旦你在else
执行了一段代码,你就会跳过else
,而你的第一个else
会占用你的所有剩余部分码。
事实上,一个好的编译器不会编译这个drive Ardumoto
,因为它们是不可缓存的代码。
此外,您可以通过一些简单的操作来改进代码。小心forward
功能并且不经常使用它,{{1}}没有时间移动你的机器人。在两次动作之间使用延迟。