// 定义红色LED引脚
int red_led = 11;
// 定义8个距离传感器的距离数组
volatile int proximity[8];
// 定义8个距离传感器的模拟输入引脚
unsigned char analogPin[8] = {A0,A1,A2,A3,A4,A5,A6,A7};
// 定义左电机PWM引脚
int PWM_left = 6;
// 定义左电机方向引脚
int left_dir = 7;
// 定义右电机PWM引脚
int PWM_right = 5;
// 定义右电机方向引脚
int right_dir = 2;
// 定义基础速度
volatile int base_speed = 12;

void setup() {
  // 设置红色LED引脚为输出模式
  pinMode(red_led,OUTPUT);
  // 设置串口通信波特率为57600
  Serial.begin(57600);
}

void loop() {
  // 读取传感器7的距离
  int distance1 = readProximityDistance(7);
  // 读取传感器5的距离
  int distance2 = readProximityDistance(5);
  // 读取传感器6的距离
  int distance3 = readProximityDistance(6);
  // 读取传感器0的距离
  int distance4 = readProximityDistance(0);
  // 读取传感器2的距离
  int distance5 = readProximityDistance(2);
  
  // 如果传感器6感应到左侧存在墙体
  if(distance3 == 0) {
    // 左电机向前转动
    leftMotorForward(base_speed+2);
    // 右电机向前转动
    rightMotorForward(base_speed);
  }
  // 如果传感器0感应到前方存在障碍物且传感器2感应到右侧不存在障碍物
  else if(distance4 == 0 && distance5 == 1) {
    // 停止电机运动
    MotorStop();
    // 延时500毫秒
    delay(500);
    // 右电机向前转动
    rightMotorForward(base_speed);
    // 延时500毫秒
    delay(500);
  }
  // 否则
  else {
    // 左电机向前转动
    leftMotorForward(base_speed);
    // 右电机向前转动
    rightMotorForward(base_speed+3);
  }
  
  // 如果四个地面传感器同时感应到黑色
  if(proximity[0] < 500 && proximity[1] < 500 && proximity[2] < 500 && proximity[3] < 500) {
    // 停止电机运动
    MotorStop();
  }
}

// 初始化红外LED
void initIRLED(){
  // 设置PORTA为输出模式
  DDRA |= B11111111;
  // 将PORTA的所有引脚都设置为低电平
  PORTA &= B00000000; 
}

// 打开指定传感器对应的LED
void proxLEDon(unsigned char proxIndex){
  PORTA |= 1<<proxIndex;
}

// 关闭指定传感器对应的LED
void proxLEDoff(unsigned char proxIndex){
  PORTA &= ~(1<<proxIndex);
}

// 读取指定传感器的距离,如果感应到墙体,则距离为0,否则为1
int readProximityDistance(unsigned char proxIndex){
      int distance;
      // 打开传感器对应的LED
      proxLEDon(proxIndex);
      // 延时1毫秒          
      delay(1);
      // 读取传感器的模拟输入值
      proximity[proxIndex] = analogRead(analogPin[proxIndex]);
      // 如果传感器感应到墙体,则距离为0,否则为1
      distance = proximity[proxIndex] < 500 ? 0 : 1;
      // 关闭传感器对应的LED
      proxLEDoff(proxIndex);
      // 返回距离值
      return distance;
}

// 停止电机
void MotorStop(){
  // 右电机方向引脚设置为高电平
  digitalWrite(right_dir, HIGH);
  // 右电机PWM引脚设置为高电平
  digitalWrite(PWM_right, HIGH);
  // 左电机方向引脚设置为高电平
  digitalWrite(left_dir, HIGH);
  // 左电机PWM引脚设置为高电平
  digitalWrite(PWM_left, HIGH);
}

// 左电机前进
dk
void leftMotorForward(float duty){
  int dutyInt = duty;
  // 将占空比映射到0-100之间
  int dutyVal = map(dutyInt,0,100,0,100);
  // 设置左电机PWM值
  analogWrite(PWM_left, dutyVal);
  // 设置左电机方向引脚为低电平
  analogWrite(left_dir, 0);
}

// 右电机前进
void rightMotorForward(float duty){
  int dutyInt = duty;
  // 将占空比映射到0-100之间
  int dutyVal = map(dutyInt,0,100,0,100);
  // 设置右电机PWM值
  analogWrite(PWM_right, dutyVal);
  // 设置右电机方向引脚为低电平
  analogWrite(right_dir, 0);
}

// 左电机后退
void leftMotorBackward(float duty){
  int dutyInt = duty;
  // 将占空比映射到0-80之间
  int dutyVal = map(dutyInt,0,100,0,80);
  // 设置左电机PWM值为0
  analogWrite(PWM_left, 0);
  // 设置左电机方向引脚为占空比值
  analogWrite(left_dir, dutyVal);
}

// 右电机后退
void rightMotorBackward(float duty){
  int dutyInt = duty;
  // 将占空比映射到0-80之间
  int dutyVal = map(dutyInt,0,100,0,80);
  // 设置右电机PWM值为0
  analogWrite(PWM_right, 0);
  // 设置右电机方向引脚为占空比值
  analogWrite(right_dir, dutyVal);
}
Arduino循墙机器人代码:使用proximity sensor实现避障和沿墙行走

原文地址: https://www.cveoy.top/t/topic/jpUq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录