(4WD+2路红外线)arduino UNO四驱arduino超声波+红外线避障小车

有兴趣可以点击**我的店铺**看看小车硬件。提供安装说明。此图片仅供参考,图中是2驱超声波避障+循迹双模式小车。程序与本文有相同之处。

在这里插入图片描述
。。。。。。。。。。。。。。。。。。。。

四驱arduino超声波+红外线避障小车。以下是我优化后的代码

#include <Servo.h>

int pinLB = 5; //左退
int pinLF = 4; //左前
int pinRB = 3; //右退
int pinRF = 2; //右前
int inputPin = A0;//超声波Echo引脚
int outputPin = A1; //超声波Trig引脚
int servoPin = 13; //舵机信息号引脚
const int SensorLeft = 7; //左红外传感器管引脚
const int SensorRight = 8; //右红外传感器管引脚

int MotorRPWM=6;
int MotorLPWM=11;

int SL; //左
int SR; //右

int Fspeedd = 0;
int Rspeedd = 0;
int Lspeedd = 0;
int directionn = 0;
Servo myservo;//定义舵机
int delay_time = 250;

int Fgo = 1;
int Rgo = 2;
int Lgo = 3;
int Bgo = 4;

int F = 90;
int L1 = 170;
int L2 = 130;
int R1 = 10;
int R2 = 50;

int F_space = 0;
int Stime = 0;//转向用时

int L_space = 0;
int L1_space = 0;
int L2_space = 0;

int R_space = 0;
int R1_space = 0;
int R2_space = 0;

void setup()

{

Serial.begin(9600);
pinMode(pinLB, OUTPUT);
pinMode(pinLF, OUTPUT);
pinMode(pinRB, OUTPUT);
pinMode(pinRF, OUTPUT);
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
myservo.attach(servoPin);//定义舵机信息号引脚
pinMode(SensorLeft, INPUT); //定义左红外传感器
pinMode(SensorRight, INPUT); //定义右红外传感器
pinMode(MotorLPWM, OUTPUT); //PWM
pinMode(MotorRPWM, OUTPUT);

}

void advance(int a) //前进
{
digitalWrite(pinRB, LOW);
digitalWrite(pinRF, HIGH);
analogWrite(MotorRPWM,100);
digitalWrite(pinLB, LOW);
digitalWrite(pinLF, HIGH);
analogWrite(MotorLPWM,100);
delay(a * 100);
}
void right(int b)//单轮右转
{
digitalWrite(pinRB, HIGH);
digitalWrite(pinRF, HIGH);
digitalWrite(pinLB, LOW);
digitalWrite(pinLF, HIGH);
analogWrite(MotorLPWM,150);

delay(b * 100);
}

void left(int c)//单轮左转
{
digitalWrite(pinRB, LOW);
digitalWrite(pinRF, HIGH);
digitalWrite(pinLB, HIGH);
digitalWrite(pinLF, HIGH);
analogWrite(MotorRPWM,150);
delay(c * 100);
}

void turnR(int d)//双轮逆向转动,转右
{
digitalWrite(pinRB, HIGH);
digitalWrite(pinRF, LOW);
analogWrite(MotorRPWM,150);

digitalWrite(pinLB, LOW);
digitalWrite(pinLF, HIGH);
analogWrite(MotorLPWM,150);

delay(d * 100);
}

void turnL(int e)//双轮逆向转动,转左
{
digitalWrite(pinRB, LOW);
digitalWrite(pinRF, HIGH);
analogWrite(MotorRPWM,150);

digitalWrite(pinLB, HIGH);
digitalWrite(pinLF, LOW);
analogWrite(MotorLPWM,150);

delay(e * 100);
}

void stopp(int f)//停止
{
digitalWrite(pinRB, HIGH);
digitalWrite(pinRF, HIGH);
digitalWrite(pinLB, HIGH);
digitalWrite(pinLF, HIGH);
delay(f * 100);
}

void back(int g)//后退
{
digitalWrite(pinRB, HIGH);
digitalWrite(pinRF, LOW);
analogWrite(MotorRPWM,100);

digitalWrite(pinLB, HIGH);
digitalWrite(pinLF, LOW);
analogWrite(MotorLPWM,100);

delay(g * 100);
}

int L_max_space(int jiaodu1, int jiaodu2)//得到左边两个角度最大距离值
{
L1_space = ask_distance(jiaodu1);
L2_space = ask_distance(jiaodu2);
if (L1_space > L2_space)
{
Stime = 4;
return ( L1_space);
} else
{
Stime = 1;
return ( L2_space);
}
}

int R_max_space(int jiaodu1, int jiaodu2)//得到右边两个角度最大距离值
{
R1_space = ask_distance(jiaodu1);
R2_space = ask_distance(jiaodu2);
if (R1_space > R2_space)
{
Stime = 4;
return ( R1_space);
} else
{
Stime = 1;
return ( R2_space);
}
}

void detection()
{
int delay_time = 250;
F_space = ask_distance(F);
if (F_space < 10)//前方小于10公分,后退
{
stopp(1);
back(2);
}
if (F_space < 25)//前方小于25公分
{
stopp(1);
L_space = L_max_space(L1, L2);//得到左边距离值
R_space = R_max_space(R1, R2);//得到右边距离值

if (L_space > R_space)//如果左>右,左转
{
  directionn = Lgo;
}
if (L_space <= R_space)//如果左<=右,右转
{
  directionn = Rgo;
}
if (L_space < 10 && R_space < 10)//均小于10公分,后退
{
  directionn = Bgo;
}

}
else
{
directionn = Fgo;//否则前进
}
}

int ask_distance(int angle)
{

myservo.write(angle);
delay(delay_time);
digitalWrite(outputPin, LOW); // 超声波发射低电平2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 超声波发射高电平10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 维持超声波发射低电平
float distance = pulseIn(inputPin, HIGH) / 58.00; //读取相差时间,将时间转化为距离(单位:厘米)
//Serial.print(“distance:”);
//Serial.println(distance);
return (distance);
}

void loop()
{

myservo.write(90);//摆正
detection();//检测距离,判断需要往哪个方向走。
SL = digitalRead(SensorLeft);//红外检测左边障碍物
SR = digitalRead(SensorRight);//红外检测右边障碍物

if (directionn == 4)//后退
{
back(5);
turnL(2);//稍微左转,防止卡死.这里应该设置一下随机,微左转或微右转
//Serial.println(" Reverse ");
}

if (directionn == 2)//右转
{
back(1);
turnR(Stime);//双轮逆向转动,转右,给于转向时间
//Serial.print(" Right ");
}

if (directionn == 3)//左转
{
back(1);
turnL(Stime);//双轮逆向转动,转左,给于转向时间
//Serial.print(" Left ");
}

if (directionn == 1)//前进
{
advance(1);
//Serial.print(" Advance “);
//Serial.println(” ");

if (SL == HIGH & SR == LOW)  // 如果右边红外线感测到物体,向左(低电平LOW表示有障外物)
{
  left(4);//单轮转左
}
else if (SR == HIGH & SL == LOW) // 如果左边红外线感应到物体,向右
{
  right(4);//单轮转右
}
else if (SR == LOW & SL == LOW) //  如果两个红外线均感应到物体,后退
{
  back(3);
}

}
}

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要制作一个arduino红外避障小车,你需要以下材料: 1. Arduino UNO板 2. 电机驱动板 3. 直流电机2个 4. 红外传感器3个 5. 9V电池1个 6. 电池盒1个 7. 杜邦线若干 8. 小车底盘 接下来,我们需要进行以下步骤: 1. 将电机驱动板与Arduino UNO板连接,用杜邦线连接驱动板的IN1、IN2、IN3、IN4引脚分别连接到Arduino UNO板的数字口2、3、4、5上。 2. 连接电机,将电机的两个线分别连接到驱动板的M1和M2上,另外两个电机也依次连接到M3和M4上。 3. 连接红外传感器,将三个红外传感器的VCC引脚连接到Arduino UNO板的5V口,GND引脚连接到GND口,SIG引脚连接到数字口6、7、8上。 4. 安装电池,将9V电池放入电池盒中,连接电池盒的正负极到Arduino UNO板的Vin和GND上。 5. 编写程序,可以使用Arduino IDE进行编程,代码示例: ``` int motor1Pin1 = 2; int motor1Pin2 = 3; int motor2Pin1 = 4; int motor2Pin2 = 5; int irSensor1Pin = 6; int irSensor2Pin = 7; int irSensor3Pin = 8; void setup() { pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); pinMode(irSensor1Pin, INPUT); pinMode(irSensor2Pin, INPUT); pinMode(irSensor3Pin, INPUT); } void loop() { int irSensor1Value = digitalRead(irSensor1Pin); int irSensor2Value = digitalRead(irSensor2Pin); int irSensor3Value = digitalRead(irSensor3Pin); if (irSensor1Value == HIGH && irSensor2Value == LOW && irSensor3Value == HIGH) { // 左侧检测到障碍,右转 digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); } else if (irSensor1Value == HIGH && irSensor2Value == HIGH && irSensor3Value == LOW) { // 右侧检测到障碍,左转 digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); } else if (irSensor1Value == LOW && irSensor2Value == HIGH && irSensor3Value == HIGH) { // 前方检测到障碍,后退 digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); } else { // 没有检测到障碍,前进 digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); } } ``` 通过这个程序,当小车检测到障碍时,会根据障碍物的位置进行转向或后退,以避免碰撞。 6. 完成组装,将Arduino UNO板和电池盒固定在小车底盘上,连接好电机和红外传感器,最后上传程序到Arduino UNO板中即可。 ### 回答2: Arduino红外避障小车是一种基于Arduino开发板的智能小车,通过红外避障传感器实现对障碍物的检测和避免。 红外避障小车的工作原理是利用红外传感器发射红外光束,当光束遇到障碍物时,会发生反射并被接收器捕捉到。通过接收到的信号强度判断障碍物的距离和方向,然后根据距离和方向来控制小车的行动。 在控制方面,当传感器检测到前方有障碍物时,Arduino会判断障碍物的距离。如果障碍物离小车比较近,Arduino会发出停止信号,使小车停下来。如果障碍物离小车较远,Arduino会发出转向信号,使小车绕过障碍物并继续前进。 小车的移动控制由电机驱动模块来实现。当Arduino发出行动指令时,电机驱动模块会根据指令控制车轮的转动速度和方向,从而实现小车的前进、后退、左转、右转等动作。 除了避障功能,Arduino红外避障小车还可以配合其他传感器,如温度传感器、光线传感器等,实现更多的功能,如自动控制温度、自动感应光线等。 总之,Arduino红外避障小车通过使用红外传感器检测障碍物,利用Arduino开发板控制小车的行动,可以实现自动避障的功能,是一款简单但实用的智能小车。 ### 回答3: Arduino红外避障小车是一种基于Arduino开发板的智能小车,利用红外传感器实现避障功能。 首先,该小车的核心部件是Arduino开发板,它是一种基于开放源代码的电子原型平台。Arduino板上有多个GPIO(通用输入输出)引脚,可以连接各种传感器和执行器。 其次,该小车还配置了红外传感器,用来检测前方的障碍物。红外传感器能够发射红外线并接收反射回来的红外信号,通过测量反射红外线的强度和时间,可以判断是否有障碍物存在。 小车的工作原理如下:当小车前方没有障碍物时,红外传感器接收到的反射光强度较低;而当有障碍物出现时,反射光强度会增加。Arduino通过读取红外传感器的模拟输入信号,根据信号强度的变化来判断是否有障碍物。当检测到障碍物时,Arduino控制小车执行相应的动作,比如停车、后退或改变方向等。 该小车的编程相对简单,使用Arduino编程语言进行开发。程序的主要逻辑是通过if-else语句,判断红外传感器输入的信号强度是否超过一定阈值。如果超过阈值,即为检测到障碍物,则根据具体情况控制小车进行适当的动作。 总结而言,Arduino红外避障小车是一款基于Arduino开发板的智能小车,利用红外传感器实现避障功能。它通过检测反射红外线的强度和时间,判断是否存在障碍物,并根据结果控制小车的动作。该小车的编程简单易懂,适合初学者学习和实践。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值