提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
菜鸡博主在网上冲浪的时候发现开源smars小车,此小车外形呆萌,可玩性高,于是便产生了做一辆避障小车的想法。。。
一、成品图
二、材料
SMARS开源模型:https://www.thingiverse.com/thing:2662828
N20电机 6v 150转 * 2
HC-05蓝牙模块 * 1
无源蜂鸣器 * 1
hcsr04超声波模块 * 1
12v锂电池包 * 1
12v to 5v 降压模块 * 1
arduino uno板 * 1
l293d盾板 * 1
开关* 1
杜邦线若干
二、功能介绍及实现方法
小车共含有3个模式:
1.蓝牙控制
2.自动避障
3.半自动避障
(还能播放音乐)
0.引用的库
#include <MsTimer2.h>
#include <Ultrasonic.h>
#include <SoftwareSerial.h>
#include <AFMotor.h>
1.模式选择
void loop()
{
if(BT.available())
{
i = (char)BT.read();
if(i == 'a')
{
mode = 1;
}
if(i == 'c')
{
mode = 0;
}
if(i == 'h')
{
mode = 2;
}
if(mode == 0)
{
avoid_mode(); //自动避障模式
}
if(mode == 1)
{
control_mode(i); //蓝牙控制模式
}
if(mode == 2)
{
half_avoid_mode(i); //半自动避障模式
}
}
}
2. 蓝牙控制
主要的控制代码如下:
电机驱动部分👇(以向前为例)
void runf(int times)
{
motor1.run(RELEASE);
motor2.run(RELEASE);
motor1.setSpeed(100);
motor2.setSpeed(100);
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(times);
}
蓝牙控制部分👇
void control_mode(char i)
{
switch(i)
{
case 'f':
runf(500); //向前
break;
case 'l':
runl(500); //向左
break;
case 'b':
runb(500); //向后
break;
case 'r':
runr(500); //向右
break;
case 's':
beep(2,100); //喇叭
break;
case 'm':
musicplay(); //播放音乐
break;
}
stoprun(); //停车
}
原理很简单,这里就不过多叙述了,嘿嘿
3.自动避障功能
代码如下(示例):
因为机械结构的问题,这里采用了随机数来决定避障方向的方式
当超声波检测距离大于10cm的时候则小车向前行驶
当超声波检测距离小于10cm的时候则由随机数决定小车向左还是向右行驶
void avoid_mode()
{
distance= ultrasonic.read();
if(distance >10)
{
distance = ultrasonic.read();
runf(100);
delay(100);
}
if(distance <= 10)
{
stoprun();
runb(500);
randway = random(2);
while(distance < 20 && randway == 0)
{
runl(1500);
distance = ultrasonic.read();
delay(100);
}
while(distance < 20 && randway == 1)
{
runr(1500);
distance = ultrasonic.read();
delay(100);
}
}
}
4.半自动避障功能
原理:当小车检测到障碍的时候停下,向上位机发出异常提示,由上位机来决定转弯的方向
实现代码👇
void half_avoid_mode(char i)
{
distance= ultrasonic.read();
if(distance > 10)
{
distance = ultrasonic.read();
runf(100);
delay(100);
}
if(distance <= 10)
{
stoprun();
runb(500);
stoprun();
while(i = (char)BT.read())
{
if(i == 'i')
{
runlhs04();
break;
}
if(i == 'o')
{
runrhs04();
break;
}
}
}
}
电机在半自动模式收到指令后转弯的代码👇
原理是转弯直到小车正前方的距离符合预设值(此处为30cm)
void runrhs04()
{
motor1.run(RELEASE);
motor2.run(RELEASE);
motor1.setSpeed(200);
motor2.setSpeed(100);
motor1.run(BACKWARD);
motor2.run(BACKWARD);
while(distance = ultrasonic.read())
{
if(distance > 30)
{
stoprun();
break;
}
motor1.run(BACKWARD);
motor2.run(BACKWARD);
delay(1000);
}
}
控制端的制作
因为博主目前还比较菜,所以采用了appinventor来制作控制端
效果图如下👇
appinventor实现逻辑如下👇
小车图片
总结
如上所述,小车还是挺好玩的嘿嘿,如有做的不够完善的地方,烦请各位大佬多多指教!