• Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车


    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 

    欢迎加入讨论群 64770604

    一、本次实验所需器材

    1、Arduino UNO板 https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395

    2、蓝牙模块

    3、蓝牙小车底盘(可从淘宝网购买)

    4、L298驱动模块:1个

    3、面包板:1个

    二、蓝牙模块的使用

    实验:给蓝牙模块发送h,回复i am here;发送b,回复see you.

    硬件连接:

    Untitled Sketch 2_bb

    代码:

    char getstr;
    void setup()
    {
      Serial.begin(9600);
    }
    void loop()
    {
      getstr=Serial.read();
      if(getstr=='h')
      {
        Serial.println("I am here!");
      }
      else if(getstr=='b'){
        Serial.println("See you!");
      }
    }

    将以上代码写入arduino时,要注意先将蓝牙断开,写入完成后,再连上蓝牙,否则会出错。

    手机端下载一个bluetooth spp或者蓝牙串口程序即可,这里我用的是http://www.mumayi.com/android-92724.html

    然后通过手机与该蓝牙模块进行连接,一般默认连接码是1234或者0000。连接后,发送h,会显示I am here,发送b,会显示See you!

    三、蓝牙遥控小车制作

    1、从网上购买了蓝牙小车底盘,组装后如下图:

    11

    2、L298驱动模块

    2222

    该模块的IN1、IN2、IN3、IN4分别连接arduino的12、11、10、9接口,电源12V口接arduino的5V,GND接地。

    例子:

    char getstr;
    int in1=12;
    int in2=11;
    int in3=10;
    int in4=9;
    //上面定义了板上的4个控制端,12一组,34一组
    void _mRight(int pin1,int pin2)//当in1和in2中有一个接高位时,电机会向某一方向转动

    {
      digitalWrite(pin1,HIGH);
      digitalWrite(pin2,LOW);
    }
    void _mLeft(int pin1,int pin2)//同上
    {
      digitalWrite(pin1,LOW);
      digitalWrite(pin2,HIGH);
    }
    void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了
    {
      digitalWrite(pin1,HIGH);
      digitalWrite(pin2,HIGH);
    }
    void setup()
    {
      Serial.begin(9600);
      pinMode(in1,OUTPUT);
      pinMode(in2,OUTPUT);
      pinMode(in3,OUTPUT);
      pinMode(in4,OUTPUT);
      //下面程序开始时让控制端都为高电平,电机保持不动。
      digitalWrite(in1,HIGH);
      digitalWrite(in2,HIGH);
      digitalWrite(in3,HIGH);
      digitalWrite(in4,HIGH);
    }

    void loop()
    {
      getstr=Serial.read();
      if(getstr=='f')
      {
        Serial.println("go forward!");
        _mStop(in1,in2);
        _mStop(in3,in4);   
        _mRight(in1,in2);
        _mRight(in3,in4);
      }
      else if(getstr=='b'){
        Serial.println("go back!");
        _mStop(in1,in2);
        _mStop(in3,in4);
        _mLeft(in1,in2);
        _mLeft(in3,in4);
      }
      else if(getstr=='l'){
        Serial.println("go left!");
        _mStop(in1,in2);
        _mStop(in3,in4);
        _mRight(in1,in2);
        _mLeft(in3,in4);
      }
      else if(getstr=='r'){
        Serial.println("go right!");
        _mStop(in1,in2);
        _mStop(in3,in4);
        _mRight(in3,in4);
        _mLeft(in1,in2);
      }
      else if(getstr=='s'){
        Serial.println("Stop!");
        _mStop(in1,in2);
        _mStop(in3,in4);  
      }
    }

    注意,当输入fl 时,无论前往、后退、左转、右转,电机都是先停一下,再转,这样电机都流畅。

    3、蓝牙模块

    接法与二中蓝牙模块的使用接法相同。

    4、超声波测距模块

    连接方法是将VCC接5V,GND接地,trig接5口,Echo接6口。

    5、硬件连接图

    2014-3-12_20187-89

    2014-3-12_201753-26

    2014-3-12_201624-50

    6、代码

    char getstr;
    int in1=12;
    int in2=11;
    int in3=10;
    int in4=9;
    //上面定义了板上的4个控制端,12一组,34一组
    int TrigPin = 5; 
    int EchoPin = 6;
    float cm;
    int i=0;//记录测量次数,每5次取一下平均值
    float cmsum;//计算5次总值
    float cmeve;//计算5次平均值
    
    void _mRun(int pin1,int pin2)//电机右转,电机到底是右转还是左转取决于电机端的接线和控制脚的顺序
    {
      digitalWrite(pin1,HIGH);
      digitalWrite(pin2,LOW);
    }
    void _mBack(int pin1,int pin2)//同上
    {
      digitalWrite(pin1,LOW);
      digitalWrite(pin2,HIGH);
    }
    void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了
    {
      digitalWrite(pin1,HIGH);
      digitalWrite(pin2,HIGH);
    }
     
    void setup()
    {
      Serial.begin(9600);
      pinMode(in1,OUTPUT);
      pinMode(in2,OUTPUT);
      pinMode(in3,OUTPUT);
      pinMode(in4,OUTPUT);
      pinMode(TrigPin, OUTPUT);
      pinMode(EchoPin, INPUT); 
      //下面程序开始时让控制端都为高电平,电机保持不动。
      digitalWrite(in1,HIGH);
      digitalWrite(in2,HIGH);
      digitalWrite(in3,HIGH);
      digitalWrite(in4,HIGH);
    }
    
    void loop()
    {
      getstr=Serial.read();
      delayMicroseconds(60);
      digitalWrite(TrigPin, HIGH);
      delayMicroseconds(60);
      digitalWrite(TrigPin, LOW);
      
      cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm 
      cm = (int(cm * 100.0)) / 100.0; //保留两位小数 
      
      if (i==5){//连接测5次,计算平均值,如果小于10厘米则紧急停车
        i=0;
        cmeve=cmsum/5;
        cmsum=0;
        
        if (cmeve<10 and cmeve>0) {
          Serial.println(cmeve);
          _mStop(in1,in2);
          _mStop(in3,in4);
        } 
      }
      else {
        i=i+1;
        cmsum=cmsum+cm;
      }
    
    
      if(getstr=='f')
      {
        Serial.println("go forward!");
        _mStop(in1,in2);
        _mStop(in3,in4);    
        _mRun(in1,in2);
        _mRun(in3,in4);
      }
      else if(getstr=='b'){
        Serial.println("go back!");
        _mStop(in1,in2);
        _mStop(in3,in4); 
        
        _mBack(in1,in2);
        _mBack(in3,in4);
      }
      else if(getstr=='l'){
        Serial.println("go left!");
        _mStop(in1,in2);
        _mStop(in3,in4); 
        
        _mRun(in1,in2);
        _mBack(in3,in4);
      }
      else if(getstr=='r'){
        Serial.println("go left!");
        _mStop(in1,in2);
        _mStop(in3,in4); 
        
        _mRun(in3,in4);
        _mBack(in1,in2);
      }
      else if(getstr=='s'){
        Serial.println("Stop!");
        _mStop(in1,in2);
        _mStop(in3,in4);   
      }
    }

    7、视频

  • 相关阅读:
    CPP标准模板库 随笔
    C++ Concurrency In Action 一些重点
    标准模板库(STL)
    单链表常见操作
    android三大组件之Intent
    数组k平移三种方法(java)
    java中空字符串、null的区别
    java最大最小堆
    java学习笔记之基础知识
    笔试题集锦
  • 原文地址:https://www.cnblogs.com/xiaowuyi/p/3597371.html
Copyright © 2020-2023  润新知