搬运一个自动,蓝牙,重力感应 避障小车车-Arduino中文社区 - Powered by Discuz! Archiver

hhz1468255512 发表于 2018-4-11 21:30

搬运一个自动,蓝牙,重力感应 避障小车车

本帖最后由 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;
}

file:///C:\Users\hhz\AppData\Roaming\Tencent\Users\1468255512\QQ\WinTemp\RichOle\177FLI2M%~$G7Y(JV07)E


milkzip 发表于 2018-4-12 10:13

学习学习,谢谢分享!:)

epigone 发表于 2018-4-12 11:21

学习了,感谢分享

cxk1314 发表于 2018-4-13 23:34

强>>>>学习了

shrub 发表于 2018-4-14 17:17

收藏一下:lol

ixumeng 发表于 2018-4-14 18:22

学习了:)

hhz1468255512 发表于 2018-4-21 03:20

最近发现超声波模块容易坏,不能买两块钱的。。。
页: [1]
查看完整版本: 搬运一个自动,蓝牙,重力感应 避障小车车