HC05蓝牙和超声波摇头避障小车的实践

一、蓝牙模块设置
在这里插入图片描述
Arduino 进入 AT 模式代码

接下来,我们需要为使用 Arduino 设置蓝牙模块 AT 模式编写程序,这个程序是让我们可以通过 Arduino IDE 提供的串口监视器来设置蓝牙模块。详细的 Arduino 代码如下:

#include <SoftwareSerial.h> 

// Pin10为RX,接HC05的TXD
// Pin11为TX,接HC05的RXD
SoftwareSerial BT(10, 11); 
char val;

void setup() {
  Serial.begin(38400); 
  Serial.println("BT is ready!");
  // HC-05默认,38400
  BT.begin(38400);
}

void loop() {
  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }

  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
}

利用 Arduino IDE 串口监视器进行调试

首先,将 Arduino 断电,然后按着蓝牙模块上的黑色按钮,再让 Arduino 通电,如果蓝牙模块指示灯按2秒的频率闪烁,表明蓝牙模块已经正确进入 AT 模式。
打开 Arduino IDE 的串口监视器,选择正确的端口,将输出格式设置为 Both: NL & CR ,波特率设置为 38400 ,可以看到串口监视器中显示 BT is ready! 的信息。
然后,输入 AT ,如果一切正常,串口显示器会显示 OK。
接下来,我们即可对蓝牙模块进行设置,常用 AT 命令如下:

AT+ORGL    # 恢复出厂模式
AT+NAME=<Name>    # 设置蓝牙名称
AT+ROLE=0    # 设置蓝牙为从模式
AT+CMODE=1    # 设置蓝牙为任意设备连接模式
AT+PSWD=<Pwd>    # 设置蓝牙匹配密码

二、arduino UNO蓝牙小车
1、一个4节+3节电池盒串联,用最便宜的电池,呵呵,vin供电;
2、L298N红板,接法见前边文章;
3、mixly代码
在这里插入图片描述
三、ardino uno 超声波摇头避障小车

1、小车演示视频
2、编程思路:
(1)舵机初始化90度;
(2)测距(前方距离);
(3)判断:如果距离大于30cm,那么前进;否则,舵机转向0度(也就是右边),测距left_distance,舵机转向180度(也就是左边),测距right_distance;继续判断:如果左侧距离大于右侧距离,则左转,否则右转。
3、mixly程序
在这里插入图片描述
在这里插入图片描述

代码下载

4、arduino代码(根据自己的小车再进行优化,多了一个三次测距,增加了精度)

#include <Servo.h>               //  控制舵机的头文件
Servo myservo;  // 创建伺服对象

const int TrigPin = 12;          //超声波
const int EchoPin = 13;        

unsigned int distance; 
unsigned char pos = 90;    //  舵机初始化位置

int right_distance = 0;      // 右边测距的距离
int left_distance = 0;      //左边测距的距离

const int L298pin1 = 5;   // 模块控制信号
const int L298pin2 = 6;
const int L298pin3 = 9;
const int L298pin4 = 10;

void setup() 
{ 
    pinMode(L298pin1,OUTPUT);
    pinMode(L298pin2,OUTPUT);
    pinMode(L298pin3,OUTPUT);
    pinMode(L298pin4,OUTPUT);
  // 初始化串口通信及连接SR04的引脚
    Serial.begin(9600); 
    pinMode(TrigPin, OUTPUT); 
    pinMode(EchoPin, INPUT); 
   // Serial.println("Ultrasonic sensor:");
    myservo.attach(11);  //  使用第11脚控制舵机伺服位置
} 
void loop() 
{ 
      myservo.write(pos);  // 舵机伺服初始化
      delay(1500);
      int temp = dis();
      if(temp > 30)
      {
        go();
      }
       else
       {
             stops();  //  小车停止
             myservo.write(0);  //右边测距
             delay(1500);
             for(int i=0; i<3; i++)   // 为了提高测量精度,进行三次测量计算
             {
                    int temp_1 = dis();
                    right_distance += temp_1;   // 三次累计
             }
             right_distance = right_distance/3;
             //Serial.println(right_distance);
              
              myservo.write(180);  //左边测距
              delay(1500);
              for(int i = 0; i < 3;i++)  
             {
                    int temp_2=dis();
                    left_distance += temp_2; 
             }
               left_distance = left_distance/3;
              // Serial.println(left_distance); 
              
            if(right_distance >= left_distance)   //  右边的距离是否大于左边
                 {
                       myservo.write(90);  //舵机初始化
                       delay(500);
                       right();    //右转
                       //delay(300);
                      // stops();    //  小车停止   暂停
                 } else
                     {
                         myservo.write(90);  //舵机初始化
                         delay(500);
                         left();    //  小车左转
                        // delay(200);
                        // stops();    //  小车停止
                     }
          }
}

unsigned int dis()  // 超声波测距函数
{  
      // 产生一个10us的高脉冲去触发TrigPin 
        digitalWrite(TrigPin, LOW); 
        delayMicroseconds(2); 
        digitalWrite(TrigPin, HIGH); 
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW); 
    // 检测脉冲宽度,并计算出距离
        distance = pulseIn(EchoPin, HIGH);
        distance=distance/58;
     //   Serial.println(distance); 
        return distance;   // 返回数据
}


void go()    // 小车前进
{
  analogWrite(L298pin1,230);
  analogWrite(L298pin2,0);
  analogWrite(L298pin3,255);
  analogWrite(L298pin4,0);
    
}
void back()   //小车后退
{
  analogWrite(L298pin1,0);
  analogWrite(L298pin2,230);
  analogWrite(L298pin3,0);
  analogWrite(L298pin4,255);
  
}
void left()    //  小车左转
{
  analogWrite(L298pin1,0);
  analogWrite(L298pin2,255);
  analogWrite(L298pin3,100);
  analogWrite(L298pin4,0);
  
}
void right()    //  小车右转
{
  analogWrite(L298pin1,255);
  analogWrite(L298pin2,0);
  analogWrite(L298pin3,0);
  analogWrite(L298pin4,100);
}
void stops()    //  小车停止
{
  analogWrite(L298pin1,0);
  analogWrite(L298pin2,0);
  analogWrite(L298pin3,0);
  analogWrite(L298pin4,0);
}
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值