arduino蓝牙避障履带小车

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

菜鸡博主在网上冲浪的时候发现开源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实现逻辑如下👇
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小车图片

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


总结

如上所述,小车还是挺好玩的嘿嘿,如有做的不够完善的地方,烦请各位大佬多多指教!

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino自动驾驶汽车是一个由汽车底盘,两个电动车轮,一个360°车轮(非机动车)和一些传感器组成的项目。它由一个9伏电池供电,Arduino Nano连接到一个微型面包板以控制电机和传感器。当它打开时,它开始直行。当它发现前方的碍物时,它寻找双方,并转向它有更多自由空间的一面。如果前方或两侧没有空余空间,则将电机反转,向后驱动。 第1步:组件 您可以从Amazon订购大部分组件。我放置了我买的汽车底盘套件的链接。 1x汽车底盘套件:YIKESHU 2WD智能电机机器人汽车底盘 2倍齿轮马达 1x汽车底盘 2倍的汽车轮胎 1x 360°车轮 1个Arduino纳米 1x迷你面包板 1个电机驱动器L293D 3x超声波传感器HC SR04 支持3x传感器 - 3D打印(参见下图) 1x 9v电池 1x开关 5x 100uF电容器 2个0.1uF电容 1个红外接收器 1x遥控器 第2步:3D打印传感器支持 超声波传感器的支架可以打印在3D打印机上。图纸如下: 详情见上传附件。 PS:孔必须根据您的机箱进行调整。机箱的孔可能有一些小的差异。 第3步:组装机箱 按照手册组装机箱。 面包板可以固定在机箱背面。由于重量的原因,电池放置在机箱的前部非常重要。将传感器支架拧紧或粘在机箱的前面,传感器可以在其支撑上施加压力。没有必要粘上或拧上它。请参考图片以更好地了解组件的位置。 第4步:接线 如图所示连接组件。参考图片了解电容器的位置。具体文件见附件。 第5步:代码 项目的代码见附件。 第6步:准备好了!启动引擎 现在汽车已经准备就绪,你可以开始玩了。 当汽车放在地上时,打开开关给它供电。之后,使用遥控器上的PLAY按钮启动电机。 当您需要将其关闭时,按遥控器上的PREV按钮并关闭汽车上的开关。当它开着的时候,它一直在开着,碍物,但是,防止它进入有台阶或有洞的地方是很重要的。 视频观看地址:https://v.youku.com/v_show/id_XMzIzMjk3NzA2OA==.html
### 回答1: 以下是一个简单的Arduino小车代码,其中包括传感器和模块的设置。 ```C++ #include <AFMotor.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX AF_DCMotor motor1(1, MOTOR12_64KHZ); // Create motor #1, 64KHz pwm AF_DCMotor motor2(2, MOTOR12_64KHZ); // Create motor #2, 64KHz pwm int trigPin = 6; int echoPin = 7; long duration, cm; void setup() { Serial.begin(9600); //开启串口 mySerial.begin(9600); //开启模块 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); motor1.setSpeed(200); motor2.setSpeed(200); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; if (cm < 15) { //如果碍物距离小于15cm,后退并向左转 motor1.run(BACKWARD); motor2.run(BACKWARD); delay(1000); motor1.run(FORWARD); motor2.run(BACKWARD); delay(1000); } if (mySerial.available()) { //检查是否有数据 char data = mySerial.read(); //读取数据 switch (data) { case 'F': //向前移动 motor1.run(FORWARD); motor2.run(FORWARD); break; case 'B': //向后移动 motor1.run(BACKWARD); motor2.run(BACKWARD); break; case 'L': //向左移动 motor1.run(BACKWARD); motor2.run(FORWARD); break; case 'R': //向右移动 motor1.run(FORWARD); motor2.run(BACKWARD); break; case 'S': //停止移动 motor1.run(RELEASE); motor2.run(RELEASE); break; } } } ``` 这个代码使用了AFMotor库来控制电机,使用了SoftwareSerial库来设置模块。在主循环中,代码读取超声波传感器的值,并检查是否有碍物。如果有,它将后退并向左转。如果没有碍物,它将等待命令。根据命令,它会向前、向后、向左或向右移动,或者停止移动。 ### 回答2: Arduino小车代码需要利用Arduino模块和超声波传感器来实现小车功能。下面是一个简单的代码示例: 首先,我们需要定义引脚的连接和一些参数: ``` #define ENA 5 // 左轮PWM控制引脚 #define IN1 8 // 左轮控制引脚1 #define IN2 7 // 左轮控制引脚2 #define ENB 6 // 右轮PWM控制引脚 #define IN3 12 // 右轮控制引脚1 #define IN4 13 // 右轮控制引脚2 #define trigPin A1 // 超声波传感器的发送引脚 #define echoPin A2 // 超声波传感器的接收引脚 ``` 然后,在`setup()`函数中初始化引脚的模式: ``` void setup() { pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); // 初始化串口通信 } ``` 接下来,我们在`loop()`函数中实现小车逻辑: ``` void loop() { int distance = getDistance(); // 获取距离 if (distance > 10) { moveForward(); // 前进 } else { turnRight(); // 向右转 delay(500); } } void moveForward() { analogWrite(ENA, 180); analogWrite(ENB, 180); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void turnRight() { analogWrite(ENA, 200); analogWrite(ENB, 200); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } int getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); int duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; return distance; } ``` 上述代码首先通过`getDistance()`函数获取超声波传感器测量到的距离,根据距离的大小判断是否需要。如果距离大于10厘米,小车就会前进;否则,小车会向右转500毫秒,并延时后再次测量距离进行决策。 以上就是一个简单的Arduino小车代码的示例,你可以根据实际情况进行更详细的控制和优化。 ### 回答3: Arduino小车代码是一个用于控制小车移动和的程序。以下是一个简单的示例: 首先,我们需要连接模块和超声波传感器到Arduino板上。模块用于接收移动指令,超声波传感器用于检测碍物。 接下来,我们需要定义一些变量和引脚。例如,我们可以定义左右电机的引脚以及超声波传感器的引脚。 然后,在Arduino的setup()函数中,我们需要初始化模块和超声波传感器。这可以通过调用相应的库函数来完成。 在主循环中,我们可以使用if-else语句来监测模块接收到的指令。例如,如果接收到指令“F”表示前进,我们可以设置左右电机的引脚为正转状态,使小车向前移动。 同时,我们可以使用超声波传感器来检测前方是否有碍物。如果检测到碍物,我们可以设置左右电机的引脚为停止状态,使小车停下来。 此外,我们还可以为其他指令,如“B”(后退)、“L”(左转)和“R”(右转),编写相应的代码。 总的来说,Arduino小车代码涉及到模块和超声波传感器的初始化,以及根据接收到的指令控制小车移动和的逻辑。通过编写相应的代码,我们可以实现一个可以远程控制和小车

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值