Arduino IDE

#include<Serio.h>

#define S_LIMIT_1 18

#define S_LIMIT_3 8

#define S_LIMIT_2 100

long timer,runtime;\

const long TIME_OUT=5000;

Servo myservo;

int ServoPin=10

int pos=0

#define MOTORADJUSTMENT

int MotorAdjustmengPin=A1;

const int trig=4;

const int echo=7;

const int DIR1_RIGHT=12;

const int DIR2_RIGHT=11;

const int DIR1_LEFT=8;

const int DIR2_LEFT=9;

const int PWM_LEFT=6;

const int PWM_RIGHT=5;

int Bit_Front,Bit_Left,Bit_Right;

 

void setup()

{

pinMode(echo,INPUT);

pinMode(trig,OUTPUT);

pinMode(DIR1_RIGHT,OUTPUT);

pinMode(DIR2_RIGHT,OUTPUT);

pinMode(DIR1_LEFT,OUTPUT);

pinMode(DIR2_LEFT,OUTPUT);

pinMode(PWM_LEFT,OUTPUT);

pinMode(PWM_RIGHT,OUTPUT);

myservo.attach(ServoPin);

Servo.begin(9600);

}

 

void motorsWrite(int speedLeft,int speedRight)

float motorAdjustment=MotorAdjustment();

if(motorAdjustment<0){

 speedRight*=(1+motorAdjustment);

}

else{

   speedLeft*=(1-motorAdjustment);

}

if(speedRight>0);

{

     digitalWrite(DIR1_RIGHT,1);

     digitalWrite(DIR2_RIGHT,0);

}

else

{

    digitalWrite(DIR1_RIGHT,1);

    digitalWrite(DIR2_RIGHT,0);

}

analogWrite(PWM_RIGHT, abs(speedRight));

 

if(speedLeft>0);

{

  digitalWrite(DIR1_LEFT,1); 

  digitalWrite(DIR2_LEFT,0);

}

else

{

     digitalWrite(DIR1_LEFT,1);

     digitalWrite(DIR2_LEFT,1);

}

analogWrite(PWM_RIGHT, abs(speedRight));

 

int ranging()

{

 long IntervalTime=0;

 digitalWrite(trig,1);

 delayMicroseconds(15);

 digitalWrite(trig,0);

 IntervalTime=pulseIn(echo,HIGH);

 int S=IntervalTime/58;

 return S;

}

void loop()

{

int S,SL,SR;

int TimerFlag=0;

myservo.write(90);

while(1);

{

   if((millis()-TIME_OUT))

}

 TimerFlag=1;

}

myservo.write(90);

delay(300);

S= ranging();

Serial.printIn(5);

if(S<=S_LIMIT_3)

   back(300)

if(S<=S_LIMIT_1||TimerFlag==1)

{

 timer=millis();

 TimerFlag=0;

 stopMotor();

 myservo.write(45);

 delay(300);

 int SR=ranging();

 myservo.write(145);

 delay(300);

 int SL=ranging();

 myservo.write(90);

 delay(300);

 int SM = ranging();

 if(SL>_LIMIT_1 && SR>S_LIMIT_1 && SM <S_LIMIT_1)

  turnRight(100);

 else if(SL<=S_LIMIT_1 && SR>S_LIMIT_1)

  turnRight(100);

 else if(SL>s_LIMIT_1 && SR<=S_LIMIT_1)

  turnRight(100);

 else if(SL<=S_LIMIT_1 && SR>S_LIMIT_1)

   back(300);

}

else

  run(60);

 }

}

void run(int pct)

{

  motorsWritePct(pct,pct);

}

void turnRight(int runtime)

{

 motorsWritePct(100,0);

 delay(runtime);

}

void turnLeft(int runtime)

{

 motorsWritePct(0,100);

 delay(runtime);

 }

void back(int runtime)

{

 motorsWritePct(-80-50);

 delay(runtime);

 }

void stopmotor()

{

  int16_t speedLeft=255*speedLeftPct/100.0;

  int16_t speedRight=255*speedRightPct/100.0;

  motorsWrite(speedLeft,speedRight);

}

float  MotorAdjustment()

{

#ifdef MOTORADJUSTMENT

  float motorAdjustment=map(analogRead(MotorAdjustmentPin),0,1023,-30,30)/100.0;

  return motorAdjustment;

#else

  return 0;

#endif

}

 

 

 



返回

2 条评论

  • 最新修改
    #1 楼 · IP: 124.79.159.90
    2025-12-20 15:52

    1. 代码主要问题检查 (Code Check)

    这份代码中有几十处错误,主要分为以下几类:

    A. 语法与格式错误 (Syntax Errors)

    1. 头文件拼写错误#include<Serio.h> 应为 <Servo.h>

    2. 标点符号缺失:

      • int ServoPin=10 后面少了分号 ;

      • int pos=0 后面少了分号 ;

      • back(300) 后面少了分号 ;

    3. 中英文符号混用pinMode(echo,INPUT); 使用了中文全角括号,编译器无法识别。

    4. 多余的符号long timer,runtime;\ 后面有多余的反斜杠。

    5. 错误的类调用Servo.begin(9600); 是错误的,应该是串口初始化 Serial.begin(9600);

    B. 逻辑与结构错误 (Logic Errors)

    1. 致命的死循环:

      • 在 loop 函数中,while(1); 后面直接跟了分号。这会导致程序卡死在这里,永远不执行后面的代码。

      • if(speedRight>0); 后面加了分号,导致 if 语句失效,无论条件如何,后面的代码块都会执行。

    2. 电机控制逻辑混乱 (:

      • 函数未闭合: 缺少 {

      • 复制粘贴错误: 在处理左轮逻辑时,最后写的是 analogWrite(PWM_RIGHT, ...),导致左轮无法调速,一直在控制右轮。

      • 方向控制错误else 分支(后退)的引脚电平设置与 if 分支(前进)完全一样,导致小车无法后退。

    3. 函数定义缺失: 代码中调用了 motorsWritePct,但并未定义该函数。

    4. 变量未定义stopmotor 函数中使用了 speedLeftPct,但这两个变量从未声明。

    C. 拼写错误 (Typos)

    1. MotorAdjustmengPin -> MotorAdjustmentPin (g -> t).

    2. Serial.printIn -> Serial.println (是小写 L,不是大写 I)。

    3. _LIMIT_1 -> S_LIMIT_1

    4. s_LIMIT_1 -> S_LIMIT_1 (大小写不一致)。

    2. 修复后的代码 (Corrected Code):

     

    #include <Servo.h>
     
    // --- 常量定义 ---
    #define S_LIMIT_1 18   // 避障距离阈值
    #define S_LIMIT_3 8
    #define S_LIMIT_2 100
     
    // --- 引脚定义 ---
    const int ServoPin = 10;
    const int MotorAdjustmentPin = A1; // 修正拼写
    const int trig = 4;
    const int echo = 7;
     
    // L298N 电机驱动引脚
    const int DIR1_RIGHT = 12;
    const int DIR2_RIGHT = 11;
    const int DIR1_LEFT = 8;
    const int DIR2_LEFT = 9;
    const int PWM_LEFT = 6;
    const int PWM_RIGHT = 5;
     
    // --- 全局变量 ---
    long timer;
    const long TIME_OUT = 5000;
    Servo myservo;
    int pos = 0;
     
    // 宏定义开关
    #define MOTORADJUSTMENT
     
    void setup() {
      // 修正中英文符号
      pinMode(echo, INPUT);
      pinMode(trig, OUTPUT);
      pinMode(DIR1_RIGHT, OUTPUT);
      pinMode(DIR2_RIGHT, OUTPUT);
      pinMode(DIR1_LEFT, OUTPUT);
      pinMode(DIR2_LEFT, OUTPUT);
      pinMode(PWM_LEFT, OUTPUT);
      pinMode(PWM_RIGHT, OUTPUT);
     
      myservo.attach(ServoPin);
      Serial.begin(9600); // 修正为 Serial
      
      // 初始舵机位置
      myservo.write(90);
    }
     
    // 获取电机速度微调系数
    float MotorAdjustment() {
    #ifdef MOTORADJUSTMENT
      // 读取电位器,映射到 -0.3 到 0.3 之间
      float adjustment = map(analogRead(MotorAdjustmentPin), 0, 1023, -30, 30) / 100.0;
      return adjustment;
    #else
      return 0;
    #endif
    }
     
    // 核心电机控制函数
    void motorsWrite(int speedLeft, int speedRight) {
      // 获取微调系数
      float adjustment = MotorAdjustment();
      
      // 应用微调 (简单的差速逻辑)
      if (adjustment < 0) {
        speedRight *= (1 + adjustment); 
      } else {
        speedLeft *= (1 - adjustment);
      }
     
      // --- 右电机控制 ---
      if (speedRight > 0) {
        digitalWrite(DIR1_RIGHT, HIGH);
        digitalWrite(DIR2_RIGHT, LOW);
      } else if (speedRight < 0) {
        digitalWrite(DIR1_RIGHT, LOW);
        digitalWrite(DIR2_RIGHT, HIGH);
      } else {
        digitalWrite(DIR1_RIGHT, LOW);
        digitalWrite(DIR2_RIGHT, LOW);
      }
      analogWrite(PWM_RIGHT, abs(speedRight));
     
      // --- 左电机控制 ---
      if (speedLeft > 0) {
        digitalWrite(DIR1_LEFT, HIGH);
        digitalWrite(DIR2_LEFT, LOW);
      } else if (speedLeft < 0) {
        digitalWrite(DIR1_LEFT, LOW);
        digitalWrite(DIR2_LEFT, HIGH);
      } else {
        digitalWrite(DIR1_LEFT, LOW);
        digitalWrite(DIR2_LEFT, LOW);
      }
      analogWrite(PWM_LEFT, abs(speedLeft)); // 修正为 PWM_LEFT
    }
     
    // 辅助函数:按百分比控制电机 (-100 到 100)
    void motorsWritePct(int leftPct, int rightPct) {
      int speedLeft = map(leftPct, -100, 100, -255, 255);
      int speedRight = map(rightPct, -100, 100, -255, 255);
      motorsWrite(speedLeft, speedRight);
    }
     
    // 超声波测距
    int ranging() {
      digitalWrite(trig, HIGH);
      delayMicroseconds(15);
      digitalWrite(trig, LOW);
      long IntervalTime = pulseIn(echo, HIGH);
      int S = IntervalTime / 58;
      return S;
    }
     
    // 停止电机
    void stopMotor() {
      motorsWrite(0, 0);
    }
     
    // 前进
    void run(int pct) {
      motorsWritePct(pct, pct);
    }
     
    // 后退
    void back(int runtime) {
      motorsWritePct(-50, -50); // 后退速度
      delay(runtime);
    }
     
    // 右转
    void turnRight(int runtime) {
      motorsWritePct(60, -60); // 原地旋转
      delay(runtime);
    }
     
    // 左转
    void turnLeft(int runtime) {
      motorsWritePct(-60, 60); // 原地旋转
      delay(runtime);
    }
     
    void loop() {
      int S, SL, SR, SM; // 定义局部变量
      
      // 每次循环前保持舵机朝前
      myservo.write(90); 
      delay(100); // 给舵机一点时间归位
     
      S = ranging();
      Serial.println(S); // 打印距离调试
     
      // 如果距离小于阈值,说明有障碍物
      if (S <= S_LIMIT_1) {
        stopMotor();
        back(300);      // 先后退一点
        stopMotor();
        
        // 1. 看右边
        myservo.write(45); // 实际上45度通常是右边(取决于安装方向)
        delay(500);
        SR = ranging();
        
        // 2. 看左边
        myservo.write(145);
        delay(500);
        SL = ranging();
        
        // 3. 回正
        myservo.write(90);
        delay(300);
        
        // 决策逻辑
        if (SL > S_LIMIT_1 && SL > SR) {
          // 左边开阔 -> 左转
          turnLeft(400); 
        } else if (SR > S_LIMIT_1 && SR >= SL) {
          // 右边开阔 -> 右转
          turnRight(400);
        } else {
          // 两边都堵死了 -> 掉头或大幅度后退
          turnRight(800); 
        }
      } else {
        // 前方无障碍 -> 前进
        run(60); 
      }
    }

  • 王钧尧
    #2 楼 · IP: 218.78.210.192
    2025-12-16 11:34

    谢谢,我会加以改正的

发表评论