原来有这样一款基于Arduino的小车,不通过循迹,红外,超声波?

有这样一款基于Arduino的小车,不通过循迹,红外,超声波?

6fc2e22970a974cbed4b59d254fc7551.png

Hello,大家好!今天我要给大家分享一下我近期制作的一个arduino的小项目----智能避障小车。之前在某站上没意间刷到某位博主制作的一款智能避障小车,觉得很有意思,便打算自己也只做一个来玩玩,于是便写了一款我自己了解的避障小车,在此根底上,我还增加了蓝牙遥控功能,二者能够互相切换,提高其趣味性。和其他的避障小车类似,这款也是超声波来进行距离避障,代码相对其他大神来说显得比较表层,但这也相对来说显得愈加好了解一些,废话不多说,看代码!!!

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

正文开始:

一、代码

/*********************************/ //调取蓝牙模块库,调取伺服电机库

#include //调取库函数

#include //声明调用Servo.h库

SoftwareSerial BT(A0, A1); //新建对象,接管脚为A0--TXD,发送脚为A1--RXD

Servo servo; //创建一个舵机对象

/*********************************/ //定义驱动模块串口及变量

int TrigPin = 2; //发出超声波

int EchoPin = 3; //收到反射回来的超声波

int Input1 = 4; //定义uno的pin5向Input1输出

int Input2 = 5; //定义uno的pin5向Input2输出

int Input3 = 6; //定义uno的pin5向Input3输出

int Input4 = 7; //定义uno的pin5向Input4输出

int pos = 118; //创建变量,存储从模拟端口读取的值

float cm; //由于测得的距离是浮点型的,单位为cm

int xuan;

int choice; //小车功能选择

/********************* ************/ //控制函数局部

void stop() //小车停下

{

digitalWrite(Input1,LOW); //给低电平

digitalWrite(Input2,LOW); //给低电平

digitalWrite(Input3,LOW); //给低电平

digitalWrite(Input4,LOW); //给低电平

delay(50);

}

void forward() //小车前进

{

digitalWrite(Input1,HIGH); //给高电平

digitalWrite(Input2,LOW); //给低电平

digitalWrite(Input3,HIGH); //给高电平

digitalWrite(Input4,LOW); //给低电平

delay(50);

}

void backward() //小车后退

{

digitalWrite(Input1,LOW); //给低电平

digitalWrite(Input2,HIGH); //给高电平

digitalWrite(Input3,LOW); //给低电平

digitalWrite(Input4,HIGH); //给高电平

delay(50);

}

void turnleft() //小车左转

{

digitalWrite(Input1,HIGH); //给高电平

digitalWrite(Input2,LOW); //给低电平

digitalWrite(Input3,LOW); //给低电平

digitalWrite(Input4,HIGH); //给高电平

delay(50);

}

void turnright() //小车右转

{

digitalWrite(Input1,LOW); //给低电平

digitalWrite(Input2,HIGH); //给高电平

digitalWrite(Input3,HIGH); //给高电平

digitalWrite(Input4,LOW); //给低电平

delay(50);

}

void Left() //舵机左转

{

while(pos < 180)

{

pos++;

servo.write(pos); //写入舵机角度

delay(15); //延时使舵机转到相应角度

}

}

void Right() //舵机右转

{

while(pos > 60)

{

pos--;

servo.write(pos);

delay(15);

}

}

void Ranging() //测量距离

{

digitalWrite(TrigPin, LOW); //低电平发一个短时长脉冲去TrigPin

delayMicroseconds(2); //delayMicroseconds在更小的时长内延时精确,delayMicroseconds是毫秒级计时单位

digitalWrite(TrigPin, HIGH); //通过这里控制超声波的发射

delayMicroseconds(10);

digitalWrite(TrigPin, LOW); //通过这里控制停下超声波的发射

cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时长换算成cm,其中pulseIn(接管信号引脚,高低电平)函数用来接管反射回来的声波

cm = (int(cm * 100.0)) / 100.0; //保留两位小数

Serial.print("Distance:");

Serial.print(cm);

Serial.print("cm");

Serial.println();

//以上四句在串口监督器中输出

delay(1000);

}

/****************************************************/

void setup()

{

Serial.begin(9600); //与电脑串口相连,波特率为9600

servo.attach(9); //9号引脚输出电机控制信号,仅能使用PWM引脚

pinMode(Input1, OUTPUT); //Input1引脚设置为输出模式

pinMode(Input2, OUTPUT); //Input2引脚设置为输出模式

pinMode(Input3, OUTPUT); //Input3引脚设置为输出模式

pinMode(Input4, OUTPUT); //Input4引脚设置为输出模式

pinMode(TrigPin, OUTPUT); //发出超声波串口设置为输出

pinMode(EchoPin, INPUT); //承受超声波接口设为输写

BT.begin(9600); //设置波特率为9600

}

void loop()

{

switch(choice)

{

case 'X' : //选择避障

Ranging(); //测量距离

if(cm > 10.0) //没有碰到障碍物

forward();

else //碰到障碍物

{

backward(); //小车后退

delay(200); //延时确定后退距离

stop(); //小车停下

Right(); //舵机右转

Ranging(); //测量距离

servo.write(118); //舵机回中

if(cm > 10.0) //假如右边满足条件

{

turnright(); //小车右转

delay(200); //延时确定转弯角度

}

else //假如右边不满足

{

Left(); //舵机左转

Ranging(); //测量距离

servo.write(118); //舵机回中

turnleft(); //小车左转

delay(200); //延时确定转弯角度

}

}

case 'Y' : //选择遥控

while(BT.available()) //蓝牙识别字符

{

xuan = BT.read(); //蓝牙读取字符

switch(xuan)

{

case 'A' :

forward(); //调取前进函数

case 'B' :

backward(); //调取后退函数

case 'C' :

turnleft(); //调取左转函数

case 'D' :

turnright(); //调取右转函数

case 'E' :

stop(); //调取停下函数

}

}

}

}

代码看起来是不是很通俗易懂呢!!!

7aaf2d485b1d14cf646976fc86ac5ddc.png

在后面我也写了详细的注释,方便大家了解;

接下来给你们介绍我了解的手机蓝牙通讯和电脑串口通讯分别是(波特率):

BT.begin(9600);

Serial.begin(9600);

虽然说二者的更深层次的含义由于学术不精,没法给出详细解释,但经过实际检测是正确的。

在代码中波及的伺服电机角度,是依据我所买的伺服电机联合制作时须要所测量和设定的角度,只具有参照性。各位能够依据自己买的伺服电机来进行修改。

void Left() //舵机左转

{undefined

while(pos < 180)

{undefined

pos++;

servo.write(pos); //写入舵机角度

delay(15); //延时使舵机转到相应角度

}

}

这局部控制舵机转动运用while循环主要是为了能够是舵机逐角度的变化,也能够直接用

servo.write(pos);

写入须要的角度,但这就会使得舵机在转动到所须要的角度所需时长会非常短,可能会对舵机有损耗(个人观点)。

二、所需素材

1.Arduino UNO板子

2.HC-SR04超声波模块

3.HC-06蓝牙模块

4.L298N电机驱动板模块

5.智能小车底盘

6.18650充电电池及电池仓

7.杜邦线若干

2add7884afb44e5110773a78c529fe69.png

以上这些素材我制作时所用到,都是能够在某1个宝上买到的。当然对于小车底盘,有才能的朋友,能够自己设计建模一款小车底盘,然后通过3D打印机打印出来也是很好的。

手机端蓝牙遥控器用的是‘手机蓝牙调试器’,在应用商店里就能够下载到。相对应的A,B,C,D,E,X,Y在按键操作里编辑即可。

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124406214