Arduino 智能小车 - 蓝牙控制(20180504实训课--华清远见)

1.cc2541 蓝牙模块

  • 蓝牙( Bluetooth®)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波).

  • 在 Arduino 小车上我们使用的蓝牙模块是基于 cc2541 蓝牙芯片构成的.

  • 在 cc2541 芯片内部已经实现了 蓝牙协议,我们不需要开发调试蓝牙协议,一般的蓝牙模块都是采用的串口协议与外部设备进行通讯,当需要通过蓝牙模块发送数据时,直接使用串口即可,蓝牙模块会自动通过蓝牙协议发送给配对好的蓝牙设备.

2.串口通讯

2.1 uart 简介

  • 一般我们所说的串口都是表示 uart 口,即通用异步串行收/发装置.
  • UART 有4个引脚分别为: 
    • VCC : 电源
    • GND : 接地
    • RX : 接收
    • TX : 发送

2.2 TTL 电平

  • UART 在传输数据时使用的是 TTL 电平,即 0(0v) 表示低电平 1(3.3v或5v) 表示高电平.
  • 具体可以参考下图: 
    uart-TTL-电平.jpg-22.3kB

2.3 RS232 电平

  • RS232 主要是为了解决 TTL 电平抗干扰能力不强的问题,提高了电平的范围,并使用了负逻辑电平 
    uart-RS232-电平.jpg-15.2kB

3.Arduino 串口通讯

  • 由于蓝牙模块与 Arduino 开发板通过串口通讯,所以我们必须先了解 Arduino 的串口.
  • Arduino 开发板上有一个串口,在操作时要调用 Arduino 对应的库函数.
  • 相关的库函数如下:

    • begin() 用于设置串口波特率.

       
           
      1. Serial.begin(speed)
    • end() 函数用于关闭串口通讯

       
           
      1. Serial.end();
    • available() 函数用于判断串口缓冲区是否有数据输入

       
           
      1. Serial.available();
    • read() 函数用于读取串口数据

       
           
      1. Serial.read();
    • print() 函数用于将数据写入到串口中

       
           
      1. Serial.print();
    • println() 函数用于将数据(包括'\n')写入到串口中

       
           
      1. Serial.println();
  • 一般 Arduino 串口编程步骤如下:

    • 设置串口波特率,一般在 setup() 中添加即可

       
           
      1. void setup() {
      2. Serial.begin(115200);//设置串口0的波特率
      3. }
    • 调用 print 或者 println 函数可以通过 Arduino 串口发送给 pc,可以通过串口监视器可以查看,具体编码如下

       
           
      1. void loop() {
      2. //每隔 1s 输出字符串
      3. Serial.println("Hello,HQYJ.");
      4. delay(1000);
      5. }
    • 具体在调试窗口上显示的如下图: 
      Arduino-串口.png-30kB

4.Arduino 与 蓝牙模块连接

  • Arduino 与蓝牙模块主要有以下的引脚需要连接: 
    • +5v : 接5v电源
    • GND :接地
    • RX : 与 Arduino TX 引脚连接
    • TX : 与 Arduino RX 引脚连接
  • 在 TX / RX 引脚在连接时, 可以选择任意引脚,这里选择的引脚8,9,可以根据实际情况进行选择

5.Arduino 软串口

5.1 Arduino 软串口

  • 由于 Arduino 的物理串口只有一个,一般用于调试,当有更多的设备需要使用串口时,则需要通过普通的 IO 口模拟,在 Arduino 提供了相应的函数接口用于将普通的 IO 口编程串口的 RX/TX 功能.

5.2 Arduino 软串口编程

5.2.1 Arduino 软串口定义

  • 在 Arduino 库函数中使用 SoftwareSerial 来定义一个软串口,一般定义如下:
 
 
  1. SoftwareSerial bluetoothSerial(8,9);
  • 在上述语句中,将 Arduino 的引脚 8,9 设置为与蓝牙模块串口通讯的 RX 与 TX 的功能.

5.2.2 Arduino 软串口监听

  • 在使用 Arduino 的软串口时,需要调用 listen() 函数进行监听,具体编程如下:
 
 
  1. char recv;
  2. //监听蓝牙串口数据
  3. bluetoothSerial.listen();

5.2.3 Arduino 软串口数据判断

  • 在读取串口数据之前需要调用 available() 函数来判断是否有数据.
 
 
  1. //判断串口是否产生数据
  2. while(bluetoothSerial.available() > 0){
  3. }

5.2.4 Arduino 软串口数据读取

  • 当读取串口数据时需要调用 read() 函数来获取串口的数据.
 
 
  1. recv = bluetoothSerial.read();//读取蓝牙串口的数据
  2. Serial.println(recv);//通过Arduino 串口进行输出
  • 完整的测试程序如下:
 
 
  1. #include <SoftwareSerial.h>
  2. //将8,9引脚设置为串口的rx,tx
  3. SoftwareSerial bluetoothSerial(8,9);
  4. void setup() {
  5. Serial.begin(115200);//设置Arduino开发板的串口的波特率
  6. bluetoothSerial.begin(115200);//设置蓝牙的串口的波特率
  7. }
  8. void loop() {
  9. char recv;
  10. //监听蓝牙串口数据
  11. bluetoothSerial.listen();
  12. while(bluetoothSerial.available() > 0){
  13. //读取蓝牙串口数据
  14. recv = bluetoothSerial.read();
  15. Serial.println(recv);
  16. }
  17. delay(1000);
  18. }

5.使用蓝牙助手调试

5.1 ios 平台

  • 在 ios 平台下可以下载 LightBlue 软件进行调试,会自动进行搜索,对应的名字为 JDY-08 .
  • 当搜索到之后可以选择 write new value 向蓝牙模块传输值
  • 当蓝牙模块接收到数据后,可以通过 Arduino 物理串口进行发送至pc上的调试窗口

5.2 Android 平台

  • 在 Android 安装 Tools 目录中的 apk 即可,通过这个软件进行控制.
  • 在使用时需要注意以下问题: 
    • 上下左右发送的值为 10 11 12 13
    • 如果单独发送指令,则需要使用两位的十六进制实现,比如发送1,则需要发送01

6.通过蓝牙控制小车

  • 当蓝牙模块可以通讯后,则可以实现通过蓝牙控制小车,具体的代码如下:
 
 
  1. #include <SoftwareSerial.h>
  2. #include <Servo.h>
  3. SoftwareSerial bluetoothSerial(8,9);
  4. #define STOP 0 //停止
  5. #define FORWARD 1 //前进
  6. #define BACKWARD 2 //后退
  7. #define TURNLEFT 3 //左转
  8. #define TURNRIGHT 4 //右转
  9. //左边的电机控制引脚
  10. int leftMotor_1 = 12;
  11. int leftMotor_2 = 13;
  12. //右边的电机控制引脚
  13. int rightMotor_1 = 10;
  14. int rightMotor_2 = 11;
  15. void setup() {
  16. // put your setup code here, to run once:
  17. Serial.begin(115200);
  18. bluetoothSerial.begin(115200);
  19. pinMode(leftMotor_1, OUTPUT);
  20. pinMode(leftMotor_2, OUTPUT);
  21. pinMode(rightMotor_1, OUTPUT);
  22. pinMode(rightMotor_2, OUTPUT);
  23. }
  24. void loop() {
  25. char cmd;
  26. while(bluetoothSerial.available() > 0){
  27. cmd = bluetoothSerial.read();
  28. //以下指令根据实际情况调整
  29. switch(cmd){
  30. case 'F':
  31. moveForward();
  32. delay(2000);
  33. stopCar();
  34. break;
  35. case 'B':
  36. moveBackward();
  37. delay(2000);
  38. stopCar();
  39. break;
  40. case 'L':
  41. moveLeft();
  42. delay(500);
  43. stopCar();
  44. break;
  45. case 'R':
  46. moveRight();
  47. delay(500);
  48. stopCar();
  49. break;
  50. default:
  51. stopCar();
  52. break;
  53. }
  54. }
  55. }
  56. void moveLeft(void)
  57. {
  58. digitalWrite(leftMotor_1, HIGH);
  59. digitalWrite(leftMotor_2, LOW);
  60. digitalWrite(rightMotor_1, LOW);
  61. digitalWrite(rightMotor_2, HIGH);
  62. }
  63. void moveRight(void)
  64. {
  65. digitalWrite(leftMotor_1,LOW);
  66. digitalWrite(leftMotor_2, HIGH);
  67. digitalWrite(rightMotor_1, HIGH);
  68. digitalWrite(rightMotor_2, LOW);
  69. }
  70. void moveForward(void)
  71. {
  72. digitalWrite(leftMotor_1, LOW);
  73. digitalWrite(leftMotor_2, HIGH);
  74. digitalWrite(rightMotor_1, LOW);
  75. digitalWrite(rightMotor_2, HIGH);
  76. }
  77. void moveBackward(void)
  78. {
  79. digitalWrite(leftMotor_1, HIGH);
  80. digitalWrite(leftMotor_2, LOW);
  81. digitalWrite(rightMotor_1, HIGH);
  82. digitalWrite(rightMotor_2, LOW);
  83. }
  84. void stopCar(void)
  85. {
  86. digitalWrite(leftMotor_1, LOW);
  87. digitalWrite(leftMotor_2, LOW);
  88. digitalWrite(rightMotor_1, LOW);
  89. digitalWrite(rightMotor_2, LOW);
  90. }

猜你喜欢

转载自blog.csdn.net/qq_40276310/article/details/80206868
今日推荐