int red_led = 11; //定义红色LED的引脚号为11 volatile int proximity[8]; //定义一个可变的、包含8个元素的整型数组proximity unsigned char analogPin[8] = {A0,A1,A2,A3,A4,A5,A6,A7}; //定义一个包含8个元素的无符号字符型数组analogPin,用于存储模拟输入引脚的编号 int PWM_left = 6; //定义左电机PWM控制引脚号为6 int left_dir = 7; //定义左电机方向控制引脚号为7 int PWM_right = 5; //定义右电机PWM控制引脚号为5 int right_dir = 2; //定义右电机方向控制引脚号为2 volatile int base_speed = 12; //定义一个可变的整型变量base_speed,初始值为12 void setup() { //初始化函数,只执行一次 pinMode(red_led,OUTPUT); //将红色LED的引脚设置为输出模式 Serial.begin(57600); //初始化串口通信,波特率为57600 }

void loop() { //主函数,循环执行 int distance1 = readProximityDistance(7); //读取第7个红外传感器的距离值,并将其赋值给distance1 int distance2 = readProximityDistance(5); //读取第5个红外传感器的距离值,并将其赋值给distance2 Serial.print("distance1:"); //通过串口输出距离值 Serial.println(distance1); Serial.print("distance2:");
Serial.println(distance2); if((distance1>=15 && distance1<20)&&(distance2>=15 && distance2<20) ) //如果两个传感器都检测到障碍物距离在15-20mm之间 { leftMotorForward(base_speed+2); //左电机向前转动,速度为base_speed+2 rightMotorForward(base_speed); //右电机向前转动,速度为base_speed } else if(distance1>=20 && distance2<20) //如果第7个传感器检测到障碍物距离大于20mm,而第5个传感器未检测到 { leftMotorForward(base_speed); //左电机向前转动,速度为base_speed rightMotorForward(base_speed+1); //右电机向前转动,速度为base_speed+1 } else if(distance1>=20 && distance2>=20){ //如果两个传感器都检测到障碍物距离大于20mm leftMotorForward(base_speed); //左电机向前转动,速度为base_speed rightMotorForward(base_speed+3); //右电机向前转动,速度为base_speed+3 } else if(distance1<15 && distance2>15){ //如果第7个传感器未检测到障碍物,而第5个传感器检测到障碍物 leftMotorForward(base_speed+3); //左电机向前转动,速度为base_speed+3 rightMotorForward(base_speed); //右电机向前转动,速度为base_speed } else if (distance1<15 && distance2<15){ //如果两个传感器都未检测到障碍物 leftMotorForward(base_speed+5); //左电机向前转动,速度为base_speed+5 rightMotorForward(base_speed); //右电机向前转动,速度为base_speed } }

void initIRLED(){ //初始化红外LED函数 DDRA |= B11111111; //将PA0-PA7引脚设置为输出模式 PORTA &= B00000000; //将PA0-PA7引脚输出低电平 }

void proxLEDon(unsigned char proxIndex){ //点亮红外LED函数 PORTA |= 1<<proxIndex; //将proxIndex引脚输出高电平 }

void proxLEDoff(unsigned char proxIndex){ //关闭红外LED函数 PORTA &= ~(1<<proxIndex); //将proxIndex引脚输出低电平 }

int readProximityDistance(unsigned char proxIndex){ //读取红外传感器距离函数 int distance; //定义一个整型变量distance,用于存储距离值 proxLEDon(proxIndex); //点亮proxIndex引脚的红外LED delay(1); //等待1ms,让红外LED发出红外光 proximity[proxIndex] = analogRead(analogPin[proxIndex]); //读取proxIndex引脚的模拟输入值,并将其赋值给proximity[proxIndex] distance = 3.425pow(2.7182,0.0026proximity[proxIndex]); //根据proximity[proxIndex]计算出距离值,并将其赋值给distance proxLEDoff(proxIndex); //关闭proxIndex引脚的红外LED return distance; //返回距离值 }

void MotorStop(){ //电机停止函数 digitalWrite(right_dir, HIGH); //将右电机方向控制引脚输出高电平 digitalWrite(PWM_right, HIGH); //将右电机PWM控制引脚输出高电平 digitalWrite(left_dir, HIGH); //将左电机方向控制引脚输出高电平 digitalWrite(PWM_left, HIGH); //将左电机PWM控制引脚输出高电平 }

void leftMotorForward(float duty){ //左电机向前转动函数 int dutyInt = duty; //将浮点型的duty转换为整型dutyInt int dutyVal = map(dutyInt,0,100,0,100); //将dutyInt从0-100映射到0-100 analogWrite(PWM_left, dutyVal); //将左电机PWM控制引脚输出dutyVal analogWrite(left_dir, 0); //将左电机方向控制引脚输出低电平 }

void rightMotorForward(float duty){ //右电机向前转动函数 int dutyInt = duty; //将浮点型的duty转换为整型dutyInt int dutyVal = map(dutyInt,0,100,0,100); //将dutyInt从0-100映射到0-100 analogWrite(PWM_right, dutyVal); //将右电机PWM控制引脚输出dutyVal analogWrite(right_dir, 0); //将右电机方向控制引脚输出低电平 }

void leftMotorBackward(float duty){ //左电机向后转动函数 int dutyInt = duty; //将浮点型的duty转换为整型dutyInt int dutyVal = map(dutyInt,0,100,0,80); //将dutyInt从0-100映射到0-80 analogWrite(PWM_left, 0); //将左电机PWM控制引脚输出低电平 analogWrite(left_dir, dutyVal); //将左电机方向控制引脚输出dutyVal }

void rightMotorBackward(float duty){ //右电机向后转动函数 int dutyInt = duty; //将浮点型的duty转换为整型dutyInt int dutyVal = map(dutyInt,0,100,0,80); //将dutyInt从0-100映射到0-80 analogWrite(PWM_right, 0); //将右电机PWM控制引脚输出低电平 analogWrite(right_dir, dutyVal); //将右电机方向控制引脚输出dutyVal

int red_led = 11;volatile int proximity8 ;unsigned char analogPin8 = A0A1A2A3A4A5A6A7;int PWM_left = 6;int left_dir = 7;int PWM_right = 5;int right_dir = 2;volatile int base_speed = 12;void setup p

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

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