|
本帖最后由 hhz1468255512 于 2018-4-11 21:34 编辑
捣鼓了半天程序,蓝牙一直不管用,后来改了波特率就成功了,浪费了三个小时手机控制app文件大,上传不了,要的直接留言吧
用的模块
uno r3
hc06 从机蓝牙模块
超声波模块
360连续旋转舵机x2
轮子x2
万向轮
杜邦线
9g舵机
这次懒得用l298n了,直接上舵机,独立供电或保证电压足够
/*
Name:超声波避障小车 蓝牙遥控版
*/
#include <Servo.h> //调用舵机库
Servo left;
Servo right;
Servo head; //定义左右和头部舵机名称
const int TrigPin = 2;
const int EchoPin = 3; //定义SR04引脚
float dist_adv;
float dist_left;
float dist_right; //将距离存储为单精度浮点数 前左右三组数据
float dist(float d); //声明获取超声波传感器距离子函数
void setup()
{
Serial.begin(9600); //初始化串口 设置波特率
left.attach(10);
right.attach(11);
head.attach(12);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT); //定义舵机和SR04引脚
Serial.println("Ultrasonic Car "); //输出装逼语句
left.write(90);
right.write(90);
head.write(79); //小车初始化 停止 头朝前看
Serial.println("System start complete!");
delay(1000);
}
void loop()
{
int mode ; //定义基本整形变量 用于转换工作模式 0自动1手动 用于驱动小车:2停3前4后5左6右 用于控制头部:7左8前9右
while (Serial.available()) //等待串口数据
{
mode = Serial.read(); //从串口读取模式变量并赋值给mode
/***********************************************自动避障模式部分************************************************/
if (mode == '0') //若模式变量为0自动 则进入自动避障模式
{
while (1) //自动避障模式循环部分
{
while (Serial.available()) //等待串口数据
{
int quit = Serial.read();
if (quit == '1') //如果模式变量为1则进入手动模式
{
goto keep; //跳出自动避障模式循环 到手动模式部分
}
}
dist_adv = dist(dist_adv); //获取前方距离
if (dist_adv >= 20)
{
left.write(45);
right.write(111); //前进
Serial.print("Distance = ");
Serial.print(dist_adv);
Serial.print("cm ");
Serial.println("Moving advance");
delay(500); //如果距离大于20cm则前进并输出"正在前进"
}
else if (dist_adv <= 20)
{
left.write(90);
right.write(90); //停止
Serial.print("Distance = ");
Serial.print(dist_adv);
Serial.print(" ");
Serial.println("Stopped"); //如果距离小于20cm则小车停止并输出"已停止"
head.write(170);
delay(1000);
dist_left = dist(dist_left); //获取左方距离
Serial.print("Left distance = ");
Serial.print(dist_left);
Serial.print(" "); //头部舵机左转测量左边距离并输出
head.write(0);
delay(1000);
dist_right = dist(dist_right); //获取右方距离
Serial.print("Right distance = ");
Serial.print(dist_right);
Serial.print(" ");
Serial.println(); //头部舵机右转测量右边距离并输出
head.write(79); //头部舵机回中
if (dist_left >= 20 && dist_left <= 1000 && dist_left > dist_right)
{
left.write(180);
right.write(180);
Serial.println("Turning left");
delay(870); //判断左右距离 若左边大则左转
}
else if (dist_left >= 1000)
{
left.write(0);
right.write(0);
Serial.println("Turning right");
delay(870); //特殊情况 若左边返回距离大于1000则说明探头被遮挡 此时右转
}
else if (dist_right >= 20 && dist_right <= 1000 && dist_right > dist_left)
{
left.write(0);
right.write(0);
Serial.println("Turning right");
delay(870); //判断左右距离 若右边大则右转
}
else if (dist_right >= 1000)
{
left.write(180);
right.write(180);
Serial.println("Turning left");
delay(870); //特殊情况 若右边返回距离大于1000则说明探头被遮挡 此时左转
}
else if (dist_right <= 20 && dist_left <= 20)
{
left.write(180);
right.write(180);
Serial.println("Turning around");
delay(1720); //若左右两边距离均小于20cm 说明没地方跑了 则掉头
}
}
}
}
/**************************************************手动控制模式部分*********************************************/
if (mode == '1') //若模式变量为1 则进入手动模式
{
keep: //跳转节点
Serial.println("Manual mode!");
left.write(90);
right.write(90); //停止一切动作 进入手动模式待命状态
}
else if (mode == '2') //若模式变量为2 则停止移动
{
Serial.println("Stopped!");
left.write(90);
right.write(90);
}
else if (mode == '3') //若模式变量为3 则前进
{
Serial.println("Moving advance!");
left.write(45);
right.write(111);
}
else if (mode == '4') //若模式变量为4 则后退
{
Serial.println("Moving Back!");
left.write(135);
right.write(65);
}
else if (mode == '5') //若模式变量为5 则左转
{
Serial.println("Turning left!");
left.write(180);
right.write(180);
}
else if (mode == '6') //若模式变量为6 则右转
{
Serial.println("Turning Right!");
left.write(0);
right.write(0);
}
else if (mode == '7') //若模式变量为2 则向左看
{
Serial.println("Looking Left!");
head.write(180);
}
else if (mode == '8') //若模式变量为8 则向前看
{
Serial.println("Looking Ahead!");
head.write(84);
}
else if (mode == '9') //若模式变量为9 则向右看
{
Serial.println("Looking Right!");
head.write(0);
}
else if (mode == 'd') //若模式变量为d 则调用超声波传感器测量当前距离
{
dist_adv = dist(dist_adv); //获取前方距离
Serial.print("Distance = ");
Serial.print(dist_adv);
Serial.println("cm"); //串口输出距离信息
}
}
}
/******************************************************子函数部分****************************************************/
float dist(float d) //获取超声波传感器距离子函数
{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW); //产生一个10us的高脉冲触发SR04
d = pulseIn(EchoPin, HIGH) / 58.00; //检测高位脉冲宽度,并计算出距离
/*超声波传感器探头被遮挡或者距离过短时声波无法回射 在算法
中由于长时间接收不到返回声波 会返回一个很大的值 此时其实
探头距离障碍物非常近 判断时应认为此时的距离非常小 而不是
非常大 这种特殊情况请注意*/
return d;
}
[img]file:///C:\Users\hhz\AppData\Roaming\Tencent\Users\1468255512\QQ\WinTemp\RichOle\177FLI2M%~$G7Y(JV07)E[G.png[/img]
|
|